<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 Análise Exploratória da base REDD
Neste documento será realizada a Análise Exploratória de Dados (EDA) da base REDD utilizando a biblioteca NILMTK.
Base REDD
Convertendo os dados originais da base REDD em arquivo compatível (hdf5, contendo medições e metadata) com a NILMTK. Vale ressaltar que será considerado neste documento apenas as leituras de baixa frequência.
Step1:  Carregando os dados via NILMTK
Step2:  Explorando o objeto de dados  REDD
Primeiramente, é possível acessar os metadados do dataset, incluindo as informações sobre os dois modelos de medidores utilizados para a coleta dos dados
Step3:  É possível também acessar informações das residências em um objeto do tipo OrderedDict (indexado a partir de 1 porque todo dataset no NILMTK inicia o índice de buildingsem 1 e não 0)
Step4:  Cara residência possui algumas informações de metadata
Step5:  Ainda, cada residência possui um atributo elec que é o objeto MeterGroup (de fato, os medidores do tipo plugutilizado na mediçção de cada um dos dispositivos contemplados)
Step6:  Note que há dois objetos MeterGroups aninhados
Step7:  Colocar estes medidores em um objeto do tipo MeterGroup permite facilmente somar a demanda de energia registrada por ambos os medidores a fim de capturar a demanda total de energia para o dispositivo (mas é também muito fácil ver a demanda de energia individual registrada).
É fácil acessar um MeterGroup de submedidores (medição no nível de dispositivos) ou da(s) corrente(s) principais (mains)
Step8:  Neste caso, é possível capturar os dados de energia de ambas as correntes principais somadas
Step9:  No caso das medições individuais dos dispositivos
Step10:  Estatísticas para os MeterGroups
Proporção de energia submedida
Vamos verificar a proporção de energia submedida na residência 1
Step11:  Potência ativa, reativa e aparente
Vamos verificar os tipos de medida de energia que foram usadas para as medições (correntes principais e dispositivos)
Step12:  Energia Total da Residência 1
Step13:  Energia Total por Submedidor (Dispositivos da Resid. 1)
Step14:  NOTA
Step15:  Gráfico do Consumo de Energia de cada Dispositivo
Step16:  Diagrama Wiring
Step17:  Não é muito evidente, mas este diagrama mostra que os medidores (1, 2 - medidores das plantas) estão a montante de todos os outros medidores.
Residências da base REDD têm apenas dois níveis na sua 'hierarquia' de medidores (correntes principais - mains - e dispositivos individuais - submeters). Se houvessem mais que dois níveis, então seria útil obter apenas os medidores imediatamente a jusante de mains
Step18:  Gráfico de Utilização dos Dispositivos
Step19:  Informações e Estatísticas Individuais dos Medidores
A classe ElecMeter represente um medidor de eletricidade único. 
Cada ElecMeter possui uma lista de objetos Appliance (dispositivos) associados.  
ElecMeter possui muitos dos mesmos métodos estatísticos do MeterGroup tais como total_energy e available_power_ac_types and power_series and power_series_all_data.  
Vamos explorar mais algumas funções estatísticas...
Step20:  Medidor Imediatamente Superiores
Step21:  Metadata da Classe do Medidor
Step22:  Energia Total Consumida (kWh)
Step23:  Outras Informações
Se visualizarmos os dados de energia originais, poderemos observar que há um grande gap onde, supostamente, o medidor associado a este dispositivo parou de funcionar (vale ressaltar que, se aumentarmos o zoom, poderemos observar pequenos intervalos com este mesmo comportamento)
Step24:  Podemos automaticamente identificar 'good sections' (i.e. seções onde cada par de amostras consecutivas é menor que o valor de max_sample_period especificado no metadata do dataset)
Step25:  Os blocos mostram onde os dados são 'bons' (good). O gap branco é o largo intervalo em branco visto nos dados originais.
É possível também listar as 'good sections'
Step26:  Selecionando Subgrupos de Medidores
Usamos ElecMeter.select_using_appliances() para selecionar um novo MeterGroup usando um campo metadata.
Por exemplo, para pegar todas as máquinas secadores no dataset REDD (considerenado todas residências), fasemos o seguinte
Step27:  Ou selecionamos múltiplos dispositivos pelo tipo
Step28:  Ou então pela categoria dos dispositivos (por exemplo, os aquecedores)
Step29:  Selecionando um Único Dispositivo de um MeterGroup
Usamos o marcador [] para retornar um único dispositivo (objeto ElecMeter) de um MeterGroup.
Step30:  Gráfico de Consumo de Energia Individual
Step31:  Gráfico de Autocorrelação
Step32:  Consumo de Energia Diário de um Conjunto de Dispositivos
Considerando dispositivos do tipo 'forno elétrico'
Step33:  Dataframe de Correlação dos Dipositivos
<ASSISTANT_TASK:>
Python Code:
from nilmtk.dataset_converters import convert_redd
convert_redd('datasets/REDD/low_freq', 'datasets/REDD/low_freq.h5')
Explanation: Análise Exploratória da base REDD
Neste documento será realizada a Análise Exploratória de Dados (EDA) da base REDD utilizando a biblioteca NILMTK.
Base REDD
Convertendo os dados originais da base REDD em arquivo compatível (hdf5, contendo medições e metadata) com a NILMTK. Vale ressaltar que será considerado neste documento apenas as leituras de baixa frequência.
End of explanation
from nilmtk import DataSet
from nilmtk.utils import print_dict
redd = DataSet('datasets/REDD/low_freq.h5')
Explanation: Carregando os dados via NILMTK
End of explanation
print_dict(redd.metadata)
Explanation: Explorando o objeto de dados  REDD
Primeiramente, é possível acessar os metadados do dataset, incluindo as informações sobre os dois modelos de medidores utilizados para a coleta dos dados:
End of explanation
print_dict(redd.buildings)
Explanation: É possível também acessar informações das residências em um objeto do tipo OrderedDict (indexado a partir de 1 porque todo dataset no NILMTK inicia o índice de buildingsem 1 e não 0)
End of explanation
print_dict(redd.buildings[1].metadata)
Explanation: Cara residência possui algumas informações de metadata:
End of explanation
redd.buildings[1].elec
Explanation: Ainda, cada residência possui um atributo elec que é o objeto MeterGroup (de fato, os medidores do tipo plugutilizado na mediçção de cada um dos dispositivos contemplados):
End of explanation
elec = redd.buildings[1].elec
elec.nested_metergroups()
Explanation: Note que há dois objetos MeterGroups aninhados: um para o forno elétrico, e um para a secadora (ambos são dispositivos de 240 vol e possuem dois medidores por aparelho, dada a voltagem dos mesmos):
End of explanation
elec.mains()
Explanation: Colocar estes medidores em um objeto do tipo MeterGroup permite facilmente somar a demanda de energia registrada por ambos os medidores a fim de capturar a demanda total de energia para o dispositivo (mas é também muito fácil ver a demanda de energia individual registrada).
É fácil acessar um MeterGroup de submedidores (medição no nível de dispositivos) ou da(s) corrente(s) principais (mains):
End of explanation
elec.mains().power_series_all_data().head()
Explanation: Neste caso, é possível capturar os dados de energia de ambas as correntes principais somadas:
End of explanation
elec.submeters()
Explanation: No caso das medições individuais dos dispositivos:
End of explanation
elec.proportion_of_energy_submetered()
Explanation: Estatísticas para os MeterGroups
Proporção de energia submedida
Vamos verificar a proporção de energia submedida na residência 1:
End of explanation
mains = elec.mains() # Correntes principais
mains.available_ac_types('power')
elec.submeters().available_ac_types('power') # Dispositivos
next(elec.load()) # Verificando os dispositivos
Explanation: Potência ativa, reativa e aparente
Vamos verificar os tipos de medida de energia que foram usadas para as medições (correntes principais e dispositivos):
End of explanation
elec.mains().total_energy() # kWh
Explanation: Energia Total da Residência 1
End of explanation
energy_per_meter = elec.submeters().energy_per_meter() # kWh, again
energy_per_meter
Explanation: Energia Total por Submedidor (Dispositivos da Resid. 1)
End of explanation
# energy_per_meter é um DataFrame onde cada linha é um 
# tipo de energia ('active', 'reactive' or 'apparent').
# Todos os medidores de dispositivo na base REDD registros 
# do tipo 'active', então basta selecionar a linha 'active':
energy_per_meter = energy_per_meter.loc['active']
more_than_20 = energy_per_meter[energy_per_meter > 20]
more_than_20
instances = more_than_20.index
instances
Explanation: NOTA: o cabeçalho se refere aos números de instância dos objetos ElecMeter.
Selecione os medidores com base em seu consumo de energia
End of explanation
from matplotlib import rcParams
import matplotlib.pyplot as plt
%matplotlib inline
plt.style.use('ggplot')
rcParams['figure.figsize'] = (13, 10)
# Calculando proporção individual
fraction = elec.submeters().fraction_per_meter().dropna()
# Criando rótulos
labels = elec.get_labels(fraction.index)
# Plotando o gráfico
plt.figure(figsize=(10,30))
fraction.plot(kind='pie', labels=labels);
Explanation: Gráfico do Consumo de Energia de cada Dispositivo
End of explanation
elec.draw_wiring_graph()
Explanation: Diagrama Wiring
End of explanation
elec.meters_directly_downstream_of_mains()
Explanation: Não é muito evidente, mas este diagrama mostra que os medidores (1, 2 - medidores das plantas) estão a montante de todos os outros medidores.
Residências da base REDD têm apenas dois níveis na sua 'hierarquia' de medidores (correntes principais - mains - e dispositivos individuais - submeters). Se houvessem mais que dois níveis, então seria útil obter apenas os medidores imediatamente a jusante de mains:
End of explanation
#sns.set_palette("Set3", n_colors=12)
# Set a threshold to remove residual power noise when devices are off
elec.plot_when_on(on_power_threshold = 40)
Explanation: Gráfico de Utilização dos Dispositivos
End of explanation
fridge_meter = elec['fridge'] # Dados de medição do forno elétrico
Explanation: Informações e Estatísticas Individuais dos Medidores
A classe ElecMeter represente um medidor de eletricidade único. 
Cada ElecMeter possui uma lista de objetos Appliance (dispositivos) associados.  
ElecMeter possui muitos dos mesmos métodos estatísticos do MeterGroup tais como total_energy e available_power_ac_types and power_series and power_series_all_data.  
Vamos explorar mais algumas funções estatísticas...
End of explanation
fridge_meter.upstream_meter()
Explanation: Medidor Imediatamente Superiores
End of explanation
fridge_meter.device
Explanation: Metadata da Classe do Medidor
End of explanation
fridge_meter.total_energy() # kWh
Explanation: Energia Total Consumida (kWh)
End of explanation
fridge_meter.plot()
Explanation: Outras Informações
Se visualizarmos os dados de energia originais, poderemos observar que há um grande gap onde, supostamente, o medidor associado a este dispositivo parou de funcionar (vale ressaltar que, se aumentarmos o zoom, poderemos observar pequenos intervalos com este mesmo comportamento):
End of explanation
good_sections = fridge_meter.good_sections(full_results=True)
# full_results=False nos dá uma lista dimples de TimeFrames.  
# Mas queremos todos GoodSectionsResults para que seja possível plotar as 'good sections'...
good_sections.plot()
Explanation: Podemos automaticamente identificar 'good sections' (i.e. seções onde cada par de amostras consecutivas é menor que o valor de max_sample_period especificado no metadata do dataset):
End of explanation
good_sections.combined()
Explanation: Os blocos mostram onde os dados são 'bons' (good). O gap branco é o largo intervalo em branco visto nos dados originais.
É possível também listar as 'good sections':
End of explanation
import nilmtk
nilmtk.global_meter_group.select_using_appliances(type='washer dryer')
Explanation: Selecionando Subgrupos de Medidores
Usamos ElecMeter.select_using_appliances() para selecionar um novo MeterGroup usando um campo metadata.
Por exemplo, para pegar todas as máquinas secadores no dataset REDD (considerenado todas residências), fasemos o seguinte:
End of explanation
elec.select_using_appliances(type=['fridge', 'microwave'])
Explanation: Ou selecionamos múltiplos dispositivos pelo tipo:
End of explanation
nilmtk.global_meter_group.select_using_appliances(category='heating')
Explanation: Ou então pela categoria dos dispositivos (por exemplo, os aquecedores):
End of explanation
elec['fridge']
elec.select_using_appliances(type='fridge')
elec['light', 2]
Explanation: Selecionando um Único Dispositivo de um MeterGroup
Usamos o marcador [] para retornar um único dispositivo (objeto ElecMeter) de um MeterGroup.
End of explanation
redd.set_window(start='2011-04-21', end='2011-04-22')
elec.plot();
plt.xlabel("Time");
Explanation: Gráfico de Consumo de Energia Individual
End of explanation
import pandas as pd
from pandas.plotting import autocorrelation_plot
elec.mains().plot_autocorrelation() # Correntes principais
Explanation: Gráfico de Autocorrelação
End of explanation
fridges_restricted = nilmtk.global_meter_group.select_using_appliances(type='fridge')
daily_energy = pd.Series([meter.average_energy_per_period(offset_alias='D') 
                          for meter in fridges_restricted.meters])
# daily_energy.plot(kind='hist');
# plt.title('Histogram of daily fridge energy');
# plt.xlabel('energy (kWh)');
# plt.ylabel('occurences');
# plt.legend().set_visible(False)
daily_energy
Explanation: Consumo de Energia Diário de um Conjunto de Dispositivos
Considerando dispositivos do tipo 'forno elétrico':
End of explanation
correlation_df = elec.pairwise_correlation()
correlation_df
Explanation: Dataframe de Correlação dos Dipositivos
End of explanation
<END_TASK>