File size: 4,408 Bytes
2c77aab
 
9c9c653
697c8d7
2c77aab
 
564f2a9
2c77aab
fe6512d
564f2a9
fe6512d
a96847b
 
2c77aab
fe6512d
d4c830a
fe6512d
2c77aab
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from huggingface_hub import hf_hub_download
from statsmodels.tsa.arima.model import ARIMA
from statsmodels.tsa.stattools import adfuller
import gradio as gr
import pickle
from datasets import load_dataset

dataset = load_dataset("Haderstafed/DataSetic")
model_path = hf_hub_download(repo_id="Haderstafed/wine", filename="model_sprice.pkl")
model_path = hf_hub_download(repo_id="Haderstafed/wine", filename="model_mprice.pkl")


data = pd.DataFrame(dataset['train'])

# Проверка стационарности ряда с помощью теста Дики-Фуллера
def test_stationarity(timeseries):
    result = adfuller(timeseries)
    print('ADF статистика:', result[0])
    print('p-зачение (простое значение):', result[1])
    if result[1] <= 0.05:
        print("Ряд стационарен")
    else:
        print("Ряд не стационарен")

    # Функция для загрузки моделей из файлов


def load_models():
    with open('model_sprice.pkl', 'rb') as f:
        model_fit_sprice = pickle.load(f)

    with open('model_mprice.pkl', 'rb') as f:
        model_fit_mprice = pickle.load(f)

    return model_fit_sprice, model_fit_mprice


# Прогнозирование
def forecast_prices(data):
    # Загрузка обученных моделей
    model_fit_sprice, model_fit_mprice = load_models()

    # Прогнозирование на 365 дней вперед
    forecast_sprice = model_fit_sprice.forecast(steps=365)
    forecast_mprice = model_fit_mprice.forecast(steps=365)

    # Создание датафрейма
    forecast_dates = pd.date_range(start=data.index[-1] + pd.Timedelta(days=1), periods=365)
    forecast_df = pd.DataFrame({
        'date': forecast_dates,
        'Sprice_forecast': forecast_sprice,
        'Mprice_forecast': forecast_mprice
    })

    forecast_df.set_index('date', inplace=True)

    return forecast_df


# Функция для создания графиков
def plot_forecasts(forecast_df):
    plt.figure(figsize=(14, 6))

    plt.subplot(1, 2, 1)
    plt.plot(data['Sprice'], label='Известные данные')
    plt.plot(forecast_df.index, forecast_df['Sprice_forecast'], label='Прогноз', color='r')
    plt.title('Прогноз начальной стоимости поездки')
    plt.xlabel('Дата/Год')
    plt.ylabel('Цена/руб')
    plt.legend()

    plt.subplot(1, 2, 2)
    plt.plot(data['Mprice'], label='Известные данные')
    plt.plot(forecast_df.index, forecast_df['Mprice_forecast'], label='Прогноз', color='r')
    plt.title('Прогноз поминутной стоимости поездки')
    plt.xlabel('Дата/Год')
    plt.ylabel('Цена/руб')
    plt.legend()

    plt.tight_layout()

    plt.savefig('forecast_plot.png')
    plt.close()


# Расчёт стоимости поездки
def cost(date_str, distance):
    date = pd.to_datetime(date_str, format='%d/%m/%Y')

    forecast_df = forecast_prices(data)

    if date in forecast_df.index:
        sprice = forecast_df.loc[date, 'Sprice_forecast']
        mprice = forecast_df.loc[date, 'Mprice_forecast']

        travel_time_seconds = distance / 3  # берём среднюю скорость поездки в 3 м/с

        total_cost = sprice + (mprice * (travel_time_seconds / 60))
        return f"Итоговая средняя для Ростовской области стоимость поездки: {total_cost:.2f} руб."

    return "Дата не найдена в прогнозе. Максимальная дата прогноза на данный момент 01/07/2025, так же используйте формат 'День/Месяц/Год' "

#Gradio
def gradio_interface(date_str, distance):
    forecast_df = forecast_prices(data)

    plot_forecasts(forecast_df)

    cost_message = cost(date_str, distance)

    return 'forecast_plot.png', cost_message

txt = gr.Textbox(label="Введите дату (dd/mm/yyyy)")
num = gr.Number(label="Введите расстояние (в метрах)")
iface = gr.Interface(fn=gradio_interface,inputs=[txt,num],outputs=["image", "text"],title="Прогноз цен на прокат электросамокатов")
iface.launch()