Передача функции Python в операторах сравнения на данных временных рядов Pandas - PullRequest
0 голосов
/ 29 октября 2018

Я пытаюсь создать функцию python для данных временных рядов, которая будет принимать любое количество операторов сравнения и применять пользовательскую логику для каждого оператора в панде DataFrame

Вот мои примерные данные:

    Date        Close
0   2008-08-20  41.2100
1   2008-08-22  41.3782
2   2008-08-25  40.6047
3   2008-08-27  41.7397
4   2008-08-28  41.7565
5   2008-09-03  39.6548
6   2008-09-04  38.5871
7   2008-09-05  38.6712
8   2008-09-09  38.5703
9   2008-09-11  37.3681
...

Пример того, что я хочу сделать:

# Return any days in which the close was lower than the last two days
df[(df['Close'] < df['Close'].shift(1)) & 
   (df['Close'].shift(1) < df['Close'].shift(2))]

    Date        Close
6   2008-09-04  38.5871
9   2008-09-11  37.3681
10  2008-09-12  36.8133
11  2008-09-15  35.6700
15  2008-09-24  36.3341
20  2008-10-07  30.0122
25  2008-10-15  27.8348
30  2008-10-22  25.2287
31  2008-10-23  25.2203
32  2008-10-24  23.2447

Но теперь давайте сделаем это функцией, которая позволит нам передавать выражения сравнения и обрабатывать любое их число.

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

Что если я хочу передать 8 операторов сравнения? Я не уверен, как построить логику для каждой перестановки, которую я мог бы передать своей функции.

comparison_op = [ <, <, >, >]
Column_Name = 'Close'

def comparison_operation(Column_Name, comparison_op[]):
  # I need to loop through the number of operators
  # to create a unique variable for each condition

  for i in len[boolean_op]:
    criteria1 = df[Column_Name] {comparison_op[0]} df[Column_Name].shift(i)
    criteria2 = df[Column_Name].shift(i + 1) {comparison_op[i]} df[Column_name].shift(i + 2)
    criteria3 = df[Column_Name].shift(i + 2) {comparison_op[i]} df[Column_name].shift(i + 3)
    criteria4 = df[Column_Name].shift(i + 3) {comparison_op[i]} df[Column_name].shift(i + 4)
    criteria_all = criteria1 & critera2 & critera3 & critera4
    result = ds[criteria_all]

Версия с жестким кодом

criteria1 = (df['Close'] < df['Close'].shift(1))
criteria2 = (df['Close'].shift(1) < df['Close'].shift(2))
criteria3 = (df['Close'].shift(2) > df['Close'].shift(3))
criteria4 = (df['Close'].shift(3) > df['Close'].shift(4))
criteria_all = criteria1 & criteria2 & criteria3 & criteria4
df[criteria_all].head(10)

Конечный результат:

    Date        Close
6   2008-09-04  38.5871
15  2008-09-24  36.3341
72  2009-01-08  28.4769
121 2009-05-15  34.3811
132 2009-06-03  37.9186
140 2009-06-15  37.0258
165 2009-07-22  40.4631
175 2009-08-05  42.4600
183 2009-08-17  40.0146
191 2009-08-27  41.7238
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...