| |
| import pandas as pd |
| import matplotlib.pyplot as plt |
| from prophet import Prophet |
| import gradio as gr |
|
|
| |
| url = 'https://data.open-power-system-data.org/time_series/2020-10-06/time_series_60min_singleindex.csv' |
| data = pd.read_csv(url) |
|
|
| df = data[['utc_timestamp', 'DE_load_actual_entsoe_transparency']].copy() |
| df.rename(columns={'utc_timestamp': 'ds', 'DE_load_actual_entsoe_transparency': 'y'}, inplace=True) |
| df.dropna(inplace=True) |
| df['ds'] = pd.to_datetime(df['ds']).dt.tz_localize(None) |
|
|
| |
| def forecast_energy(days, graph_type): |
| model = Prophet() |
| model.fit(df) |
|
|
| future = model.make_future_dataframe(periods=24 * days, freq='H') |
| forecast = model.predict(future) |
| forecast_future = forecast.tail(24 * days) |
|
|
| |
| paths = {} |
|
|
| |
| plt.figure(figsize=(12, 5)) |
| plt.plot(forecast_future['ds'], forecast_future['yhat'], label='Predicted Load (MW)', color='blue') |
| plt.fill_between(forecast_future['ds'], forecast_future['yhat_lower'], forecast_future['yhat_upper'], color='skyblue', alpha=0.3, label='Confidence Interval') |
| plt.xticks(rotation=45) |
| plt.xlabel("Date") |
| plt.ylabel("Load (MW)") |
| plt.title(f"Forecasted Load (Next {days} Days)") |
| plt.legend() |
| plt.tight_layout() |
| paths["Forecast Plot"] = f"forecast_plot_{days}.png" |
| plt.savefig(paths["Forecast Plot"]) |
| plt.close() |
|
|
| |
| plt.figure(figsize=(12, 4)) |
| plt.plot(df['ds'].tail(24 * 7), df['y'].tail(24 * 7), label='Actual Load (Past Week)', color='black') |
| plt.plot(forecast_future['ds'], forecast_future['yhat'], label='Forecast Load', color='green') |
| plt.xticks(rotation=45) |
| plt.title("Actual vs Forecast") |
| plt.xlabel("Date") |
| plt.ylabel("Load (MW)") |
| plt.legend() |
| plt.tight_layout() |
| paths["Actual vs Forecast"] = f"actual_vs_forecast_{days}.png" |
| plt.savefig(paths["Actual vs Forecast"]) |
| plt.close() |
|
|
| |
| df['hour'] = df['ds'].dt.hour |
| hourly_avg = df.groupby('hour')['y'].mean() |
| plt.figure(figsize=(10, 4)) |
| plt.plot(hourly_avg.index, hourly_avg.values, marker='o', linestyle='-', color='orange') |
| plt.title("Average Load by Hour of Day") |
| plt.xlabel("Hour") |
| plt.ylabel("Average Load (MW)") |
| plt.grid(True) |
| paths["Hourly Pattern"] = f"hourly_pattern.png" |
| plt.savefig(paths["Hourly Pattern"]) |
| plt.close() |
|
|
| |
| seasonality_fig = model.plot_components(forecast) |
| paths["Seasonality"] = f"seasonality_{days}.png" |
| seasonality_fig.savefig(paths["Seasonality"]) |
| plt.close() |
|
|
| |
| peak_row = forecast_future.loc[forecast_future['yhat'].idxmax()] |
| peak_time = peak_row['ds'] |
| peak_value = round(peak_row['yhat'], 2) |
| peak_info = f"🔺 Peak Demand Time: {peak_time} — {peak_value} MW" |
|
|
| return paths[graph_type], peak_info |
|
|
| |
| iface = gr.Interface( |
| fn=forecast_energy, |
| inputs=[ |
| gr.Radio([3, 7, 14], label="Select Forecast Period (Days)"), |
| gr.Dropdown(["Forecast Plot", "Actual vs Forecast", "Hourly Pattern", "Seasonality"], label="Select Graph Type") |
| ], |
| outputs=[ |
| gr.Image(type="filepath", label="Selected Plot"), |
| gr.Textbox(label="Peak Demand Info") |
| ], |
| title="Smart Energy Load Forecasting", |
| description="Choose forecast days and which graph you want to visualize." |
| ) |
|
|
| iface.launch(share=True) |
|
|