Taller reducción de dimensionalidad#
TS: Temperatura. Earth Skin Temperature
RH2M: Humedad relativa 2m
WS50M: Viento 50m
PRECTOTCORR: Precipitación promedio
ALLSKY_SFC_SW_DWN: Irradiancia
import json
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
# Cargar el archivo JSON
with open("POWER_Point_Monthly_19810101_20221231_006d24N_075d58W_UTC.json", "r") as file:
data = json.load(file)
# Extraer las variables principales
properties = data["properties"]
# Extraer las seis variables
variables = properties["parameter"]
# Crear un DataFrame con las variables extraídas
df = pd.DataFrame(variables)
df.head()
TS | RH2M | WS50M | PRECTOTCORR_SUM | ALLSKY_SFC_SW_DWN | |
---|---|---|---|---|---|
198101 | 16.38 | 88.00 | 1.39 | 100.20 | -999.0 |
198102 | 16.79 | 89.31 | 1.34 | 195.12 | -999.0 |
198103 | 17.50 | 88.06 | 1.24 | 295.31 | -999.0 |
198104 | 17.27 | 90.44 | 1.42 | 358.59 | -999.0 |
198105 | 16.90 | 92.88 | 1.31 | 411.33 | -999.0 |
# Renombrar las variables en el DataFrame
df.rename(
columns={
"TS": "Temperatura",
"RH2M": "Humedad relativa 2m",
"WS50M": "Viento 50m",
"PRECTOTCORR_SUM": "Precipitación",
"ALLSKY_SFC_SW_DWN": "Irradiancia",
},
inplace=True,
)
df.head()
Temperatura | Humedad relativa 2m | Viento 50m | Precipitación | Irradiancia | |
---|---|---|---|---|---|
198101 | 16.38 | 88.00 | 1.39 | 100.20 | -999.0 |
198102 | 16.79 | 89.31 | 1.34 | 195.12 | -999.0 |
198103 | 17.50 | 88.06 | 1.24 | 295.31 | -999.0 |
198104 | 17.27 | 90.44 | 1.42 | 358.59 | -999.0 |
198105 | 16.90 | 92.88 | 1.31 | 411.33 | -999.0 |
# Convertir el índice a formato de texto para filtrar filas
df.index = df.index.astype(str)
# Filtrar filas cuyo índice no termine en '13'
df = df[~df.index.str.endswith("13")]
# Convertir el índice de vuelta a formato de fecha y cambiar el formato a año/mes
df.index = pd.to_datetime(df.index, format="%Y%m").strftime("%Y/%m")
df.head()
Temperatura | Humedad relativa 2m | Viento 50m | Precipitación | Irradiancia | |
---|---|---|---|---|---|
1981/01 | 16.38 | 88.00 | 1.39 | 100.20 | -999.0 |
1981/02 | 16.79 | 89.31 | 1.34 | 195.12 | -999.0 |
1981/03 | 17.50 | 88.06 | 1.24 | 295.31 | -999.0 |
1981/04 | 17.27 | 90.44 | 1.42 | 358.59 | -999.0 |
1981/05 | 16.90 | 92.88 | 1.31 | 411.33 | -999.0 |
# Contar el total de datos por variable
total_counts = df.count()
print(total_counts)
# Verificar si hay datos faltantes (NaN) y contarlos
nan_counts = df.isna().sum()
print(nan_counts)
Temperatura 504
Humedad relativa 2m 504
Viento 50m 504
Precipitación 504
Irradiancia 504
dtype: int64
Temperatura 0
Humedad relativa 2m 0
Viento 50m 0
Precipitación 0
Irradiancia 0
dtype: int64
# Realizar el análisis descriptivo de las variables
descriptive_analysis = df.describe()
# Mostrar el análisis descriptivo
print(descriptive_analysis)
Temperatura Humedad relativa 2m Viento 50m Precipitación count 504.000000 504.000000 504.000000 504.000000 mean 17.267044 88.761171 1.468512 223.256766 std 0.613532 2.608982 0.172959 96.200608 min 15.810000 74.750000 1.020000 5.270000 25% 16.837500 87.620000 1.360000 152.930000 50% 17.225000 89.250000 1.440000 221.480000 75% 17.650000 90.440000 1.570000 295.310000 max 19.970000 94.250000 2.040000 479.880000 Irradiancia count 504.000000 mean -66.716389 std 258.826222 min -999.000000 25% 4.580000 50% 4.910000 75% 5.292500 max 6.200000
# Eliminar filas donde cualquier variable tenga el valor -999.000000
df = df[(df != -999.000000).all(axis=1)]
# Realizar el análisis descriptivo de las variables
descriptive_analysis = df.describe()
# Mostrar el análisis descriptivo
print(descriptive_analysis)
Temperatura Humedad relativa 2m Viento 50m Precipitación count 468.000000 468.000000 468.000000 468.000000 mean 17.290021 88.680705 1.471368 220.125491 std 0.611990 2.644085 0.171126 96.169838 min 15.810000 74.750000 1.020000 5.270000 25% 16.870000 87.605000 1.360000 147.660000 50% 17.250000 89.190000 1.450000 216.210000 75% 17.660000 90.395000 1.572500 295.310000 max 19.970000 94.250000 2.040000 479.880000 Irradiancia count 468.000000 mean 4.997735 std 0.455511 min 4.060000 25% 4.657500 50% 4.970000 75% 5.332500 max 6.200000
# Crear un gráfico por cada variable en subplots
variables = [
"Temperatura",
"Humedad relativa 2m",
"Viento 50m",
"Precipitación",
"Irradiancia",
]
plt.figure(figsize=(15, 20))
for i, var in enumerate(variables, 1):
plt.subplot(6, 1, i)
plt.plot(df[var], label=var)
plt.title(var)
plt.xlabel("Fecha")
plt.ylabel(var)
plt.xticks(rotation=45)
plt.legend()
# Ajustar la frecuencia de las etiquetas en el eje x
if len(df) > 0:
plt.xticks(
ticks=range(0, len(df.index), len(df.index) // 50),
labels=df.index[:: len(df.index) // 50],
)
plt.tight_layout(pad=3.0)
plt.show()