Код: Выделить всё
┌────────────┬──────────┬──────────┬──────────┬──────────┐
│ time ┆ open ┆ high ┆ low ┆ close │
│ --- ┆ --- ┆ --- ┆ --- ┆ --- │
│ i64 ┆ f64 ┆ f64 ┆ f64 ┆ f64 │
╞════════════╪══════════╪══════════╪══════════╪══════════╡
│ 1649016000 ┆ 46405.49 ┆ 47444.11 ┆ 46248.84 ┆ 46407.35 │
│ 1649030400 ┆ 46407.36 ┆ 46461.14 ┆ 45744.77 ┆ 46005.44 │
│ 1649044800 ┆ 46005.43 ┆ 46293.38 ┆ 45834.39 ┆ 46173.99 │
│ 1649059200 ┆ 46174.0 ┆ 46287.97 ┆ 45787.0 ┆ 46160.09 │
│ … ┆ … ┆ … ┆ … ┆ … │
│ 1653278400 ┆ 30171.32 ┆ 30670.51 ┆ 30101.07 ┆ 30457.01 │
│ 1653292800 ┆ 30457.01 ┆ 30616.18 ┆ 30281.89 ┆ 30397.11 │
│ 1653307200 ┆ 30397.12 ┆ 30625.98 ┆ 29967.07 ┆ 30373.53 │
│ 1653321600 ┆ 30373.53 ┆ 30529.9 ┆ 30042.09 ┆ 30121.02 │
└────────────┴──────────┴──────────┴──────────┴──────────┘
Сначала я добавляю два столбца для подсчета локального минимума/максимума для каждой строки и заполняю нулями
Код: Выделить всё
raw_data["lmin_count"] = np.zeros(len(raw_data), dtype=np.int16)
raw_data["lmax_count"] = np.zeros(len(raw_data), dtype=np.int16)
Код: Выделить всё
for _order in range(2, 51):
local_minima = argrelextrema(raw_data["low"].to_numpy(), np.less, order=_order)[0]
local_maxima = argrelextrema(raw_data["high"].to_numpy(), np.greater, order=_order)[0]
и на каждой итерации по длине окна я хочу увеличивать значение lmin_count и lmax_count на индексы, найденные в local_minima и local_maxima
Я пробовал увеличивать значение с помощью этого кода:
Код: Выделить всё
if len(local_minima) > 1:
raw_data[local_minima,5] += 1
if len(local_maxima) > 1:
raw_data[local_minima,6] += 1
Код: Выделить всё
6но ошибка не реализована.
Итак, как лучше всего увеличить (или присвоить) значение столбца по индексам строк?
Обновление от 24 мая 2022 г.
Поскольку ответы были очень полезны, теперь у меня есть другие проблемы.
Я изменил свой код следующий:
Код: Выделить всё
min_expr_list = [
(
pl.col("price").rolling_min(
window_size=_order * 2 + 1, min_periods=_order + 2, center=True
)
== pl.col("price")
).cast(pl.UInt32)
for _order in range(200, 1001)
]
max_expr_list = [
(
pl.col("price").rolling_max(
window_size=_order * 2 + 1, min_periods=_order + 2, center=True
)
== pl.col("price")
).cast(pl.UInt32)
for _order in range(200, 1001)
]
raw_data = raw_data.with_columns(
pl.sum_horizontal(min_expr_list).alias("min_freq"),
pl.sum_horizontal(max_expr_list).alias("max_freq"),
)
еще одна проблема, с которой я столкнулся, - это использование памяти при этом подходе.
В предыдущем примере _order были ограничены, но в действии он шире, чем пример.
В настоящее время у меня есть наборы данных с миллионами записей (некоторые из них имеют более 10 миллионов записей) и диапазон _orders может быть от 2 до 1500, поэтому для вычислений требуется много ГБ оперативной памяти.
есть ли лучший способ сделать это?
и еще одна побочная проблема. при увеличении _order до более чем 1000 кажется, что это не работает. есть ли какие-либо ограничения в исходном коде?
Подробнее здесь: https://stackoverflow.com/questions/723 ... n-by-index
Мобильная версия