我有一个 OHLC 价格数据集,我已将其从 CSV 解析为 Pandas 数据框并重新采样为 15 分钟柱:
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 500047 entries, 1998-05-04 04:45:00 to 2012-08-07 00:15:00
Freq: 15T
Data columns:
Close 363152 non-null values
High 363152 non-null values
Low 363152 non-null values
Open 363152 non-null values
dtypes: float64(4)
我想添加各种计算列,从简单的列开始,例如周期范围 (H-L),然后是 bool 值来指示我将定义的价格模式的出现 - 例如。锤子蜡烛形态,其示例定义:
def closed_in_top_half_of_range(h,l,c):
return c > l + (h-l)/2
def lower_wick(o,l,c):
return min(o,c)-l
def real_body(o,c):
return abs(c-o)
def lower_wick_at_least_twice_real_body(o,l,c):
return lower_wick(o,l,c) >= 2 * real_body(o,c)
def is_hammer(row):
return lower_wick_at_least_twice_real_body(row["Open"],row["Low"],row["Close"]) \
and closed_in_top_half_of_range(row["High"],row["Low"],row["Close"])
基本问题:如何将函数映射到列,特别是我想引用多个其他列或整行或其他什么的地方?
This post处理从单个源列中添加两个计算列,这很接近,但并不完全。
稍微高级一点:对于引用多个柱 (T) 确定的价格模式,我如何从函数定义中引用不同的行(例如 T-1、T-2 等)?
最佳答案
您想要执行的每一列的确切代码会有所不同,但您可能希望使用 map
和 apply
函数。在某些情况下,您可以直接使用现有列进行计算,因为这些列是 Pandas Series 对象,它们也可以用作 Numpy 数组,它会自动按元素进行通常的数学运算。
>>> d
A B C
0 11 13 5
1 6 7 4
2 8 3 6
3 4 8 7
4 0 1 7
>>> (d.A + d.B) / d.C
0 4.800000
1 3.250000
2 1.833333
3 1.714286
4 0.142857
>>> d.A > d.C
0 True
1 True
2 True
3 False
4 False
如果您需要在一行中使用 max 和 min 等操作,您可以使用 apply
和 axis=1
将您喜欢的任何函数应用到每一行。这是一个计算 min(A, B)-C
的示例,它看起来就像您的“下灯芯”:
>>> d.apply(lambda row: min([row['A'], row['B']])-row['C'], axis=1)
0 6
1 2
2 -3
3 -3
4 -7
希望这能让您对如何进行操作有所了解。
编辑:要将行与相邻行进行比较,最简单的方法是对要比较的列进行切片,省略开头/结尾,然后比较结果切片。例如,这将告诉您 A 列中的元素小于哪些行 C 列中的下一行元素:
d['A'][:-1] < d['C'][1:]
反之亦然,告诉你哪些行的 A 小于前一行的 C:
d['A'][1:] < d['C'][:-1]
执行 ['A"][:-1]
切掉 A 列的最后一个元素,执行 ['C'][1:]
切掉C 列的第一个元素,因此当您将这两个对齐并比较它们时,您将 A 中的每个元素与下一行中的 C 进行比较。
关于python - 将计算列添加到 Pandas 中的数据框中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12376863/