Spaces:
Runtime error
Runtime error
#%% | |
from matplotlib.pyplot import title | |
import tensorflow as tf | |
from tensorflow import keras | |
from huggingface_hub import from_pretrained_keras | |
import pandas as pd | |
import matplotlib.pyplot as plt | |
import streamlit as st | |
from zipfile import ZipFile | |
import os | |
import warnings | |
warnings.filterwarnings("ignore") | |
uri = "https://storage.googleapis.com/tensorflow/tf-keras-datasets/jena_climate_2009_2016.csv.zip" | |
zip_path = keras.utils.get_file(origin=uri, fname="jena_climate_2009_2016.csv.zip") | |
zip_file = ZipFile(zip_path) | |
zip_file.extractall() | |
csv_path = "jena_climate_2009_2016.csv" | |
df = pd.read_csv(csv_path) | |
#%% | |
title = "Timeseries forecasting for weather prediction" | |
st.title('Timeseries forecasting for weather prediction') | |
st.write("Demonstrates how to do timeseries forecasting using a [LSTM model.](https://keras.io/api/layers/recurrent_layers/lstm/#lstm-class)This space demonstration is forecasting for weather prediction. Observation is selected from validation dataset." ) | |
st.write("Keras example authors: [Prabhanshu Attri, Yashika Sharma, Kristi Takach, Falak Shah](https://keras.io/examples/timeseries/timeseries_weather_forecasting/)") | |
# %% model | |
titles = [ | |
"Pressure", | |
"Temperature", | |
"Temperature in Kelvin", | |
"Temperature (dew point)", | |
"Relative Humidity", | |
"Saturation vapor pressure", | |
"Vapor pressure", | |
"Vapor pressure deficit", | |
"Specific humidity", | |
"Water vapor concentration", | |
"Airtight", | |
"Wind speed", | |
"Maximum wind speed", | |
"Wind direction in degrees", | |
] | |
feature_keys = [ | |
"p (mbar)", | |
"T (degC)", | |
"Tpot (K)", | |
"Tdew (degC)", | |
"rh (%)", | |
"VPmax (mbar)", | |
"VPact (mbar)", | |
"VPdef (mbar)", | |
"sh (g/kg)", | |
"H2OC (mmol/mol)", | |
"rho (g/m**3)", | |
"wv (m/s)", | |
"max. wv (m/s)", | |
"wd (deg)", | |
] | |
date_time_key = "Date Time" | |
split_fraction = 0.715 | |
train_split = int(split_fraction * int(df.shape[0])) | |
step = 6 | |
past = 720 | |
future = 72 | |
learning_rate = 0.001 | |
batch_size = 256 | |
epochs = 10 | |
def normalize(data, train_split): | |
data_mean = data[:train_split].mean(axis=0) | |
data_std = data[:train_split].std(axis=0) | |
return (data - data_mean) / data_std | |
print( | |
"The selected parameters are:", | |
", ".join([titles[i] for i in [0, 1, 5, 7, 8, 10, 11]]), | |
) | |
selected_features = [feature_keys[i] for i in [0, 1, 5, 7, 8, 10, 11]] | |
features = df[selected_features] | |
features.index = df[date_time_key] | |
features.head() | |
features = normalize(features.values, train_split) | |
features = pd.DataFrame(features) | |
features.head() | |
train_data = features.loc[0 : train_split - 1] | |
val_data = features.loc[train_split:] | |
split_fraction = 0.715 | |
train_split = int(split_fraction * int(df.shape[0])) | |
step = 6 | |
past = 720 | |
future = 72 | |
learning_rate = 0.001 | |
batch_size = 256 | |
epochs = 10 | |
def normalize(data, train_split): | |
data_mean = data[:train_split].mean(axis=0) | |
data_std = data[:train_split].std(axis=0) | |
return (data - data_mean) / data_std | |
print( | |
"The selected parameters are:", | |
", ".join([titles[i] for i in [0, 1, 5, 7, 8, 10, 11]]), | |
) | |
selected_features = [feature_keys[i] for i in [0, 1, 5, 7, 8, 10, 11]] | |
features = df[selected_features] | |
features.index = df[date_time_key] | |
features.head() | |
features = normalize(features.values, train_split) | |
features = pd.DataFrame(features) | |
features.head() | |
train_data = features.loc[0 : train_split - 1] | |
val_data = features.loc[train_split:] | |
start = past + future | |
end = start + train_split | |
x_train = train_data[[i for i in range(7)]].values | |
y_train = features.iloc[start:end][[1]] | |
sequence_length = int(past / step) | |
x_end = len(val_data) - past - future | |
label_start = train_split + past + future | |
x_val = val_data.iloc[:x_end][[i for i in range(7)]].values | |
y_val = features.iloc[label_start:][[1]] | |
dataset_val = keras.preprocessing.timeseries_dataset_from_array( | |
x_val, | |
y_val, | |
sequence_length=sequence_length, | |
sampling_rate=step, | |
batch_size=batch_size, | |
) | |
#%% | |
model = from_pretrained_keras("keras-io/timeseries_forecasting_for_weather") | |
#%% | |
st.set_option('deprecation.showPyplotGlobalUse', False) | |
def plot(): | |
n = st.sidebar.slider("Step", min_value = 1, max_value=5, value = 1) | |
def show_plot(plot_data, delta, title): | |
labels = ["History", "True Future", "Model Prediction"] | |
marker = [".-", "rx", "go"] | |
time_steps = list(range(-(plot_data[0].shape[0]), 0)) | |
if delta: | |
future = delta | |
else: | |
future = 0 | |
plt.title(title) | |
for i, val in enumerate(plot_data): | |
if i: | |
plt.plot(future, plot_data[i], marker[i], markersize=10, label=labels[i]) | |
else: | |
plt.plot(time_steps, plot_data[i].flatten(), marker[i], label=labels[i]) | |
plt.legend(loc='lower center', bbox_to_anchor=(0.5, 1.05), | |
ncol=3, fancybox=True, shadow=True) | |
plt.xlim([time_steps[0], (future + 5) * 2]) | |
plt.xlabel("Time-Step") | |
plt.show() | |
return | |
for x, y in dataset_val.take(n): | |
show_plot( | |
[x[0][:, 1].numpy(), y[0].numpy(), model.predict(x)[0]], | |
12, | |
f"{n} Step Prediction", | |
) | |
fig = plot() | |
st.pyplot(fig) | |
# %% |