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()