import gradio as gr import pandas as pd import plotly.graph_objects as go from sklearn.linear_model import LinearRegression from datetime import timedelta def plot_and_predict(zip, prediction_days): # Read and process the real estate data from Zillow df = pd.read_csv('https://files.zillowstatic.com/research/public_csvs/zhvi/Zip_zhvi_uc_sfrcondo_tier_0.33_0.67_sm_sa_month.csv') df = df[df['RegionName'] == int(zip)] df = df.loc[:, '2000-01-31':] df = df.T.reset_index() df.columns = ['Date', 'Price'] df['Date'] = pd.to_datetime(df['Date']) # Train linear regression model df['Timestamp'] = (df['Date'] - pd.Timestamp("1970-01-01")) // pd.Timedelta('1D') X = df['Timestamp'].values.reshape(-1, 1) y = df['Price'].values model = LinearRegression() model.fit(X, y) # Predict future prices last_timestamp = df['Timestamp'].iloc[-1] future_timestamps = [last_timestamp + i for i in range(1, prediction_days + 1)] predicted_prices = model.predict(pd.np.array(future_timestamps).reshape(-1, 1)) # Prepare data for plotting historical_prices_trace = go.Scatter( x=df['Date'], y=df['Price'], mode="lines", name="Historical Prices" ) future_dates = [df['Date'].iloc[-1] + timedelta(days=i) for i in range(1, prediction_days + 1)] predicted_prices_trace = go.Scatter( x=future_dates, y=predicted_prices, mode="lines", name="Predicted Prices" ) # Plot data fig = go.Figure() fig.add_trace(historical_prices_trace) fig.add_trace(predicted_prices_trace) fig.update_layout( title=f"Real Estate Price Prediction for Zip Code {zip}", xaxis_title="Date", yaxis_title="Price", legend_title_text="Data" ) return fig # Gradio interface interface = gr.Interface( fn=plot_and_predict, inputs=[ gr.Textbox(label="ZIP Code"), gr.Slider(minimum=1, maximum=365, step=1, label="Prediction Days"), ], outputs="plot" ) # Launch the app interface.launch(debug=True)