pdtlem / app.py
aiwhisperer33's picture
Update app.py
6d0b9a1 verified
# app.py
import os
os.environ['TF_ENABLE_ONEDNN_OPTS'] = '0' # Suppress TensorFlow warnings
import gradio as gr
import pandas as pd
import numpy as np
from scipy.fft import fft, fftfreq
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense
import matplotlib.pyplot as plt
def load_data(input_source):
"""Handle both uploaded files and URLs"""
try:
if isinstance(input_source, str) and input_source.startswith("http"):
# Load from URL
df = pd.read_csv(
input_source,
engine='python',
on_bad_lines='warn',
encoding='utf-8'
)
else:
# Load from uploaded file
df = pd.read_csv(
input_source.name,
engine='python',
on_bad_lines='warn',
encoding='utf-8'
)
# Common cleaning steps
df = df.drop(columns=['Province/State', 'Lat', 'Long'], errors='ignore')
df = df.groupby('Country/Region').sum().T
df.index = pd.to_datetime(df.index)
df['Global'] = df.sum(axis=1)
return df['Global'].diff().fillna(0)
except Exception as e:
raise ValueError(f"Data loading failed: {str(e)}")
def analyze_data(input_source):
try:
if not input_source:
return "⚠️ Please upload a file or enter a URL", None
data = load_data(input_source)
# Cycle detection
N = len(data)
yf = fft(data.values)
xf = fftfreq(N, 1)[:N//2]
cycle_days = int(1/xf[np.argmax(np.abs(yf[0:N//2]))])
# Create plot
fig, ax = plt.subplots(figsize=(10, 4))
ax.plot(data.index, data.values, label='Daily Cases')
ax.set_title("COVID-19 Analysis")
ax.set_xlabel("Date")
ax.set_ylabel("New Cases")
ax.grid(True)
plt.tight_layout()
# Generate insights
latest_avg = data[-30:].mean()
trend = "↑ Rising" if data[-1] > data[-7] else "↓ Falling"
return (
f"πŸ” Analysis Results:\n"
f"- Dominant Cycle: {cycle_days} days\n"
f"- 30-Day Average: {latest_avg:.1f} cases/day\n"
f"- Current Trend: {trend}\n"
f"βœ… Analysis completed successfully!",
fig
)
except Exception as e:
return f"❌ Error: {str(e)}", None
# Create interface
with gr.Blocks(theme=gr.themes.Soft()) as app:
gr.Markdown("# 🦠 COVID-19 Analysis Bot")
gr.Markdown("Analyze case data from URLs or uploaded CSV files")
with gr.Row():
with gr.Column():
file_upload = gr.File(label="1. Upload CSV", file_count='single')
url_input = gr.Textbox(label="2. Or paste data URL here")
submit_btn = gr.Button("Analyze βž”")
with gr.Column():
chat_output = gr.Chatbot(label="Analysis Results", height=300)
plot_output = gr.Plot(label="Case Trend")
# Link components
submit_btn.click(
fn=analyze_data,
inputs=[gr.combine(file_upload, url_input)],
outputs=[chat_output, plot_output]
)
# Examples
gr.Examples(
examples=[
["https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/data/time_series_covid19_confirmed_global.csv"]
],
inputs=[url_input],
label="Try this example URL:"
)
if __name__ == "__main__":
app.launch()