Spaces:
Sleeping
Sleeping
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 | |
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]))) |