import epmwebapi as epm
import datetime as dt
import numpy as np
import pandas as pd
import math
import os
credentials = os.environ.get('user_and_password').split(';')
user = credentials[0]
password = credentials[1]
epmConn = epm.EpmConnection('http://localhost:44333', 'http://localhost:44332', user, password)
iniTime = dt.datetime(2016, 1, 1, 0, 0, 0, 0)
endTime = iniTime + dt.timedelta(days=3)
path = 'R80711_Wind_direction'
bv = epmConn.getDataObjects(path)
#cria objeto queryperiod
queryPeriod = epm.QueryPeriod(iniTime, endTime)
#aplica o objeto um historyReadRaw com o queryPeriod na basicVariable selecionada
result_direction = bv[path].historyReadRaw(queryPeriod)
#quantidade de dados buscandos
print(len(result_direction))
#fechando a conexão
connection.close()
path = 'R80711_Wind_speed'
bv = epmConn.getDataObjects(path)
#cria objeto queryperiod
queryPeriod = epm.QueryPeriod(iniTime, endTime)
#aplica o objeto um historyReadRaw com o queryPeriod na basicVariable selecionada
result_speed = bv[path].historyReadRaw(queryPeriod)
#quantidade de dados buscandos
print(len(result_speed))
path = 'R80711_Active_power'
bv = epmConn.getDataObjects(path)
#cria objeto queryperiod
queryPeriod = epm.QueryPeriod(iniTime, endTime)
#aplica o objeto um historyReadRaw com o queryPeriod na basicVariable selecionada
result_power = bv[path].historyReadRaw(queryPeriod)
#quantidade de dados buscandos
print(len(result_power))
corrige o problema: ValueError: Big-endian buffer not supported on little-endian compiler para ser possível transformar os dados vindos do EPM em um Dataframe Pandas
#Direction
new_Quality = result_direction[:]['Quality'].byteswap().newbyteorder()
new_Timestamp = result_direction[:]['Timestamp']
new_Value = result_direction[:]['Value'].byteswap().newbyteorder()
d = {'Value':new_Value, 'Timestamp':new_Timestamp, 'Quality':new_Quality}
df_direction = pd.DataFrame(d)
#Speed
new_Quality = result_speed[:]['Quality'].byteswap().newbyteorder()
new_Timestamp = result_speed[:]['Timestamp']
new_Value = result_speed[:]['Value'].byteswap().newbyteorder()
d = {'Value':new_Value, 'Timestamp':new_Timestamp, 'Quality':new_Quality}
df_speed = pd.DataFrame(d)
#Active Power
new_Quality = result_power[:]['Quality'].byteswap().newbyteorder()
new_Timestamp = result_power[:]['Timestamp']
new_Value = result_power[:]['Value'].byteswap().newbyteorder()
d = {'Value':new_Value, 'Timestamp':new_Timestamp, 'Quality':new_Quality}
df_power = pd.DataFrame(d)
Mostra o formato dos dados, para esse caso são 432 linhas por 3 colunas
df_direction.shape
df_direction.describe(include='all')
Para esse exemplo nenhuma linha foi removida porque o conjunto de dados não possuia valores NaN
df_direction_01 = df_direction.dropna(how='any')
df_direction_01.shape
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
#Configuração da Paleta de cores e estilo
sns.set(palette="tab10_r", color_codes=True)
current_palette_7 = sns.color_palette("GnBu_d",2)
sns.set_palette(current_palette_7)
Histrograma mostrando a distribuição dos dados.
Nele é possivel notar que existe uma grande quantidade de dados com valores entre 200 e 230 que representam a direção do vento Sudoeste
#geração do gráfico
ax=sns.distplot(df_direction_01['Value'], kde=True, bins=15)
fig = ax.get_figure()
Adicionando os dados de velocidade do vento, geramos um gráfico polar que mostra a dispersão da Direção e Velocidade.
Com essa visualização confirmamos o que o histograma indicou(maior distribuição de ventos Sudoeste) e ainda apresenta a velocidade do vento em cada direção(quanto mais afastado do centro, maior a velocidade)
speed, direction = df_speed.Value, list(map(math.radians, df_direction.Value.tolist())),
ax1 = plt.subplot(111, polar=True)
ax1.set_theta_zero_location('N')
ax1.set_theta_direction(-1)
ax1.grid(True)
ax1.xaxis.set_ticklabels(['N',r"$45^{o}$",'E',r"$135^{o}$",'S',r"$225^{o}$",'W', r"$315^{o}$"])
ax1.set_title("Wind direction\n", va='bottom')
ax1.plot(direction, speed, 'b.')
plt.show()
Por fim adicionamos os dados de Potência Ativa ao gráfico, e com isso visualizamos em quais direções houve a maior geração de energia(quanto maior o circulo, maior a geração).
power = df_power.Value
colors = power/1000.
area = np.pi * speed**2
ax1 = plt.subplot(111, polar=True)
ax1.set_theta_zero_location('N')
ax1.set_theta_direction(-1)
ax1.xaxis.set_ticklabels(['N',r"$45^{o}$",'E',r"$135^{o}$",'S',r"$225^{o}$",'W', r"$315^{o}$"])
c = plt.scatter(direction, speed, c=colors, s=area, cmap=plt.cm.hsv)
c.set_alpha(0.75)
plt.show()
fig = ax1.get_figure()