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