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

#python #pandas #vectorization #finance

#питон #панды #векторизация #финансы

Вопрос:

Я смотрю на данные OHLC с использованием Панд и немного зацикливаюсь на том, могу ли я избежать цикла для того, чего мне нужно достичь. В принципе, для столбца «высокий» я хочу просмотреть произвольное количество строк, скажем, 10, в поисках ситуации, когда предыдущий максимум находится в пределах 0,01 =gt; предостережение, если максимум равен 81,21, 82,2, 82,19, 81,2, для последней строки (81,2) я бы не включил первую (81,21), так как она уже встречается 82,19, поэтому не хочу иметь абсолютный разрыв 0,02, надеюсь, это имеет смысл.

Я изо всех сил пытаюсь решить, использовать ли скользящее окно, или просто применять по строкам, или есть ли какие-либо хорошие идеи, которые подошли бы, которые мне полностью не хватает? Ниже приведена версия фрейма данных (df) в 10 строк и конечный желаемый вывод (end_df), который будет содержать логический столбец для привязки к диапазону, отметку времени начала диапазона (минимум 2 периода), минимум и максимум в заданном диапазоне и количество периодов.

Я понимаю, что имело бы смысл фильтровать только те строки, в которых разница с предыдущей строкой

Я могу легко найти решение, просто не очень быстрое или элегантное, заранее спасибо, если у вас есть какие-либо мысли, код ниже:

 import pandas as pd from numpy import NaN from pandas import NaT  # Starting dataframe df df_data = {'columns': ['ts', 'high', 'low'],  'data': [['2021-11-11 21:50:00', 81.18, 81.16],  ['2021-11-11 21:51:00', 81.2, 81.17],  ['2021-11-11 21:52:00', 81.2, 81.19],  ['2021-11-11 21:53:00', 81.2, 81.2],  ['2021-11-11 21:54:00', 81.2, 81.17],  ['2021-11-11 21:55:00', 81.19, 81.12],  ['2021-11-11 21:56:00', 81.16, 81.15],  ['2021-11-11 21:57:00', 81.18, 81.16],  ['2021-11-11 21:58:00', 81.18, 81.16],  ['2021-11-11 21:59:00', 81.21, 81.16]]}  df = pd.DataFrame(data=df_data['data'], columns=df_data['columns']) df = df.assign(ts=pd.to_datetime(df.ts)) df = df.set_index('ts')  # desired output, end_df end_data = {'columns': ['ts', 'high', 'low', 'range_bound', 'range_start', 'range_periods', 'range_low', 'range_high'],  'data': [['2021-11-11 21:50:00', 81.18, 81.16, False, NaT, 0, NaN, NaN],  ['2021-11-11 21:51:00', 81.2, 81.17, False, NaT, 0, NaN, NaN],  ['2021-11-11 21:52:00', 81.2, 81.19, True, '2021-11-11 21:51:00', 2, 81.17, 81.2],  ['2021-11-11 21:53:00', 81.2, 81.2, True, '2021-11-11 21:51:00', 3, 81.17, 81.2],  ['2021-11-11 21:54:00', 81.2, 81.17, True, '2021-11-11 21:51:00', 4, 81.17, 81.2],  ['2021-11-11 21:55:00', 81.19, 81.12, True, '2021-11-11 21:51:00', 5, 81.17, 81.2],  ['2021-11-11 21:56:00', 81.16, 81.15, False, NaT, 0, NaN, NaN],  ['2021-11-11 21:57:00', 81.18, 81.16, False, NaT, 0, NaN, NaN],  ['2021-11-11 21:58:00', 81.18, 81.16, True, '2021-11-11 21:57:00', 2, 81.16, 81.18],  ['2021-11-11 21:59:00', 81.21, 81.16, False, NaT, 0, NaN, NaN]]}  end_df = pd.DataFrame(data=end_data['data'], columns=end_data['columns']) end_df = end_df.assign(ts=pd.to_datetime(end_df.ts), range_start=pd.to_datetime(end_df.range_start)) end_df = end_df.set_index('ts')  

Комментарии:

1. Немного неясно, чего вы пытаетесь достичь с помощью этих данных. Разве нет индикаторов, таких как ценовые каналы Дончиана или подобных, которые могли бы помочь? Если вы просто пытаетесь найти торговлю с ограниченным диапазоном, могут помочь другие методы.

2. Я ищу сигналы ниже по течению, когда цена движется в соответствии с диапазоном — просто хотел выяснить, можно ли легко векторизовать этот первый шаг…