📜  使用Python3跟踪鸟类迁移

📅  最后修改于: 2020-05-19 05:05:58             🧑  作者: Mango

一个引人入胜的研究领域是使用GPS跟踪动物的运动。现在可以制造一个带太阳能的小型GPS设备,因此您无需更换电池就可以追踪鸟类的飞行模式。
此案例研究的数据来自LifeWatch INBO项目。该项目已发布了一些数据集。我们将使用一个小的数据集,该数据集包含三个名为Eric,Nico和Sanne的海鸥的迁移数据。该official_datasets ; 使用的数据集–“ csv “>“ csv文件”包含八列,并包含诸如纬度,经度,海拔和时间戳记之类的变量。在本案例研究中,我们将首先加载数据,可视化一些简单的飞行轨迹,跟踪飞行速度,了解白天以及更多其他内容。
目标:跟踪三个海鸥的运动,即埃里克,尼科和桑内
数据集: Official_datasets ; 使用的数据集– csv
依赖项: Matplotlib, Pandas, Numpy, Cartopy, Shapely
Repository(Github):源代码
(请检查存储库以获取源代码的文档。)
撰写: 说明(.pdf)

我们将案例研究分为五个部分:
1.可视化海鸥的经度和纬度数据。
2.可视化海鸥速度的变化。
3.可视化海鸥在整个旅程中覆盖相等距离所需的时间。
4.可视化海鸥的每日平均速度。
5.海鸥旅行的地图视图。

第(1/5)部分:纬度和经度
在这一部分中,我们将可视化鸟类的位置。我们将分别沿y和x轴绘制纬度和经度,并可视化csv文件中存在的位置数据。

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)
# 存储鸟类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:
    # 存储鸟类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.")

我们使用matplotlib函数fig()将图形的大小初始化为7 x 7并使用plot()函数进行绘制。函数plot()中的参数x,y和“ b”指定使用沿x轴的经度数据(对于x),沿y的纬度数据(对于y),并且b = blue,。=可视化中的圆圈。

输出:

第(2/5)部分:2D速度与频率的关系
在案例研究的第二部分中,我们将可视化名为“ Eric”的海鸥的2D速度与频率的关系。

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)
# 存储鸟类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()

参数speed [〜ind]表示我们将仅包括那些ind!= True,bins = np.linspace(0,30,20)的条目,表示沿着x轴的bin将从0到30变化,其中20个bin最后,我们分别使用xlabel()和ylabel()函数在x轴上以m / s为单位绘制二维速度,在y轴上以频率为单位绘制二维速度,并使用plt.show()绘制数据。
输出:

第(3/5)部分:时间和日期
第三部分与日期和时间相关。我们将可视化埃里克需要的时间(以天为单位),以覆盖他的行程中的恒定距离。时间量,则“经过时间与观察值”曲线将是线性的。

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()”,返回当前日期(yy-mm-dd)和时间(h:m:s)。
“ >>> date_str [:-3]”,切片/删除UTC +00协调时间戳。
“ >>> datetime.datetime.strptime(date_str [:-3],“%Y-%m-%d%H:%M:%S”)”,date_str中的时间戳字符串将转换为datetime对象待处理。“%Y-%m-%d%H:%M:%S”是“年月日”和“时分秒”格式。
输出:

第(4/5)部分:日平均速度
我们将可视化名为“ Eric”的海鸥在记录的飞行天总数中的日平均速度。

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()-是内置的Python函数之一。它返回一个枚举的对象。在我们的例子中,该对象是一个元组列表(不可变列表),每个元组都包含一对计数/索引和值。

输出:

第(5/5)部分:制图视图
在这最后一部分中,我们将在地图上跟踪鸟类。

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)
# 要继续前进,我们需要指定一个我们有兴趣使用的特定项目.
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

这些模块对于映射数据很重要。

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

我们添加了地图的显着物理特征。
输出: