Asof-join с множественными условиями неравенстваPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Asof-join с множественными условиями неравенства

Сообщение Anonymous »

У меня есть два кадра данных: a (~600 млн строк) и b (~2 млн строк). Каков наилучший подход к соединению b с a при использовании 1 условия равенства и 2 условий неравенства в соответствующих столбцах?
  • a_1 = b_1
  • a_2 >= b_2
  • a_3 >= b_3
На данный момент я исследовал следующие пути:
  • Полярности:

    join_asof(): допускает только 1 условие неравенства
  • join_where() с фильтром(): даже при небольшом окне допуска в стандартной установке Polars не хватает строк (ограничение строк 4,3 Б) во время соединения, а в установке Polars-u64-idx не хватает строк. память (512 ГБ)
[*]DuckDB: ASOF LEFT JOIN: также допускает только 1 условие неравенства
< li>Numba: Поскольку описанное выше не сработало, я попытался создать собственную функцию join_asof() — см. код ниже. Он работает нормально, но с увеличением длины a становится непомерно медленным. Я пробовал различные конфигурации циклов for/ while и фильтрации, все с одинаковыми результатами.

Теперь у меня заканчиваются идеи... Какой способ реализовать это было бы более эффективным?
Спасибо!
import numba as nb
import numpy as np
import polars as pl
import time

@nb.njit(nb.int32[:](nb.int32[:], nb.int32[:], nb.int32[:], nb.int32[:], nb.int32[:], nb.int32[:], nb.int32[:]), parallel=True)
def join_multi_ineq(a_1, a_2, a_3, b_1, b_2, b_3, b_4):
output = np.zeros(len(a_1), dtype=np.int32)

for i in nb.prange(len(a_1)):

for j in range(len(b_1) - 1, -1, -1):

if a_1 == b_1[j]:

if a_2 >= b_2[j]:

if a_3 >= b_3[j]:
output = b_4[j]
break

return output

length_a = 5_000_000
length_b = 2_000_000

start_time = time.time()
output = join_multi_ineq(a_1=np.random.randint(1, 1_000, length_a, dtype=np.int32),
a_2=np.random.randint(1, 1_000, length_a, dtype=np.int32),
a_3=np.random.randint(1, 1_000, length_a, dtype=np.int32),
b_1=np.random.randint(1, 1_000, length_b, dtype=np.int32),
b_2=np.random.randint(1, 1_000, length_b, dtype=np.int32),
b_3=np.random.randint(1, 1_000, length_b, dtype=np.int32),
b_4=np.random.randint(1, 1_000, length_b, dtype=np.int32))
print(f"Duration: {(time.time() - start_time):.2f} seconds")


Подробнее здесь: https://stackoverflow.com/questions/793 ... conditions
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Asof-join с множественными условиями неравенства
    Anonymous » » в форуме Python
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous
  • Asof-join с множественными условиями неравенства
    Anonymous » » в форуме Python
    0 Ответы
    20 Просмотры
    Последнее сообщение Anonymous
  • Asof-join с множественными условиями неравенства
    Anonymous » » в форуме Python
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous
  • Asof-join с множественными условиями неравенства
    Anonymous » » в форуме Python
    0 Ответы
    24 Просмотры
    Последнее сообщение Anonymous
  • Asof-join с множественными условиями неравенства
    Anonymous » » в форуме Python
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous

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