CuDF для текста / строки - PullRequest
       52

CuDF для текста / строки

0 голосов
/ 30 марта 2020

Я новичок в cuDF и, возможно, не понял цели конструкции, так что это очень общий вопрос c, который у меня есть. У меня есть набор данных, который в основном содержит строковые столбцы, и я надеялся использовать apply_rows для выполнения обработки строк, однако я понял, что это может работать только с данными цифр c.

Вот пример которые я цитировал на большинстве сайтов:

import cudf
import numpy as np

df = cudf.DataFrame()
nelem = 3
df['col1'] = np.arange(nelem)
df['col2'] = np.arange(nelem)
df['col3'] = np.arange(nelem)

# Define input columns for the kernel
col1 = df['col1']
col2 = df['col2']
col3 = df['col3']

def kernel(col1, col2, col3, out1,  out2, kwarg1, kwarg2):
    for i, (x, y, z) in enumerate(zip(col1, col2, col3)):
        out1[i] = kwarg2 * x - kwarg1 * y
        out2[i] = y - kwarg1 * z
df.apply_rows(kernel,
              incols=['col1', 'col2', 'col3'],
              outcols=dict(out1=np.float64),
              kwargs=dict(kwarg1=3, kwarg2=4))

Если я изменяю это на

import cudf
import numpy as np

df = cudf.DataFrame()
nelem = 3
df['col1'] = np.arange(nelem)
df['col2'] = np.arange(nelem)
df['col3'] = ['a','a','a'] # <<- change to string

# Define input columns for the kernel
col1 = df['col1']
col2 = df['col2']
col3 = df['col3']

def kernel(col1, col2, col3, out1,  out2, kwarg1, kwarg2):
    for i, (x, y, z) in enumerate(zip(col1, col2, col3)):
        out1[i] = kwarg2 * x - kwarg1 * y
        out2[i] = y - kwarg1 * z

Он сообщает об ошибке, подобной AttributeError: у объекта 'nvstrings' нет атрибута 'to_gpu_array' .

Это предназначено для работы только с числовыми значениями? Я предполагаю, что это предназначено для работы с матричным типом операций, поэтому это ограничение. Может ли кто-нибудь представить некоторые идеи здесь?

Ответы [ 3 ]

0 голосов
/ 31 марта 2020

Когда вы выполняете apply_rows, вы выполняете пользовательскую функцию (UDF) для строк столбцов, в которые вы ее передаете. Прямо сейчас в текущей версии cuDF строковые столбцы - это совсем другой тип объекта, чем числовые столбцы, и, как упоминает @rnyai, вы не можете выполнить UDF для строкового столбца.

Сейчас cuDF претерпевает большой переход (libcudf ++), где строковые столбцы подвергаются ре-архитектуре и вскоре должны поддерживать UDF. , Следите за проблемами, упомянутыми @rnyai, чтобы увидеть, когда строковые столбцы cuDF будут поддерживать UDF.

В то же время, я бы посоветовал вам использовать только apply_rows для числовых столбцов и посмотреть, есть ли другой способ Вы можете делать то, что вам нужно сделать с вашими строковыми столбцами. Возможно, если вы разместите здесь то, что пытаетесь достичь, мы можем предложить некоторые решения.

0 голосов
/ 31 марта 2020

@ Маюх, как сказал @rnyai, вы используете применяются строки и UDF таким образом, что они не будут работать в RAPIDS. Обработка строки может быть выполнена немного по-другому. У RAPIDS есть средство доступа к строкам, которое использует nvstrings для эффективной обработки строк в графическом процессоре.

Я не уверен, какую операцию вы хотите выполнить с вашим примером в вашем вопросе, но вот ссылка на наш код для справки. Я свяжу вас с документами позже ниже.

https://github.com/rapidsai/cudf/blob/branch-0.14/python/cudf/cudf/core/column/string.py

, например, если вы хотите сделать строчные буквы в верхнем регистре,

import cudf
import numpy as np

df = cudf.DataFrame()
nelem = 3
df['col1'] = np.arange(nelem)
df['col2'] = np.arange(nelem)
df['col3'] = ['a','a','a'] # <<- change to string
df['col3'] = df['col3'].str.upper()
df.head()

здесь можно выполнить больше операций: https://docs.rapids.ai/api/nvstrings/stable/

Оттуда вы можете создавать обычные функции, которые обрабатывают строки с ожидаемой скоростью графического процессора. Просто держите ваш код параллельно! Поскольку петли являются последовательными, и RAPIDS делает много тяжелой работы для вас.

0 голосов
/ 30 марта 2020

UDF для строкового столбца пока не поддерживаются. Вы можете следить за открытыми выпусками GitHub здесь:

https://github.com/rapidsai/cudf/issues/2169

https://github.com/rapidsai/cudf/issues/3646

...