加州高速公路PEMS数据集http://kaggle.com/code/elmahy/spatial-temporal-graph-convolutional-networks/data
这里绘制PEMS04中的交通流量数据。该数据集中包含旧金山2018年1月1日至2月28日的29条道路上307个探测器每五分钟收集的数据。
npz是一种numpy文件存储的压缩格式,可使用numpy进行读取。
allow_pickle=True用于防止numpy版本过高带来的错误。
data.files查看压缩文件下的所有文件。
import numpy as np
data = np.load(数据集存放地址, allow_pickle=True)
print(data.files)
可以看到压缩文件下只有data一个文件。
通过 data['data'] 即可对该数据集进行读取。我们也可以查看一下该数据的维度。
print(data['data'].shape)
其维度如下:
16992 = 59天×24小时×12(每五分钟统计一次流量数据),307为探测器数量,3为特征数。
数据中包含的三个特征为(交通流量,平均速度,平均占用率),取出绘图需要的第一个特征(这里只绘制其中一个探测器的)。
flow = data['data'][:, 0, 0]
导入matplotlib包,通过pyplot来绘制最简单的折线图。
import matplotlib.pyplot as plt
由于希望观测到工作日的流量变化,我们将横坐标替换为周一至周日。旧金山2018年1月1日为周一。
绘制的全部代码如下:
import numpy as np
import matplotlib.pyplot as plt
data = np.load(文件路径, allow_pickle=True)
flow = data['data'][:, 0, 0]
print(len(flow))
week = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']
x = []
for i in range(59):
x.append(week[(i + 1) % 7])
y = []
sum = 0
for i in range(len(flow)):
if i == 0 or (i + 1) % 288 != 0:
sum += flow[i]
else:
y.append(sum)
sum = 0
fig = plt.figure(figsize=(15, 5)) # 图片宽度设置的大一些
plt.title('traffic flow in San Francisco')
plt.xlabel('day')
plt.ylabel('flow')
plt.xticks(np.arange(59), x)
plt.plot(np.arange(59), y, linestyle='-')
fig.autofmt_xdate(rotation=45) # x轴的刻度标签逆时针旋转45度
plt.show()
绘制结果如下:
由于人们从周一至周五是在工作,所以大部分的KPI都会遵循“Mary's Peak”模式,比如说使用公共交通工具出行的情况、外卖点餐情况。从上图可以看出,这里的交通流量是遵循这一模式的。