使用Python pandas数据帧中的statsmodel对样条进行平滑处理

时间:2017-03-07 11:01:41

标签: python pandas statsmodels smoothing

我需要通过平滑销售百分比值来进行分组,这可能因缺货情况而变得不稳定。我在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,并具有足够好的平滑因子s作为{ {1}}。但是我收到了错误:

  

KeyError :('PCT_TILL_DATE',未发生在索引GREG_D')

我在这里缺少什么?

1 个答案:

答案 0 :(得分:1)

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

此外,UnitvariateSpline会返回一个“拟合”对象,您需要使用所需的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)

enter image description here