Predicción de Aportes Mensuales del SIN#
Carga de datos#
[1]:
import pandas as pd
import requests
owner = "jdvelasq"
repo = "datalabs"
folder = "datasets/aportes_diarios/csv/"
api_url = f"https://api.github.com/repos/{owner}/{repo}/contents/{folder}"
response = requests.get(api_url)
base_url = f"https://raw.githubusercontent.com/{owner}/{repo}/master/{folder}"
dfs = []
for file in response.json():
    file_url = base_url + file["name"]
    df = pd.read_csv(file_url, sep=";", decimal=",", thousands=".")
    dfs.append(df)
df_concat = pd.concat(dfs, ignore_index=True)
print(df_concat.head())
        Fecha Region Hidrologica                 Nombre Río
0  2000-01-01          ANTIOQUIA             A. SAN LORENZO  \
1  2000-01-01          ANTIOQUIA                 CONCEPCION
2  2000-01-01          ANTIOQUIA  DESV. EEPPM (NEC,PAJ,DOL)
3  2000-01-01          ANTIOQUIA                     GRANDE
4  2000-01-01          ANTIOQUIA                  GUADALUPE
   Aportes Caudal m3/s  Aportes Energía kWh Aportes %
0                18.50            3924500.0    65,08%
1                 5.37            1103300.0   110,33%
2                 9.98            2050500.0   130,61%
3                28.03            5192100.0   120,19%
4                15.82            3250400.0   112,86%
Homogenización de nombres de columnas#
[2]:
df_concat = df_concat.rename(
    columns={
        "Fecha": "fecha",
        "Region Hidrologica": "region",
        "Nombre Río": "rio",
        "Aportes Caudal m3/s": "caudal",
        "Aportes Energía kWh": "energia",
        "Aportes %": "porcentaje",
    }
)
df_concat
[2]:
| fecha | region | rio | caudal | energia | porcentaje | |
|---|---|---|---|---|---|---|
| 0 | 2000-01-01 | ANTIOQUIA | A. SAN LORENZO | 18.50 | 3924500.0 | 65,08% | 
| 1 | 2000-01-01 | ANTIOQUIA | CONCEPCION | 5.37 | 1103300.0 | 110,33% | 
| 2 | 2000-01-01 | ANTIOQUIA | DESV. EEPPM (NEC,PAJ,DOL) | 9.98 | 2050500.0 | 130,61% | 
| 3 | 2000-01-01 | ANTIOQUIA | GRANDE | 28.03 | 5192100.0 | 120,19% | 
| 4 | 2000-01-01 | ANTIOQUIA | GUADALUPE | 15.82 | 3250400.0 | 112,86% | 
| ... | ... | ... | ... | ... | ... | ... | 
| 201921 | 2021-12-31 | VALLE | CALIMA | 16.66 | 724600.0 | 103,51% | 
| 201922 | 2021-12-31 | VALLE | CAUCA SALVAJINA | 257.67 | 5224900.0 | 122,08% | 
| 201923 | 2021-12-31 | VALLE | DIGUA | 48.29 | 699800.0 | 132,04% | 
| 201924 | 2021-12-31 | VALLE | FLORIDA II | 9.85 | 197000.0 | 109,44% | 
| 201925 | NaN | NaN | NaN | NaN | NaN | NaN | 
201926 rows × 6 columns
Preparación columna caudal#
[3]:
df_concat = df_concat[["fecha", "rio", "caudal"]]
df_concat
[3]:
| fecha | rio | caudal | |
|---|---|---|---|
| 0 | 2000-01-01 | A. SAN LORENZO | 18.50 | 
| 1 | 2000-01-01 | CONCEPCION | 5.37 | 
| 2 | 2000-01-01 | DESV. EEPPM (NEC,PAJ,DOL) | 9.98 | 
| 3 | 2000-01-01 | GRANDE | 28.03 | 
| 4 | 2000-01-01 | GUADALUPE | 15.82 | 
| ... | ... | ... | ... | 
| 201921 | 2021-12-31 | CALIMA | 16.66 | 
| 201922 | 2021-12-31 | CAUCA SALVAJINA | 257.67 | 
| 201923 | 2021-12-31 | DIGUA | 48.29 | 
| 201924 | 2021-12-31 | FLORIDA II | 9.85 | 
| 201925 | NaN | NaN | NaN | 
201926 rows × 3 columns
Eliminación de NAs#
[4]:
df_concat = df_concat.dropna()
Preprocesamiento#
[5]:
#
# Generación de la columna año - mes
#
df_concat = df_concat.assign(ano=df_concat["fecha"].str[:4])
df_concat = df_concat.assign(mes=df_concat["fecha"].str[5:7])
df_concat
[5]:
| fecha | rio | caudal | ano | mes | |
|---|---|---|---|---|---|
| 0 | 2000-01-01 | A. SAN LORENZO | 18.50 | 2000 | 01 | 
| 1 | 2000-01-01 | CONCEPCION | 5.37 | 2000 | 01 | 
| 2 | 2000-01-01 | DESV. EEPPM (NEC,PAJ,DOL) | 9.98 | 2000 | 01 | 
| 3 | 2000-01-01 | GRANDE | 28.03 | 2000 | 01 | 
| 4 | 2000-01-01 | GUADALUPE | 15.82 | 2000 | 01 | 
| ... | ... | ... | ... | ... | ... | 
| 201920 | 2021-12-31 | ALTOANCHICAYA | 70.08 | 2021 | 12 | 
| 201921 | 2021-12-31 | CALIMA | 16.66 | 2021 | 12 | 
| 201922 | 2021-12-31 | CAUCA SALVAJINA | 257.67 | 2021 | 12 | 
| 201923 | 2021-12-31 | DIGUA | 48.29 | 2021 | 12 | 
| 201924 | 2021-12-31 | FLORIDA II | 9.85 | 2021 | 12 | 
193798 rows × 5 columns
[6]:
#
# Cálculo del caudal promedio mensual
#
caudal_prom_mensual = df_concat[["ano", "mes", "rio", "caudal"]]
caudal_prom_mensual = caudal_prom_mensual.groupby(
    ["rio", "ano", "mes"], as_index=False
).agg("mean")
caudal_prom_mensual.head(10)
[6]:
| rio | ano | mes | caudal | |
|---|---|---|---|---|
| 0 | A. SAN LORENZO | 2000 | 01 | 18.823226 | 
| 1 | A. SAN LORENZO | 2000 | 02 | 20.944138 | 
| 2 | A. SAN LORENZO | 2000 | 03 | 20.465161 | 
| 3 | A. SAN LORENZO | 2000 | 04 | 29.197000 | 
| 4 | A. SAN LORENZO | 2000 | 05 | 58.759032 | 
| 5 | A. SAN LORENZO | 2000 | 06 | 69.072000 | 
| 6 | A. SAN LORENZO | 2000 | 07 | 64.742903 | 
| 7 | A. SAN LORENZO | 2000 | 08 | 63.440968 | 
| 8 | A. SAN LORENZO | 2000 | 09 | 78.647000 | 
| 9 | A. SAN LORENZO | 2000 | 10 | 62.897419 | 
[7]:
#
# Media multianual
#
caudal_prom_mensual["media"] = caudal_prom_mensual.groupby(
    ["rio", "mes"], as_index=False
)["caudal"].transform("mean")
caudal_prom_mensual["desvest"] = caudal_prom_mensual.groupby(
    ["rio", "mes"], as_index=False
)["caudal"].transform("std")
caudal_prom_mensual
[7]:
| rio | ano | mes | caudal | media | desvest | |
|---|---|---|---|---|---|---|
| 0 | A. SAN LORENZO | 2000 | 01 | 18.823226 | 22.849633 | 7.683702 | 
| 1 | A. SAN LORENZO | 2000 | 02 | 20.944138 | 21.802286 | 8.342737 | 
| 2 | A. SAN LORENZO | 2000 | 03 | 20.465161 | 27.192796 | 10.879506 | 
| 3 | A. SAN LORENZO | 2000 | 04 | 29.197000 | 37.643984 | 12.428113 | 
| 4 | A. SAN LORENZO | 2000 | 05 | 58.759032 | 53.741075 | 17.915003 | 
| ... | ... | ... | ... | ... | ... | ... | 
| 6378 | TENCHE | 2021 | 08 | 5.727419 | 4.903011 | 1.434027 | 
| 6379 | TENCHE | 2021 | 09 | 6.037000 | 5.052683 | 1.722873 | 
| 6380 | TENCHE | 2021 | 10 | 6.575806 | 5.197343 | 1.378708 | 
| 6381 | TENCHE | 2021 | 11 | 4.068000 | 4.792651 | 1.426030 | 
| 6382 | TENCHE | 2021 | 12 | 2.423571 | 3.221338 | 0.997481 | 
6383 rows × 6 columns
[8]:
#
# Caudal normalizado
#
caudal_prom_mensual["z"] = (
    caudal_prom_mensual["caudal"] - caudal_prom_mensual["media"]
) / caudal_prom_mensual["desvest"]
caudal_prom_mensual
[8]:
| rio | ano | mes | caudal | media | desvest | z | |
|---|---|---|---|---|---|---|---|
| 0 | A. SAN LORENZO | 2000 | 01 | 18.823226 | 22.849633 | 7.683702 | -0.524019 | 
| 1 | A. SAN LORENZO | 2000 | 02 | 20.944138 | 21.802286 | 8.342737 | -0.102862 | 
| 2 | A. SAN LORENZO | 2000 | 03 | 20.465161 | 27.192796 | 10.879506 | -0.618377 | 
| 3 | A. SAN LORENZO | 2000 | 04 | 29.197000 | 37.643984 | 12.428113 | -0.679667 | 
| 4 | A. SAN LORENZO | 2000 | 05 | 58.759032 | 53.741075 | 17.915003 | 0.280098 | 
| ... | ... | ... | ... | ... | ... | ... | ... | 
| 6378 | TENCHE | 2021 | 08 | 5.727419 | 4.903011 | 1.434027 | 0.574891 | 
| 6379 | TENCHE | 2021 | 09 | 6.037000 | 5.052683 | 1.722873 | 0.571323 | 
| 6380 | TENCHE | 2021 | 10 | 6.575806 | 5.197343 | 1.378708 | 0.999823 | 
| 6381 | TENCHE | 2021 | 11 | 4.068000 | 4.792651 | 1.426030 | -0.508160 | 
| 6382 | TENCHE | 2021 | 12 | 2.423571 | 3.221338 | 0.997481 | -0.799781 | 
6383 rows × 7 columns
[9]:
caudal_prom_mensual.rio.drop_duplicates()
[9]:
0                  A. SAN LORENZO
254                 ALTOANCHICAYA
497                         AMOYA
591                          BATA
845                    BETANIA CP
909                        BLANCO
933                   BOGOTA N.R.
1187                       CALIMA
1441                CARLOS LLERAS
1477              CAUCA SALVAJINA
1731                        CHUZA
1985                   CONCEPCION
2239                      CUCUANA
2275    DESV. EEPPM (NEC,PAJ,DOL)
2529                DESV. GUARINO
2553                  DESV. MANSO
2646             DESV. SAN MARCOS
2682                        DIGUA
2925                    EL QUIMBO
2989                   FLORIDA II
3231                       GRANDE
3485                    GUADALUPE
3739                      GUATAPE
3993                       GUAVIO
4247            MAGDALENA BETANIA
4437                       MIEL I
4656                         NARE
4910                     PORCE II
5105                    PORCE III
5227                    PORCE2 CP
5263                        PRADO
5517                   QUEBRADONA
5542                   SAN CARLOS
5796                   SAN MIGUEL
5823                    SINU URRA
6054                     SOGAMOSO
6129                       TENCHE
Name: rio, dtype: object
[10]:
#
# Se selecciona arbitrariamente Miel I
#
miel = caudal_prom_mensual.loc[caudal_prom_mensual.rio == 'MIEL I', :]
miel = miel.sort_values(['ano', 'mes'], ascending=True)
miel = miel.reset_index(drop=True)
miel
[10]:
| rio | ano | mes | caudal | media | desvest | z | |
|---|---|---|---|---|---|---|---|
| 0 | MIEL I | 2002 | 12 | 86.300000 | 115.145914 | 49.469120 | -0.583109 | 
| 1 | MIEL I | 2003 | 01 | 48.707419 | 93.429830 | 46.537674 | -0.960994 | 
| 2 | MIEL I | 2003 | 02 | 48.258571 | 84.957152 | 32.442290 | -1.131196 | 
| 3 | MIEL I | 2003 | 03 | 64.661290 | 94.654480 | 28.077482 | -1.068229 | 
| 4 | MIEL I | 2003 | 04 | 76.045000 | 86.222852 | 29.343489 | -0.346852 | 
| ... | ... | ... | ... | ... | ... | ... | ... | 
| 214 | MIEL I | 2021 | 08 | 70.004516 | 40.166022 | 21.886092 | 1.363354 | 
| 215 | MIEL I | 2021 | 09 | 58.833000 | 56.559370 | 26.137309 | 0.086988 | 
| 216 | MIEL I | 2021 | 10 | 57.112258 | 80.493853 | 31.914298 | -0.732637 | 
| 217 | MIEL I | 2021 | 11 | 91.285667 | 117.866889 | 44.239004 | -0.600855 | 
| 218 | MIEL I | 2021 | 12 | 137.261071 | 115.145914 | 49.469120 | 0.447050 | 
219 rows × 7 columns
Pronóstico del caudal#
[11]:
import matplotlib.pyplot as plt
plt.figure(figsize=(7, 4))
plt.plot(miel.z)
plt.show()
 
[12]:
plt.figure(figsize=(7, 4))
plt.plot(miel.caudal)
plt.show()
 
[13]:
data = miel[['z']].copy()
for lag in range(1, 7):
    z = miel[['z']].copy()
    z = z.shift(periods=lag, fill_value=0)
    z.columns = [f'lag{lag:d}']
    data = pd.concat([data, z], axis=1)
data = data.dropna()
data.head(20)
[13]:
| z | lag1 | lag2 | lag3 | lag4 | lag5 | lag6 | |
|---|---|---|---|---|---|---|---|
| 0 | -0.583109 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 
| 1 | -0.960994 | -0.583109 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 
| 2 | -1.131196 | -0.960994 | -0.583109 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 
| 3 | -1.068229 | -1.131196 | -0.960994 | -0.583109 | 0.000000 | 0.000000 | 0.000000 | 
| 4 | -0.346852 | -1.068229 | -1.131196 | -0.960994 | -0.583109 | 0.000000 | 0.000000 | 
| 5 | -0.789074 | -0.346852 | -1.068229 | -1.131196 | -0.960994 | -0.583109 | 0.000000 | 
| 6 | -0.033272 | -0.789074 | -0.346852 | -1.068229 | -1.131196 | -0.960994 | -0.583109 | 
| 7 | -0.464947 | -0.033272 | -0.789074 | -0.346852 | -1.068229 | -1.131196 | -0.960994 | 
| 8 | -0.430125 | -0.464947 | -0.033272 | -0.789074 | -0.346852 | -1.068229 | -1.131196 | 
| 9 | 0.385182 | -0.430125 | -0.464947 | -0.033272 | -0.789074 | -0.346852 | -1.068229 | 
| 10 | 1.737153 | 0.385182 | -0.430125 | -0.464947 | -0.033272 | -0.789074 | -0.346852 | 
| 11 | 0.209787 | 1.737153 | 0.385182 | -0.430125 | -0.464947 | -0.033272 | -0.789074 | 
| 12 | -0.313316 | 0.209787 | 1.737153 | 0.385182 | -0.430125 | -0.464947 | -0.033272 | 
| 13 | -0.412884 | -0.313316 | 0.209787 | 1.737153 | 0.385182 | -0.430125 | -0.464947 | 
| 14 | -0.539395 | -0.412884 | -0.313316 | 0.209787 | 1.737153 | 0.385182 | -0.430125 | 
| 15 | -0.251572 | -0.539395 | -0.412884 | -0.313316 | 0.209787 | 1.737153 | 0.385182 | 
| 16 | 1.090877 | -0.251572 | -0.539395 | -0.412884 | -0.313316 | 0.209787 | 1.737153 | 
| 17 | 0.403287 | 1.090877 | -0.251572 | -0.539395 | -0.412884 | -0.313316 | 0.209787 | 
| 18 | -0.429622 | 0.403287 | 1.090877 | -0.251572 | -0.539395 | -0.412884 | -0.313316 | 
| 19 | 0.020538 | -0.429622 | 0.403287 | 1.090877 | -0.251572 | -0.539395 | -0.412884 | 
[14]:
#
# Tamaño del dataframe
#
data.shape
[14]:
(219, 7)
[15]:
from sklearn.linear_model import LinearRegression
from sklearn.pipeline import make_pipeline
from sklearn.feature_selection import SelectKBest
from sklearn.model_selection import LeaveOneOut
from sklearn.model_selection import GridSearchCV
from sklearn.feature_selection import f_regression
gridSearchCV = GridSearchCV(
    #
    # Tuberia:
    estimator=make_pipeline(
        SelectKBest(score_func=f_regression),
        LinearRegression(),
    ),
    #
    # Hiperparámetros
    param_grid={
        'selectkbest__k': range(1, 7),
    },
    #
    # Esquema de validación cruzada
    cv=LeaveOneOut(),
    #
    # Métrica:
    scoring="neg_mean_squared_error",
)
gridSearchCV.fit(data.iloc[:, 1:], data.iloc[:, 0])
gridSearchCV.best_params_
[15]:
{'selectkbest__k': 4}
Predicción un mes adelante#
[16]:
#
# Datos normalizados:
#
pronostico = gridSearchCV.predict(data.iloc[:, 1:])
plt.figure(figsize=(7, 4))
plt.plot(data.iloc[:, 0], '.k')
plt.plot(pronostico, '.-', color='tab:orange')
plt.show()
 
Pronóstico siguientes 12 meses#
[17]:
#
# Ultimos 6 valores:
#
z_pred = miel['z'].to_list()
z_pred[-6:]
[17]:
[-0.4492764339010605,
 1.36335414278238,
 0.08698789899864781,
 -0.7326369913693848,
 -0.6008549012629729,
 0.4470497467418994]
[18]:
#
# Ultimos 6 valores convertidos a una lista de listas:
#
[z_pred[-6:]]
[18]:
[[-0.4492764339010605,
  1.36335414278238,
  0.08698789899864781,
  -0.7326369913693848,
  -0.6008549012629729,
  0.4470497467418994]]
[19]:
#
# Pronostico del siguiente valor:
#
z_point = pd.DataFrame(
    {
    'lag1': [z_pred[-1]],
    'lag2': [z_pred[-2]],
    'lag3': [z_pred[-3]],
    'lag4': [z_pred[-4]],
    'lag5': [z_pred[-5]],
    'lag6': [z_pred[-6]],
    }
)
z_point
[19]:
| lag1 | lag2 | lag3 | lag4 | lag5 | lag6 | |
|---|---|---|---|---|---|---|
| 0 | 0.44705 | -0.600855 | -0.732637 | 0.086988 | 1.363354 | -0.449276 | 
[20]:
gridSearchCV.predict(z_point)
[20]:
array([0.09399993])
[21]:
gridSearchCV.predict(z_point)[0]
[21]:
0.09399992667978989
[22]:
#
# Pronostico hacia adelante
#
z_pred = miel['z'].to_list()
for k in range(1, 12):
    z = pd.DataFrame(
        {
        'lag1': [z_pred[-1]],
        'lag2': [z_pred[-2]],
        'lag3': [z_pred[-3]],
        'lag4': [z_pred[-4]],
        'lag5': [z_pred[-5]],
        'lag6': [z_pred[-6]],
        }
    )
    y = gridSearchCV.predict(z)[0]
    z_pred += [y]
z_pred[-20:]
[22]:
[-0.7558696311664597,
 0.3785568687510893,
 1.7387279863689598,
 -0.4492764339010605,
 1.36335414278238,
 0.08698789899864781,
 -0.7326369913693848,
 -0.6008549012629729,
 0.4470497467418994,
 0.09399992667978989,
 -0.14218600955455485,
 -0.08011930759957069,
 0.03650019975340008,
 0.006226590328926463,
 -0.02892303367320035,
 -0.019275249649277962,
 -0.0038196105322661645,
 -0.006064686142144557,
 -0.010215492904360501,
 -0.008455976860362509]
Transformación de los pronósticos a las unidades originales#
[23]:
pronostico = pd.DataFrame(
    {
        'rio': ['MIEL I'] * 12,
        'ano': [2022] * 12,
        'mes': ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11' , '12'],
        'caudal': [0] * 12,
        'media': miel.iloc[-12:, 4].to_list(),
        'desvest': miel.iloc[-12:, 5].to_list(),
        'z': z_pred[-12:],
    }
)
pronostico
[23]:
| rio | ano | mes | caudal | media | desvest | z | |
|---|---|---|---|---|---|---|---|
| 0 | MIEL I | 2022 | 01 | 0 | 93.429830 | 46.537674 | 0.447050 | 
| 1 | MIEL I | 2022 | 02 | 0 | 84.957152 | 32.442290 | 0.094000 | 
| 2 | MIEL I | 2022 | 03 | 0 | 94.654480 | 28.077482 | -0.142186 | 
| 3 | MIEL I | 2022 | 04 | 0 | 86.222852 | 29.343489 | -0.080119 | 
| 4 | MIEL I | 2022 | 05 | 0 | 95.709606 | 34.279779 | 0.036500 | 
| 5 | MIEL I | 2022 | 06 | 0 | 63.538000 | 24.144471 | 0.006227 | 
| 6 | MIEL I | 2022 | 07 | 0 | 43.356001 | 17.723554 | -0.028923 | 
| 7 | MIEL I | 2022 | 08 | 0 | 40.166022 | 21.886092 | -0.019275 | 
| 8 | MIEL I | 2022 | 09 | 0 | 56.559370 | 26.137309 | -0.003820 | 
| 9 | MIEL I | 2022 | 10 | 0 | 80.493853 | 31.914298 | -0.006065 | 
| 10 | MIEL I | 2022 | 11 | 0 | 117.866889 | 44.239004 | -0.010215 | 
| 11 | MIEL I | 2022 | 12 | 0 | 115.145914 | 49.469120 | -0.008456 | 
[24]:
pronostico = pronostico.assign(caudal=pronostico.z * pronostico.desvest + pronostico.media)
pronostico
[24]:
| rio | ano | mes | caudal | media | desvest | z | |
|---|---|---|---|---|---|---|---|
| 0 | MIEL I | 2022 | 01 | 114.234486 | 93.429830 | 46.537674 | 0.447050 | 
| 1 | MIEL I | 2022 | 02 | 88.006725 | 84.957152 | 32.442290 | 0.094000 | 
| 2 | MIEL I | 2022 | 03 | 90.662255 | 94.654480 | 28.077482 | -0.142186 | 
| 3 | MIEL I | 2022 | 04 | 83.871872 | 86.222852 | 29.343489 | -0.080119 | 
| 4 | MIEL I | 2022 | 05 | 96.960825 | 95.709606 | 34.279779 | 0.036500 | 
| 5 | MIEL I | 2022 | 06 | 63.688338 | 63.538000 | 24.144471 | 0.006227 | 
| 6 | MIEL I | 2022 | 07 | 42.843382 | 43.356001 | 17.723554 | -0.028923 | 
| 7 | MIEL I | 2022 | 08 | 39.744162 | 40.166022 | 21.886092 | -0.019275 | 
| 8 | MIEL I | 2022 | 09 | 56.459536 | 56.559370 | 26.137309 | -0.003820 | 
| 9 | MIEL I | 2022 | 10 | 80.300303 | 80.493853 | 31.914298 | -0.006065 | 
| 10 | MIEL I | 2022 | 11 | 117.414966 | 117.866889 | 44.239004 | -0.010215 | 
| 11 | MIEL I | 2022 | 12 | 114.727604 | 115.145914 | 49.469120 | -0.008456 | 
[25]:
pronostico = pd.concat([miel, pronostico], axis=0, ignore_index=True)
pronostico.tail(20)
[25]:
| rio | ano | mes | caudal | media | desvest | z | |
|---|---|---|---|---|---|---|---|
| 211 | MIEL I | 2021 | 05 | 108.686452 | 95.709606 | 34.279779 | 0.378557 | 
| 212 | MIEL I | 2021 | 06 | 105.518667 | 63.538000 | 24.144471 | 1.738728 | 
| 213 | MIEL I | 2021 | 07 | 35.393226 | 43.356001 | 17.723554 | -0.449276 | 
| 214 | MIEL I | 2021 | 08 | 70.004516 | 40.166022 | 21.886092 | 1.363354 | 
| 215 | MIEL I | 2021 | 09 | 58.833000 | 56.559370 | 26.137309 | 0.086988 | 
| 216 | MIEL I | 2021 | 10 | 57.112258 | 80.493853 | 31.914298 | -0.732637 | 
| 217 | MIEL I | 2021 | 11 | 91.285667 | 117.866889 | 44.239004 | -0.600855 | 
| 218 | MIEL I | 2021 | 12 | 137.261071 | 115.145914 | 49.469120 | 0.447050 | 
| 219 | MIEL I | 2022 | 01 | 114.234486 | 93.429830 | 46.537674 | 0.447050 | 
| 220 | MIEL I | 2022 | 02 | 88.006725 | 84.957152 | 32.442290 | 0.094000 | 
| 221 | MIEL I | 2022 | 03 | 90.662255 | 94.654480 | 28.077482 | -0.142186 | 
| 222 | MIEL I | 2022 | 04 | 83.871872 | 86.222852 | 29.343489 | -0.080119 | 
| 223 | MIEL I | 2022 | 05 | 96.960825 | 95.709606 | 34.279779 | 0.036500 | 
| 224 | MIEL I | 2022 | 06 | 63.688338 | 63.538000 | 24.144471 | 0.006227 | 
| 225 | MIEL I | 2022 | 07 | 42.843382 | 43.356001 | 17.723554 | -0.028923 | 
| 226 | MIEL I | 2022 | 08 | 39.744162 | 40.166022 | 21.886092 | -0.019275 | 
| 227 | MIEL I | 2022 | 09 | 56.459536 | 56.559370 | 26.137309 | -0.003820 | 
| 228 | MIEL I | 2022 | 10 | 80.300303 | 80.493853 | 31.914298 | -0.006065 | 
| 229 | MIEL I | 2022 | 11 | 117.414966 | 117.866889 | 44.239004 | -0.010215 | 
| 230 | MIEL I | 2022 | 12 | 114.727604 | 115.145914 | 49.469120 | -0.008456 | 
[26]:
plt.figure(figsize=(7, 4))
plt.plot(miel.caudal[-60:-12], '.-k')
plt.plot(miel.caudal[-13:], '.-', color='tab:orange')
plt.show()
