ARIMA model schur decomposition solver error

di il
0 risposte

ARIMA model schur decomposition solver error

Buonasera,

 premetto che non so programmare non capisco come posso risolvere questa situazione, devo fare in modo che arima riempia i gap nel caso in cui siano più lunghi di 24 per farlo ho cercato di far addestrare arima su una serie create con i dati di temperatura della stessa ora mancante dei giorni precedenti, mi continua a dare quest'errore, questo è il codice che ho usato:

import pandas as pd
import numpy as np
from statsmodels.tsa.arima.model import ARIMA
def linear_interpolate(start_index, end_index, start_value, end_value):
    indices = np.arange(start_index, end_index + 1)
    values = np.linspace(start_value, end_value, len(indices))
    return values
percorso_file_excel = 'C:\\Users\\marco\\Desktop\\Tesi\\datiTSh.xlsx'
df = pd.read_excel(percorso_file_excel)
temperature = 'drybulb'
# Aggiunta delle colonne 'year', 'month', 'day', 'hour'
df['datetime'] = pd.to_datetime(df[['year', 'month', 'day', 'hour']])
df.set_index('datetime', inplace=True)
serie_numerica = df[temperature]
serie_orig = serie_numerica.copy()
serie_test = serie_numerica.copy()
scelta = input("Inserisci 'percentuale' o 'numero' per decidere come inserire i gap: ")
if scelta.lower() == 'p':
    percentuale_gap = input("Inserisci percentuale gap: ")
    percentuale_gap = float(percentuale_gap)
    num_gap = int(len(serie_test) * percentuale_gap / 100)
elif scelta.lower() == 'numero':
    num_gap = input("Inserisci numero di gap da inserire: ")
    num_gap = int(num_gap)
    percentuale_gap = (num_gap / len(serie_test)) * 100
else:
    print("Scelta non valida. Chiudere il programma.")
    exit()
lunghezza_gap = input("Inserisci lunghezza gap: ")
lunghezza_gap = int(lunghezza_gap)
indici_gap_casuali = np.random.choice(len(serie_test) - lunghezza_gap + 1, num_gap, replace=True)
serie_test_gap = serie_test.copy()
for indice in indici_gap_casuali:
    if 24 <= indice <= len(serie_test) - 25:
        serie_test_gap.iloc[indice:indice + lunghezza_gap] = np.nan
serie_corretta = serie_test_gap.copy()
for index in serie_corretta.index[serie_corretta.isna()]:
    if 24 <= indice <= len(serie_test) - 25:
        if lunghezza_gap == 1:
           serie_corretta.loc[index] = (serie_corretta.loc[index - pd.Timedelta(hours=1)] + serie_corretta.loc[index + pd.Timedelta(hours=1)]) / 2
       
        elif 2 <= lunghezza_gap <= 24:
            serie_corretta.loc[index] = (serie_corretta.loc[index - pd.DateOffset(days=1)] + serie_corretta.loc[index + pd.DateOffset(days=1)]) / 2
       
        elif lunghezza_gap > 24:
        # Crea una serie di addestramento utilizzando solo dati dello stesso orario
            train_data = serie_corretta.loc[serie_corretta.index.hour == index.hour].dropna()
            train_data = train_data.asfreq('h')
        # Fit del modello ARIMA
            arima_model = ARIMA(train_data, order=(5, 1, 0))
            arima_fit = arima_model.fit()
        # Forecast e backcast
            forecast = arima_fit.forecast(steps=lunghezza_gap)[0]
            backcast = arima_fit.predict(start=train_data.index[-1], end=index - 1, typ='levels').values[-1]
        # Interpolazione lineare
            interpolated_values = linear_interpolate(train_data.index[-1], index + pd.DateOffset(hours=lunghezza_gap - 1), backcast, forecast)
        # Riempimento dei gap
            serie_corretta.loc[index:index + pd.DateOffset(hours=lunghezza_gap - 1)] = interpolated_values
# Creazione del DataFrame finale con colonne di identificazione temporale
df_finale = pd.DataFrame({
    'Year': df.index.year,
    'Month': df.index.month,
    'Day': df.index.day,
    'Hour': df.index.hour,
    'Serie Orig': serie_orig,
    'Serie Test Gap': serie_test_gap,
    'Serie Corretta': serie_corretta
})
# Salvataggio del DataFrame finale in un file Excel
df_finale.to_excel('file_finale.xlsx', index=True)
# Stampa delle prime righe del DataFrame finale
print(df_finale.head())


Teoricamente arima venendo addestrato riferendosi alla stessa ora dei giorni precedenti e successivi dovrebbe calcolare ogni singola ora mancante del gap. 

Grazie per l'aiuto

Devi accedere o registrarti per scrivere nel forum
0 risposte