在 Python pandas 数据帧中使用 statsmodel 进行样条平滑

Spline smoothening using statsmodel within Python pandas dataframe

我需要通过平滑销售百分比值来进行分组,由于缺货情况,销售百分比值可能会不稳定。我的数据在 Pandas 数据框中。这是我正在尝试的代码:

from scipy.interpolate import UnivariateSpline
s = base_data1.groupby(['MDSE_ITEM_I','CO_LOC_I'])\
.transform(lambda x: UnivariateSpline(np.arange(x.count()), x['PCT_TILL_DATE'].value, s=x.count()))

在这里,我将 np.arange(x.count()) 作为 x 单调递增数组,并将 Pandas 系列的值 x['PCT_TILL_DATE'].value 作为 y 传递,具有足够好的平滑因子 sx.count()。但是我收到错误:

KeyError: ('PCT_TILL_DATE', u'occurred at index GREG_D')

我在这里缺少什么?

你不需要 select 你想要的列,因为 transform() 已经把它变成了一个系列,你不能那样索引。

此外,UnitvariateSpline returns 一个 'fitted' 对象,您需要使用所需的 x 输出再次调用该对象以获得一些实际值。

import pandas as pd
from scipy.interpolate import UnivariateSpline

n = 16
df = pd.DataFrame({'data1': np.cos(np.linspace(0,np.pi*4, n)),
                   'data2': np.random.randn(n),
                   'class_a': np.array([0]*(n//2)+[1]*(n//2)),
                   'class_b': np.array([1]*n)})

def grpfunc(grp):

    n = len(grp)
    x = np.arange(n)

    spl = UnivariateSpline(x, grp.values, s=n)

    return spl(x)

df.groupby(['class_a', 'class_b']).transform(grpfunc)