|
import pandas as pd |
|
import numpy as np |
|
from datetime import datetime |
|
import matplotlib.pyplot as plt |
|
import gradio as gr |
|
from xgboost import XGBRegressor |
|
from sklearn.model_selection import train_test_split |
|
|
|
def simulate_factory_data(days=7, freq='H'): |
|
date_rng = pd.date_range(end=datetime.now(), periods=24 * days, freq=freq) |
|
df = pd.DataFrame(date_rng, columns=['ds']) |
|
df['temperature'] = np.random.normal(loc=70, scale=4, size=(len(date_rng))) |
|
anomaly_indices = np.random.choice(len(df), size=8, replace=False) |
|
df.loc[anomaly_indices, 'temperature'] += np.random.uniform(10, 20, size=8) |
|
return df |
|
|
|
def create_lag_features(df, lags=6): |
|
for i in range(1, lags + 1): |
|
df[f'lag_{i}'] = df['temperature'].shift(i) |
|
df = df.dropna().reset_index(drop=True) |
|
return df |
|
|
|
def forecast_temperature(hours): |
|
df = simulate_factory_data() |
|
df = create_lag_features(df) |
|
X = df[[f'lag_{i}' for i in range(1, 7)]] |
|
y = df['temperature'] |
|
model = XGBRegressor(n_estimators=100, learning_rate=0.1) |
|
model.fit(X, y) |
|
|
|
last_row = df.iloc[-1][[f'lag_{i}' for i in range(1, 7)]].values |
|
preds = [] |
|
for _ in range(int(hours)): |
|
pred = model.predict([last_row])[0] |
|
preds.append(pred) |
|
last_row = np.roll(last_row, -1) |
|
last_row[-1] = pred |
|
|
|
future_dates = pd.date_range(start=df['ds'].iloc[-1], periods=int(hours)+1, freq='H')[1:] |
|
fig, ax = plt.subplots(figsize=(10, 5)) |
|
ax.plot(df['ds'], df['temperature'], label='Actual') |
|
ax.plot(future_dates, preds, label='Forecast', color='orange') |
|
ax.axhspan(85, 100, color='red', alpha=0.1, label='Danger Zone') |
|
ax.set_title("Machine Temperature Forecast (XGBoost)") |
|
ax.set_xlabel("Time") |
|
ax.set_ylabel("Temperature (°C)") |
|
ax.legend() |
|
plt.tight_layout() |
|
return fig |
|
|
|
demo = gr.Interface( |
|
fn=forecast_temperature, |
|
inputs=gr.Slider(6, 48, value=24, step=1, label="Forecast Hours"), |
|
outputs=gr.Plot(label="Forecasted Temperature Chart"), |
|
title="Smart Factory AI Pipeline (XGBoost)", |
|
description="Forecast machine temperature using XGBoost. Red zone shows potential overheating." |
|
) |
|
|
|
if __name__ == "__main__": |
|
demo.launch() |
|
|