Dask Dataframe Эффективный генератор пар строк? - PullRequest
0 голосов
/ 10 июля 2020

То, что я хочу достичь с точки зрения ввода вывода, - это перекрестное соединение

Пример ввода

df = pd.DataFrame(columns = ['A', 'val'], data = [['a1', 23],['a2', 29], ['a3', 39]])
print(df)
    A  val
0  a1   23
1  a2   29
2  a3   39

Пример вывода:

df['key'] = 1
df.merge(df, how = "outer", on ="key")
  A_x  val_x  key A_y  val_y
0  a1     23    1  a1     23
1  a1     23    1  a2     29
2  a1     23    1  a3     39
3  a2     29    1  a1     23
4  a2     29    1  a2     29
5  a2     29    1  a3     39
6  a3     39    1  a1     23
7  a3     39    1  a2     29
8  a3     39    1  a3     39

Как мне добиться этого для большого набора данных с помощью Dask?

Я заинтересован в получении всех комбинаций пар строк кадра данных Dask (аналогично декартовому продукту) для дальнейшего расчета метрик между строками, таких как расстояние и c. Но я всегда получаю ошибку памяти при использовании Dask Distributed локально, я привел игрушечный пример того, что я пытаюсь достичь.

Я новичок в dask, поэтому я просто хочу знать, даже возможно локально? Каким должен быть мой идеальный размер разделов? Как лучше получить пары строк с помощью dask?

import pandas as pd
import numpy as np
import dask.dataframe as dd
from dask.distributed import Client
client = Client()
client
df = pd.DataFrame(columns = list(range(50)), data =  np.random.rand(10000,50))
ddf = dd.from_pandas(df, npartitions=10)  # rather than here
ddf = ddf.assign(key = 0)
ddf = dd.merge(ddf, ddf, suffixes=('', '_ch'), on='key', 
npartitions = 10000, how = 'outer')
ddf['0'].mean().compute()

Я получаю следующую ошибку:

MemoryError: Unable to allocate 37.3 GiB for an 
array with shape (100000000, 50) and data type float64

Сведения о локальном кластере

Scheduler: tcp://127.0.0.1:52435
Dashboard: http://127.0.0.1:8787/status
Cluster
Workers: 4
Cores: 12
Memory: 34.10 GB

[ Снимок потока задач1 ]

1 Ответ

0 голосов
/ 08 августа 2020

Полный внешний продукт, вероятно, создаст очень большой набор данных. Допустим, в каждом из ваших промежуточных pandas фреймов данных всего миллион строк. Перекрестный продукт этого фрейма данных с самим собой будет содержать один триллион строк, и поэтому, вероятно, выльет память на этой машине.

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

...