Press "Enter" to skip to content

气候变化的时间序列:起点-终点需求预测

挖掘浮动车数据以应对气候变化

由Denys Nevozhai拍摄的照片,来源于Unsplash

本文是《气候变化时间序列》系列的第8部分。文章列表:

  • 第1部分:风力预测
  • 第2部分:太阳辐射预测
  • 第3部分:大洋波浪预测
  • 第4部分:能源需求预测
  • 第5部分:极端天气事件预测
  • 第6部分:使用深度学习进行精准农业
  • 第7部分:聚类减少食品浪费

移动建模的浮动车数据

挖掘浮动车数据是智能交通系统中的关键任务。浮动车数据指的是由配备GPS设备的车辆收集的数据。这些提供了有关车辆位置和速度的信息。

了解城市内的移动模式是交通运输中的重要任务。例如,它有助于减少拥堵和总体交通活动。在交通中花费的时间越少,排放的温室气体就越少。因此,准确的模型对气候变化产生积极影响。

GPS设备的广泛使用产生了许多与移动性相关的数据集。但是,从GPS数据中学习是一个具有挑战性的问题。空间依赖关系很棘手,但是捕捉这些关系是根本的。还存在时间依赖性,例如高峰时间。移动模式还因为是否是工作日而有所不同。

起点-终点流量计数估计

美国旧金山的出租车行程。作者图片

浮动车数据为移动性建模提供了许多可能性。其中之一是起点-终点(OD)流量计数问题。

OD流量计数是指在给定时间段内有多少车辆穿越一个给定的子区域到达另一个区域的估计。这个任务对几个原因都是相关的。出租车公司可以根据特定区域的预期需求动态分配车队。

实际操作:预测旧金山OD需求

在本文的其余部分中,我们将预测美国加州旧金山的出租车乘客需求。我们将将此问题作为OD流量计数任务来解决。

本教程中使用的完整代码可在Github上找到:

  • https://github.com/vcerqueira/tsa4climate

数据集

我们将使用由旧金山,加利福尼亚州,美国的一家出租车公司收集的数据集。数据集包含来自21天内536辆出租车的GPS数据。总共有1.21亿个GPS跟踪,分布在464045次行程中。您可以查看参考文献[1]以了解更多细节。

数据集的样本。

对于每个时间步长和每辆出租车,我们都可以获得有关其坐标以及是否有乘客占用的信息。

定义问题

美国旧金山出租车行程的终点位置。作者图片。

我们的目标是对于给定的起点,建模人们移动到哪里。OD流量计数估计可以分为四个子任务:

  1. 空间网格分解
  2. 起点-终点对的选择
  3. 时间离散化
  4. 建模和预测

让我们依次深入每个问题。

空间网格分解

空间分解是OD流量计数估计的常见预处理步骤。其思想是将地图分成网格单元,这些单元表示城市的一小部分。然后,我们可以计算每个可能的网格单元对之间有多少人穿过。

San Francisco 中两个示例网格单元。作者提供的图片。

在这个案例研究中,我们将城市地图分成了10000个网格单元,如下所示:

import pandas as pdfrom src.spatial import SpatialGridDecomposition, prune_coordinates# 读取数据集trips_df = pd.read_csv('trips.csv', parse_dates=['time'])# 从坐标中删除异常值trips_df = prune_coordinates(trips_df=trips_df, lhs_thr=0.01, rhs_thr=0.99)# 用10000个单元进行网格分解grid = SpatialGridDecomposition(n_cells=10000)# 设置边界框grid.set_bounding_box(lat=trips_df.latitude, lon=trips_df.longitude)# 进行网格分解grid.grid_decomposition()

在上面的代码中,我们删除了异常位置。这些可能是由于GPS故障引起的。

在空间分解过程之后,当出租车被乘客占据时,我们得到了每次出租车行程的起点和终点。

from src.spatial import ODFlowCounts# 获取每次行程的起点和终点坐标df_group = trips_df.groupby(['cab', 'cab_trip_id'])trip_points = df_group.apply(lambda x: ODFlowCounts.get_od_coordinates(x))trip_points.reset_index(drop=True, inplace=True)

我们的想法是重构数据集,以包含以下信息:每个乘客行程的起点、终点和起点时间戳。这些数据构成了我们的起点-终点(OD)流量计数模型的基础。

这些数据允许我们计算从单元 A 到单元 B 有多少次行程:

# 获取起点和终点单元质心od_pairs = trip_points.apply(lambda x: ODFlowCounts.get_od_centroids(x, grid.centroid_df), axis=1)

为了简单起见,我们获取了最高需求的50个OD网格单元对。选择此子集是可选的。然而,仅有少数行程的OD对将显示出随时间稀疏的需求,这很难建模。此外,低需求的行程可能从车队管理的角度来看是无用的。

flow_count = od_pairs.value_counts().reset_index()flow_count = flow_count.rename({0: 'count'}, axis=1)top_od_pairs = flow_count.head(50)

时间离散化

在找到需求最高的OD对之后,我们对这些对进行时间离散化。这是通过计算每个给定的顶部对在每小时内有多少次行程来完成的。可以按以下方式完成:

# 准备数据trip_points = pd.concat([trip_points, od_pairs], axis=1)trip_points = trip_points.sort_values('time_start')trip_points.reset_index(drop=True, inplace=True)# 获取每个行程的起点、终点单元以及起始时间trip_starts = []for i, pair in top_od_pairs.iterrows():    origin_match = trip_points['origin'] == pair['origin']    dest_match = trip_points['destination'] == pair['destination']    od_trip_df = trip_points.loc[origin_match & dest_match, :]    od_trip_df.loc[:, 'pair'] = i    trip_starts.append(od_trip_df[['time_start', 'time_end', 'pair']])trip_starts_df = pd.concat(trip_starts, axis=0).reset_index(drop=True)# 更多数据处理od_count_series = {}for pair, data in trip_starts_df.groupby('pair'):    new_index = pd.date_range(        start=data.time_start.values[0],        end=data.time_end.values[-1],        freq='H',        tz='UTC'    )    od_trip_counts = pd.Series(0, index=new_index)    for _, r in data.iterrows():        dt = r['time_start'] - new_index        dt_secs = dt.total_seconds()        valid_idx = np.where(dt_secs >= 0)[0]        idx = valid_idx[dt_secs[valid_idx].argmin()]        od_trip_counts[new_index[idx]] += 1    od_count_series[pair] = od_trip_counts.resample('H').mean()od_df = pd.DataFrame(od_count_series)

这会产生一组时间序列,每个顶部OD对应一个序列。这是四个示例对应的时间序列图:

四个示例起点-终点对应的流量计数的时间序列图。作者提供的图像。

这些时间序列呈现出每日季节性,主要是由高峰时间驱动的。

预测

由时间离散化产生的时间序列可以用于预测。我们可以建立一个模型来预测在给定OD对中有多少乘客想要进行旅行。

以下是一个示例OD对的预测方法:

from pmdarima.arima import auto_arima# getting the first OD pair as exampleseries = od_df[0].dropna()# fitting an ARIMA modelmodel = auto_arima(y=series, m=24)

上面我们基于ARIMA建立了一个预测模型。该模型根据最近的过去需求预测下一个小时的客流量。我们使用ARIMA方法是为了简单,但也可以使用其他方法,如深度学习。

进一步使用图神经网络

上述方法是解决OD流量计数问题的一种简单而有效的方法。但实际上,每个OD对都与相邻的OD对或周围的道路相关联。因此,图神经网络越来越多地用于预测交通状况。道路网络被建模为图,神经网络可以捕捉其中的复杂交互作用。您可以查看这个Keras示例来学习如何实现这种方法。

要点

  • 移动建模是智能交通系统中的重要任务;
  • OD流量计数模型可以帮助减少城市内的交通拥堵,从而减少温室气体的排放;
  • 您可以通过空间分解和时间离散化的方法来解决OD流量计数问题。这将产生每个OD对应的一组时间序列,可用于预测。

感谢您的阅读,我们下次再见!

参考文献

[1] 美国旧金山出租车移动轨迹数据集。 (许可证 CC BY 4.0)

[2] Moreira-Matias, Luís, et al. “Time-evolving OD matrix estimation using high-speed GPS data streams.” Expert systems with Applications 44 (2016): 275–288.

Leave a Reply

Your email address will not be published. Required fields are marked *