Как увеличить значения столбца данных Polars по индексуPython

Программы на Python
Ответить
Anonymous
 Как увеличить значения столбца данных Polars по индексу

Сообщение Anonymous »

У меня есть следующий фрейм данных

Код: Выделить всё

┌────────────┬──────────┬──────────┬──────────┬──────────┐
│ 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 │
└────────────┴──────────┴──────────┴──────────┴──────────┘
Я хочу посчитать, сколько раз каждая цена (минимальная и высокая) была локальным минимумом/максимумом в диапазоне окон от 2 до 50.
Сначала я добавляю два столбца для подсчета локального минимума/максимума для каждой строки и заполняю нулями

Код: Выделить всё

raw_data["lmin_count"] = np.zeros(len(raw_data), dtype=np.int16)
raw_data["lmax_count"] = np.zeros(len(raw_data), dtype=np.int16)
затем я перебираю длину окна от 2 до 50 и нахожу индекс каждого локального минимума/максимума, используя:

Код: Выделить всё

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
где local_minima и local_maxima являются массивом индексов и 5, являются индексом столбцов lmin_count и lmax_count.
но ошибка не реализована.
Итак, как лучше всего увеличить (или присвоить) значение столбца по индексам строк?
Обновление от 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"),
)
во-первых: можно ли объединить min_expr_list и max_expr_list в один список? и если это возможно, в выражении with_columns, как я могу добавить отдельные столбцы на основе каждого элемента списка?
еще одна проблема, с которой я столкнулся, - это использование памяти при этом подходе.
В предыдущем примере _order были ограничены, но в действии он шире, чем пример.
В настоящее время у меня есть наборы данных с миллионами записей (некоторые из них имеют более 10 миллионов записей) и диапазон _orders может быть от 2 до 1500, поэтому для вычислений требуется много ГБ оперативной памяти.
есть ли лучший способ сделать это?
и еще одна побочная проблема. при увеличении _order до более чем 1000 кажется, что это не работает. есть ли какие-либо ограничения в исходном коде?

Подробнее здесь: https://stackoverflow.com/questions/723 ... n-by-index
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»