gpt4 book ai didi

python - 基于 Pandas Dataframe 中的多列计算公式 - 但不创建许多中间列

转载 作者:太空宇宙 更新时间:2023-11-03 14:44:42 27 4
gpt4 key购买 nike

我一直在尝试根据包含股票代码历史记录的 Pandas 数据框计算“真实范围”公式。

这是公式:

TR = max [(high - low ), abs(high − close prev), abs ⁡(low − close prev)] 

我在数据框中有高、低和收盘价列。

当我尝试这样操作时,我得到无效字符标识符错误,这不是很有帮助。我在下面的表达式中尝试了很多变化和组合,但没有成功。

df['TR']=((df['high']-df['low']), (df['high'] - df['adjclose'].shift(1)).abs(),(df['low'] - df['adjclose'].shift(1))).max(axis=1)

我知道这可以通过三个独立的中间列并取其中的最大值来实现。但是,我想避免相同的情况并直接进行。

有出路吗?

最佳答案

使用 concatmax:

df['TR'] = pd.concat([(df['high'] - df['low']), 
(df['high'] - df['adjclose'].shift(1)).abs(),
(df['low'] - df['adjclose'].shift(1))], axis=1).max(axis=1)

示例:

df = pd.DataFrame({'high':[4,5,4,5,5,4],
'low':[7,8,9,4,2,3],
'adjclose':[1,3,5,7,1,0]})

print (df)
adjclose high low
0 1 4 7
1 3 5 8
2 5 4 9
3 7 5 4
4 1 5 2
5 0 4 3

df['TR'] = pd.concat([(df['high']-df['low']),
(df['high'] - df['adjclose'].shift(1)).abs(),
(df['low'] - df['adjclose'].shift(1))], axis=1).max(axis=1)

print (df)
adjclose high low TR
0 1 4 7 -3.0
1 3 5 8 7.0
2 5 4 9 6.0
3 7 5 4 1.0
4 1 5 2 3.0
5 0 4 3 3.0

详细信息:

print (pd.concat([(df['high']-df['low']), 
(df['high'] - df['adjclose'].shift(1)).abs(),
(df['low'] - df['adjclose'].shift(1))], axis=1))
0 1 2
0 -3 NaN NaN
1 -3 4.0 7.0
2 -5 1.0 6.0
3 1 0.0 -1.0
4 3 2.0 -5.0
5 1 3.0 2.0

Numpy 的解决方案是不同的,因为行中 NaN 的最大值再次是 NaN:

df['TR1'] = np.max(np.c_[(df['high']-df['low']), 
(df['high'] - df['adjclose'].shift(1)).abs(),
(df['low'] - df['adjclose'].shift(1))], axis=1)

print (df)
adjclose high low TR1
0 1 4 7 NaN
1 3 5 8 7.0
2 5 4 9 6.0
3 7 5 4 1.0
4 1 5 2 3.0
5 0 4 3 3.0

print (np.c_[(df['high']-df['low']),
(df['high'] - df['adjclose'].shift(1)).abs(),
(df['low'] - df['adjclose'].shift(1))])

[[-3. nan nan]
[-3. 4. 7.]
[-5. 1. 6.]
[ 1. 0. -1.]
[ 3. 2. -5.]
[ 1. 3. 2.]]

关于python - 基于 Pandas Dataframe 中的多列计算公式 - 但不创建许多中间列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50590667/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com