Количество случаев, когда разность столбцов в DataFrame удовлетворяет условию - PullRequest
0 голосов
/ 02 сентября 2018

У меня есть Dataframe с большим количеством строк, и я просто ищу количество строк, которые соответствуют критериям.
Фрагмент данных:

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.

ТИА

Ответы [ 2 ]

0 голосов
/ 02 сентября 2018

Вам не нужно разницы, тогда принимайте абсолютное значение только для того, чтобы найти, где ноль. Просто найдите, где они равны в первую очередь.

eval

Это pandas.DataFrame метод, который позволяет строкам представлять формулы. Оказывается, это очень быстро для больших наборов данных. Я нахожу это очень читабельным во многих обстоятельствах.

mydf.tail(6).eval('Close == Open').sum()

Если вам нужно было быть в какой-то дельте и нужно было различать столбцы

mydf.tail(6).eval('abs(Close - Open) < 1e-6').sum() 

isclose

Это функция Numpy, которая признает, что поплавки по своей сути немного отклонены из-за отсутствия точности. Поэтому мы просто хотим знать, достаточно ли близки значения.

np.isclose(mydf.Open.tail(6), mydf.Close.tail(6)).sum()

Однако, для определения, находится ли разница в некоторой дельте, легче использовать isclose из-за встроенного аргумента допуска

np.isclose(mydf.Open.tail(6), mydf.Close.tail(6), atol=1e-6).sum()
0 голосов
/ 02 сентября 2018

Я думаю, что нужно сравнить eq для == с последними 6 значениями tail и подсчитать значения sum:

out = mydf['Close'].tail(6).eq(mydf['Open'].tail(6)).sum()

Ваше решение должно быть изменено для последних 6 значений, также добавлено sub для меньшего () в коде:

out = mydf['Close'].tail(6).sub(mydf['Open'].tail(6)).abs().eq(0).sum()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...