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

如何结合Pandas Groupby与apply方法实现最优EWMA估算?

没问题!我来帮你搞定怎么用groupby+apply调用你的自定义EWMA优化函数。

首先,先补全你的find_best_ewma函数逻辑(你的代码里优化结果部分没写完),让它能输出可用的最优EWMA序列,同时处理一些边界情况:

from scipy import optimize
from sklearn.metrics import mean_squared_error
import pandas as pd

## 寻找最优alpha并生成EWMA的函数
def find_best_ewma(series, eps=10e-5):
    # 处理分组数据过短的情况(比如只有1个数据点,无法计算EWMA)
    if len(series) < 2:
        return series  # 也可以返回全NaN,根据你的业务需求调整
    
    def f(alpha):
        # 用shift后的序列计算EWMA,避免泄露未来数据
        ewm = series.shift().ewm(alpha=alpha, adjust=False).mean()
        # 填充第一个值的NaN(这里用0,你也可以用序列第一个有效值填充)
        return mean_squared_error(series, ewm.fillna(0))
    
    # 调用优化器,初始值设为0.3,约束alpha在(eps, 1-eps)范围内
    result = optimize.minimize(f, 0.3, bounds=[(0+eps, 1-eps)])
    
    if result.success:
        best_alpha = result.x[0]
        # 用最优alpha生成最终的EWMA序列
        best_ewma = series.shift().ewm(alpha=best_alpha, adjust=False).mean()
        return best_ewma.fillna(0)  # 保留NaN或填充,按需选择
    else:
        # 优化失败时返回原序列,避免报错中断流程
        return series

结合Groupby+Apply调用函数

假设你的DataFrame有分组列(比如group_id)和需要计算EWMA的目标列(比如value),示例用法如下:

# 构造示例DataFrame
df = pd.DataFrame({
    'group_id': ['A', 'A', 'A', 'B', 'B', 'B', 'B'],
    'value': [1.2, 1.5, 1.7, 3.1, 2.9, 3.3, 3.0]
})

# 按group_id分组,对每个组的value列应用自定义函数
df['best_ewma'] = df.groupby('group_id')['value'].apply(find_best_ewma)

执行后,df['best_ewma']列就会对应每个分组的最优EWMA计算结果。

额外需求:同时获取每个分组的最优alpha

如果你还想得到每个分组的最优alpha值,可以修改函数返回结构化结果:

def find_best_ewma_with_alpha(series, eps=10e-5):
    if len(series) < 2:
        return pd.Series({'alpha': None, 'ewma': series})
    
    def f(alpha):
        ewm = series.shift().ewm(alpha=alpha, adjust=False).mean()
        return mean_squared_error(series, ewm.fillna(0))
    
    result = optimize.minimize(f, 0.3, bounds=[(0+eps, 1-eps)])
    
    if result.success:
        best_alpha = result.x[0]
        best_ewma = series.shift().ewm(alpha=best_alpha, adjust=False).mean().fillna(0)
        return pd.Series({'alpha': best_alpha, 'ewma': best_ewma})
    else:
        return pd.Series({'alpha': None, 'ewma': series})

# 获取分组的alpha和ewma结果
group_stats = df.groupby('group_id')['value'].apply(find_best_ewma_with_alpha).unstack()

# 把alpha映射回原DataFrame
df['best_alpha'] = df['group_id'].map(group_stats['alpha'])
# 再单独生成ewma列
df['best_ewma'] = df.groupby('group_id')['value'].apply(find_best_ewma)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:54:16