<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 <table width="100%" border="0">
  <tr>    
  <td><img src="./images/ing.png" alt="" align="left" /></td>
  <td><img src="./images/ucv.png" alt="" align="center" height="100" width="100" /></td>
  <td><img src="./images/mec.png" alt="" align="right"/></td>
  </tr>
</table>
<br>
<h1 style="text-align
Step1:  Cargando los datos y explorándolos
Trabajaremos sobre un fichero de datos metereológicos de la Consejeria Agricultura Pesca y Desarrollo Rural Andalucía.
http
Step2:  Vemos que los datos no están en formato CSV, aunque sí tienen algo de estructura. Si intentamos cargarlos con pandas no tendremos mucho éxito
Step3:  Tenemos que hacer los siguientes cambios
Step4:  Las fechas también se pueden parsear de manera manual con el argumento
Step5:  Accediendo a los datos
Tenemos dos formas de acceder a las columnas
Step6:  Para acceder a las filas tenemos dos métodos
Step7:  Puedo incluso hacer secciones basadas en fechas
Step8:  También puedo indexar utilizando arrays de valores booleanos, por ejemplo procedentes de la comprobación de una condición
Step9:  Podemos agrupar nuestros datos utilizando groupby
Step10:  Y podemos reorganizar los datos utilizando pivot tables
Step11:  Por último, pandas proporciona métodos para calcular magnitudes como medias móviles usando el método rolling
Step12:  Plotting
Líneas
Step13:  Cajas
Step14:  Pintando la temperatura máxima de las máximas, mínima de las mínimas, media de las medias para cada día del año de los años disponnibles
Step15:  Visualizaciones especiales
<ASSISTANT_TASK:>
Python Code:
# Importamos pandas
%matplotlib inline
import pandas as pd
import matplotlib.pyplot as plt
Explanation: <table width="100%" border="0">
  <tr>    
  <td><img src="./images/ing.png" alt="" align="left" /></td>
  <td><img src="./images/ucv.png" alt="" align="center" height="100" width="100" /></td>
  <td><img src="./images/mec.png" alt="" align="right"/></td>
  </tr>
</table>
<br>
<h1 style="text-align: center;"> Curso de Python para Ingenieros Mecánicos </h1>
<h3 style="text-align: center;"> Por: Eduardo Vieira</h3>
<br>
<br>
<h1 style="text-align: center;">  Pandas - Estadística y análisis de datos </h1>
<br>
Carga y manipulación de datos con pandas
_ pandas es una biblioteca de análisis de datos en Python que nos provee de las estructuras de datos y herramientas para realizar análisis de manera rápida. Se articula sobre la biblioteca NumPy y nos permite enfrentarnos a situaciones en las que tenemos que manejar datos reales que requieren seguir un proceso de carga, limpieza, filtrado, reduccióń y análisis. _
En esta clase veremos como cargar y guardar datos, las características de las pricipales estructuras de pandas y las aplicaremos a algunos problemas.
End of explanation
# Vemos qué pinta tiene el fichero
!head ./tabernas_meteo_data.txt
Explanation: Cargando los datos y explorándolos
Trabajaremos sobre un fichero de datos metereológicos de la Consejeria Agricultura Pesca y Desarrollo Rural Andalucía.
http://www.juntadeandalucia.es
End of explanation
# Tratamos de cargarlo en pandas
pd.read_csv("./tabernas_meteo_data.txt").head(5)
Explanation: Vemos que los datos no están en formato CSV, aunque sí tienen algo de estructura. Si intentamos cargarlos con pandas no tendremos mucho éxito:
End of explanation
data = pd.read_csv(
    "./tabernas_meteo_data.txt",
    delim_whitespace=True,   # delimitado por espacios en blanco
    usecols=(0, 2, 3, 4, 5),  # columnas que queremos usar
    skiprows=2,  # saltar las dos primeras líneas
    names=['DATE', 'TMAX', 'TMIN', 'TMED', 'PRECIP'],
    parse_dates=['DATE'],
#     date_parser=lambda x: pd.datetime.strptime(x, '%d-%m-%y'),  # Parseo manual
    dayfirst=True,  # ¡Importante
    index_col=["DATE"]  # Si queremos indexar por fechas
)
# Ordenando de más antigua a más moderna
data.sort_index(inplace=True)
# Mostrando sólo las primeras o las últimas líneas
data.head()
# Comprobamos los tipos de datos de la columnas
data.dtypes
Explanation: Tenemos que hacer los siguientes cambios:
Separar los campos por un número arbitrario de espacios en blanco.
Saltar las primeras líneas.
Dar nombres nuevos a las columnas.
Descartar la columna del día del año (podemos calcularla luego).
Parsear las fechas en el formato correcto.
End of explanation
# Pedomos información general del dataset
data.info()
# Descripción estadística
data.describe()
# Una vez convertido en un objeto fecha se pueden obtener cosas como:
data.index.dayofweek
Explanation: Las fechas también se pueden parsear de manera manual con el argumento:
date_parser=lambda x: pd.datetime.strptime(x, '%d-%m-%y'),  # Parseo manual
End of explanation
# Accediendo como clave
data['TMAX'].head()
# Accediendo como atributo
data.TMIN.head()
# Accediendo a varias columnas a la vez
data[['TMAX', 'TMIN']].head()
# Modificando valores de columnas
data[['TMAX', 'TMIN']] / 10
# Aplicando una función a una columna entera (ej. media numpy)
import numpy as np
np.mean(data.TMAX)
# Calculando la media con pandas
data.TMAX.mean()
Explanation: Accediendo a los datos
Tenemos dos formas de acceder a las columnas: por nombre o por atributo (si no contienen espacios ni caracteres especiales).
End of explanation
# Accediendo a una fila por índice
data.iloc[1]
# Accediendo a una fila por etiqueta
data.loc["2016-09-02"]
Explanation: Para acceder a las filas tenemos dos métodos: .loc (basado en etiquetas), .iloc (basado en posiciones enteras) y .ix (que combina ambos).
End of explanation
data.loc["2016-12-01":]
Explanation: Puedo incluso hacer secciones basadas en fechas:
End of explanation
# Búsqueda de valores nulos
data.loc[data.TMIN.isnull()]
Explanation: También puedo indexar utilizando arrays de valores booleanos, por ejemplo procedentes de la comprobación de una condición:
End of explanation
# Agruparemos por año y día: creemos dos columnas nuevas
data['year'] = data.index.year
data['month'] = data.index.month
# Creamos la agrupación
monthly = data.groupby(by=['year', 'month'])
# Podemos ver los grupos que se han creado
monthly.groups.keys()
# Accedemos a un grupo
monthly.get_group((2016,3)).head()
# O hacemos una agregación de los datos:
monthly_mean = monthly.mean()
monthly_mean.head(24)
Explanation: Podemos agrupar nuestros datos utilizando groupby:
End of explanation
# Dejar los años como índices y ver la media mensual en cada columna
monthly_mean.reset_index().pivot(index='year', columns='month')
Explanation: Y podemos reorganizar los datos utilizando pivot tables:
End of explanation
# Calcular la media de la columna TMAX
monthly.TMAX.mean().head(15)
# Media trimensual centrada
monthly_mean.TMAX.rolling(3, center=True).mean().head(15)
Explanation: Por último, pandas proporciona métodos para calcular magnitudes como medias móviles usando el método rolling:
End of explanation
# Pintar la temperatura máx, min, med
data.plot(y=["TMAX", "TMIN", "TMED"])
plt.title('Temperaturas')
Explanation: Plotting
Líneas
End of explanation
data.loc[:, 'TMAX':'PRECIP'].plot.box()
Explanation: Cajas
End of explanation
group_daily = data.groupby(['month', data.index.day])
daily_agg = group_daily.agg({'TMED': 'mean', 'TMAX': 'max', 'TMIN': 'min', 'PRECIP': 'mean'})
daily_agg.head()
daily_agg.plot(y=['TMED', 'TMAX', 'TMIN'])
Explanation: Pintando la temperatura máxima de las máximas, mínima de las mínimas, media de las medias para cada día del año de los años disponnibles
End of explanation
# scatter_matrix
from pandas.tools.plotting import scatter_matrix
axes = scatter_matrix(data.loc[:, "TMAX":"TMED"])
# Esta celda da el estilo al notebook
from IPython.core.display import HTML
css_file = './css/aeropython.css'
HTML(open(css_file, "r").read())
Explanation: Visualizaciones especiales
End of explanation
<END_TASK>