Копаене на данни за плаващи автомобили за справяне с изменението на климата

Това е част 8 от поредицата Времеви серии за изменението на климата. Списък на статиите:

Плаващи данни за автомобили за моделиране на мобилност

Извличането на данни за плаващи автомобили е ключова задача в интелигентните транспортни системи. Данните за плаващи автомобили се отнасят за данни, събрани от превозни средства, оборудвани с GPS устройства. Те предоставят информация за местоположението и скоростта на превозните средства.

Разбирането на моделите на мобилност в градовете е важна задача в транспорта. Например, помага за намаляване на задръстванията и цялостната транспортна дейност. По-малко време в трафик означава по-малко емисии на парникови газове. Така че точните модели имат положително въздействие върху изменението на климата.

Широкото разпространение на GPS устройства създаде много набори от данни, свързани с мобилността. Но ученето от GPS данни е предизвикателен проблем. Пространствените зависимости са трудни, но фундаментални за улавяне. Има и времеви зависимости, например часове пик. Моделите на мобилност също се различават в зависимост от това дали е делничен ден или не.

Оценка на потока от местоназначение

Данните за плаващи автомобили предлагат много възможности за моделиране на мобилността. Една от тези възможности е проблемът с броя на потока произход-дестинация (OD).

Броят на OD потока се отнася до оценката на това колко превозни средства преминават от даден подрегион до друг за даден период. Тази задача е уместна по няколко причини. Таксиметровите компании могат да разпределят своя автопарк динамично според очакваното търсене в определена зона.

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

В останалата част от тази статия ще прогнозираме търсенето на таксиметрови пътници в Сан Франциско, САЩ. Ще се заемем с този проблем като задача за преброяване на OD потока.

Пълният код, използван в този урок, е достъпен в Github:

Набор от данни

Ще използваме набор от данни, събран от таксиметров парк в Сан Франциско, Калифорния, САЩ. Наборът от данни съдържа GPS данни от 536 таксита за период от 21 дни. Общо има 121 милиона GPS следи, разделени на 464 045 пътувания. Можете да проверите справка [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 за опростяване, но могат да се използват и други подходи като „задълбочено обучение“.

Продължаваме по-далеч с Graph Neural Networks

Гореспоменатият подход е прост, но ефективен начин за решаване на проблеми с броя на OD потока. Но той разглежда всяка OD двойка като отделен времеви ред.

В действителност всяка двойка е свързана със съседните OD двойки или околните пътища. Поради това графичните невронни мрежи все повече се използват за прогнозиране на условията на трафика. Пътната мрежа се моделира като графика и невронните мрежи могат да уловят сложни взаимодействия в нея. Можете да проверите този пример на Keras, за да научите как да приложите този вид метод.

Ключови изводи

  • Моделирането на мобилността е важна задача в интелигентните транспортни системи;
  • Моделите за преброяване на OD потока могат да помогнат за намаляване на трафика в градовете, като по този начин намаляват емисиите на парникови газове;
  • Можете да се справите с проблеми с броя на OD потока с подход, базиран на пространствено разлагане и времева дискретизация. Това води до набор от времеви редове за всяка OD двойка, които могат да се използват за прогнозиране.

Благодарим ви, че прочетохте и ще се видим в следващата история!

Препратки

[1] Набор от данни за следи от мобилност на таксиметрови таксита в Сан Франциско, САЩ. (Лиценз CC BY 4.0)

[2] Морейра-Матиас, Луис и др. „Развиваща се във времето оценка на OD матрица с помощта на високоскоростни GPS потоци от данни.“ Експертни системи с приложения 44 (2016): 275–288.