在熊猫数据框上应用Savitzky-Golay过滤器

时间:2020-10-06 11:03:11

标签: python pandas

我有以下时间序列数据集:

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)

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

这实际上有效:

df['savgol'] = df.groupby('group')['value'].transform(lambda x: savgol_filter(x, 5,2))