File size: 3,491 Bytes
540fe64
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
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])))