import gradio as gr import pandas as pd import numpy as np from fetch_plot_data import get_plot_data def get_time_series_data(): # Fetch and process data plot_data = get_plot_data(hours=24) plot_data["datetime"] = pd.to_datetime(plot_data["datetime"]) time_series_data = pd.DataFrame({ "Datetime": plot_data["datetime"], "Actual BTC/USD": plot_data["labels"], "Predicted BTC/USD": plot_data["prediction"] }) time_series_data = time_series_data.sort_values(by="Datetime") time_series_data["Datetime"] = time_series_data["Datetime"].dt.strftime( "%Y-%m-%d %H:%M") all_values = np.concatenate([time_series_data["Actual BTC/USD"], time_series_data["Predicted BTC/USD"]]) y_min = np.min(all_values) y_max = np.max(all_values) y_range = y_max - y_min padding = y_range * 0.0005 y_min = y_min - padding y_max = y_max + padding long_data = time_series_data.melt( id_vars="Datetime", var_name="Series", value_name="BTC/USD Value" ) return (long_data, y_min, y_max) custom_css = """ body { background-color: #f8fafc !important; } .gradio-container { max-width: 1200px !important; margin: 2rem auto !important; padding: 2rem !important; background-color: white !important; border-radius: 1rem !important; box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06) !important; } .main-title { color: #1e293b !important; font-size: 2.5rem !important; font-weight: 700 !important; text-align: center !important; margin-bottom: 0.5rem !important; line-height: 1.2 !important; } .subtitle { color: #64748b !important; font-size: 1.125rem !important; text-align: center !important; margin-bottom: 1.5rem !important; font-weight: 500 !important; } .chart-container { margin-bottom: 1rem !important; } .footer-content { margin-top: 1rem !important; padding-top: 1rem !important; border-top: 1px solid #e2e8f0 !important; display: flex !important; justify-content: space-between !important; align-items: center !important; color: #64748b !important; font-size: 0.875rem !important; } .footer-left { text-align: left !important; } .footer-right { text-align: right !important; } .developer-info { color: #3b82f6 !important; font-weight: 500 !important; text-decoration: none !important; transition: color 0.2s !important; } .developer-info:hover { color: #2563eb !important; } """ # Initialize the Gradio app with gr.Blocks(css=custom_css, theme=gr.themes.Soft()) as app: with gr.Column(): # Title and subtitle gr.Markdown("""
Live BTC/USD Time Series Info
Predictions served via Hopsworks API
""") initial_data, initial_y_min, initial_y_max = get_time_series_data() # Chart with reduced bottom margin with gr.Column(elem_classes=["chart-container"]): line_plot = gr.LinePlot( value=initial_data, x="Datetime", y="BTC/USD Value", color="Series", title="", y_title="BTC/USD Value", x_title="Time", x_label_angle=45, width=1000, height=450, # Slightly reduced height colors={ "Actual BTC/USD": "#3b82f6", "Predicted BTC/USD": "#ef4444" }, tooltip=["Datetime", "BTC/USD Value", "Series"], overlay_point=True, zoom=False, pan=False, show_label=True, stroke_width=2, y_min=initial_y_min, y_max=initial_y_max, y_lim=[initial_y_min, initial_y_max], show_grid=True, ) # Footer with timestamp and developer info gr.Markdown(f""" """) # Launch the app app.launch()