El siguiente ejercicio te permitirá generar indicadores para el Estado de Aguascalientes, como base se va a utilizar la base de datos de la RNEAA.
In [1]:
# importar librerías
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
plt.style.use("ggplot")
In [2]:
# leer csv
df = pd.read_csv("/Users/jorgemauricio/Documents/Research/INIFAP_Course/data/ags_curso.csv")
In [3]:
# estructura del DataFrame
df.head()
Out[3]:
In [4]:
# información del DataFrame
df.info()
In [5]:
# información estadística del DataFrame
df.describe()
Out[5]:
In [6]:
# Generar columnas año, mes, día
df["year"] = pd.DatetimeIndex(df["fecha"]).year
df["month"] = pd.DatetimeIndex(df["fecha"]).month
df["day"] = pd.DatetimeIndex(df["fecha"]).day
In [7]:
# estructura del DataFrame
df.head()
Out[7]:
In [8]:
df.info()
In [9]:
# agrupar los datos por año-mes
grouped = df.groupby(["year","month"]).mean()["temt"]
In [10]:
grouped
Out[10]:
In [11]:
# desplegar la información en gráfica
grouped.plot()
Out[11]:
In [12]:
# modificar los parámetros para una mejor visualización
grouped.plot(figsize=(20,5))
Out[12]:
In [13]:
# agregar título a la gráfica
grouped.plot(title="Temperatura media mensual", figsize=(20,5))
Out[13]:
In [14]:
# modificar el tamaño de la letra
grouped.plot(title="Temperatura media mensual", figsize=(20,5), fontsize=8)
Out[14]:
In [15]:
# gráfica de caja y bigotes
grouped.plot(title="Temperatura media mensual", kind="box")
Out[15]:
In [16]:
# gráfica de área
grouped.plot(title="Temperatura media mensual", kind="area", figsize=(20,5))
Out[16]:
In [17]:
# gráfica histograma
grouped.plot(title="Temperatura media mensual", kind="hist", bins=50)
Out[17]:
In [18]:
# agrupar los datos por año-mes
grouped_temp_radg = df.groupby(["year","month"]).mean()[["temt","radg"]]
In [19]:
grouped_temp_radg
Out[19]:
In [20]:
# modificar los parámetros para una mejor visualización
grouped_temp_radg.plot(figsize=(20,5))
Out[20]:
In [21]:
# utilizamos el parametro secondary_y, para generar una gráfica con dos escalas de valores para Y
grouped_temp_radg.plot(figsize=(20,5),secondary_y="radg")
Out[21]:
In [22]:
grouped_temp_radg.plot(kind="box")
Out[22]:
In [23]:
# utilizamos el parametro secondary_y, para generar una gráfica con dos escalas de valores para Y
grouped_temp_radg.plot(figsize=(20,5),secondary_y="radg", kind="area")
Out[23]:
In [24]:
# agrupar los datos por año-mes media para temperatura y acumulado para radiación
# utilizamos el método .agg
grouped_temp_radg = df.groupby(["year","month"]).agg({"temt": "mean", "radg": "sum"})
In [25]:
grouped_temp_radg
Out[25]:
In [26]:
# utilizamos el parametro secondary_y, para generar una gráfica con dos escalas de valores para Y
grouped_temp_radg.plot(figsize=(20,5),secondary_y="radg")
Out[26]:
In [27]:
# agrupar los datos por año-mes media para temperatura y acumulado para radiación
# utilizamos el método .agg
grouped_temp_radg = df.groupby(["year","month","day"]).agg({"temt": "mean", "radg": "sum"})
In [28]:
# utilizamos el parametro secondary_y, para generar una gráfica con dos escalas de valores para Y
grouped_temp_radg.plot(figsize=(20,5),secondary_y="radg")
Out[28]:
In [29]:
# clasificar los datos a modo de tabla para desplegarlos en un heatmap
table = pd.pivot_table(df, values="radg", index=["year"], columns=["month"], aggfunc=np.sum)
In [30]:
# visualizar la tabla de datos
table
Out[30]:
In [31]:
sns.heatmap(table, cmap="jet")
Out[31]:
In [32]:
# clasificar los datos a modo de tabla para desplegarlos en un heatmap
table = pd.pivot_table(df, values="temt", index=["year"], columns=["month"], aggfunc=np.mean)
In [33]:
table
Out[33]:
In [34]:
sns.heatmap(table, cmap="jet")
Out[34]:
In [35]:
sns.heatmap(table, cmap="jet", linewidths=.2)
Out[35]:
In [36]:
sns.heatmap(table, cmap="jet", linewidths=.2, annot=True)
Out[36]:
In [40]:
# verificar estación con mayor número de registros
df["nombre"].value_counts().head()
Out[40]:
In [41]:
# selecionar solo los registros de la estación San Carlos
df_san_carlos = df.loc[df["nombre"] == "San Carlos"]
In [42]:
# verificar el corte de información
df_san_carlos.head()
Out[42]:
In [49]:
# agrupar la información por años
grouped_sc = df_san_carlos.groupby("year").mean()
In [50]:
plt.figure(figsize=(15,5))
plt.plot(grouped_sc["temt"])
plt.title("Temperatura media anual")
plt.xlabel("Año")
plt.ylabel("Temperatura promedio")
plt.show()
In [51]:
# Para modelar los datos, vamos a necesitar de la libreria sklearn
from sklearn.linear_model import LinearRegression as LinReg
In [52]:
# generar los valores para x y y
x = grouped_sc.index.values.reshape(-1, 1)
y = grouped_sc['temt'].values
In [53]:
# generar el modelo
reg = LinReg()
reg.fit(x, y)
y_preds = reg.predict(x)
print("Certeza: " + str(reg.score(x, y)))
In [63]:
# desplegar los valores
plt.figure(figsize = (15, 5))
plt.title("Regresión lineal")
plt.plot(x, y_preds)
plt.scatter(x, y, c = "b")
Out[63]:
In [64]:
# realizar una predicción
reg.predict(2019)
Out[64]:
In [ ]: