You are on page 1of 34

Send More Riders!

Predictive scheduling for an on demand delivery fleet

@PeterOwlett
High quality food, delivered fast and
on demand
Life of an order
Life of an order
Utilisation

Hour of Day (Colour = Day of Week)


We need enough drivers to deliver on
time, but not so many we lose money
It gets harder
Restaurants take longer than expected to make food
Items get missed - we have to go back and get them
Drivers become unavailable (flat tyre etc)
Customers hard to find
Exam question
How many drivers should we schedule for the
next two weeks in each part of London over 15
minute blocks?
Before we dive
in - a quick
apology
Lets formulate!

Where
O is orders
d is date
z is zone
Forecasting Daily Volume
This book is awesome

And Free!!! - https://www.otexts.org/fpp


Forecasting Daily Volume
Forecasting Daily Volume
Statsmodels supports this out of the box

# Decompose the raw time series


decomposition = sm.tsa.seasonal_decompose(data.values, freq=7)

# Extract individual components


all_trend = decomposition.trend
all_seasonal = decomposition.seasonal
all_resid = decomposition.resid
First Results
Forecasting Daily Volume
Holidays (and Weather)
Improving the seasonal

50%
Improvement!
Signal in the noise?

Looks Random Looks


Seasonal Noise Seasonal

Vary the training range


Train on np.log(series) and transform back
Because we can chart each series,
we can reason about how to improve
our model
Forecasting Daily Volume
Forecast each component

# Forecast Trend
lm_lin = LinearRegression().fit(dates, trend_vals)
forecast_trend = lm_lin.predict(forecast_window)

# Forecast Seasonal
seasonal_pattern = np.tile(base_seasonal_pattern,
math.ceil(days_to_forecast / 7.0))
forecast_seasonal = seasonal_pattern[0: days_to_forecast]
Forecasting Daily Volume
Converting Daily Orders to Driver Hours

Where
O is orders
D is demand
E is efficiency
z is zone
d is date
w is weekday
t is time of day
Estimating Demand Curves
Zero to One Scale - neat trick

scaled_series = df_mean_curves.order_volume /
df_mean_curves.groupby(['zone', day_of_week])\
.transform(np.sum).order_volume
Estimating Demand Curves

Ratio of daily
orders per
unit time

Hour of Day
Efficiency

Orders per
driver
per hour

Hour of Day
Final Forecast
Getting the forecast out into the real world
Volumes to Shifts
Deployment
SUCCESS!!!
Stuff we learned
1. While not as powerful as R, Statsmodels does give
you core time series tools
2. Seasonal decomposition is very meaningful to
human beings
3. By using all python, we were able to ship quickly
Thanks!

You might also like