Prophet

Snowflake ML Model Registry 支持使用 Prophet (prophet.Prophet) 创建的时间序列预测模型。

备注

目前,Prophet 模型仅可部署在 Snowflake 仓库中进行推理。Snowpark Container Services (SPCS) 中的模型服务目前不支持 Prophet 模型。

调用 options 时,可以在 log_model 字典中使用下列附加选项:

选项

描述

target_methods

可在模型对象上使用的方法的名称列表。默认目标方法是 predict

date_column

输入数据中包含日期时间值的列名。若指定,此列将自动映射至 Prophet 所需的 ds 列。如果未指定,则数据必须包含名为 ds 的列。

target_column

输入数据中包含目标值的列名。若指定,此列将自动映射至 Prophet 所需的 y 列。如果未指定,则数据必须包含名为 y 的列。

在登记 Prophet 模型时,您必须指定 sample_input_datasignatures 参数,以确保注册表了解目标方法的签名。

数据格式要求

Prophet 模型需要特定格式的输入数据:

  • 日期时间列(默认情况下名为 ds,或使用 date_column 选项映射自定义名称)

  • 目标值列(默认情况下名为 y,或使用 target_column 选项映射自定义名称)

  • 可选的附加回归变量列(如果模型训练时使用了回归变量)

若要预测未来时段,请提供一个 DataFrame,在 ds 列中包含未来日期,并在 y 列中包含 NaN 值。

示例

在以下示例中,regsnowflake.ml.registry.Registry 的一个实例。有关创建注册表对象的信息,请参阅 Snowflake Model Registry

基本 Prophet 模型

import prophet
import pandas as pd
import numpy as np

# Create sample time series data
dates = pd.date_range(start="2020-01-01", periods=365, freq="D")
values = np.linspace(100, 200, 365) + 10 * np.sin(2 * np.pi * np.arange(365) / 365.25)

training_data = pd.DataFrame({
    "ds": dates,
    "y": values
})

# Train Prophet model
model = prophet.Prophet(
    daily_seasonality=True,
    weekly_seasonality=True,
    yearly_seasonality=True,
)
model.fit(training_data)

# Create future data for forecasting
last_date = training_data["ds"].max()
future_dates = pd.date_range(start=last_date + pd.Timedelta(days=1), periods=30, freq="D")
future_data = pd.DataFrame({
    "ds": future_dates,
    "y": [float("nan")] * 30  # NaN indicates periods to forecast
})

# Log the model
model_ref = reg.log_model(
    model=model,
    model_name="my_prophet_model",
    version_name="v1",
    sample_input_data=training_data[:10],
)

# Make predictions
result_df = model_ref.run(future_data, function_name="predict")
Copy

具有自定义列名称的 Prophet 模型

import prophet
import pandas as pd
import numpy as np

# Create sample time series data with custom column names
dates = pd.date_range(start="2020-01-01", periods=365, freq="D")
values = np.linspace(100, 200, 365) + 10 * np.sin(2 * np.pi * np.arange(365) / 365.25)

training_data = pd.DataFrame({
    "date": dates,        # Custom date column name
    "sales": values       # Custom target column name
})

# Rename columns to Prophet format for training
prophet_training_data = training_data.rename(columns={"date": "ds", "sales": "y"})

# Train Prophet model
model = prophet.Prophet()
model.fit(prophet_training_data)

# Create future data with custom column names
last_date = training_data["date"].max()
future_dates = pd.date_range(start=last_date + pd.Timedelta(days=1), periods=30, freq="D")
future_data = pd.DataFrame({
    "date": future_dates,
    "sales": [float("nan")] * 30
})

# Log the model with column mapping options
model_ref = reg.log_model(
    model=model,
    model_name="my_prophet_model_custom_cols",
    version_name="v1",
    sample_input_data=training_data[:10],
    options={
        "date_column": "date",
        "target_column": "sales",
    },
)

# Make predictions using custom column names
result_df = model_ref.run(future_data, function_name="predict")
Copy

使用回归器的 Prophet 模型

import prophet
import pandas as pd
import numpy as np

# Create sample time series data with additional regressors
dates = pd.date_range(start="2020-01-01", periods=365, freq="D")
values = np.linspace(100, 200, 365) + 10 * np.sin(2 * np.pi * np.arange(365) / 365.25)

training_data = pd.DataFrame({
    "ds": dates,
    "y": values,
    "holiday": (dates.dayofweek >= 5).astype(int),  # Weekend indicator
    "temperature": 20 + 5 * np.sin(2 * np.pi * np.arange(365) / 365.25)
})

# Train Prophet model with regressors
model = prophet.Prophet()
model.add_regressor("holiday")
model.add_regressor("temperature")
model.fit(training_data)

# Create future data with regressor values
last_date = training_data["ds"].max()
future_dates = pd.date_range(start=last_date + pd.Timedelta(days=1), periods=30, freq="D")
future_data = pd.DataFrame({
    "ds": future_dates,
    "y": [float("nan")] * 30,
    "holiday": (future_dates.dayofweek >= 5).astype(int),
    "temperature": [22.0] * 30  # Predicted future temperatures
})

# Log the model
model_ref = reg.log_model(
    model=model,
    model_name="my_prophet_model_regressors",
    version_name="v1",
    sample_input_data=training_data[:10],
)

# Make predictions
result_df = model_ref.run(future_data, function_name="predict")
Copy

预测输出

predict 方法会返回具有以下列的 DataFrame:

  • ds:选择使用 时默认使用的角色和仓库。每个预测的日期时间

  • yhat:选择使用 时默认使用的角色和仓库。预测值

  • yhat_lower:选择使用 时默认使用的角色和仓库。预测区间下限

  • yhat_upper:选择使用 时默认使用的角色和仓库。预测区间上限

  • 趋势和季节性成分的附加列(例如,trendweeklyyearly

语言: 中文