在 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
传递,具有足够好的平滑因子 s
为 x.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)
我需要通过平滑销售百分比值来进行分组,由于缺货情况,销售百分比值可能会不稳定。我的数据在 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
为 x.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)