yandex_project / pages /9_taxi_orders_prediction.py
Sazuppy's picture
Upload 32 files
540fe64 verified
raw
history blame
3.49 kB
import streamlit as st
import numpy as np
import pandas as pd
import pickle
from catboost import CatBoostRegressor
import datetime
st.set_page_config(page_title="# Прогнозирование заказов такси")
st.markdown('# Прогнозирование заказов такси')
with st.expander("Описание проекта"):
st.write("""
Компания «Чётенькое такси» собрала исторические данные о заказах такси в аэропортах.
Чтобы привлекать больше водителей в период пиковой нагрузки, нужно спрогнозировать количество заказов такси на следующий час.
Описание данных:
- datetime - время заказа
- num_orders - число заказов
""")
df_old = pd.read_csv('models/taxi.csv', index_col=[0], parse_dates=[0]).sort_index().resample('1H').sum()
def user_input_features():
date = st.date_input("дата заказа такси", datetime.date(2018, 9, 6))
time = st.time_input('время заказа такси', datetime.time(8, 45))
target_datetime = datetime.datetime.combine(date, time)
data = {'datetime': target_datetime }
features = pd.DataFrame(data, index=[0])
return features
df = user_input_features()
df = df.sort_index(axis=1)
def preprocessing_data(data, max_lag, rolling_mean_size, target_datetime):
df_new = data.copy()
df_new['month'] = df_new.index.month
df_new['day'] = df_new.index.day
df_new['dayofweek'] = df_new.index.dayofweek
df_new['hour'] = df_new.index.hour
# Создаем признаки - значения за предыдущие периоды
for lag in range(1, max_lag + 1):
df_new[f'lag_{lag}'] = df_new['num_orders'].shift(lag)
# Создаем признак "скользящее среднее"
df_new['rolling_mean'] = df_new['num_orders'].shift().rolling(rolling_mean_size).mean()
# Удаляем пропуски
df_new = df_new.dropna(axis=0)
# Создаем DataFrame для target_datetime
target_df = target_datetime.copy()
target_df['month'] = target_df['datetime'].dt.month
target_df['day'] = target_df['datetime'].dt.day
target_df['dayofweek'] = target_df['datetime'].dt.dayofweek
target_df['hour'] = target_df['datetime'].dt.hour
target_df = target_df.set_index('datetime')
# Создаем признаки - значения за предыдущие периоды для target_datetime
for lag in range(1, max_lag + 1):
target_df[f'lag_{lag}'] = df_new['num_orders'].shift(lag).iloc[-1]
# Создаем признак "скользящее среднее" для target_datetime
target_df['rolling_mean'] = df_new['num_orders'].shift().rolling(rolling_mean_size).mean().iloc[-1]
return target_df
@st.cache_resource
def get_model():
load_model = pickle.load(open('models/taxi_orders_prediction.pkl', 'rb'))
return load_model
model = get_model()
target_datetime = pd.to_datetime(df['datetime'].iloc[0])
features_for_prediction = preprocessing_data(df_old, 10, 10, df)
prediction = model.predict(features_for_prediction)
st.subheader('Прогназируемое количество заказов:')
st.write(str(round(prediction[0])))