我有一个包含很多行的数据框,我只是在寻找满足条件的行数。
数据段:
mydf:
Date Time Open High Low Close
143 07:08:2015 14:55:00 300.10 300.45 300.10 300.45
144 07:08:2015 15:00:00 300.50 300.95 300.45 300.90
145 07:08:2015 15:05:00 300.90 301.20 300.75 300.90
146 07:08:2015 15:10:00 300.85 301.40 300.75 301.40
147 07:08:2015 15:15:00 301.40 301.60 301.20 301.55
148 07:08:2015 15:20:00 301.45 301.55 301.10 301.40
我当前的代码,首先将所需的列分为2个系列,然后计算最近6个元素的出现次数
openpr = mydf['Open']
closepr = mydf['Close'] # 2 Series, one for Open and One for Close data
differ = abs(closepr - openpr) #I have a series list with absolute Difference.
myarr = differ[142:].values == 0 # last X elements
sum(myarr) #Num of occurances with Zero Difference.
据我了解,有很多方法可以用最少的代码直接使用DF本身来达到上述结果。
TIA
答案 0 :(得分:1)
我认为需要将eq
的{{1}}与tail
的最后==
值进行比较,并以6
的值进行计数:
sum
您的解决方案应更改为最后6个值,并在代码中添加sub
减少out = mydf['Close'].tail(6).eq(mydf['Open'].tail(6)).sum()
:
()
答案 1 :(得分:1)
您无需求差,然后仅取绝对值即可找到零。只需首先找到它们相等的位置即可。
out = mydf['Close'].tail(6).sub(mydf['Open'].tail(6)).abs().eq(0).sum()
这是一个eval
方法,它允许字符串表示公式。事实证明,在大型数据集上非常快。我发现它在很多情况下都很可读。
pandas.DataFrame
如果您需要在某个增量之内并且必须更改列数
mydf.tail(6).eval('Close == Open').sum()
mydf.tail(6).eval('abs(Close - Open) < 1e-6').sum()
这是一个Numpy函数,它承认由于缺乏精度,浮点数固有地有点偏离。因此,我们只想知道值是否足够接近。
isclose
但是,由于内置公差参数,在使用np.isclose(mydf.Open.tail(6), mydf.Close.tail(6)).sum()
时更容易确定差是否在某个增量内
isclose