我需要通过平滑销售百分比值来进行分组,这可能因缺货情况而变得不稳定。我在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')
我在这里缺少什么?
答案 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)