То, что я хочу достичь с точки зрения ввода вывода, - это перекрестное соединение
Пример ввода
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 ]