Files
2026-07-13 13:22:34 +08:00

55 lines
1.4 KiB
Python

import numpy as np
import pandas as pd
from prophet import Prophet, serialize
from prophet.diagnostics import cross_validation, performance_metrics
import mlflow
SOURCE_DATA = (
"https://raw.githubusercontent.com/facebook/prophet/master/examples/example_retail_sales.csv"
)
np.random.seed(12345)
def extract_params(pr_model):
params = {attr: getattr(pr_model, attr) for attr in serialize.SIMPLE_ATTRIBUTES}
return {k: v for k, v in params.items() if isinstance(v, (int, float, str, bool))}
sales_data = pd.read_csv(SOURCE_DATA)
with mlflow.start_run():
model = Prophet().fit(sales_data)
params = extract_params(model)
metrics_raw = cross_validation(
model=model,
horizon="365 days",
period="180 days",
initial="710 days",
parallel="threads",
disable_tqdm=True,
)
cv_metrics = performance_metrics(metrics_raw)
metrics = cv_metrics.drop(columns=["horizon"]).mean().to_dict()
# The training data can be retrieved from the fit model for convenience
train = model.history
model_info = mlflow.prophet.log_model(
model, name="prophet_model", input_example=train[["ds"]].head(10)
)
mlflow.log_params(params)
mlflow.log_metrics(metrics)
loaded_model = mlflow.prophet.load_model(model_info.model_uri)
forecast = loaded_model.predict(loaded_model.make_future_dataframe(60))
forecast = forecast[["ds", "yhat"]].tail(90)
print(f"forecast:\n${forecast.head(30)}")