pandas DataFrame两种衰减计算实现及ewm函数应用咨询
Pandas衰减值计算实现方案
结论先行
- 版本1的递推式衰减可以通过pandas的ewm函数实现,也可以用更直观的自定义分组递推实现
- 版本2的公式化衰减不需要用到ewm,直接向量化计算即可
前置准备
首先保证数据按用户、日期升序排序,确保时序计算逻辑正确:
import pandas as pd import numpy as np df = df.sort_values(['user', 'day']).reset_index(drop=True)
版本1衰减实现
你给出的递推规则为 decay_v1 = 当前value + 前序衰减值 * 0.1,两种实现方式可选:
方式1:ewm实现
对应ewm参数设置adjust=False,alpha取0.9即可匹配递推规则:
df['decay_v1'] = df.groupby('user')['value']\ .transform(lambda x: x.ewm(alpha=0.9, adjust=False).mean() / 0.9)
方式2:自定义递推(更易理解、方便调整规则)
def calc_decay_v1(group): res = [] prev_decay = 0 for val in group['value']: curr_decay = val + prev_decay * 0.1 res.append(curr_decay) prev_decay = curr_decay group['decay_v1'] = res return group df = df.groupby('user', group_keys=False).apply(calc_decay_v1)
版本2衰减实现
按你给出的公式直接计算即可,步骤如下:
sat = 0.05 # 提取每个用户2021-03-01的value_cumulative作为基准center user_center_map = df[df['day'] == '2021-03-01'].set_index('user')['value_cumulative'].to_dict() df['center'] = df['user'].map(user_center_map) # 计算参数x,加极小值避免除0报错 df['x'] = -np.log(1 - sat) / (df['center'] + 1e-9) # 计算最终衰减值 df['decay_v2'] = 1 - np.exp(-df['x'] * df['value_cumulative']) # 可选:删除中间计算列 df = df.drop(columns=['center', 'x'])
内容的提问来源于stack exchange,提问作者Manuel
相关产品推荐
相关产品推荐

