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"
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 :
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:
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:
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:
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