You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何遍历Python字典按键取值并赋值给Facebook Prophet模型参数

核心问题

你在循环中已经将all_params列表里的单组参数字典赋值给了params变量,但后续取值时错误地使用了列表对象all_params来读取字典键值,列表不支持这种键索引操作,直接将所有取值时的all_params替换为params即可正常运行。

正确实现代码

import itertools
from prophet import Prophet

# 参数网格定义
param_grid = {  
                'changepoint_prior_scale': [.01, 0.05],
                'changepoint_range': [0.8, 0.9],
                'monthly_fourier': [5, 10],
                'monthly_prior_scale': [.01, 0.05],
                'daily_fourier': [5, 10],
                'daily_prior_scale': [.01, 0.05],
                'weekly_fourier': [5, 10],
                'weekly_prior_scale': [.01, 0.05],
                'yearly_fourier': [5],
                'yearly_prior_scale': [.01, 0.05]
              }

# 生成所有参数组合
all_params = [dict(zip(param_grid.keys(), v)) for v in itertools.product(*param_grid.values())]
mape = []  # 存储每组参数对应的MAPE指标

for params in all_params:
    m = Prophet(
        changepoint_prior_scale = params['changepoint_prior_scale'],
        changepoint_range = params['changepoint_range'],
        seasonality_mode = 'multiplicative',
        growth = 'logistic',
        holidays=Holidays,
        ).add_seasonality(
            name='monthly',
            period=30.5,
            fourier_order = params['monthly_fourier'],
            prior_scale = params['monthly_prior_scale']
        ).add_seasonality(
            name='daily',
            period=1,
            fourier_order = params['daily_fourier'],
            prior_scale = params['daily_prior_scale']
        ).add_seasonality(
            name='weekly',
            period=7,
            fourier_order = params['weekly_fourier'],
            prior_scale = params['weekly_prior_scale']
        ).add_seasonality(
            name='yearly',
            period=365.25,
            fourier_order = params['yearly_fourier'],
            prior_scale = params['yearly_prior_scale']
        )
    # 在此处补充模型训练、预测、指标计算逻辑,将得到的MAPE值追加到mape列表即可

简化写法参考

如果后续需要调整参数或新增季节性规则,可通过参数解包、循环批量添加的方式简化代码,减少重复冗余:

for params in all_params:
    # 提取Prophet初始化所需参数,通过**解包传入
    prophet_init_params = {k:v for k,v in params.items() if k in ['changepoint_prior_scale', 'changepoint_range']}
    m = Prophet(
        **prophet_init_params,
        seasonality_mode = 'multiplicative',
        growth = 'logistic',
        holidays=Holidays,
    )
    # 循环批量添加所有自定义季节性
    season_config = {
        'monthly': 30.5,
        'daily': 1,
        'weekly':7,
        'yearly':365.25
    }
    for season_name, period in season_config.items():
        m.add_seasonality(
            name=season_name,
            period=period,
            fourier_order=params[f'{season_name}_fourier'],
            prior_scale=params[f'{season_name}_prior_scale']
        )

内容的提问来源于stack exchange,提问作者t25

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 06:24:03