Панды катят ближайшее значение

Предположим, у нас есть следующий фрейм данных:

              timestamp      open      high       low     close  delta  atr  last_index  bearish bullish_turning_point
2   04-10-2024 01:54:44  18370.00  18377.75  18367.50  18376.00     32    0        1949    False                  True
5   04-10-2024 03:21:14  18376.50  18383.00  18375.25  18381.25     28    0        3899    False                  True
7   04-10-2024 04:38:54  18378.50  18386.25  18378.25  18385.50    133    0        5199    False                  True
9   04-10-2024 05:30:27  18384.00  18389.50  18378.75  18388.25    135    0        6499    False                  True
12  04-10-2024 06:06:12  18371.00  18378.00  18369.50  18378.00    130    0        8449    False                  True
14  04-10-2024 06:33:44  18372.25  18383.75  18372.00  18376.25     67    0        9749    False                  True
18  04-10-2024 07:21:14  18377.50  18387.75  18376.25  18380.00      8    0       12349    False                  True
22  04-10-2024 07:47:58  18388.00  18396.75  18385.25  18389.50    -30    0       14949    False                  True
25  04-10-2024 08:06:17  18390.75  18397.00  18387.50  18392.00    -25    0       16899    False                  True
28  04-10-2024 08:33:32  18384.75  18398.00  18383.25  18394.00     89    0       18849    False                  True
30  04-10-2024 08:54:35  18391.25  18403.00  18387.75  18399.25     84    0       20149    False                  True
34  04-10-2024 09:11:15  18388.75  18396.25  18385.75  18392.25     15    0       22749    False                  True
43  04-10-2024 10:02:22  18343.50  18350.50  18341.25  18350.50    113    0       28599    False                  True
46  04-10-2024 10:14:44  18352.00  18361.75  18352.00  18360.00    -42    0       30549    False                  True
49  04-10-2024 10:35:49  18354.00  18361.25  18347.75  18358.00     49    0       32499    False                  True
52  04-10-2024 10:54:18  18362.25  18372.00  18361.50  18372.00    180    0       34449    False                  True
56  04-10-2024 11:12:32  18369.25  18379.50  18367.00  18376.50     78    0       37049    False                  True
59  04-10-2024 11:27:27  18370.00  18376.50  18367.50  18373.25     54    0       38999    False                  True
65  04-10-2024 12:01:53  18377.75  18388.25  18377.50  18383.25    108    0       42899    False                  True
73  04-10-2024 12:25:04  18382.00  18386.25  18381.00  18384.75     65    0       48099    False                  True

Как я могу найти «ближайший» к «открытому» для каждой предыдущей строки? Например.

Для строки 30 (close: 18399,25) это будет строка 25 (open: 18390,75). Для строки 52 (close: 18372,00) это будет 14 (open: 18372,25) и так далее.

что такое closest close? предоставьте желаемый результат вашего образца.

Panda Kim 19.04.2024 18:34

@PandaKim: «Ближайший» к каждой строке close. Позвольте мне объяснить это дальше.

Jan 19.04.2024 18:37

Если да, попробуйте использовать expanding вместо rolling.

Panda Kim 19.04.2024 18:50

Что, если ближайшее открытие состоится в тот же день? Вам нужна эта ценность?

Nick 20.04.2024 05:50

Честно говоря, это тиковые данные (~500 тыс. строк в день) — open в один и тот же день — это слишком неточно...

Jan 20.04.2024 10:26
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
5
81
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Пытаться:

def find_closest_value(idx):
    g = df.loc[: idx.iat[-1]]
    close_ = g.loc[idx.iat[-1], "close"]
    closest_open_to_close = (g.loc[: idx.iat[-2], "open"] - close_).abs().argmin()
    return g.index[closest_open_to_close]


df["nearest"] = df.index.to_frame().expanding(min_periods=2).apply(find_closest_value)
print(df)

Распечатки:

              timestamp      open      high       low     close  delta  atr  last_index  bearish  bullish_turning_point  nearest
2   04-10-2024 01:54:44  18370.00  18377.75  18367.50  18376.00     32    0        1949    False                   True      NaN
5   04-10-2024 03:21:14  18376.50  18383.00  18375.25  18381.25     28    0        3899    False                   True      2.0
7   04-10-2024 04:38:54  18378.50  18386.25  18378.25  18385.50    133    0        5199    False                   True      5.0
9   04-10-2024 05:30:27  18384.00  18389.50  18378.75  18388.25    135    0        6499    False                   True      7.0
12  04-10-2024 06:06:12  18371.00  18378.00  18369.50  18378.00    130    0        8449    False                   True      7.0
14  04-10-2024 06:33:44  18372.25  18383.75  18372.00  18376.25     67    0        9749    False                   True      5.0
18  04-10-2024 07:21:14  18377.50  18387.75  18376.25  18380.00      8    0       12349    False                   True      7.0
22  04-10-2024 07:47:58  18388.00  18396.75  18385.25  18389.50    -30    0       14949    False                   True      9.0
25  04-10-2024 08:06:17  18390.75  18397.00  18387.50  18392.00    -25    0       16899    False                   True     22.0
28  04-10-2024 08:33:32  18384.75  18398.00  18383.25  18394.00     89    0       18849    False                   True     25.0
30  04-10-2024 08:54:35  18391.25  18403.00  18387.75  18399.25     84    0       20149    False                   True     25.0
34  04-10-2024 09:11:15  18388.75  18396.25  18385.75  18392.25     15    0       22749    False                   True     30.0
43  04-10-2024 10:02:22  18343.50  18350.50  18341.25  18350.50    113    0       28599    False                   True      2.0
46  04-10-2024 10:14:44  18352.00  18361.75  18352.00  18360.00    -42    0       30549    False                   True      2.0
49  04-10-2024 10:35:49  18354.00  18361.25  18347.75  18358.00     49    0       32499    False                   True     46.0
52  04-10-2024 10:54:18  18362.25  18372.00  18361.50  18372.00    180    0       34449    False                   True     14.0
56  04-10-2024 11:12:32  18369.25  18379.50  18367.00  18376.50     78    0       37049    False                   True      5.0
59  04-10-2024 11:27:27  18370.00  18376.50  18367.50  18373.25     54    0       38999    False                   True     14.0
65  04-10-2024 12:01:53  18377.75  18388.25  18377.50  18383.25    108    0       42899    False                   True      9.0
73  04-10-2024 12:25:04  18382.00  18386.25  18381.00  18384.75     65    0       48099    False                   True     28.0

Большое спасибо - есть ли какое-нибудь преимущество перед ответом @Nick?

Jan 20.04.2024 21:08

@ Ян, я думаю, ответ Ника более элегантный. Выберите тот, который подходит вам лучше всего (и, например, более эффективен)

Andrej Kesely 20.04.2024 21:10
Ответ принят как подходящий

Если вы хотите включить открытие текущей строки в ближайшие открытые значения, вы можете сделать это:

df['nearest'] = [(abs(df.loc[:i, 'open'] - close)).idxmin() for i, close in df['close'].items()]

Выход:

[2, 5, 7, 9, 7, 5, 7, 22, 25, 25, 30, 30, 43, 46, 49, 14, 5, 14, 9, 28]

Если вы не хотите включать открытие текущей строки, все становится немного сложнее:

df['nearest'] = [0] + [(abs(df.loc[:df.index[i-1], 'open'] - close)).idxmin() for i, close in enumerate(df['close'][1:], 1)]

Выход:

[0, 2, 5, 7, 7, 5, 7, 9, 22, 25, 25, 30, 2, 2, 46, 14, 5, 14, 9, 28]

По желанию вы можете заменить np.nan (или что-нибудь еще) на значение первой строки.

Приведенный выше код реализует то, что фактически является расширяющимся окном. Если вы хотите реализовать скользящее окно, вы можете использовать этот код:

k = 5    # length of window
df['nearest'] = [0] * k + [(abs(df.loc[df.index[i-k]:df.index[i-1], 'open'] - close)).idxmin() for i, close in enumerate(df['close'][k:], k)]

Выход:

# k = 5
[0, 0, 0, 0, 0, 5, 7, 9, 22, 25, 25, 30, 28, 43, 46, 34, 34, 56, 59, 65]
# k = 8
[0, 0, 0, 0, 0, 0, 0, 0, 22, 25, 25, 30, 12, 14, 46, 28, 28, 56, 34, 34]

Хороший! ПОКА, что ты можешь сделать abs(pd.Series) :) +1

Andrej Kesely 20.04.2024 10:59

@AndrejKesely да, кому нужны глупости .abs()! :)

Nick 20.04.2024 14:20

А если серьезно, то мне abs(...) гораздо легче читать.

Nick 20.04.2024 14:20

Спасибо большое, это похоже на механизм expanding(...), да? А если бы я захотел ограничить его скользящим окном, мне просто пришлось бы настроить цикл for?

Jan 20.04.2024 21:08

@ Ян, да, это расширяющееся окно. Я отредактировал свой ответ, добавив код для скользящего окна.

Nick 21.04.2024 01:31

@Ник: Очень хорошо, спасибо огромное.

Jan 21.04.2024 09:40

Другие вопросы по теме