<jupyter_start><jupyter_text><jupyter_code># Instalando o Arrow (caso você rode no Google Colab)
!pip install arrow
# Lendo as bibliotecas
from oauthlib.oauth2 import BackendApplicationClient
from requests_oauthlib import OAuth2Session
import numpy as np
import pandas as pd
import arrow
from pandas import json_normalize
import json
import glob
import matplotlib.pyplot as plt
# Definindo a funcoes para uso da API da plataforma
def get_data(application,guid,timestamp_init,timestamp_final):
    result = []
    i = 0
    lastlen=10000
    while timestamp_init < timestamp_final:
        stats = oauth.get("https://api.demo.konkerlabs.net/v1/{}/incomingEvents?q=device:{} timestamp:>{}&sort=oldest&limit=10000".format(application,guid, timestamp_init)).json()['result']
        if (len(stats)<2) and (lastlen<10000) :
            break
        timestamp_init = stats[-1]['timestamp']
        result.extend(stats)
        lastlen = len(stats)
        print(timestamp_init)
    return result

def list_devices(oauth):
    global base_api
    devices = oauth.get("https://api.demo.konkerlabs.net/v1/{}/devices/?size=5000".format(application)).json()['result']
    return devices
# Inserindo os dados da conta na plataforma (importante não passar esse notebook para pessoas externas)
base_api = 'https://api.demo.konkerlabs.net'
application = 'univesp'
username = "<EMAIL>"
password = '<PASSWORD>'
# Autenticando e pegando o token de acesso a conta
client = BackendApplicationClient(client_id=username)
oauth = OAuth2Session(client=client)
token = oauth.fetch_token(token_url='{}/v1/oauth/token'.format(base_api),client_id=username,client_secret=password)
# Listando os dispositivos dessa conta.
# Cada dispositivo possuí um sensor DHT22 e está localizado em um dos polos da Univesp.
# Existem dispositivos que não tem dados, pois nunca foram ligados, bem como alguns com dados intermitentes, que funcionam
# por um período e estão desligados por outros.
dev_list = list_devices(oauth)
# Vamos olhar agora os metadados de dispositivos.
dev_list
# Todos os dispositivos são identificados na plataforma pelo seu guid.
# Essa é a informação que você deve usar para baixar os dados de um dispositivo único
# Vamos examinar o dispositivo S8V0200A0B4B7 que está em São Paulo (-23.554597,-46.7333)
guid = '60e55023-91a9-4e85-b49c-e732b5e69318'
# Vamos dar uma olhada nos dados desse dispositivo no mês de junho e julho
data_inicial = '2020-06-01T00:00:00.000000'
data_final = '2020-08-01T00:00:00.000000'
dev_data = get_data(application, guid, data_inicial , data_final)
stats_df = json_normalize(dev_data).set_index('timestamp')
stats_df.index = pd.to_datetime(stats_df.index)
stats_df.index = stats_df.index.tz_convert('America/Sao_Paulo')
stats_df
# Vamos agora examinar os dados do dispositivo:
stats_df.groupby(['incoming.channel']).count()

# Os dispositivos tem 3 canais de dados independentes. 
# _health: envia os dados com relação a rede a qual o dispositivo está conectado e sobre os erros de leitura e envio dos dados;
# _networks: envia os dados com relação as redes wifi visíveis para o dispositivo (usado para reconstrução da posição);
# data: envia os dados de temperatura e umidade medidos pelo DHT22.
# Esses dados são gerados por processos distintos rodando no ESP8266, logo podem falhar de forma independente.
# Você vai notar que o DHT22 tem um índice de falha relativamente alto os dados dele não vão estar disponíveis em todo o intervalo.
# Vamos agora dar uma olhada nos dados de temperatura e umidade
fig, ax1 = plt.subplots(figsize=(20,10))
plt.rcParams.update({'font.size': 22})
plt.gca().xaxis_date('America/Sao_Paulo')
plt.rcParams['timezone'] = 'America/Sao_Paulo'
plt.title('Temperatura e umidade do dispositivo S8V0200A0B4B7', size=32,y=1.02)
ax1.plot(stats_df[stats_df['incoming.channel']=='data']['payload.temperature'], color='red',alpha=1, linewidth=1)
ax1.set_ylabel('Temperatura [$^\circ$C]', size=24, color = 'red')
ax1.set_xlabel('Data', size=24)
plt.grid()
for tl in ax1.get_yticklabels():
    tl.set_color('r')
    fig.tight_layout()
labels = ax1.get_xticklabels()
ax2 = ax1.twinx()
ax2.plot(stats_df[stats_df['incoming.channel']=='data']['payload.humidity'], color='blue', linewidth=1)
ax2.set_ylabel('Umidade [%]', size=24, color = 'blue')
for tl in ax2.get_yticklabels():
    tl.set_color('b')
fig.tight_layout()
labels = ax1.get_xticklabels()
plt.setp(labels, rotation=45, fontsize=22)
plt.show()

# No gráfico acima é possível observar um gap nos dados de mais de 30 dias.
# Vamos olhar apenas as primeiras semanas do gráfico:

# Vamos agora dar uma olhada nos dados de temperatura e umidade
fig, ax1 = plt.subplots(figsize=(20,10))
plt.rcParams.update({'font.size': 22})
plt.gca().xaxis_date('America/Sao_Paulo')
plt.rcParams['timezone'] = 'America/Sao_Paulo'
plt.title('Temperatura e umidade do dispositivo S8V0200A0B4B7', size=32,y=1.02)
ax1.plot(stats_df[stats_df['incoming.channel']=='data']['payload.temperature'][:20000], color='red',alpha=1, linewidth=1)
ax1.set_ylabel('Temperatura [$^\circ$C]', size=24, color = 'red')
ax1.set_xlabel('Data', size=24)
plt.grid()
for tl in ax1.get_yticklabels():
    tl.set_color('r')
    fig.tight_layout()
labels = ax1.get_xticklabels()
ax2 = ax1.twinx()
ax2.plot(stats_df[stats_df['incoming.channel']=='data']['payload.humidity'][:20000], color='blue', linewidth=1)
ax2.set_ylabel('Umidade [%]', size=24, color = 'blue')
for tl in ax2.get_yticklabels():
    tl.set_color('b')
fig.tight_layout()
labels = ax1.get_xticklabels()
plt.setp(labels, rotation=45, fontsize=22)
plt.show()<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.12126632087283133, 'fraction_numerical': 0.040243248077267035, 'mean_word_length': 5.6571428571428575, 'pattern_counts': {'":': 0, '<': 10, '<?xml version=': 0, '>': 8, 'https://': 3, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '1', 'dir': 'jupyter-structured-clean-dedup', 'id': '614319', 'license': 'MIT', 'n_tokens_mistral': 2159, 'n_tokens_neox': 2007, 'n_words': 516, 'path': 'dados_univesp_comentados.ipynb', 'repo_name': 'joseangelooliveira-br/Python3', 'size': '5605'}