File size: 2,480 Bytes
59f29f6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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

# Online Python - IDE, Editor, Compiler, Interpreter
import gradio as gr
import pandas as pd
import numpy as np
import pickle
import matplotlib.pyplot as plt
from sklearn.ensemble import IsolationForest

# Load trained model
with open("trained_model.pkl", "rb") as f:
    model = pickle.load(f)

# Load dataset
df = pd.read_csv("Electric_Production.csv")
df["DATE"] = pd.to_datetime(df["DATE"])
df.set_index("DATE", inplace=True)
df = df.asfreq("MS")
df["Lag_1"] = df["Value"].shift(1)
df["Lag_2"] = df["Value"].shift(2)
df["Month"] = df.index.month
df["Year"] = df.index.year
df.dropna(inplace=True)

# Fit Isolation Forest for anomaly detection
df["Timestamp"] = df.index.astype(np.int64) // 10**9
X_anom = df[["Timestamp", "Value"]]
iso_forest = IsolationForest(contamination=0.02, random_state=42)
df["Anomaly"] = iso_forest.fit_predict(X_anom)

# Prediction function
def forecast_electricity(lag1, lag2, month, year):
    input_df = pd.DataFrame([[lag1, lag2, month, year]], columns=["Lag_1", "Lag_2", "Month", "Year"])
    prediction = model.predict(input_df)[0]
    return f"🔮 Predicted Electricity Production: {prediction:.2f}"

# Plot function
def show_anomaly_plot():
    plt.figure(figsize=(10, 4))
    plt.plot(df.index, df["Value"], label="Electricity Production", color="blue")
    anomalies = df[df["Anomaly"] == -1]
    plt.scatter(anomalies.index, anomalies["Value"], color="red", label="Anomalies", s=30)
    plt.xlabel("Date")
    plt.ylabel("Electricity Production")
    plt.title("Anomaly Detection")
    plt.legend()
    plt.grid(True)
    plt.tight_layout()
    plt.savefig("anomaly_plot.png")
    return "anomaly_plot.png"

# Gradio UI
with gr.Blocks() as demo:
    gr.Markdown("## ⚡ Powecast-AI: Electricity Forecasting and Anomaly Detection")

    with gr.Row():
        with gr.Column():
            lag1 = gr.Number(label="Lag 1 (Previous Month)")
            lag2 = gr.Number(label="Lag 2 (Two Months Ago)")
            month = gr.Number(label="Month (1-12)")
            year = gr.Number(label="Year (e.g. 2025)")
            predict_btn = gr.Button("Predict")
            prediction_output = gr.Textbox(label="Forecast Output")

        with gr.Column():
            plot_btn = gr.Button("Show Anomaly Plot")
            plot_output = gr.Image()

    predict_btn.click(forecast_electricity, inputs=[lag1, lag2, month, year], outputs=prediction_output)
    plot_btn.click(show_anomaly_plot, outputs=plot_output)

# Launch the app
demo.launch()