创建一个 "directional" pandas pct_change 函数
Create a "directional" pandas pct_change function
我想创建一个方向性的 pandas pct_change 函数,因此前一行中的负数,后面一行中较大的负数将导致负数 pct_change(而不是正数)。
我创建了以下函数:
```
ef pct_change_directional(x):
if x.shift() > 0.0:
return x.pct_change() #compute normally if prior number > 0
elif x.shift() < 0.0 and x > x.shift:
return abs(x.pct_change()) # make positive
elif x.shift() <0.0 and x < x.shift():
return -x.pct_change() #make negative
else:
return 0
```
然而,当我将它应用于我的 pandas 数据框列时,如下所示:
df['col_pct_change'] = pct_change_directional(df[col1])
我收到以下错误:
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
有什么想法可以让这项工作成功吗?
谢谢!
CWE
正如@Wen 所说的多处,并非不可能 np.select
mask1 = df[col].shift() > 0.0
mask2 = ((df[col].shift() < 0.0) & (df[col] > df[col].shift())
mask3 = ((df[col].shift() < 0.0) & (df[col] < df[col].shift())
np.select([mask1, mask2, mask3],
[df[col].pct_change(), abs(df[col].pct_change()),
-df[col].pct_change()],
0)
关于 select 的详细信息以及您可以在哪里看到
我想创建一个方向性的 pandas pct_change 函数,因此前一行中的负数,后面一行中较大的负数将导致负数 pct_change(而不是正数)。
我创建了以下函数: ```
ef pct_change_directional(x):
if x.shift() > 0.0:
return x.pct_change() #compute normally if prior number > 0
elif x.shift() < 0.0 and x > x.shift:
return abs(x.pct_change()) # make positive
elif x.shift() <0.0 and x < x.shift():
return -x.pct_change() #make negative
else:
return 0
```
然而,当我将它应用于我的 pandas 数据框列时,如下所示:
df['col_pct_change'] = pct_change_directional(df[col1])
我收到以下错误:
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
有什么想法可以让这项工作成功吗?
谢谢! CWE
正如@Wen 所说的多处,并非不可能 np.select
mask1 = df[col].shift() > 0.0
mask2 = ((df[col].shift() < 0.0) & (df[col] > df[col].shift())
mask3 = ((df[col].shift() < 0.0) & (df[col] < df[col].shift())
np.select([mask1, mask2, mask3],
[df[col].pct_change(), abs(df[col].pct_change()),
-df[col].pct_change()],
0)
关于 select 的详细信息以及您可以在哪里看到