Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 仅当行满足特定条件时,才计算每组的滚动函数_Python 3.x_Pandas_Dataframe_Pandas Groupby_Rolling Computation - Fatal编程技术网

Python 3.x 仅当行满足特定条件时,才计算每组的滚动函数

Python 3.x 仅当行满足特定条件时,才计算每组的滚动函数,python-3.x,pandas,dataframe,pandas-groupby,rolling-computation,Python 3.x,Pandas,Dataframe,Pandas Groupby,Rolling Computation,假设我有以下数据帧(这里是简化版本): 我感兴趣的是通过id在任意窗口上计算滚动标准偏差(本例中为3)。但是,我只想为满足cond==1的行计算它 我所期望的输出是: | id | date | cond | ret | r_std | | -- | ---- | ---- | --- | --------------- | | a | t1 | 1 | n1 | nan | | a | t2 | 0 | n2 | nan

假设我有以下数据帧(这里是简化版本):

我感兴趣的是通过
id
在任意窗口上计算滚动标准偏差(本例中为3)。但是,我只想为满足
cond==1
的行计算它

我所期望的输出是:

| id | date | cond | ret |      r_std      |
| -- | ---- | ---- | --- | --------------- |
| a  | t1   | 1    | n1  | nan             |
| a  | t2   | 0    | n2  | nan             |
| a  | t3   | 0    | n3  | nan             |
| a  | t4   | 1    | n4  | std(n2,n3,n4)   |
| a  | t5   | 0    | n5  | nan             |
| a  | t6   | 0    | n6  | nan             |
| a  | t7   | 0    | n7  | nan             |
| a  | t8   | 1    | n8  | std(n6,n7,n8)   |
| a  | t9   | 0    | n9  | nan             |
| a  | t10  | 1    | n10 | std(n8,n9,n10)  |
| b  | t1   | 1    | n11 | nan             |
| b  | t2   | 0    | n12 | nan             |
| b  | t3   | 0    | n13 | nan             |
| b  | t4   | 1    | n14 | std(n12,n13,n14)|
| b  | t5   | 0    | n15 | nan             |
| b  | t6   | 0    | n16 | nan             |
| b  | t7   | 1    | n17 | std(n15,n16,n17)|
| b  | t8   | 0    | n18 | nan             |
| b  | t9   | 1    | n19 | std(n17,n18,n19)|
| b  | t10  | 0    | n20 | nan             |
或者这个:

| id | date | cond | ret |      r_std      |
| -- | ---- | ---- | --- | --------------- |
| a  | t4   | 1    | n4  | std(n2,n3,n4)   |
| a  | t8   | 1    | n8  | std(n6,n7,n8)   |
| a  | t10  | 1    | n10 | std(n8,n9,n10)  |
| b  | t4   | 1    | n14 | std(n12,n13,n14)|
| b  | t7   | 1    | n17 | std(n15,n16,n17)|
| b  | t9   | 1    | n19 | std(n17,n18,n19)|
我的第一次尝试是:

df.loc[df['cond']==1,'r_std']=df.loc[df['cond']==1].groupby('id')['ret']].apply(lambda x:x.rolling(window=3.std())
但这不起作用,因为它只计算由
.loc
确定的数据集切片上的滚动标准偏差。这是我从上述代码中得到的:

| id | date | cond | ret |      r_std      |
| -- | ---- | ---- | --- | --------------- |
| a  | t1   | 1    | n1  | nan             |
| a  | t2   | 0    | n2  | nan             |
| a  | t3   | 0    | n3  | nan             |
| a  | t4   | 1    | n4  | nan             |
| a  | t5   | 0    | n5  | nan             |
| a  | t6   | 0    | n6  | nan             |
| a  | t7   | 0    | n7  | nan             |
| a  | t8   | 1    | n8  | std(n1,n4,n8)   |
| a  | t9   | 0    | n9  | nan             |
| a  | t10  | 1    | n10 | std(n4,n8,n10)  |
| b  | t1   | 1    | n11 | nan             |
| b  | t2   | 0    | n12 | nan             |
| b  | t3   | 0    | n13 | nan             |
| b  | t4   | 1    | n14 | nan             |
| b  | t5   | 0    | n15 | nan             |
| b  | t6   | 0    | n16 | nan             |
| b  | t7   | 1    | n17 | std(n11,n14,n17)|
| b  | t8   | 0    | n18 | nan             |
| b  | t9   | 1    | n19 | std(n14,n17,n19)|
| b  | t10  | 0    | n20 | nan             |
我还尝试:

df['r_std'] = df.groupby('id')[['cond', 'ret']].apply(lambda x : x[1].rolling(window=3).std() if x[0]==1 else np.nan)
但这会引起一个错误

我知道我可以简单地计算每行的滚动标准偏差,然后只选择我感兴趣的行,但这是一个非常大的高频数据,效率非常低


谢谢。

尝试使用
reset\u index
where

df['new'] = df.groupby('id').ret.rolling(3).std().reset_index(level=0,drop=True).where(df.cond==1)
df
Out[227]: 
   id date  cond  ret  new
0   a   t1     1    0  NaN
1   a   t2     0    1  NaN
2   a   t3     0    2  NaN
3   a   t4     1    3  1.0
4   a   t5     0    4  NaN
5   a   t6     0    5  NaN
6   a   t7     0    6  NaN
7   a   t8     1    7  1.0
8   a   t9     0    8  NaN
9   a  t10     1    9  1.0
10  b   t1     1   10  NaN
11  b   t2     0   11  NaN
12  b   t3     0   12  NaN
13  b   t4     1   13  1.0
14  b   t5     0   14  NaN
15  b   t6     0   15  NaN
16  b   t7     1   16  1.0
17  b   t8     0   17  NaN
18  b   t9     1   18  1.0
19  b  t10     0   19  NaN

你能展示可行的样本数据吗?n1 n2…无法工作…因为std'ret'是一个类型为float的列,没有丢失的值,如果不清楚,很抱歉。
df['new'] = df.groupby('id').ret.rolling(3).std().reset_index(level=0,drop=True).where(df.cond==1)
df
Out[227]: 
   id date  cond  ret  new
0   a   t1     1    0  NaN
1   a   t2     0    1  NaN
2   a   t3     0    2  NaN
3   a   t4     1    3  1.0
4   a   t5     0    4  NaN
5   a   t6     0    5  NaN
6   a   t7     0    6  NaN
7   a   t8     1    7  1.0
8   a   t9     0    8  NaN
9   a  t10     1    9  1.0
10  b   t1     1   10  NaN
11  b   t2     0   11  NaN
12  b   t3     0   12  NaN
13  b   t4     1   13  1.0
14  b   t5     0   14  NaN
15  b   t6     0   15  NaN
16  b   t7     1   16  1.0
17  b   t8     0   17  NaN
18  b   t9     1   18  1.0
19  b  t10     0   19  NaN