from typing import Iterable, List
import pandas as pd
from ridepy.data_structures import TransportSpace
from ridepy.util.analytics.stops import (
_create_stoplist_dataframe,
_add_locations_to_stoplist_dataframe,
)
from ridepy.util.analytics.requests import _create_transportation_requests_dataframe
def _create_events_dataframe(events: Iterable[dict]) -> pd.DataFrame:
"""
Create a DataFrame of all logged events with their properties at columns.
The schema of the returned DataFrame is the following, where
the index is an unnamed integer range index.
.. code-block::
Column Dtype
------ -----
request_id int64
timestamp float64
vehicle_id float64
event_type object
location Union[int, float64, Tuple[float64]]
origin Union[int, float64, Tuple[float64]]
destination Union[int, float64, Tuple[float64]]
pickup_timewindow_min float64
pickup_timewindow_max float64
delivery_timewindow_min float64
delivery_timewindow_max float64
Parameters
----------
events
Returns
-------
events DataFrame, indexed by integer range
"""
return pd.DataFrame(events)
[docs]
def get_stops_and_requests_from_events_dataframe(
*, events_df: pd.DataFrame, space: TransportSpace
) -> tuple[pd.DataFrame, pd.DataFrame]:
"""
Prepare stops and requests dataframes from an events dataframe.
For details on the returned dataframes see doc on outside-facing `get_stops_and_requests`.
Parameters
----------
events_df
DataFrame indexed
space
Returns
-------
stops
dataframe indexed by `[vehicle_id, timestamp]` containing all stops
requests
dataframe indexed by `request_id` containing all requests
"""
stops_df = _create_stoplist_dataframe(evs=events_df)
requests_df = _create_transportation_requests_dataframe(
evs=events_df, stops=stops_df, space=space
)
# try:
stops_df = _add_locations_to_stoplist_dataframe(
reqs=requests_df, stops=stops_df, space=space
)
# stops_df = _add_insertion_stats_to_stoplist_dataframe(
# reqs=requests_df, stops=stops_df, space=space
# )
# except KeyError: # TODO document this
# pass
return stops_df, requests_df
[docs]
def get_stops_and_requests(
*, events: List[dict], space: TransportSpace
) -> tuple[pd.DataFrame, pd.DataFrame]:
"""
Prepare two DataFrames, containing stops and requests.
# NOTE: This assumes occupancy delta of +1/-1, i.e. only single-customer requests.
# If the simulator should allow for multi-customer requests in the future,
# this must be changed.
# See also [issue #45](https://github.com/PhysicsOfMobility/ridepy/issues/45)
The `stops` DataFrame returned has the following schema:
.. code-block::
Column Dtype
------ -----
vehicle_id float64
stop_id int64
timestamp float64
delta_occupancy float64
request_id int64
state_duration float64
occupancy float64
location object
dist_to_next float64
time_to_next float64
timestamp_submitted float64
insertion_index float64
leg_1_dist_service_time float64
leg_2_dist_service_time float64
leg_direct_dist_service_time float64
detour_dist_service_time float64
leg_1_dist_submission_time float64
leg_2_dist_submission_time float64
leg_direct_dist_submission_time float64
detour_dist_submission_time float64
stoplist_length_submission_time float64
stoplist_length_service_time float64
avg_segment_dist_submission_time float64
avg_segment_time_submission_time float64
avg_segment_dist_service_time float64
avg_segment_time_service_time float64
system_stoplist_length_submission_time float64
system_stoplist_length_service_time float64
avg_system_segment_dist_submission_time float64
avg_system_segment_time_submission_time float64
avg_system_segment_dist_service_time float64
avg_system_segment_time_service_time float64
relative_insertion_position float6
The `requests` DataFrame returned has the following schema:
.. code-block::
Column Dtype
------ -----
(submitted, timestamp) float64
(submitted, origin) Union[float64, int, Tuple[float64]]
(submitted, destination) Union[float64, int, Tuple[float64]]
(submitted, pickup_timewindow_min) float64
(submitted, pickup_timewindow_max) float64
(submitted, delivery_timewindow_min) float64
(submitted, delivery_timewindow_max) float64
(submitted, direct_travel_distance) float64
(submitted, direct_travel_time) float64
(accepted, timestamp) float64
(accepted, origin) Union[float64, int, Tuple[float64]]
(accepted, destination) Union[float64, int, Tuple[float64]]
(accepted, pickup_timewindow_min) float64
(accepted, pickup_timewindow_max) float64
(accepted, delivery_timewindow_min) float64
(accepted, delivery_timewindow_max) float64
(rejected, timestamp) float64
(inferred, relative_travel_time) float64
(inferred, travel_time) float64
(inferred, waiting_time) float64
(serviced, timestamp_dropoff) float64
(serviced, timestamp_pickup) float64
(serviced, vehicle_id) float64
Parameters
----------
events
list of all the events returned by the simulation
space
transportation space that was used for the simulations
Returns
-------
stops
dataframe indexed by `[vehicle_id, timestamp]` containing all stops
requests
dataframe indexed by `request_id` containing all requests
"""
return get_stops_and_requests_from_events_dataframe(
events_df=_create_events_dataframe(events=events), space=space
)