Advertisement
Guest User

Untitled

a guest
Aug 16th, 2017
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.19 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2. """
  3. Created on Wed Aug 16 10:18:24 2017
  4.  
  5. @author: thanvaf
  6. """
  7. ### Libraries ###
  8. from influxdb import InfluxDBClient
  9. import pandas as pd
  10. import datetime
  11. from datetime import datetime, timedelta
  12. from datetime import timedelta
  13. import numpy as np
  14. import matplotlib.pyplot as plt
  15. import math
  16. from keras.models import Sequential
  17. from keras.layers import Dense
  18. from keras.layers import LSTM
  19. from sklearn.preprocessing import MinMaxScaler
  20. from sklearn.metrics import mean_squared_error
  21.  
  22. import time
  23.  
  24. ### Modules ###
  25. def roundTime(dt=None, roundTo=60):
  26. """Round a datetime object to any time laps in seconds
  27. dt : datetime.datetime object, default now.
  28. roundTo : Closest number of seconds to round to, default 1 minute.
  29. Author: Thierry Husson 2012 - Use it as you want but don't blame me.
  30. """
  31. if dt == None : dt = datetime.datetime.now()
  32. seconds = (dt.replace(tzinfo=None) - dt.min).seconds
  33. rounding = (seconds+roundTo/2) // roundTo * roundTo
  34. return dt + timedelta(0,rounding-seconds,-dt.microsecond)
  35.  
  36. def datetime_range(start, end, delta):
  37. current = start
  38. while current < end:
  39. yield current
  40. current += delta
  41.  
  42. # convert an array of values into a dataset matrix
  43. def create_dataset(dataset, look_back=1):
  44. dataX, dataY = [], []
  45. for i in range(len(dataset)-look_back-1):
  46. a = dataset[i:(i+look_back), 0]
  47. dataX.append(a)
  48. dataY.append(dataset[i + look_back, 0])
  49. return np.array(dataX), np.array(dataY)
  50. #==============================================================================
  51. # Database parameters
  52. #==============================================================================
  53. localhost = 'hydra.iti.gr'
  54. port = 8086
  55. username = 'root'
  56. password = 'root'
  57. databaseN = '90676b79_3273_400e_8b57_368ca37e9f8c'
  58. assignmentToken0 = '948a55d9-722e-4ec6-a176-8d1ea9c04c83'
  59. assignmentToken1 = '8962cf27-704d-4f32-8d44-ae67762ae87b'
  60. assignmentToken2 = '79c122e9-14ec-4ae4-a932-3efd208256cc'
  61. assignmentToken3 = '721b460c-ad4f-4921-a71f-0f87cfb69ef0'
  62. measurement = 'mx:kwhCons'
  63. time0 = 'time'
  64. #==============================================================================
  65. # Various parameters (Initialization)
  66. #==============================================================================
  67. listamin = [];listamax = []; listamedian = []
  68. #==============================================================================
  69. # Dates parameters
  70. #==============================================================================
  71. N = 31
  72. currentDate=datetime.utcnow()
  73. endDate=(currentDate - timedelta(days = 1)).strftime('%Y-%m-%dT23:59:59.999Z')
  74. startDate=(currentDate - timedelta(days = N)).strftime('%Y-%m-%dT00:00:00.000Z')
  75. #==============================================================================
  76. # Retrieve data from database based on specified parameters
  77. #==============================================================================
  78. client = InfluxDBClient(host = localhost, port = 8086, username = 'root', password = 'root', database = databaseN)
  79. q = ("""SELECT "{0}","{1}" FROM events WHERE assignment = '{2}' AND time>='{3}' AND time<='{4}'""".format(time0, measurement, assignmentToken0,startDate,endDate))
  80. #q = ("""SELECT "{0}" FROM events WHERE assignment = '{1}' AND time>='{2}T07:00:00Z' AND time<='{3}T13:51:00Z'""".format(measurement,assignmentToken1,start_date,end_date))
  81. df = pd.DataFrame(client.query(q, chunked=True).get_points())
  82. size = df.shape
  83. #==============================================================================
  84. # Time series of interest
  85. #==============================================================================
  86. # fix random seed for reproducibility
  87. np.random.seed(7)
  88.  
  89. timeSeries = df[measurement].astype(float)
  90. timeSeries = [[timeSeries[i]] for i in range(len(timeSeries)-500,len(timeSeries))]
  91. dataset = np.array(timeSeries)
  92. dataset = dataset.astype('float32')
  93. # normalize the dataset
  94. scaler = MinMaxScaler(feature_range=(0, 1))
  95. dataset = scaler.fit_transform(dataset)
  96.  
  97. # split into train and test sets
  98. train_size = int(len(dataset) * (1.0-0.192))
  99. test_size = len(dataset) - train_size
  100. train, test = dataset[0:train_size,:], dataset[train_size:len(dataset),:]
  101.  
  102. # reshape into X=t and Y=t+1
  103. look_back = 4
  104. trainX, trainY = create_dataset(train, look_back)
  105. testX, testY = create_dataset(test, look_back)
  106.  
  107. # reshape input to be [samples, time steps, features]
  108. trainX = np.reshape(trainX, (trainX.shape[0], 1, trainX.shape[1]))
  109. testX = np.reshape(testX, (testX.shape[0], 1, testX.shape[1]))
  110.  
  111. start = time.time()
  112.  
  113. hidden_neurons = 30
  114. epochs = 1500
  115.  
  116. # create and fit the LSTM network
  117. model = Sequential()
  118. model.add(LSTM(hidden_neurons, input_shape=(1, look_back))) # 3 is the number of LSTM blocks or neurons
  119. model.add(Dense(1))
  120. model.compile(loss='mean_squared_error', optimizer='adam', metrics = ['accuracy'])
  121.  
  122. history = model.fit(trainX, trainY, nb_epoch=epochs, batch_size=1, verbose=2)
  123.  
  124. end = time.time()
  125.  
  126. overall_time = end-start
  127. print overall_time
  128. # make predictions
  129. trainPredict = model.predict(trainX)
  130. testPredict = model.predict(testX)
  131. # invert predictions
  132. trainPredict = scaler.inverse_transform(trainPredict)
  133. trainY = scaler.inverse_transform([trainY])
  134. testPredict = scaler.inverse_transform(testPredict)
  135. testY = scaler.inverse_transform([testY])
  136. # calculate root mean squared error
  137. trainScore = math.sqrt(mean_squared_error(trainY[0], trainPredict[:,0]))
  138. print('Train Score: %.2f RMSE' % (trainScore))
  139. testScore = math.sqrt(mean_squared_error(testY[0], testPredict[:,0]))
  140. print('Test Score: %.2f RMSE' % (testScore))
  141.  
  142. # shift train predictions for plotting
  143. trainPredictPlot = np.empty_like(dataset)
  144. trainPredictPlot[:, :] = np.nan
  145. trainPredictPlot[look_back:len(trainPredict)+look_back, :] = trainPredict
  146. # shift test predictions for plotting
  147. testPredictPlot = np.empty_like(dataset)
  148. testPredictPlot[:, :] = np.nan
  149. testPredictPlot[len(trainPredict)+(look_back*2)+1:len(dataset)-1, :] = testPredict
  150. # plot baseline and predictions
  151. plt.plot(scaler.inverse_transform(dataset))
  152. plt.plot(trainPredictPlot)
  153. plt.plot(testPredictPlot)
  154. plt.legend(['Initial','Train','Test'],loc='best')
  155. plt.title('Epochs: '+str(epochs)+' Neurons: '+str(hidden_neurons)+' Lag: '+str(look_back))
  156. plt.show()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement