首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >向pandas中的数据框添加计算列

向pandas中的数据框添加计算列
EN

Stack Overflow用户
提问于 2012-09-12 03:48:29
回答 4查看 157.5K关注 0票数 80

我有一个OHLC价格数据集,我已经将其从CSV解析为Pandas数据帧,并重新采样到15分钟条形图:

代码语言:javascript
复制
<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)

我想添加各种计算列,从简单的列开始,例如period Range (H-L),然后是booleans,以指示我将定义的价格模式的出现-例如锤子蜡烛模式,其示例定义如下:

代码语言:javascript
复制
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等)从函数定义中?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-09-12 04:04:57

对于您想要执行的每一列,确切的代码会有所不同,但是您可能希望使用mapapply函数。在某些情况下,您可以直接使用现有的列进行计算,因为列是Pandas Series对象,它也可以作为Numpy数组工作,它会自动按元素执行通常的数学运算。

代码语言:javascript
复制
>>> 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这样的操作,您可以使用带有axis=1apply将任何您喜欢的函数应用到每一行。这是一个计算min(A, B)-C的例子,它看起来就像你的“下芯”:

代码语言:javascript
复制
>>> 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中下一行的元素的行:

代码语言:javascript
复制
d['A'][:-1] < d['C'][1:]

这是另一种方式,告诉您哪些行的A比前一行的C少:

代码语言:javascript
复制
d['A'][1:] < d['C'][:-1]

对列A的最后一个元素执行['A"][:-1]切片,对列C的第一个元素执行['C'][1:]切片,所以当您将这两个元素排成一行并进行比较时,您就是在将A中的每个元素与下一行的C进行比较。

票数 75
EN

Stack Overflow用户

发布于 2012-09-12 04:04:40

您可以使用row["Open"]等形式的is_hammer,如下所示

代码语言:javascript
复制
def is_hammer(rOpen,rLow,rClose,rHigh):
    return lower_wick_at_least_twice_real_body(rOpen,rLow,rClose) \
       and closed_in_top_half_of_range(rHigh,rLow,rClose)

然后,您可以使用map:

代码语言:javascript
复制
df["isHammer"] = map(is_hammer, df["Open"], df["Low"], df["Close"], df["High"])
票数 48
EN

Stack Overflow用户

发布于 2014-08-16 20:52:20

对于问题的第二部分,您还可以使用shift,例如:

代码语言:javascript
复制
df['t-1'] = df['t'].shift(1)

然后,t-1将包含来自上一行t的值。

http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.shift.html

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12376863

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档