Предположим, у нас есть следующий фрейм данных:
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) и так далее.
@PandaKim: «Ближайший» к каждой строке close
. Позвольте мне объяснить это дальше.
Если да, попробуйте использовать expanding
вместо rolling
.
Что, если ближайшее открытие состоится в тот же день? Вам нужна эта ценность?
Честно говоря, это тиковые данные (~500 тыс. строк в день) — open
в один и тот же день — это слишком неточно...
Пытаться:
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?
@ Ян, я думаю, ответ Ника более элегантный. Выберите тот, который подходит вам лучше всего (и, например, более эффективен)
Если вы хотите включить открытие текущей строки в ближайшие открытые значения, вы можете сделать это:
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
@AndrejKesely да, кому нужны глупости .abs()
! :)
А если серьезно, то мне abs(...)
гораздо легче читать.
Спасибо большое, это похоже на механизм expanding(...)
, да? А если бы я захотел ограничить его скользящим окном, мне просто пришлось бы настроить цикл for?
@ Ян, да, это расширяющееся окно. Я отредактировал свой ответ, добавив код для скользящего окна.
@Ник: Очень хорошо, спасибо огромное.
что такое
closest close
? предоставьте желаемый результат вашего образца.