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()