例如,在环境科学中,时间序列分析有助于分析一个地区的土地覆盖/土地利用随时间的变化及其潜在驱动因素。它在气象研究中也很有用,可以帮助我们理解天气模式的时空变化(我将很快使用降雨数据演示一个这样的案例研究)。社会和经济科学在理解时间和空间现象的动态方面也极大受益,例如人口、经济和政治模式。
空间数据的表示具有很强的力量。然而,对于一个没有接受地理信息科学培训的数据科学家/分析师来说,分析地理空间数据并提取有趣的见解可能是一项具有挑战性的任务。幸运的是,有工具可以简化这个过程,这正是在本文中尝试的内容。
在本文中,将经历一系列过程,从下载光栅数据开始,然后将数据转换为pandas数据框,并为传统的时间序列分析任务进行设置。
在这个案例研究中,我使用了日本北海道2020年1月1日至12月31日期间的降雨空间分布数据,涵盖了一年的366天。我从NASA/USAID合作伙伴关系的开放式空间数据平台ClimateServe下载了数据。任何有互联网访问权限的人都可以轻松下载这些数据。
以下是我本地目录中一些光栅图像的快照:
首先,设置了一个文件夹,用于存储光栅数据集,以便以后可以循环遍历它们。
# specify folder path for raster dataset
tsFolderPath = './data/hokkaido/'
接下来,导入了一些库,其中大多数对数据科学家来说应该是熟悉的。为了处理光栅数据,我使用了rasterio库。
# import libraries
import os
import rasterio
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
让我们看看光栅图像在绘图中的样子。将首先使用rasterio加载一个随机图像,然后使用matplotlib功能绘制它。
# load in raster data
rf = rasterio.open('./data/hokkaido/20201101.tif')
fig, ax = plt.subplots(figsize=(15,5))
_ = ax.imshow(rf.read()[0], cmap = 'inferno')
fig.colorbar(_, ax=ax)
plt.axis('off')
plt.title('Daily rainfall Jan-Dec 2020, Hokkaido, Japan');
如你所见,这个图像是像素的组合,每个像素的值表示该特定位置的降雨量。较亮的像素具有较高的降雨值。在下一节中,我将提取这些值并将它们转换为pandas数据框。
现在进入关键步骤——提取每个366个光栅图像的像素值。这个过程很简单:我们将循环遍历每个图像,读取像素值并将它们存储在一个列表中。
我们将另外在另一个列表中跟踪日期信息。我们从哪里获取日期信息?如果你仔细查看文件名,你会注意到它们是按照每个相应的日期命名的。
# create empty lists to store data
date = []
rainfall_mm = []
# loop through each raster
for file in os.listdir(tsFolderPath):
# read the files
rf = rasterio.open(tsFolderPath + file)
# convert raster data to an array
array = rf.read(1)
# store data in the list
date.append(file[:-4])
rainfall_mm.append(array[array>=0].mean())
请注意,由于图像分辨率低(即像素尺寸大),循环遍历366个光栅图像并不需要很长时间。然而,对于高分辨率数据集,这可能需要大量计算资源。
因此,我们刚刚创建了两个列表,一个存储文件名中的日期,另一个存储降雨数据。以下是这两个列表的前五个项目:
print(date[:5])
print(rainfall_mm[:5])
>> ['20200904', '20200910', '20200723', '20200509', '20200521']
>> [4.4631577, 6.95278, 3.4205956, 1.7203209, 0.45923564]
接下来,我们将这些列表转换为pandas数据框的格式。从这里开始,我们将采取额外的步骤将数据框转换为时间序列对象。
在pandas中,将列表转换为数据框格式是一项简单的任务:
# convert lists to a dataframe
df = pd.DataFrame(zip(date, rainfall_mm), columns = ['date', 'rainfall_mm'])
df.head()
现在我们有了一个pandas数据框,但请注意,“日期”列中的值是字符串,pandas尚不知道它代表日期。因此,我们需要稍微调整一下:
# Convert dataframe to datetime object
df['date'] = pd.to_datetime(df['date'])
df.head()
df['date'].info()
现在数据框是一个日期时间对象。
将日期列设置为索引也是一个好主意。这有助于按不同日期和日期范围切片和过滤数据,并使绘图任务变得容易。我们首先将日期排序到正确的顺序,然后将该列设置为索引。
df = df.sort_values('date')
df.set_index('date', inplace=True)
好了,所有处理都已完成。你现在可以根据需要使用这个时间序列数据。我只是绘制数据以查看其外观。
# plot
df.plot(figsize=(12,3), grid =True);
漂亮的图表!
从地理空间时间序列数据中提取有趣且可操作的见解可以非常强大,因为它同时展示了数据的空间和时间维度。然而,对于没有地理空间信息培训的数据科学家来说,这可能是一项令人望而却步的任务。
在本文中,通过一个案例研究演示了如何以最少的努力轻松完成这项艰巨任务