#!/usr/bin/env python
# coding: utf-8

# # Calidad del dato 4

# ## Caso meteorología Madrid

# In[1]:


import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

import warnings
warnings.filterwarnings('ignore')

pd.options.display.float_format = '{:.2f}'.format #Desactivar notación científica en pandas:
np.set_printoptions(suppress=True) #Desactivar notación científica en numpy:
pd.set_option('display.max_columns', None) #comando para mostrar todas las columnas


# In[2]:


df1 = pd.read_csv("./datos/calidad_4.csv", sep=";", decimal=".", encoding="WINDOWS-1252")
df1.head()


# In[4]:


df1.describe()


# In[17]:


df1.info()


# In[30]:


df1.isnull().sum()


# In[3]:


# De momento tipamos la fecha correctamente
from datetime import datetime
df1['CET'] = pd.to_datetime(df1.CET)
df1.CET


# In[22]:


# ¿Qué pasa en Events? ¿Que no haya datos en esa columna, qué significa?


# In[44]:


df1[' Events']


# In[47]:


df1['Max TemperatureC']


# In[4]:


# Comprobamos mediante boxplot si tenemos valores perdidos
sns.boxplot(df1['Max TemperatureC'])
plt.show()
sns.boxplot(df1['Mean TemperatureC'])
plt.show()
sns.boxplot(df1['Min TemperatureC'])
plt.show()
sns.boxplot(df1['Max Humidity'])
plt.show()
sns.boxplot(df1[' Mean Humidity'])
plt.show()
sns.boxplot(df1[' Min Humidity'])
plt.show()
sns.boxplot(df1[' Max Sea Level PressurehPa'])
plt.show()
sns.boxplot(df1[' Mean Sea Level PressurehPa'])
plt.show()
sns.boxplot(df1[' Min Sea Level PressurehPa'])
plt.show()
sns.boxplot(df1[' Max Wind SpeedKm/h'])
plt.show()
sns.boxplot(df1[' Max Wind SpeedKm/h'])
plt.show()
sns.boxplot(df1[' Mean Sea Level PressurehPa'])
plt.show()
sns.boxplot(df1['Precipitationmm'])
plt.show()
sns.boxplot(df1['WindDirDegrees'])
plt.show()


# In[59]:


# Nos centramos en la variable Max Humidity
sns.boxplot(df1['Max Humidity'])


# In[5]:


# ¿Cuáles son esos 3 registros outliers?
# Modificamos la fórmula del script previo y extraemos los valores atípicos

def rangos_outliers(x):
    sorted(x)
    Q1,Q3 = np.percentile(x , [25,75])
    IQR = Q3 - Q1
    rango_inferior = Q1 - (1.5 * IQR)
    rango_superior = Q3 + (1.5 * IQR)
    return rango_inferior, rango_superior


# In[6]:


# Ejecutamos la función sobre la columna Max Humidity PERO debemos eliminar los NULOS,
# de otra manera, la función previa fallará.
rangos_outliers(df1.loc [df1['Max Humidity'].notnull(),'Max Humidity'])


# In[7]:


# Extraemos aquellos valores de Max Humidity menores que 29
outliers = df1.loc[df1['Max Humidity']<29, 'Max Humidity']
outliers.unique()


# In[8]:


# Seleccionamos los datos para estos valores y observamos que para esas observaciones la temperatura
# maxima era elevada, luego es muy posible que la humedad maxima estuviese en esos valores. 
# A la eleccion de cada uno, trabajar con ellos o tratarlos.

df2 = df1[df1['Max Humidity']<29]


# In[9]:


df2


# In[ ]:


# df3 = df1[df1['Max Humidity']==16]


# ## Tratamiento de los valores perdidos

# In[18]:


df1 = pd.read_csv("./datos/calidad_4.csv", sep=";", decimal=".", encoding="WINDOWS-1252")


# In[19]:


df1.isnull().sum()


# In[21]:


# Mediante los siguientes graficos  tambien podemos observar la cantidad 
# de valores perdidos
sns.heatmap(df1.isnull())


# In[22]:


import missingno as msno
msno.matrix(df1)


# ### 1. Eliminación de observaciones con valores perdidos.

# In[23]:


# Método radical
df31 = df1.dropna()
df31.isnull().sum()


# ### 2.Sustitución por la media

# In[24]:


df1.isnull().sum()


# In[49]:


df32 = df1.copy()


# In[50]:


filtro = df32['Max TemperatureC'].isnull()
df32['Max TemperatureC'][filtro] = df32['Max TemperatureC'].mean()


# In[51]:


df32.isnull().sum()


# In[55]:


filtro = df32['Mean TemperatureC'].isnull()
df32['Mean TemperatureC'][filtro] = df32['Mean TemperatureC'].mean()
filtro = df32['Min TemperatureC'].isnull()
df32['Min TemperatureC'][filtro] = df32['Min TemperatureC'].mean()
filtro = df32['Min TemperatureC'].isnull()
df32['Min TemperatureC'][filtro] = df32['Min TemperatureC'].mean()
filtro = df32['Max Humidity'].isnull()
df32['Max Humidity'][filtro] = df32['Max Humidity'].mean()
filtro = df32[' Mean Humidity'].isnull()
df32[' Mean Humidity'][filtro] = df32[' Mean Humidity'].mean()
filtro = df32[' Min Humidity'].isnull()
df32[' Min Humidity'][filtro] = df32[' Min Humidity'].mean()
df32.isnull().sum()


# ### 3. Imputación mediante la generación de datos sintéticos MICE

# In[ ]:


#!pip install fancyimpute
#!pip install miceforest


# In[56]:


from fancyimpute import IterativeImputer 
import miceforest as mf


# In[57]:


df33 = df1.copy()


# In[59]:


tmp = mf.MultipleImputedKernel(
    df33,
    datasets=1,
    save_all_iterations=True,
    random_state = 123)

tmp.mice(5)


# In[64]:


df33 = tmp.complete_data(0)


# In[65]:


df33.isnull().sum()

