Как улучшить прогноз осадков, когда большинство значений в наборе данных равны нулю?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как улучшить прогноз осадков, когда большинство значений в наборе данных равны нулю?

Сообщение Anonymous »

Я работаю над проектом прогнозирования осадков с использованием моделей временных рядов, таких как LSTM, Arima и Prophet в Google Colab. Набор данных, который я использую, содержит ежедневные значения осадков, но подавляющее большинство записей равно нулю - поскольку в большинстве дней не дождь. Например: < /p>
LSTM имеет тенденцию к постоянным или почти нулевым прогнозам, вероятно, переосмысление часто нулевых значений. Осадки. Существуют ли рекомендуемые методы для обработки нулевого характера таких данных в прогнозировании временных рядов? < /P>
Любые советы или общий опыт будут оценены. Заранее спасибо!

Код: Выделить всё

 import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.style.use('fivethirtyeight')
from sklearn.metrics import mean_squared_error
import seaborn as sns

from statsmodels.tsa.arima_model import ARIMA
from statsmodels.tsa.stattools import adfuller, acf, pacf
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf

weather_df = pd.read_csv('sample_data/preprocessed.csv', parse_dates=['DATE'], index_col='DATE')
weather_df.head()

def list_and_visualize_missing_data(dataset):
# Listing total null items and its percent with respect to all nulls
total = dataset.isnull().sum().sort_values(ascending=False)
percent = ((dataset.isnull().sum())/(dataset.isnull().count())).sort_values(ascending=False)
percent = percent*100

print('Count of missing data : \n',total)
print('% of missing data : \n',percent)

list_and_visualize_missing_data(weather_df)

#check trend and seasonality of weather data
weather_df.plot(subplots=True, figsize=(20,12))
#detailed view of 2015 year
weather_df['2015':'2016'].resample('D')
weather_df['2015':'2016'].fillna(weather_df['2015':'2016']['PRECTOTCORR'].mean())
weather_df['2015':'2016'].plot(subplots=True, figsize=(20,12))

print(weather_df)

weather_df.index = pd.to_datetime(weather_df.index, format='%Y-%m-%d')  # İndeks olarak tarih formatına dönüştür

precip = weather_df[['PRECTOTCORR']]

# Tarih indeksine göre sıralı olduğundan emin ol
precip = precip.sort_index()

# Veri setinin uzunluğunu al
n = len(precip)
train_size = int(n * 0.8)

# %80 eğitim, %20 test verisi olarak ayır
train_df = precip.iloc[:train_size]
test_df = precip.iloc[train_size:]

train_df.describe()
print(train_df)

# check rolling mean and rolling standard deviation
def plot_rolling_mean_std(ts):
rolling_mean = ts.rolling(12).mean()
rolling_std = ts.rolling(12).std()
plt.figure(figsize=(22,10))

plt.plot(ts, label='Actual Mean')
plt.plot(rolling_mean, label='Rolling Mean')
plt.plot(rolling_std, label = 'Rolling Std')
plt.xlabel("Date")
plt.ylabel("Mean Temperature")
plt.title('Rolling Mean &  Rolling Standard Deviation')
plt.legend()
plt.show()

# check stationary: mean, variance(std)and adfuller test
plot_rolling_mean_std(train_df.PRECTOTCORR)

#Plot ACF and PACF
acf_lag = acf(train_df.values, nlags=20)
pacf_lag = pacf(train_df.values, nlags=20, method='ols')

plt.figure(figsize=(22,10))

plt.subplot(1,2,1)
plt.plot(acf_lag)
plt.axhline(y=0,linestyle='--',color='silver')
plt.axhline(y=-1.96/np.sqrt(len(train_df.values)),linestyle='--',color='silver')
plt.axhline(y=1.96/np.sqrt(len(train_df.values)),linestyle='--',color='silver')
plt.title("Autocorrelation Function")

plt.subplot(1,2,2)
plt.plot(pacf_lag)
plt.axhline(y=0,linestyle='--',color='silver')
plt.axhline(y=-1.96/np.sqrt(len(train_df.values)),linestyle='--',color='silver')
plt.axhline(y=1.96/np.sqrt(len(train_df.values)),linestyle='--',color='silver')
plt.title("Partial Autocorrelation Function")
plt.tight_layout()

#ARIMA model
from statsmodels.tsa.arima.model import ARIMA

print("train_df values:",train_df)
model = ARIMA(train_df.values, order=(2, 0, 2))
model_fit = model.fit()
print(model_fit.summary())

# Plot residual errors
plt.rcParams.update({'figure.figsize':(12,3), 'figure.dpi':120})
residuals = pd.DataFrame(model_fit.resid)
fig, ax = plt.subplots(1,2)
residuals.plot(title="Residuals", ax=ax[0])
residuals.plot(kind='kde', title='Density', ax=ax[1])
plt.show()

# Actual vs Fitted
fig, ax = plt.subplots(figsize=(10, 5))
plot_predict(model_fit, dynamic=False, ax=ax)

# Başlık ve etiketler
ax.set_title("Gerçek ve Tahmin Edilen Değerler (Actual vs Fitted)", fontsize=14)
ax.set_ylabel("Değer", fontsize=12)
ax.legend(["Gerçek Değer", "Tahmin"], loc="upper left")

plt.tight_layout()
plt.show()

forecast_steps = len(test_df)
forecast_index = test_df.index

# 16 dönemlik tahmin ve güven aralığı
forecast_obj = model_fit.get_forecast(steps=forecast_steps)
fc = forecast_obj.predicted_mean
conf = forecast_obj.conf_int(alpha=0.05)

# Pandas serileri oluştur
fc_series = pd.Series(fc, index=forecast_index)
lower_series = pd.Series(conf[:, 0], index=forecast_index)
upper_series = pd.Series(conf[:, 1], index=forecast_index)

# Grafik
plt.figure(figsize=(12,5), dpi=100)
plt.plot(train_df, label='Test Value')
plt.plot(test_df, label='Actual Values')
plt.plot(fc_series, label='Forecast')
plt.fill_between(lower_series.index, lower_series, upper_series, color='k', alpha=.15)
plt.title('Forecast vs Actual')
plt.legend(loc='upper left', fontsize=8)
plt.show()

# plot Testing and Forecasted data
plt.plot(test_df, label='Actual')
plt.plot(fc_series, label='Forecast', color='red')
plt.legend(loc='upper left', fontsize=8)
plt.show()

error = mean_squared_error(test_df, fc_series)
print('Test Mean Squared Error: ',error)

df_result = pd.DataFrame({
"Actual": test_df["PRECTOTCORR"],  # test_df'deki hedef sütunu yaz
"Forecast": fc_series
})
df_result.head(100)
Это ссылка на код Github, где я получаю и корректирую свою потребность:
https://github.com/niwedita17/weather-f ... sing-arima
shate shots: press> press> press> press> press> press> press> press> press> press> press> psliou alt = "Введите описание изображения здесь" src = "https://i.sstatic.net/vhzwhath.png"/>


Подробнее здесь: https://stackoverflow.com/questions/796 ... t-are-zero
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Проблемы с тестированием значений, сохраненных в намерении Android (дополнительные функции всегда равны нулю)
    Anonymous » » в форуме Android
    0 Ответы
    46 Просмотры
    Последнее сообщение Anonymous
  • PHP: ложные значения всегда равны «», истинные значения всегда равны «1»? [дубликат]
    Anonymous » » в форуме Php
    0 Ответы
    76 Просмотры
    Последнее сообщение Anonymous
  • Извлечь значения осадков из netcdf
    Anonymous » » в форуме Python
    0 Ответы
    6 Просмотры
    Последнее сообщение Anonymous
  • Извлечь значения осадков из netcdf
    Anonymous » » в форуме Python
    0 Ответы
    4 Просмотры
    Последнее сообщение Anonymous
  • Климада - как добавить настройки осадков и штормовых наголов к урагану
    Anonymous » » в форуме Python
    0 Ответы
    1 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»