<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 AVISO
Step1:  FORZAMOS VALORES NUMERICOS. ALLI DONDE NO ES POSIBLE SERA PORQUE NO HABIA DATOS, O ERAN TEXTO. ESOS PASAN A SER NP.NAN, AHORA MAS ABAJO LES METEMOS EL VALOR MEDIO DE LA COLUMNA A LA QUE PERTENEZCAN. AUNQUE SE PUEDE VER ARRIBA QUE EL UNICO QUE LE AFECTA DE VERDAD ES A LA COLUMNA 'PART' QUE HA PERDIDO CASI 15000 VALORES, EL RESTO ESTAN BASTANTE BIEN
A continuacion hacemos lo siguiente
Step2:  ANALIZAMOS AHORA QUE VARIABLES INFLUYEN MAS EN LOS NIVELES DE NO2
Step3:  ANALIZAMOS AHORA QUE VARIABLES INFLUYEN MAS EN LOS NIVELES DE PARTICULAS
Step4:  ANALIZAMOS AHORA QUE VARIABLES INFLUYEN MAS EN LOS NIVELES DE S02
Step5:  ANALIZAMOS AHORA QUE VARIABLES INFLUYEN MAS EN LOS NIVELES DE O3
<ASSISTANT_TASK:>
Python Code:
import pandas as pd
import datetime
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics  import roc_auc_score
congr_datasetDF  = pd.DataFrame.from_csv('https://raw.githubusercontent.com/oslugr/contaminAND/master/datos/contaminAND-gr-congresos.csv').reset_index()
congr_datasetDF['date'] = congr_datasetDF['date'].apply(lambda x: pd.to_datetime(x,dayfirst = True))
congr_datasetDF
#OBTENEMOS DOS NUEVAS COLUMNAS CON EL DIA DE LA SEMANA Y LA HORA DEL DIA(EN MINUTOS)
congr_datasetDF['WEEKDAY'] = congr_datasetDF['date'].apply(lambda x: x.weekday())
congr_datasetDF['TIME_minutesofday'] = congr_datasetDF['date'].apply(lambda x: x.hour*60+x.minute)
congr_datasetDF = congr_datasetDF.drop(['date'],axis=1)
congr_datasetDF.info()
congr_datasetDF = congr_datasetDF.apply(lambda x: pd.to_numeric(x, errors='coerce'))
congr_datasetDF.isnull().any()
congr_datasetDF.isnull().sum()
Explanation: AVISO: ESTE JUPYTER NOTEBOOK VIENE DE UNA VERSION DE DATABRICKS NOTEBOOK. NO LO HE TESTEADO AQUI COMPLETAMENTE Y LA PARTE EN LA QUE SE APLICA RANDOM FORESTS PUEDE DAR ALGUN ERROR(AUNQUE NO CREO). LOS RESULTADOS SOBRE LOS QUE HABLO ABAJO SON LOS QUE ME HAN DADO A MI AL APLICAR EL ALGORITMO, Y AL VOLVERLO A EJECUTAR PUEDEN VARIAR UN POCO (PERO NO VARIARA SIGNIFICATIVAMENTE). EN EL PDF Y VERSION DE DATABRICKS QUE ACOMPAÑAN A ESTE NOTEBOOK SI VIENEN LOS RESULTADOS FINALES AL EJECUTAR EL ALGORITMO.
UTILIZAMOS RANDOM FORESTS PARA ANALIZAR LA RELACION ENTRE LAS DISTINTAS VARIABLES, ASI COMO LA INFLUENCIA QUE TIENEN LA HORA DEL DIA O EL DIA DE LA SEMANA. ESTE ALGORITMO NOS VA A DAR PARA CADA VARIABLE QUE ANALICEMOS (NO2,CO2,PART,03 Y SO2) CUALES SON LAS VARIABLES QUE MEJOR "EXPLICAN" A LA ANALIZADA. DE ESTA FORMA PODEMOS VER DE MANERA RAPIDA SI A GRAN ESCALA LOS DATOS TIENEN SENTIDO Y POR LO TANTO SE PUEDEN CONSIDERAR LAS MEDICIONES COMO FIABLES, O SI PRESENTAN ALGUNAS INCONGRUENCIAS. AQUI ANALIZAMOS SOLO LOS DATOS DEL PALACIO DE CONGRESOS PARA TODOS LOS DATOS QUE HAY DESDE 2009 HASTA MARZO DE 2017
End of explanation
def media(column):
    column = column.fillna(value=column.mean())
    return column
congr_datasetDF = congr_datasetDF.apply(media,axis=0)
#VARIABLE DUMMY EN FUCION DE SI ES FIN DE SEMANA O NO(CONSIDERADO COMO V-D)
def fin_semana(row):
    if ((row.WEEKDAY == 0) or (row.WEEKDAY >= 5 )):
        return 1
    else:
        return 0
congr_datasetDF['WEEKEND_VD'] = congr_datasetDF.apply(fin_semana,axis=1)
def fin_semana(row):
    if ((row.WEEKDAY == 0) or (row.WEEKDAY == 6)):
        return 1
    else:
        return 0
#VARIABLE DUMMY EN FUCION DE SI ES FIN DE SEMANA O NO(CONSIDERADO COMO S-D)
congr_datasetDF['WEEKEND_SD'] = congr_datasetDF.apply(fin_semana,axis=1)
congr_datasetDF
Explanation: FORZAMOS VALORES NUMERICOS. ALLI DONDE NO ES POSIBLE SERA PORQUE NO HABIA DATOS, O ERAN TEXTO. ESOS PASAN A SER NP.NAN, AHORA MAS ABAJO LES METEMOS EL VALOR MEDIO DE LA COLUMNA A LA QUE PERTENEZCAN. AUNQUE SE PUEDE VER ARRIBA QUE EL UNICO QUE LE AFECTA DE VERDAD ES A LA COLUMNA 'PART' QUE HA PERDIDO CASI 15000 VALORES, EL RESTO ESTAN BASTANTE BIEN
A continuacion hacemos lo siguiente:
    Limpiar el dataset y dejarlo preparado para que se pueda aplicar Random Forests.
    Añadir columnas relativas al dia de la semana, hora del dia y si es fin de semana o no (considerando V-D y solo S-D)
End of explanation
X_bis = congr_datasetDF.copy()
y = X_bis.pop('NO2')
    
model = RandomForestRegressor(n_estimators = 100,oob_score=True,n_jobs=-1)
model.fit(X_bis,y)
score = model.oob_score_
 
feature_importances = model.feature_importances_
feature_importances_Series = pd.Series(data=feature_importances,index=X_bis.columns).sort_values(ascending=False)
features = feature_importances_Series
print 'Precision del modelo para el analisis de la variable "NO2": ',score
print 'Variables que explican los valores de NO2 \n \n',features
Explanation: ANALIZAMOS AHORA QUE VARIABLES INFLUYEN MAS EN LOS NIVELES DE NO2
End of explanation
X_bis = congr_datasetDF.copy()
y = X_bis.pop('PART')
    
model = RandomForestRegressor(n_estimators = 100,oob_score=True,n_jobs=-1)
model.fit(X_bis,y)
score = model.oob_score_
 
feature_importances = model.feature_importances_
feature_importances_Series = pd.Series(data=feature_importances,index=X_bis.columns).sort_values(ascending=False)
features = feature_importances_Series
print 'Precision del modelo para el analisis de la variable "PART": ' ,score
print 'Variables que explican los valores de PART \n \n',features
Explanation: ANALIZAMOS AHORA QUE VARIABLES INFLUYEN MAS EN LOS NIVELES DE PARTICULAS
End of explanation
X_bis = congr_datasetDF.copy()
y = X_bis.pop('SO2')
    
model = RandomForestRegressor(n_estimators = 100,oob_score=True,n_jobs=-1)
model.fit(X_bis,y)
score = model.oob_score_
 
feature_importances = model.feature_importances_
feature_importances_Series = pd.Series(data=feature_importances,index=X_bis.columns).sort_values(ascending=False)
features = feature_importances_Series
print('Precision del modelo para el analisis de la variable "S02": ',score)
print 'Variables que explican los valores de S02 \n \n',features
Explanation: ANALIZAMOS AHORA QUE VARIABLES INFLUYEN MAS EN LOS NIVELES DE S02
End of explanation
X_bis = congr_datasetDF.copy()
y = X_bis.pop('O3')
    
model = RandomForestRegressor(n_estimators = 100,oob_score=True,n_jobs=-1)
model.fit(X_bis,y)
score = model.oob_score_
 
feature_importances = model.feature_importances_
feature_importances_Series = pd.Series(data=feature_importances,index=X_bis.columns).sort_values(ascending=False)
features = feature_importances_Series
print 'Precision del modelo para el analisis de la variable "O3": ',score
print 'Variables que explican los valores de 03 \n \n',features
Explanation: ANALIZAMOS AHORA QUE VARIABLES INFLUYEN MAS EN LOS NIVELES DE O3
End of explanation
<END_TASK>