import epmwebapi as epm
import datetime as dt
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from datetime import datetime
sns.set(style="whitegrid")
%matplotlib inline
import os
credentials = os.environ.get('user_and_password_dili').split(';')
user = credentials[0]
password = credentials[1]
#cria conexao
epmConn = epm.EpmConnection('http://dili:44333', 'http://dili:44332', user, password)
#3 porque dados estão em UTC no server
iniTime = dt.datetime(2018, 9, 24, 3, 0, 0, 0)
endTime = iniTime + dt.timedelta(days=5)
list_df = []
paths = ['ADM_Temperature', 'ADM_TemperatureSP', 'ADM_ACCompr', 'ADM_ACVent']
processInterval = dt.timedelta(minutes=10)
#cria objeto queryperiod
queryPeriod = epm.QueryPeriod(iniTime, endTime)
aggInterpDetails = epm.AggregateDetails(processInterval, epm.AggregateType.Interpolative)
aggTimeAvgDetails = epm.AggregateDetails(processInterval, epm.AggregateType.TimeAverage)
for path in paths:
bv = epmConn.getDataObjects(path)
if path == 'ADM_Temperature':
result= bv[path].historyReadAggregate(aggTimeAvgDetails, queryPeriod)
else:
result= bv[path].historyReadAggregate(aggInterpDetails, queryPeriod)
#======================================================================================
# Transformação em DataFrame do pandas
#======================================================================================
#corrige o erro: ValueError: Big-endian buffer not supported on little-endian compiler
new_Quality = result[:]['Quality'].byteswap().newbyteorder()
new_Timestamp = result[:]['Timestamp']
new_Value = result[:]['Value'].byteswap().newbyteorder()
d = {'Value':new_Value, 'Timestamp':new_Timestamp, 'Quality':new_Quality}
df_original = pd.DataFrame(d)
#======================================================================================
# Converte de UTC PARA LOCALTIME
#======================================================================================
df_original['Timestamp'] = df_original['Timestamp'].dt.tz_convert('America/Sao_Paulo')
#array de dataframes
list_df.append(df_original)
epmConn.close()
type(list_df)
Filtro para horário comercial
filtered_df = []
for df in list_df:
mask = (
(df.Timestamp.dt.hour.between(8,11) | (df.Timestamp.dt.hour.between(13,18) ))
& (df.Quality == 0)
)
df_aux = df.loc[mask]
filtered_df.append(df_aux)
type(filtered_df)
df_01 = filtered_df[0][['Timestamp']].copy()
df_01['Temperatura'] = filtered_df[0][['Value']].copy()
df_01['TemperaturaSP'] = filtered_df[1][['Value']].copy()
df_01['Compressor'] = filtered_df[2][['Value']].copy()
df_01['Ventilacao'] = filtered_df[3][['Value']].copy()
df_01.describe()
def conforto(a):
if a>=24.5 and a<=25.5:
return 'dentro'
if a<24.5:
return 'abaixo'
else:
return 'acima'
df_01['conforto_termico'] = df_01.Temperatura.apply(conforto)
df_01.head()
df_01.describe(include='all')
grouped = df_01.groupby(['conforto_termico']).Temperatura.agg(['count', 'max', 'min'])
grouped
def make_autopct(values):
#values -> valores enviados
def my_autopct(pct):
#pct -> %
total = sum(values)
val = int(round(pct*total/100.0))
return '{p:.2f}%\n({v:d})'.format(p=pct,v=val)
return my_autopct
colors = ["#103547", "#296e8e", "#59a1c0", "#4F5559", "#7B858A", "#323531"]
##plt.close()
sub_plot = df_01.groupby(['conforto_termico']).Temperatura.count().plot(
kind='pie',
autopct=make_autopct(grouped['count']),
colors=colors,
textprops=dict(color="black", size= 20)
)
sub_plot.set_title('Conforto Térmico', size=20, color='white', weight="bold")
plt.axis('off')
grouped_01 = df_01.groupby(['conforto_termico', 'Compressor']).Compressor.agg(['count']).reset_index()
grouped_01
grouped_01.loc[grouped_01.conforto_termico=='abaixo']['count'].sum()
grouped_01.conforto_termico.tolist()
grouped_01['count'].tolist()
def make_autopct02(values):
#values -> valores enviados
def my_autopct(pct):
#pct -> %
total = sum(values)
val = int(round(pct*total/100.0))
return '{p:.2f}%\n({v:d})'.format(p=pct,v=val)
return my_autopct
labels = ['abaixo', 'acima', 'dentro']
colors = ["#FF7033", "#005885", "#FF3300"]
acima_sum = grouped_01.loc[grouped_01.conforto_termico=='abaixo']['count'].sum()
abaixo_sum = grouped_01.loc[grouped_01.conforto_termico=='acima']['count'].sum()
dentro_sum = grouped_01.loc[grouped_01.conforto_termico=='dentro']['count'].sum()
sizes = [acima_sum, abaixo_sum, dentro_sum]
labels_compressor = grouped_01.conforto_termico.tolist()
sizes_compressor = grouped_01['count'].tolist()
labels_legend = ['Desligado', 'Ligado']
colors_compressor = ['#FFA166', '#0195D0']
explode = (0.2,0.2,0.2)
explode_compressor = (0.1,0.65,0.1,0.65,0.1,0.65)
fig, ax = plt.subplots(figsize = (10,10),subplot_kw=dict(aspect="equal"))
#Plot
plt.pie(sizes, labels=labels, colors=colors,
startangle=90,
frame=True,
explode=explode,
radius=4,
autopct=make_autopct02(grouped_01['count']),
textprops=dict(size= 16,weight='bold'),
pctdistance=0.85,
labeldistance=1.1,
)
wedges, texts, autotexts = plt.pie(sizes_compressor,
# labels=labels_comp,
colors=colors_compressor,
startangle=90,
explode=explode_compressor,
radius=3,
autopct=make_autopct02(grouped_01['count'] ),
pctdistance=0.65,
textprops=dict(size= 16, weight='bold'),
#labeldistance=0.6,
#edgeprops=dict(width=0.5)
)
ax.legend(wedges,labels_legend,
title = 'Status Compressor',
title_fontsize= 18,
loc="lower right",
facecolor='#37474F',
edgecolor='#37474F',
fontsize=16 ,
)
# seta todas as fontes com branco
def myfunc(x):
return hasattr(x, 'set_color') and not hasattr(x, 'set_facecolor')
for o in fig.findobj(myfunc):
o.set_color('white')
centre_circle = plt.Circle((0,0),1.5,color='black', fc='#37474F',linewidth=0)
fig = plt.gcf()
fig.gca().add_artist(centre_circle)
ax.set_title("Conforto Térmico", fontsize=25, color='white')
fig.set_facecolor('#37474F')
plt.axis('equal')
plt.tight_layout()
plt.show()
from io import BytesIO
import mimetypes
import time
#cria conexao
epmConn = epm.EpmConnection('http://localhost:44333', 'http://localhost:44332', 'sa', 'Elipse21')
sio = BytesIO()
fig.savefig(sio, format="png", facecolor='#37474F')
epResourceManager = epmConn.getPortalResourcesManager()
reportPath = epResourceManager.getResource(u'webinar')
resource = reportPath.upload('pie_chart_current.png', sio,
'Figura enviada jupyter.',
mimetypes.types_map['.png'], overrideFile=True)
path = 'update_img'
bv = epmConn.getDataObjects(path)
wResult = bv[path].write(0, datetime.now(), 0 )
time.sleep(2)
wResult = bv[path].write(1, datetime.now(), 0 )
epmConn.close()