#!/usr/bin/env python
# coding: utf-8

# In[ ]:


import pandas as pd
import numpy as np
import seaborn as sns
import tensorflow as tf
import matplotlib as mpl
import matplotlib.pyplot as plt
from keras.models import Sequential
from keras.layers import LSTM
from keras.layers import Dense, Dropout
from matplotlib import pyplot as plt
from sklearn.preprocessing import StandardScaler,MinMaxScaler
from keras.preprocessing.sequence import TimeseriesGenerator
from sklearn.model_selection import train_test_split
import tensorflow as tf


from google.colab import files
uploaded = files.upload()

import io
df = pd.read_csv(io.BytesIO(uploaded['filename.csv']))

df_input=df[['input parameters']]

scaler=MinMaxScaler()
data_scaled=scaler.fit_transform(df_input)

df = pd.DataFrame(data_scaled)
display(df)

features=data_scaled[:,:]
target=data_scaled[:,0]

TimeseriesGenerator(features,target,length=24,sampling_rate=1,batch_size=32)[0]

x_train, x_test, y_train, y_test = train_test_split(features,target,test_size=0.30, random_state=155, shuffle=False)

win_length=24
batch_size=32
num_features=10
train_generator = TimeseriesGenerator(x_train,y_train,length=win_length,sampling_rate=1,batch_size=batch_size)
test_generator = TimeseriesGenerator(x_test,y_test,length=win_length,sampling_rate=1,batch_size=batch_size)

train_generator[0]

model=tf.keras.Sequential()
model.add(tf.keras.layers.LSTM(128,input_shape=(win_length,num_features),return_sequences=True))
model.add(tf.keras.layers.LeakyReLU(alpha=0.5))
model.add(tf.keras.layers.LSTM(128,return_sequences=True))
model.add(tf.keras.layers.LeakyReLU(alpha=0.5))
model.add(tf.keras.layers.Dropout(0.3))
model.add(tf.keras.layers.LSTM(64, return_sequences=False))
model.add(tf.keras.layers.Dropout(0.3))
model.add(tf.keras.layers.Dense(1))

model.summary()


early_stopping=tf.keras.callbacks.EarlyStopping(monitor='val_loss',patience=5, mode='min')

from keras import backend as K

def coeff_determination(x_train, x_test):
    SS_res =  K.sum(K.square(x_train-x_test )) 
    SS_tot = K.sum(K.square( x_train - K.mean(x_train) ) ) 
    return ( 1 - SS_res/(SS_tot + K.epsilon()) )

model.compile(optimizer='adam',loss="mse",metrics=[coeff_determination])
history = model.fit_generator(train_generator, epochs=20, validation_data=test_generator,shuffle=False,callbacks=[early_stopping])


model.evaluate_generator(test_generator,verbose=0)

predictions=model.predict_generator(test_generator)

x_test[:,1:][win_length:]

df_pred=pd.concat([pd.DataFrame(predictions),pd.DataFrame(x_test[:,1:,][win_length:])], axis=1)

rev_trans=scaler.inverse_transform(df_pred)

df_final=df_input[predictions.shape[0]*-1:]

df_final['prediction name']=rev_trans[:,0]

df5=df_final

