<jupyter_start><jupyter_text><jupyter_code>#Importando bibliotecas
import numpy as np
import pandas as pd
from datetime import datetime
from keras.models import Sequential
from keras.layers import Dense
from keras.wrappers.scikit_learn import KerasClassifier
from keras.utils import np_utils
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import KFold
from sklearn.preprocessing import RobustScaler
from sklearn.preprocessing import MinMaxScaler
from sklearn.preprocessing import LabelEncoder
#Nomes para as colunas
columns = ["Estacao","Data","Hora","Prec","TempMax","TempMin","Insolacao","EvapoPiche","TempCompMedia",
           "UmidRelatMedia", "VelocVento", "Missing"]

#Tipos de dados em cada coluna
types = {"Hora":np.uint16,"Prec":np.float64,"TempMax":np.float64,"TempMin":np.float64,"Insolacao":np.float64,
         "EvapoPiche":np.float64,"TempCompMedia":np.float64,"UmidRelatMedia":np.float64,"VelocVento":np.float64}

#Leitura do arquivo csv
dataSet = pd.read_csv("https://github.com/gilvandrocesardemedeiros/ClimatePrediction/raw/master/Dados_INMET/Diarios/INMET-Dados_Diarios_Natal_1968-2018.csv",
                      sep=';',skiprows=48, nrows = 27003, usecols = columns[1:11], names=columns, dtype = types)
#Transformando data em variável do tipo datetime
dataSet["Data"] = pd.to_datetime(dataSet["Data"], format = "%d/%m/%Y")
#Verificando dados
dataSet.head()
#Verificando o tipo dos dados
dataSet.dtypes
#Separando os dados em dois dataframes, um para as 00:00 h e outro para as 12:00 h
dataSet00, dataSet12 = dataSet[dataSet["Hora"] == 0], dataSet[dataSet["Hora"] == 1200]
#Verificando dataframe para os dados disponibilizados às 00:00 h
dataSet00.head()
#Verificando dataframe para os dados disponibilizados às 12:00 h
dataSet12.head()
#Transformando a data no índice de cada dataframe
dataSet00 = dataSet00.set_index("Data")
dataSet12 = dataSet12.set_index("Data")
#Descartando a coluna "Hora"
dataSet00, dataSet12 = dataSet00.drop(columns = "Hora"), dataSet12.drop(columns = "Hora")
#Juntando os dados em um mesmo dataframe (no caso, o dataSet00)
for i in dataSet00.index:
    try:
        dataSet00["Prec"].loc[i] = dataSet12["Prec"].loc[i]
        dataSet00["TempMin"].loc[i] = dataSet12["TempMin"].loc[i]
    except:
        print("Data " + str(i.day) + "/" + str(i.month) + "/" + str(i.year) + " Não encontrada!")
#Atribuindo à variável dataSet o DataFrame atualizado
dataSet = dataSet00
#Verificando dimensões do DataFrame
print(dataSet.shape)
#Eliminando dias que estejam faltando variáveis
dataSet = dataSet.dropna()
#Verificando dimensões do DataFrame após excluir linhas com problema
print(dataSet.shape)
#Transformando a coluna Data de volta em uma coluna de informações do dataSet
dataSet = dataSet.reset_index()<jupyter_output><empty_output><jupyter_text>Considerando os seguintes intervalos: - Outono: 20 de março a 21 de junho (fechado em 20/03 e aberto em 21/06)- Inverno: 21 de junho a 22 de setembro (fechado em 21/06 e aberto em 22/09)- Primavera: de 22 de setembro a 21 de dezembro (fechado em 22/09 e aberto em 21/12)- Verão: de 21 de dezembro a 20 de março (fechado em 21/12 e aberto em 20/03)<jupyter_code>#Função que retorna a estação do ano para uma determinada data
def season(data):
    if (data.month > 3 and data.month < 6) or (data.month == 3 and data.day >= 20) or (data.month == 6 and data.day < 21):
        return "Out"
    if (data.month > 6 and data.month < 9) or (data.month == 6 and data.day >= 21) or (data.month == 9 and data.day < 22):
        return "Inv"
    if (data.month > 9 and data.month < 12) or (data.month == 9 and data.day >= 22) or (data.month == 12 and data.day < 21):
        return "Pri"
    else:
        return "Ver"
#Identificando a estação do ano na base de dados e guardando a informação referente ao ano de cada dado
estacao, ano = [], []
for i in dataSet.index:
    estacao.insert(i, season(dataSet.loc[i, "Data"]))
    ano.insert(i, dataSet.loc[i,"Data"].year)
#Contando quantos dados existem para cada estação
print("Outono: " + str(estacao.count("Out")))
print("Inverno: " + str(estacao.count("Inv")))
print("Primavera: " + str(estacao.count("Pri")))
print("Verão: " + str(estacao.count("Ver")))
#Adicionando a estação do ano na base de dados
dataSet["Season"] = estacao
#Efetuando uma transformação simples nos dados referentes ao ano
ano = np.array(ano).astype(np.float64)
minMax = MinMaxScaler()
ano = minMax.fit_transform(ano.reshape(-1,1))
#Eliminando a coluna "Data" e visualizando dados
dataSet = dataSet.drop(columns="Data")
dataSet.head()
#Separando a variável que será prevista (Y) em função das demais variáveis (X) e convertendo-os em um ndarray
X = dataSet.drop(columns = "Season").values
Y = dataSet["Season"].values
#Efetuando uma transformação robusta nos dados - menor sensibilidade aos outliers
sc = RobustScaler(quantile_range = (10.0,90.0))
X = sc.fit_transform(X)
#Adicionando a coluna de informações referentes ao ano na base de dados X
X = np.append(X, ano, axis=1)
#Decodificando as estações em uma matriz (one hot encoding - dummy variables)
encoder = LabelEncoder()
encoder.fit(Y)
encoded_Y = encoder.transform(Y)
dummy_Y = np_utils.to_categorical(encoded_Y)
#Amostra da matriz de estações (cada coluna representa uma classe: verão, outono, inverno e primavera)
dummy_Y[70:80,:]
#Dimensões da matriz de dados
print(X.shape)
#Definindo uma função para fazer o Cross Validation com a MLP
def trainMLP():
    #Criando o modelo
    mlp = Sequential()
    #Adicionando a camada de entrada
    mlp.add(Dense(activation = 'tanh', input_dim = 9, units = 18, kernel_initializer = 'normal'))
    #Adicionando a segunda camada
    mlp.add(Dense(activation = 'tanh', units = 9, kernel_initializer = 'normal'))
    #Adicionando a camada de saída
    mlp.add(Dense(activation = 'softmax', units = 4, kernel_initializer='normal'))
    # Compilando o modelo
    mlp.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
    return mlp
#Modelo de classificação do Keras
estimator = KerasClassifier(build_fn=trainMLP, epochs=200, batch_size=5, verbose=1)
#Treinando a MLP com Cross Validation
kfold = KFold(n_splits=10, shuffle=True, random_state=7)
results = cross_val_score(estimator, X, dummy_Y, cv=10)
#Mostrando os resultados obtidos:
print("A taxa de acerto foi de: " + str(results.mean()))<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.11763784461152882, 'fraction_numerical': 0.031171679197994986, 'mean_word_length': 5.0983763132760265, 'pattern_counts': {'":': 9, '<': 15, '<?xml version=': 0, '>': 15, 'https://': 1, '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': '2', 'dir': 'jupyter-structured-clean-dedup', 'id': '603190', 'license': 'MIT', 'n_tokens_mistral': 2411, 'n_tokens_neox': 2243, 'n_words': 652, 'path': 'PredictSeasons_MLP.ipynb', 'repo_name': 'gilvandrocesardemedeiros/ClimatePrediction', 'size': '6384'}