<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 NumPy
Step1:  La primera columna es un entero con formato "AAAAMMDD" que vamos a ignorar. Las temperaturas están medidas en décimas de grado Celsius, así que hay que pasarlas a grados Celsius. Vamos a calcular también la temperatura media.
Step2:  Como vamos a ignorar la columna de las fechas tenemos que crear un dominio para el eje x. Simplemente construiremos un array de enteros desde 0 hasta 365.
Step3:  Supongamos que ahora queremos guardar nuestra tabla de datos en un archivo txt, para poder cargarlo ya modificado más adelante. Una manera fácil de hacerlo sería con otra función de NumPy
Step4:  Ejercicio
Y ahora representamos la evolución de la temperatura media (por ejemplo de color negro), indicando "Daily summaries" en el título, "Days" en el eje x y "Temperature (C)" en el eje y, usando la interfaz orientada a objetos de matplotlib (función plt.subplots). Podemos crear una zona rellena entre la máxima y la mínima con la función fill_between(x, max, min) (por ejemplo de color #4f88b1). Si los límites del eje x no quedan como queremos podemos usar la función set_xlim(xmin, xmax).
Step5:  Ejemplo datos calidad del aire
Step6:  Cargando los datos
Step7:  Valores inexistentes
Step8:  Pintando los datos
Valores máximos  obtenidos de
Step9:  CO 
Máxima diaria de las medias móviles octohorarias
Step10:  O3
Máxima diaria de las medias móviles octohorarias
Step11:  ¿Cómo leeríamos un archivo sin usar NumPy?
<ASSISTANT_TASK:>
Python Code:
!head ../data/temperaturas.csv  # Esta línea no funciona en Windows
import numpy as np
%matplotlib inline
import matplotlib.pyplot as plt
datos = np.loadtxt("../data/temperaturas.csv",
                   skiprows=1,  # Saltamos una línea
                   usecols=(1, 2, 3),  # Solo columnas 2, 3 y 4
                   delimiter=',')  # Separados por comas
datos[:9]
Explanation: NumPy: Entrada/Salida
Con E/S (I/O en inglés) entendemos leer y escribir datos archivos. Es algo que necesitaremos hacer con relativa frecuencia, y en NumPy es muy sencillo de hacer. Para el caso de la lectura se usa la función np.loadtxt.
Ejemplo con datos de temperaturas
Para practicar, vamos a leer el archivo temperaturas.csv que contiene datos diarios de temperaturas en Nueva York entre el 1 de enero de 2013 y el 1 de enero de 2014, obtenidos gratuitamente de http://ncdc.noaa.gov/. Como los hemos descargado en formato CSV habrá que tener algunas precauciones a la hora de leer el archivo.
End of explanation
Tmax = datos[:, 1] / 10
Tmin = datos[:, 2] / 10
Tavg = (Tmax + Tmin) / 2
Explanation: La primera columna es un entero con formato "AAAAMMDD" que vamos a ignorar. Las temperaturas están medidas en décimas de grado Celsius, así que hay que pasarlas a grados Celsius. Vamos a calcular también la temperatura media.
End of explanation
x = np.arange(366)
Explanation: Como vamos a ignorar la columna de las fechas tenemos que crear un dominio para el eje x. Simplemente construiremos un array de enteros desde 0 hasta 365.
End of explanation
matriz_datos = np.zeros([366, 4])
matriz_datos[:, 0] = x
matriz_datos[:, 1] = Tmax
matriz_datos[:, 2] = Tmin
matriz_datos[:, 3] = Tavg
print(matriz_datos[:10])
# np.savetxt('archivo_datos.txt', matriz_datos, fmt='%.5f', newline = '\r\n')
Explanation: Supongamos que ahora queremos guardar nuestra tabla de datos en un archivo txt, para poder cargarlo ya modificado más adelante. Una manera fácil de hacerlo sería con otra función de NumPy: np.savetxt. Lo usaremos con los argumentos opcionales  fmt='%.5f', newline = '\r\n' para obtener un fichero bonito que podamos entender de un vistazo.
End of explanation
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.plot(x, Tavg, 'k')
ax.set_xlim(0, 366)
ax.fill_between(x, Tmin, Tmax, facecolor='#4f88b1', edgecolor='none')
ax.set_title("Resúmenes diarios")
ax.set_xlabel("Días")
ax.set_ylabel("Temperatura (C)")
Explanation: Ejercicio
Y ahora representamos la evolución de la temperatura media (por ejemplo de color negro), indicando "Daily summaries" en el título, "Days" en el eje x y "Temperature (C)" en el eje y, usando la interfaz orientada a objetos de matplotlib (función plt.subplots). Podemos crear una zona rellena entre la máxima y la mínima con la función fill_between(x, max, min) (por ejemplo de color #4f88b1). Si los límites del eje x no quedan como queremos podemos usar la función set_xlim(xmin, xmax).
End of explanation
from IPython.display import HTML
HTML('<iframe src="http://www.mambiente.munimadrid.es/sica/scripts/index.php" \
            width="700" height="400"></iframe>')
Explanation: Ejemplo datos calidad del aire
End of explanation
# Linux command 
!head ../data/barrio_del_pilar-20160322.csv
# Windows
#!gc log.txt | select -first 10 # head
# loading the data
# ./data/barrio_del_pilar-20160322.csv
data1 = np.genfromtxt('../data/barrio_del_pilar-20160322.csv', skip_header=3, delimiter=';', usecols=(2,3,4))
data1
Explanation: Cargando los datos
End of explanation
np.mean(data1, axis=0)
np.nanmean(data1, axis=0)
# masking invalid data
data1 = np.ma.masked_invalid(data1)
np.mean(data1, axis=0)
data2 = np.genfromtxt('../data/barrio_del_pilar-20151222.csv', skip_header=3, delimiter=';', usecols=(2,3,4))
data2 = np.ma.masked_invalid(data2)
Explanation: Valores inexistentes
End of explanation
plt.plot(data1[:, 1], label='2016')
plt.plot(data2[:, 1], label='2015')
plt.legend()
plt.hlines(200, 0, 200, linestyles='--')
plt.ylim(0, 220)
from IPython.display import HTML
HTML('<iframe src="http://ccaa.elpais.com/ccaa/2015/12/24/madrid/1450960217_181674.html" width="700" height="400"></iframe>')
Explanation: Pintando los datos
Valores máximos  obtenidos de: http://www.mambiente.munimadrid.es/opencms/export/sites/default/calaire/Anexos/valores_limite_1.pdf
NO2
Media anual: 40 µg/m3
Media horaria: 200 µg/m3
End of explanation
# http://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.convolve.html
def moving_average(x, N=8):
    return np.convolve(x, np.ones(N)/N, mode='same')
plt.plot(moving_average(data1[:, 0]), label='2016')
plt.plot(moving_average(data2[:, 0]), label='2015')
plt.hlines(10, 0, 250, linestyles='--')
plt.ylim(0, 11)
plt.legend()
Explanation: CO 
Máxima diaria de las medias móviles octohorarias: 10 mg/m³
End of explanation
plt.plot(moving_average(data1[:, 2]), label='2016')
#plt.plot(data1[:, 2])
plt.plot(moving_average(data2[:, 2]), label='2015')
#plt.plot(data2[:, 2])
plt.hlines(180, 0, 250, linestyles='--')
plt.ylim(0, 190)
plt.legend()
Explanation: O3
Máxima diaria de las medias móviles octohorarias: 120 µg/m3
Umbral de información. 180 µg/m3
Media horaria. Umbral de alerta. 240 µg/m3
End of explanation
data_file = '../data/barrio_del_pilar-20151222.csv'
data = []
with open(data_file) as f:
    # Saltamos las tres primeras líneas
    for ii in range(3):
        f.readline()
    
    for line in f:
        line_string = line
        line_list = line.split(';')
        
        date = line_list[0]
        hour = line_list[1]
        
        components_data = []
        for c in line_list[2:]:
            if '-' not in c:
                components_data.append(float(c))
            else:
                components_data.append(np.nan)
        data.append(components_data)
        
print(np.array(data))    
Explanation: ¿Cómo leeríamos un archivo sin usar NumPy?
End of explanation
<END_TASK>