1

我是 cuDF 的新手,可能不了解构造的目的,所以这是一个非常普遍的问题。我有一个主要包含字符串列的数据集,我希望使用 apply_rows 来执行字符串的处理,但是,我意识到这可能只适用于数字数据。

这是我在大多数网站中引用的示例:

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' object has no attribute 'to_gpu_array' 的错误。

这是否设计为仅适用于数值?我假设这是为了处理矩阵类型的操作而设计的,这就是这个约束的原因。有人可以在这里提供一些见解吗?

4

3 回答 3

1

@Mayukh,正如@rnyai 所说,您正在使用应用行和UDF,它们在RAPIDS 中不起作用。字符串处理可以稍有不同。RAPIDS 有一个字符串访问器,用于nvstrings以 GPU 高效的方式处理字符串。

我不确定您要对问题中的示例执行什么操作,但这里是我们代码的链接,以供参考。稍后我会将您链接到下面的文档。

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/

从那里,您可以创建常规函数,以预期的 GPU 速度处理字符串。只要保持你的代码并行!For 循环是串行的,RAPIDS 为您做了很多繁重的工作。

于 2020-03-31T17:24:27.210 回答
0

当您执行时,apply_rows您正在对您传入的列的行执行用户定义函数 (UDF)。现在在当前版本的 cuDF 中,字符串列是与数字列非常不同的对象类型,并且作为 @ rnyai 提到,您不能在字符串列上执行 UDF。

现在 cuDF 正在经历一个大的转变 (libcudf++),其中 String 列正在重新架构,并且应该很快支持 UDF。密切关注@rnyai 提到的问题,以了解 cuDF 字符串列何时支持 UDF。

同时,我建议您只使用apply_rows数字列,看看是否有另一种方法可以对字符串列执行您需要执行的操作。也许如果您在这里发布您想要实现的目标,我们可以提出一些解决方案。

于 2020-03-31T13:39:32.963 回答
0

尚不支持字符串列上的 UDF。您可以在此处关注开放的 GitHub 问题:

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

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

于 2020-03-30T15:08:45.700 回答