我有一个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)
我想添加各种计算的列,从简单的列开始,例如期间范围(HL),然后是布尔值以指示我将定义的价格模式的出现-例如锤形蜡烛模式,为其定义示例:
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"])
基本问题:如何将函数映射到列,特别是在我想引用多个其他列或整行或其他内容的地方?
这篇文章处理从单个源列添加两个计算列,这是很接近的,但还不完全是。
稍微先进一点:对于参照多个条形(T)确定的价格模式,我如何从函数定义中引用不同的行(例如T-1,T-2等)?
确切的代码对于您要执行的每个列都会有所不同,但是您可能需要使用map
andapply
函数。在某些情况下,您可以直接使用现有的列进行计算,因为这些列是Pandas系列对象,它们也可以作为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
withaxis=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列的第一个元素,所以你排队的这两个并比较他们,你是在一个每个元素比较从以下行℃。
问题内容: 这可能很容易,但是我有以下数据: 在数据框1中: 在数据框2中: 我想要一个具有以下形式的数据框: 我尝试使用该方法,但是得到了交叉连接(即笛卡尔积)。 什么是正确的方法? 问题答案: 通常看来,您只是在寻找联接:
问题内容: 我的数据可以在给定日期包含多个事件,也可以在一个日期包含否事件。我接受这些事件,按日期计数并绘制它们。但是,当我绘制它们时,我的两个系列并不总是匹配。 在上面的代码中,idx变为30个日期范围。2019/09/01至2019/09/30但是S可能只有25或26天,因为在给定日期没有事件发生。然后,当我尝试绘图时,由于大小不匹配,我得到一个AssertionError: 解决这个问题的正
问题内容: 我有两个,都被索引。我需要将元素添加在一起以形成一个new ,但前提是索引和列相同。如果该项不存在于之一,则应将其视为零。 我试过使用,但这无论索引和列如何。还尝试了一个简单的方法,但是如果两个数据框都没有该元素,则给出a 。 有什么建议? 问题答案: 怎么样
我想使用两列作为行ID,同时计算基于时间的分组。请看下图: 转化成这样: 正在发生的是,X在时间10发生了0次,但在15和23发生了1次。 Y在10点钟发生了3次,但在15和23没有。等等。
问题内容: 我想统计数据框中某些单词出现的次数。我知道使用“ str.contains” 目前,我正在使用上面的代码。是否有一种匹配正则表达式并获得出现次数的方法?就我而言,我有一个大的数据框,我想匹配大约100个字符串。 问题答案: 更新:原始答案计算包含子字符串的行。 要计算子字符串的所有出现次数,可以使用: 该方法接受正则表达式: 例如: 要计算出现的次数,您可以对布尔系列求和:
我想给我的 以下是我的代码: 当我运行这个,我得到以下错误: 我怎样才能解决这个问题?