a10's picture
Update app.py
de5d5cf
raw
history blame
7.69 kB
#%%
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
if ("0" != "mycustom"):
import datetime
from io import StringIO
import warnings
warnings.filterwarnings("ignore")
if ("0" == "mycustom"):
os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"
os.environ["CUDA_VISIBLE_DEVICES"] = ""
if ("0" == "mycustom"):
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)
if ("0" == "mycustom"):
mybacklogmax = 10000
df = df.head(n=mybacklogmax)
st.dataframe(df)
if ("0" != "mycustom"):
myfields = [0, 1, 5, 7, 8, 10, 11]
myfields = [1]
mytitles = ["Date Time","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)"]
mybacklogmax = 10
atoday = datetime.date.today()
ayear = int(atoday.strftime("%Y"))-0
amonth = int(atoday.strftime("%m"))
amonthday = int(atoday.strftime("%d"))
csvString = ""
csvString += (",").join(mytitles)
adf = pd.DataFrame(columns=mytitles)
for i in range((ayear-mybacklogmax),ayear,1):
alink = ("https://data.weather.gov.hk/weatherAPI/opendata/opendata.php?dataType=CLMTEMP&year={}&rformat=csv&station=HKO").format(str(i))
df = pd.read_csv(alink, skiprows=[0,1,2], skipfooter=3, engine='python', on_bad_lines='skip')
df = df.reset_index() # make sure indexes pair with number of rows
for index, row in df.iterrows():
if (row[2]!=amonth) or (row[3]!=amonthday):
continue
adate = ("{:02d}.{:02d}.{} 00:00:00").format(row[3], row[2], row[1])
csvString += '\n'+(",").join([adate,"",str(row[4]),"","","","","","","","","","","",""])
st.write(row[0],adate)
adf = adf.append({"Date Time":adate,"T (degC)":(row[4]),}, ignore_index=True)
break
adf = pd.read_csv(StringIO(csvString), sep=",")
df = adf
st.dataframe(df)
#%%
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. *n* 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
if ("0" != "mycustom"):
past = 0
future = 1
batch_size = 1
step = 1
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]]
if ("0" != "mycustom"):
print(
"The selected parameters are:",
", ".join([titles[i] for i in myfields]),
)
selected_features = [feature_keys[i] for i in myfields]
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
if ("0" != "mycustom"):
past = 0
future = 1
batch_size = 1
step = 1
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]]
if ("0" != "mycustom"):
print(
"The selected parameters are:",
", ".join([titles[i] for i in myfields]),
)
selected_features = [feature_keys[i] for i in myfields]
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
if ("0" == "mycustom"):
x_train = train_data[[i for i in range(7)]].values
y_train = features.iloc[start:end][[1]]
if ("0" != "mycustom"):
x_train = train_data[[i for i in range(len(myfields))]].values
y_train = features.iloc[start:end][[0]]
sequence_length = int(past / step)
x_end = len(val_data) - past - future
label_start = train_split + past + future
st.write(label_start)
if ("0" == "mycustom"):
x_val = val_data.iloc[:x_end][[i for i in range(7)]].values
y_val = features.iloc[label_start:][[1]]
if ("0" != "mycustom"):
x_val = val_data.iloc[:x_end][[i for i in range(len(myfields))]].values
y_val = features.iloc[label_start:][[0]]
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):
if ("0" == "mycustom"):
show_plot(
[x[0][:, 1].numpy(), y[0].numpy(), model.predict(x)[0]],
12,
f"{n} Step Prediction",
)
if ("0" != "mycustom"):
show_plot(
[x[0][:, 0].numpy(), y[0].numpy(), model.predict(x)[0]],
12,
f"{n} Step Prediction",
)
fig = plot()
st.pyplot(fig)
# %%