Создание КатегориальногоDtype из столбца int в Dask - PullRequest
1 голос
/ 19 февраля 2020

dask .__ version__ = 2.5.0

У меня есть таблица со столбцами, содержащая множество значений uint16 в диапазоне 0, ..., n и несколько таблиц подстановки, содержащих сопоставления этих «кодов» с их « категории.

Мой вопрос: есть ли способ сделать эти целочисленные столбцы «категориальными», не анализируя данные или не заменяя сначала коды категориями.

В идеале я хочу, чтобы Dask мог сохранять значения как есть, принимать их как коды категорий и принимать категории, которые, как я сказал, Dask принадлежат этим кодам?

dfp = pd.DataFrame({'c01': np.random.choice(np.arange(3),size=10), 'v02': np.random.randn(10)})
dfd = dd.from_pandas(dfp, npartitions=2)
mdt = pd.CategoricalDtype(list('abc'), ordered=True)
dfd.c01 = dfd.c01.map_partitions(lambda s: pd.Categorical.from_codes(s, dtype=mdt), meta='category')
dfd.dtypes

Выше не работает, dtype это 'O' (кажется, он заменил целые строки на строки)? Впоследствии я могу сделать следующее (что, кажется, делает трюк):

dfd.c01 = dfd.c01.astype('category')

Но чем это кажется неэффективным для больших наборов данных.

Любые указатели приветствуются.

Некоторый контекст: у меня большой набор данных (> 500 миллионов строк) со многими столбцами, содержащими ограниченное количество строк. Идеальный вариант использования для категории dtype. Данные извлекаются из Teradata DW с помощью Parallel Transporter, что означает, что он создает файл UTF-8 с разделителями. Чтобы ускорить этот процесс, я классифицирую данные на стороне Teradata, и мне просто нужно создать категорию dtype из кодов на стороне dask забора.

1 Ответ

0 голосов
/ 25 февраля 2020

Пока у вас есть верхняя граница наибольшего целого числа, которое вы называете n (равно 3), будет работать следующее:

In [33]: dfd.c01.astype('category').cat.set_categories(np.arange(len(mdt.categories))).cat.rename_categories(list(mdt.categories))
Out[33]:
Dask Series Structure:
npartitions=2
0    category[known]
5                ...
9                ...
Name: c01, dtype: category
Dask Name: cat, 10 tasks

Что будет следующим при вычислении

Out[34]:
0    b
1    b
2    c
3    c
4    a
5    c
6    a
7    a
8    a
9    a
Name: c01, dtype: category
Categories (3, object): [a, b, c]

Основная идея c состоит в том, чтобы создать промежуточную категорию, категориями которой являются коды (0, 1, ... n), а затем перейти от этих числовых категорий к фактическим (a, b, c).

У нас есть открытый вопрос, чтобы сделать этот лучше https://github.com/dask/dask/issues/2829

...