python在分组数据帧中使用两个参数来表示滚动函数

2024-09-28 22:25:57 发布

您现在位置:Python中文网/ 问答频道 /正文

这在某种程度上扩展了我以前的问题 python pandas rolling function with two arguments。在

如何按组执行相同的操作?假设下面的“C”列用于分组。在

我正在努力:

  1. 按列“C”分组
  2. 在每个组中,按“A”排序
  3. 在每组中,对参数“a”和“B”应用带两个参数的滚动函数,如kendalltau。在

预期结果将是如下所示的数据帧:

expected result

我一直在尝试“通过索引”解决方法,如上面的链接所述,但这个案例的复杂性超出了我的能力:-(。这是一个有趣的例子,离我正在处理的不远,所以为了简单起见,我使用了随机生成的数据。在

rand = np.random.RandomState(1)
dff = pd.DataFrame({'A' : np.arange(20),
                    'B' : rand.randint(100, 120, 20),
                    'C' : rand.randint(0, 2, 20)})

def my_tau_indx(indx):
    x = dff.iloc[indx, 0]
    y = dff.iloc[indx, 1]
    tau = sp.stats.mstats.kendalltau(x, y)[0]
    return tau

dff['tau'] = dff.sort_values(['C', 'A']).groupby('C').rolling(window = 5).apply(my_tau_indx, args = ([dff.index.values]))

我做的每一个修复都会产生另一个错误。。。在

上面的问题已经由nickilmaveli解决了,它可以与numpy 1.11.0、pandas 0.18.1、scipy0.17.1和conda 4.1.4一起工作。它会生成一些警告,但会起作用。在


在我的另一台装有最新和最伟大的numpy 1.12.0、pandas 0.19.2、scipy 0.18.1、conda version 3.10.0和BLAS/LAPACK的另一台机器上,它不工作,我得到了下面的回溯。这似乎是版本相关,因为我升级了第一台机器,它也停止工作。。。以科学的名义。。。;—)

正如Nickil所说,这是由于numpy1.11和1.12之间的不兼容。降级纽比帮了忙。因为我在Windows上安装了BLAS/LAPACK,所以我从http://www.lfd.uci.edu/~gohlke/pythonlibs/安装了nump1.11.3+mkl。在

^{pr2}$

最终检查:

enter image description here


Tags: 数据numpypandas参数mynpvaluesrandint
1条回答
网友
1楼 · 发布于 2024-09-28 22:25:57

一种实现方法是迭代每个组,并在每个组上使用pd.rolling_apply。在

import scipy.stats as ss

def my_tau_indx(indx):
    x = dff.iloc[indx, 0]
    y = dff.iloc[indx, 1]
    tau = ss.mstats.kendalltau(x, y)[0]
    return tau

grp = dff.sort_values(['A', 'C']).groupby('C', group_keys=False)
func = lambda x: pd.Series(pd.rolling_apply(np.arange(len(x)), 5, my_tau_indx), x.index)
t = grp.apply(func)
dff.reindex(t.index).assign(tau=t)

enter image description here


编辑:

^{pr2}$

enter image description here

相关问题 更多 >