[英]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 多個小時。
我正在考慮應用NeuralProphet
和StatsForecast
,但不確定如何為每個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_id
、 ds
、 y
。 所以你必須重命名你的列:
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)
您可以將StatsForecast
與spark
trough fugue
一起使用。 這是和示例。
關於使用prophet
,我建議使用其他模型,例如來自AutoARIMA
的StatsForecast
。 通過這個實驗,我們已經看到它比prophet
更快、更准確。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.