Добыча данных о плавучих автомобилях для борьбы с изменением климата

Это восьмая часть серии Временные ряды изменения климата. Список статей:

Плавающие данные об автомобилях для моделирования мобильности

Добыча данных о плавающих автомобилях является ключевой задачей в интеллектуальных транспортных системах. Плавающие данные об автомобиле относятся к данным, собранным транспортными средствами, оснащенными устройствами GPS. Они предоставляют информацию о местоположении и скорости транспортных средств.

Понимание моделей мобильности в городах является важной задачей в сфере транспорта. Например, это помогает уменьшить заторы и общую транспортную активность. Меньше времени в пробках означает меньше выбросов парниковых газов. Таким образом, точные модели оказывают положительное влияние на изменение климата.

Широкое распространение устройств GPS привело к появлению множества наборов данных, связанных с мобильностью. Но изучение данных GPS является сложной задачей. Пространственные зависимости сложны, но их необходимо зафиксировать. Есть и временные зависимости, например, часы пик. Модели мобильности также различаются в зависимости от того, будний это день или нет.

Оценка количества потоков отправления-назначения

Плавающие данные об автомобилях предлагают множество возможностей для моделирования мобильности. Одной из таких возможностей является проблема подсчета потока исходного-назначаемого (OD).

Подсчет потока OD относится к оценке того, сколько транспортных средств пересекают данный субрегион в другой за определенный период. Эта задача актуальна по нескольким причинам. Таксомоторные компании могут динамически распределять свой автопарк в соответствии с ожидаемым спросом в конкретной зоне.

Практическое занятие: прогнозирование спроса на OD в Сан-Франциско

В оставшейся части этой статьи мы спрогнозируем спрос пассажиров такси в Сан-Франциско, США. Мы решим эту проблему как задачу подсчета потока OD.

Полный код, используемый в этом руководстве, доступен на Github:

Набор данных

Мы будем использовать набор данных, собранный таксопарком в Сан-Франциско, Калифорния, США. Набор данных содержит данные GPS от 536 такси за период в 21 день. Всего имеется 121 миллион GPS-треков, разделенных на 464045 поездок. Вы можете проверить ссылку [1] для получения более подробной информации.

На каждом временном шаге и для каждого такси у нас есть информация о его координатах и ​​о том, находится ли в нем пассажир.

Определение проблемы

Наша цель — смоделировать, куда люди перемещаются, учитывая их происхождение. Оценку потока OD можно разделить на четыре подзадачи:

  1. Декомпозиция пространственной сетки
  2. Выбор пар отправления-назначения
  3. Временная дискретизация
  4. Моделирование и прогнозирование

Давайте углубимся в каждую проблему по очереди.

Декомпозиция пространственной сетки

Пространственная декомпозиция является распространенным этапом предварительной обработки для оценки количества потоков OD. Идея состоит в том, чтобы разделить карту на ячейки сетки, которые представляют небольшую часть города. Затем мы можем подсчитать, сколько людей проходит через каждую возможную пару ячеек сетки.

В этом примере мы разделили карту города на 10 000 ячеек сетки следующим образом:

import pandas as pd

from src.spatial import SpatialGridDecomposition, prune_coordinates

# reading the data set
trips_df = pd.read_csv('trips.csv', parse_dates=['time'])

# removing outliers from coordinates
trips_df = prune_coordinates(trips_df=trips_df, lhs_thr=0.01, rhs_thr=0.99)

# grid decomposition with 10000 cells
grid = SpatialGridDecomposition(n_cells=10000)
# setting bounding box
grid.set_bounding_box(lat=trips_df.latitude, lon=trips_df.longitude)
# grid decomposition
grid.grid_decomposition()

В приведенном выше коде мы удаляем отдаленные местоположения. Это может произойти из-за сбоев GPS.

Получение самых популярных поездок

После процесса пространственной декомпозиции мы получаем исходную и конечную точки каждой поездки на такси, когда они заняты пассажиром.

from src.spatial import ODFlowCounts

# getting origin and destination coordinates for each trip
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:

# getting the origin and destination cell centroid
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 с точки зрения спроса, мы дискретизируем их по времени. Это делается путем подсчета количества поездок в каждый час для каждой заданной верхней пары. Это можно сделать следующим образом:

# preparing data
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)

# getting origin-destination cells for each trip, and origin start time
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)

# more data processing
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 example
series = od_df[0].dropna()

# fitting an ARIMA model
model = auto_arima(y=series, m=24)

Выше мы построили модель прогнозирования на основе ARIMA. Модель прогнозирует пассажиропоток в течение следующего часа с учетом недавнего прошлого спроса. Мы используем метод ARIMA для простоты, но можно использовать и другие подходы, такие как глубокое обучение.

Идем дальше с графовыми нейронными сетями

Вышеупомянутый подход является простым, но эффективным способом решения задач подсчета потока OD. Но он рассматривает каждую пару OD как отдельный временной ряд.

На самом деле каждая пара коррелирует с соседними парами OD или окружающими дорогами. Из-за этого графовые нейронные сети все чаще используются для прогнозирования условий движения. Дорожная сеть моделируется в виде графа, и нейронные сети могут фиксировать в ней сложные взаимодействия. Вы можете проверить этот пример Keras, чтобы узнать, как реализовать такой метод.

Ключевые выводы

  • Моделирование мобильности — важная задача в интеллектуальных транспортных системах;
  • Модели подсчета потоков OD могут помочь уменьшить трафик в городах, тем самым уменьшая выбросы парниковых газов;
  • Вы можете решить проблемы подсчета потока OD с помощью подхода, основанного на пространственной декомпозиции и временной дискретизации. Это приводит к набору временных рядов для каждой пары OD, которые можно использовать для прогнозирования.

Спасибо за прочтение и до встречи в следующей истории!

Рекомендации

[1] Набор данных следов движения такси в Сан-Франциско, США. (Лицензия CC BY 4.0)

[2] Морейра-Матиас, Луис и др. «Оценка матрицы OD с изменением времени с использованием высокоскоростных потоков данных GPS». Экспертные системы с приложениями 44 (2016): 275–288.