簡體   English   中英

在分類數據中大規模應用時間序列預測 model [pyspark]

[英]Applying time series forcasting model at scale in categorised data [pyspark]

我的數據集看起來像這樣

+-------+--------+----------+
|     ID|     Val|      Date|
+-------+--------+----------+
|Ax3838J|81119.73|2021-07-01|
|Ax3838J|81289.62|2021-07-02|
|Ax3838J|81385.62|2021-07-03|
|Ax3838J|81385.62|2021-07-04|
|Ax3838J|81385.62|2021-07-05|
|Bz3838J|81249.76|2021-07-02|
|Bz3838J|81324.28|2021-07-03|
|Bz3838J|81329.28|2021-07-04|
|Bz3838J|81329.28|2021-07-05|
|Bz3838J|81329.28|2021-07-06|
+-------+--------+----------+

實際上,有 270 萬個ID ,總共有 5600 萬行。 我正在使用 Azure Databricks (PySpark) 並嘗試將fbprophet應用於 10000 行的采樣數據集,並且已經花費了 5 多個小時。

我正在考慮應用NeuralProphetStatsForecast ,但不確定如何為每個ID應用預測 model 以基於ID進行預測。

有什么建議么?

注意:在應用fbprophet時, val變成 'y' 並且Date變成ds以各自的順序。

這是我為fbprophet嘗試過的

def forecast_balance(history_pd: pd.DataFrame) -> pd.DataFrame:

    anonym_cis = history_pd.at[0,'ID']
    
    # instantiate the model, configure the parameters
    model = Prophet(
        interval_width=0.95,
        growth='linear',
        daily_seasonality=True,
        weekly_seasonality=True,
        yearly_seasonality=False,
        seasonality_mode='multiplicative'
    )

    # fit the model
    model.fit(history_pd)

    # configure predictions
    future_pd = model.make_future_dataframe(
        periods=30,
        freq='d',
        include_history=False
    )

    # make predictions
    results_pd = model.predict(future_pd)
    results_pd.loc[:, 'ID'] = anonym_cis

    # . . .


    # return predictions
    return results_pd[['ds', 'ID', 'yhat', 'yhat_upper', 'yhat_lower']]

result_schema =StructType([
  StructField('ds',DateType()),
  StructField('CIS_ANONYM',IntegerType()),
  StructField('yhat',FloatType()),
  StructField('yhat_upper',FloatType()),
  StructField('yhat_lower',FloatType())
  ])

historic_data = df.filter(F.col('ds') < '2022-02-20')
 
group_results = (
    historic_data
    .groupBy('ID')
    .applyInPandas(forecast_balance, schema=result_schema)
    )
 
   

這是使用StatsForecast + Fugue + Spark 的完美案例。 (我們今天剛剛合並了此更改,因此您可以從主分支安裝 pip 或等待它發布)

from statsforecast import forecast
from statsforecast.fugue_backend import FugueBackend
from statsforecast.models import auto_arima

from pyspark.sql import SparkSession

spark = SparkSession.builder.getOrCreate() # or your own spark session
df = spark.read.parquet("input file") # or your own spark dataframe
df = df.withColumnRenamed("ID", "unique_id")\
       .withColumnRenamed("Val", "y")\
       .withColumnRenamed("Date", "ds")

backend = FugueBackend(spark, {"fugue.spark.use_pandas_udf":True})
result_df = forecast(df, models=[auto_arima], freq='D', h=30, parallel=backend) # result_df is a new spark dataframe
result_df.write.parquet("output file") # or do something else

您可以使用StatsForecast來執行您的任務。 該庫將每個時間序列 ( ID ) 的訓練並行化。 StatsForecast接收帶有樹列的 pandas 數據幀: unique_iddsy 所以你必須重命名你的列:

from statsforecast.core import StatsForecast
from statsforecast.models import auto_arima

df = df.rename(columns={'ID': 'unique_id', 'Val': 'y', 'Date': 'ds'})
df = df.set_index('unique_id')

fcst = StatsForecast(df, models=[auto_arima], freq='D')
forecasts = fcst.forecast(h=30)

您可以將StatsForecastspark trough fugue一起使用。 這是和示例。

如果您使用Ray ,您還可以擴展您的任務

關於使用prophet ,我建議使用其他模型,例如來自AutoARIMAStatsForecast 通過這個實驗,我們已經看到它比prophet更快、更准確。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM