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

标签 python pandas numpy

我一直在尝试根据包含股票代码历史记录的 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/

相关文章:

python pptx 判断一个表格的宽高

python - 带有 NaN 键的字典到 pandas 系列

python - 使用Python删除不包含正则表达式匹配的单元格/行

arrays - 如何通过组合 column_names 列表和 numpy 数组然后添加更多列来创建 pandas DataFrame?

python - Numpy sum() 出现 'keepdims' 错误

python - 比较慢的python numpy 3D傅立叶变换

python - 从混合高斯分布生成二维样本数据集

python - 如何使用图像序列在 tkinter 上显示视频

python - 理解RNN的softmax输出层

python - GAE Python - CSV Writer 给出 ascii 编解码器错误