我有以下时间序列数据集:
import pandas as pd
from datetime import datetime
import numpy as np
from scipy.signal import savgol_filter
date_rng = pd.date_range(start='2020-07-01', end='2020-07-20', freq='d')
df = pd.DataFrame(date_rng, columns=['date'])
df['data'] = np.random.randint(0,100,size=(len(date_rng)))
我想计算一个Savitzky-Golay过滤器和一个熊猫数据框,它们是在以下函数中定义的:
def savgol(x, wl=3, p=2):
return savgol_filter(x, window_length=wl, polyorder=p)
df['sav_gol'] = df['data'].apply(savgol)
执行脚本时,我收到以下错误消息:
ValueError:如果模式为'interp',则window_length必须小于或等于x的大小。
编辑:
这是我调整后的分组数据集。我将savgol函数应用于此数据集:
df = pd.DataFrame({
'date':date_rng,
'value':np.random.randint(0,100,size=(len(date_rng))),
'group':'a'
})
df2 = pd.DataFrame({
'date':date_rng,
'value':np.random.randint(0,100,size=(len(date_rng))),
'group':'b'
})
df = df.append(df2, ignore_index=True)
这是我的尝试:
df['sav_gol'] = df.groupby('group')['value'].apply(savgol)
任何帮助将不胜感激!
答案 0 :(得分:0)
这实际上有效:
df['savgol'] = df.groupby('group')['value'].transform(lambda x: savgol_filter(x, 5,2))