from math import sqrt
from numpy import concatenate
import numpy as np
from matplotlib import pyplot
from pandas import read_csv
from pandas import DataFrame
from pandas import concat
from sklearn.metrics import r2_score
from sklearn.preprocessing import MinMaxScaler
from sklearn.preprocessing import LabelEncoder
from sklearn.metrics import mean_squared_error,mean_absolute_error
from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.layers import LSTM
import pandas as pd
import matplotlib.pyplot as plt
from keras.models import load_model
from sklearn.utils import shuffle
import tensorflow as tf
from tensorflow import keras
from datetime import datetime
import seaborn as sb
from pandas import Series
from math import sin,cos,radians
from numpy import arctan2


path_param= "Data Angin/dari_sensor_12_7_19.csv"
dataset = read_csv(path_param)
df = pd.DataFrame(dataset)
#print(df)
names = dataset.columns
values = dataset.values
dir_cos_val =[]
dir_sin_val =[]
dir_cos = np.array(values[:,-1],dtype=np.float)
for x in range(dir_cos.shape[0]):
    if dir_cos[x]>0 and dir_cos[x]<20:
       values[x,-1]=0
    if dir_cos[x] >340 and dir_cos[x] <= 360:
           values[x,-1] = 0
pyplot.plot(values[:,-1])
pyplot.plot(dir_cos)
pyplot.legend()
pyplot.show()
for x in range(dir_cos.shape[0]):
    ap=cos(radians(dir_cos[x]))
    dir_cos_val.append(ap)
for x in range(dir_cos.shape[0]):
    ap=sin(radians(dir_cos[x]))
    dir_sin_val.append(ap)
print(dir_cos_val)

#ensure all data is float
values = values.astype(float)
#values = values[:,:-1]
#inputs, target = values[:, :-1], values[:, -1]
normalizer = MinMaxScaler(feature_range=(0, 1))
normalized = normalizer.fit_transform(values)
print(normalized.shape)
dir_cos_val=np.array(dir_cos_val)
print(dir_cos_val.shape)
dir_cos_val = dir_cos_val.reshape((dir_cos_val.shape[0],1))
#normalized = concatenate((normalized, dir_cos_val), axis=1)
#df['dir']=target

print(normalized)

#split into train dan test sets
train_samples = 700
train = normalized[:train_samples, :]
test = normalized[train_samples:, :]

#split into inputs and outputs
train_X, train_y = train[:, :-1],train[:, -1]
test_X, test_y = test[:, :-1],test[:, -1]
print(train_X.shape)
#train_y = train_y.reshape((len(train_y), 1))
#test_y = test_y.reshape((len(test_y), 1))

#design network
model = Sequential()
model.add(Dense(2, activation='sigmoid', input_dim=5))
model.add(Dropout(0.15))
# model.add(Dense(5, activation='sigmoid'))
# model.add(Dropout(0.05))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='mae',
              optimizer='adam'
              , metrics=['mae'])

model.summary()
# logdir=datetime.now().strftime("%Y%m%d-%H%M%S")
# tensorboard_callback = keras.callbacks.TensorBoard(log_dir=logdir)
#fit network
history = model.fit(train_X, train_y, epochs=80, batch_size=2, validation_data=(test_X,test_y), verbose=2, shuffle=False,
                    #callbacks=[tensorboard_callback]
                    )

#evaluate model
scores =  model.evaluate(train_X,train_y, verbose=0)
print("%s: %.2f%%" % (model.metrics_names[1], scores[1]*100))

# plot history
pyplot.plot(history.history['loss'], label='train')
pyplot.plot(history.history['val_loss'], label='test')
pyplot.legend()
pyplot.show()
#model.save("model_18_7_19_5inputs_windparamk.h5")
# model=load_model("model_20percenterror_5inputs_windparamk.h5")
# model.summary()
#make prediction
print(test_X)
yhat = model.predict(test_X)
print(yhat)
#invert scaling
inv_yhat = concatenate((test_X, yhat), axis=1)
inv_yhat = normalizer.inverse_transform(inv_yhat)
inv_yhat = inv_yhat[:,-1]
print(inv_yhat)
# invert scaling for actual
test_y = test_y.reshape((len(test_y), 1))
inv_y = concatenate((test_X, test_y), axis=1)
inv_y = normalizer.inverse_transform(inv_y)
inv_y = inv_y[:,-1]
print(inv_y)

pyplot.plot(inv_yhat, label="predicted")
pyplot.plot(inv_y, label="desired")
pyplot.ylabel('degree')
pyplot.xlabel('time')
pyplot.legend()

# test_y=test_X[:,:-1]
# pyplot.scatter(test_X,test_y,color='black')
# pyplot.plot(test_X,inv_yhat,line_width=3,color='blue')
# #print("Saved model to disk")
# pyplot.xticks(())
# pyplot.yticks(())
# pyplot.show()
#culate RMSE
rmse = sqrt(mean_squared_error(inv_y, inv_yhat))
print('Test RMSE: %.3f' % rmse)

r_squared = r2_score(inv_y,inv_yhat)
print(r_squared)