Я пытаюсь создать функцию 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