Seguimiento de la migración de aves con Python-3

Un área fascinante de investigación utiliza GPS para rastrear los movimientos de los animales. Ahora es posible fabricar un pequeño dispositivo GPS que funciona con energía solar, por lo que no es necesario cambiar las baterías y usarlo para rastrear los patrones de vuelo de las aves. 
Los datos de este estudio de caso provienen del proyecto LifeWatch INBO. Se han publicado varios conjuntos de datos como parte de este proyecto. Usaremos un pequeño conjunto de datos que consta de datos de migración de tres gaviotas llamadas Eric, Nico y Sanne. Los conjuntos_de_datos_oficiales ; conjunto de datos usado: CSV”> El archivo csv contiene ocho columnas e incluye variables como latitud, longitud, altitud y marcas de tiempo. En este estudio de caso, primero cargaremos los datos, visualizaremos algunas trayectorias de vuelo simples, rastrearemos la velocidad de vuelo, aprenderemos sobre el día y mucho, mucho más.

Objetivo: rastrear el movimiento de tres gaviotas, a saber: Eric, Nico y Sanne Conjunto de
datos: conjuntos de datos oficiales ; conjunto de datos utilizado – csv  
Dependencias: Matplotlib, Pandas, Numpy, Cartopy, Shapely
Repository (Github): código fuente 
(consulte el repositorio para ver la documentación del código fuente). 
Redacción: explicación (.pdf)

Dividiremos nuestro caso de estudio en cinco partes: 
1. Visualización de datos de longitud y latitud de las gaviotas. 
2. Visualiza la variación de la velocidad de las gaviotas. 
3. Visualiza el tiempo que tardan las gaviotas en recorrer distancias iguales durante el trayecto. 
4. Visualiza la velocidad media diaria de las gaviotas. 
5. Vista cartográfica del viaje de las gaviotas.

PARTE (1/5): Latitud y Longitud 
En esta parte vamos a visualizar la ubicación de las aves. Vamos a trazar la latitud y la longitud a lo largo de los ejes y y x respectivamente y visualizar los datos de ubicación presentes en el archivo csv. 

Python

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
 
 
birddata = pd.read_csv("bird_tracking.csv")
bird_names = pd.unique(birddata.bird_name)
 
# storing the indices of the bird Eric
ix = birddata.bird_name == "Eric"
x,y = birddata.longitude[ix], birddata.latitude[ix]
plt.figure(figsize = (7,7))
plt.plot(x,y,"b.")
 
''' To look at all the birds trajectories,
    we plot each bird in the same plot '''
plt.figure(figsize = (7,7))
for bird_name in bird_names:
 
    # storing the indices of the bird Eric
    ix = birddata.bird_name == bird_name 
    x,y = birddata.longitude[ix], birddata.latitude[ix]
    plt.plot(x,y,".", label=bird_name)
plt.xlabel("Longitude")
plt.ylabel("Latitude")
plt.legend(loc="lower right")
plt.show()
plt.figure(figsize = (7,7))
plt.plot(x,y,"b.")

Usamos la función matplotlib, figure() para inicializar el tamaño de la figura como 7 x 7 y trazarlo usando la función plot(). Los parámetros dentro de la función plot() es decir, x, y y «b». están especificando el uso de datos de longitud a lo largo del eje x (para x), latitud a lo largo de y (para y) y b=azul, . = círculos en la visualización. 

Output : You must have all the dependencies.Install them using "pip install dependency_name"

figure_1_Eric's_trajectory
figure_2_bird_trajectories

PARTE (2/5): Velocidad 2D vs Frecuencia 
En esta segunda parte del estudio de caso, vamos a visualizar la velocidad 2D vs Frecuencia de la gaviota llamada “Eric”.

Python

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
 
birddata = pd.read_csv("bird_tracking.csv")
bird_names = pd.unique(birddata.bird_name)
 
# storing the indices of the bird Eric
ix = birddata.bird_name == "Eric"
speed = birddata.speed_2d[ix]
 
plt.figure(figsize = (8,4))
ind = np.isnan(speed)
plt.hist(speed[~ind], bins = np.linspace(0,30,20), normed=True)
plt.xlabel(" 2D speed (m/s) ")
plt.ylabel(" Frequency ")
plt.show()
ind = np.isnan(speed)
plt.hist(speed[~ind], bins = np.linspace(0,30,20), normed=True)
plt.xlabel(" 2D speed (m/s) ")
plt.ylabel(" Frequency ")
plt.show()

Los parámetros speed[~ind] indican que incluiremos solo aquellas entradas para las cuales ind != True, bins=np.linspace(0,30,20) indica que los contenedores a lo largo del eje x variarán de 0 a 30 con 20 contenedores dentro de ellos, espaciados linealmente. Por último, trazamos la velocidad 2D en m/s a lo largo del eje x y la frecuencia a lo largo del eje y usando las funciones xlabel() e ylabel() respectivamente y trazamos los datos usando plt.show().

Producción : 

figure_3_speed

PARTE (3/5): Hora y Fecha 
La tercera parte está asociada a la fecha y la hora. Vamos a visualizar el tiempo (en días) que necesita Eric para cubrir distancias constantes a lo largo de su viaje. Si cubre distancias iguales en la misma cantidad de tiempo, entonces la curva Tiempo transcurrido frente a Observación será lineal. 

Python

import pandas as pd
import matplotlib.pyplot as plt
import datetime
import numpy as np
 
birddata = pd.read_csv("bird_tracking.csv")
bird_names = pd.unique(birddata.bird_name)
 
timestamps = []
for k in range(len(birddata)):
    timestamps.append(datetime.datetime.strptime(birddata.date_time.iloc[k][:-3], "%Y-%m-%d %H:%M:%S"))
 
birddata["timestamp"] = pd.Series(timestamps, index = birddata.index)
 
times = birddata.timestamp[birddata.bird_name == "Eric"]
elapsed_time = [time-times[0] for time in times]
 
plt.plot(np.array(elapsed_time)/datetime.timedelta(days=1))
plt.xlabel(" Observation ")
plt.ylabel(" Elapsed time (days) ")
plt.show()
for k in range(len(birddata)):
    timestamps.append(datetime.datetime.strptime(birddata.date_time.iloc[k][:-3], "%Y-%m-%d %H:%M:%S"))

“>>>datetime.datetime.today()”, devuelve la fecha actual (aa-mm-dd) y la hora (h:m:s). 
“>>>date_str[:-3]”, divide/elimina las marcas de tiempo coordinadas UTC+00. 
«>>>datetime.datetime.strptime(date_str[:-3], «%Y-%m-%d %H:%M:%S»)», las strings de marca de tiempo de date_str se convierten en un objeto de fecha y hora para ser trabajado. “%Y-%m-%d %H:%M:%S” es el formato de año-mes-fecha y hora-minuto-segundo.

Producción: 

figure_4_time_stamp

PARTE (4/5): Velocidad Media Diaria 
Vamos a visualizar la velocidad media diaria de la gaviota de nombre “Eric” para el total de días de vuelo registrados. 

Python

import pandas as pd
import matplotlib.pyplot as plt
import datetime
import numpy as np
 
birddata = pd.read_csv("bird_tracking.csv")
bird_names = pd.unique(birddata.bird_name)
 
timestamps = []
for k in range(len(birddata)):
    timestamps.append(datetime.datetime.strptime(birddata.date_time.iloc[k][:-3], "%Y-%m-%d %H:%M:%S"))
birddata["timestamp"] = pd.Series(timestamps, index = birddata.index)
 
data =  birddata[birddata.bird_name == "Eric"]
times = data.timestamp
elapsed_time = [time-times[0] for time in times]
elapsed_days = np.array(elapsed_time)/datetime.timedelta(days=1)
 
next_day = 1
inds = []
daily_mean_speed = []
for (i,t) in enumerate(elapsed_days):
    if t < next_day:
        inds.append(i)
    else:
        daily_mean_speed.append(np.mean(data.speed_2d[inds]))
        next_day += 1
        inds = []
 
plt.figure(figsize = (8,6))
plt.plot(daily_mean_speed, "rs-")
plt.xlabel(" Day ")
plt.ylabel(" Mean Speed (m/s) ");
plt.show()
enumerate() - is one of the built-in Python functions. It returns an enumerated object. In our case, that object is a list of tuples (immutable lists), each containing a pair of count/index and value.

Producción: 

figure_5_mean.avg.speed_perday

PARTE (5/5): Vista Cartográfica 
En esta última parte, vamos a rastrear las Aves sobre un mapa. 

Python

import pandas as pd
import cartopy.crs as ccrs
import cartopy.feature as cfeature
import matplotlib.pyplot as plt
 
birddata = pd.read_csv("bird_tracking.csv")
bird_names = pd.unique(birddata.bird_name)
 
# To move forward, we need to specify a
# specific projection that we're interested
# in using.
proj = ccrs.Mercator()
 
plt.figure(figsize=(10,10))
ax = plt.axes(projection=proj)
ax.set_extent((-25.0, 20.0, 52.0, 10.0))
ax.add_feature(cfeature.LAND)
ax.add_feature(cfeature.OCEAN)
ax.add_feature(cfeature.COASTLINE)
ax.add_feature(cfeature.BORDERS, linestyle=':')
for name in bird_names:
    ix = birddata['bird_name'] == name
    x,y = birddata.longitude[ix], birddata.latitude[ix]
    ax.plot(x,y,'.', transform=ccrs.Geodetic(), label=name)
plt.legend(loc="upper left")
plt.show()
import cartopy.crs as ccrs
import cartopy.feature as cfeature

Estos módulos son importantes para mapear datos.

ax.add_feature(cfeature.LAND)
ax.add_feature(cfeature.OCEAN)
ax.add_feature(cfeature.COASTLINE)
ax.add_feature(cfeature.BORDERS, linestyle=':')

Agregamos las características físicas más destacadas de un mapa.

Producción: 

figure_6_bird_cartographic

Recursos: 
1. edX – HarvardX – Uso de Python para la investigación 
2. Funciones de Python doc_I 
3. Funciones de Python doc_II

Este artículo es una contribución de Amartya Ranjan Saikia . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *