0

我不认为我正在尝试解决这个问题,而是要了解正在发生的事情,因此我可以将它应用到我更大的项目的上下文中。我正在重写一个 Python 包以在 GPU 上运行。

无论如何,我正在使用 cudf 和 cuml 将数据帧传递给一个搜索列并创建所有 unqiue 值的数组的函数。传入的数据是一个包含所有数字字段的 csv,以及一个包含 1 表示正类,否则为 0 的类/y 字段。

数据的加载几乎相同。

编辑: cudf.unique() 返回一个 Series 而不是数组的事实似乎是原因。

还是很奇怪。以下适用于 Pandas 系列对象:

data = pd.read_csv(MY_DATA)

l = []

for val in data.MY_COLUMN:
    l.append(val)

print(type(data.MY_COLUMN)
# returns <pandas.core.series.Series>

但是与 <cudf.core.series.Series> 相同的循环会得到 TypeError: series objects not iterable 错误。为什么会这样?

熊猫版:

import pandas as pd
from sklearn.model_selection import train_test_split

dataTest = pdf.read_csv(MY_DATA)

X = dataTest.iloc[:, [1,12]]
y = dataTest.iloc[:,12]

X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=.2, random_state=610)"

cdf 版本:

import cudf
from cuml.model_selection import train_test_split

dataTest = cudf.read_csv(MY_DATA)

X = dataTest.iloc[:, [1,12]]
y = dataTest.iloc[:,12]

X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=.2, random_state=610)

接下来,我将 X_train 和 y_train 传递给一个模型,该模型作为一百万个其他事物的一部分,创建了 y_train 的唯一值数组。作为该过程的一部分,它使用 pandas.unique()。使用 pandas 数据框时,没有问题,整个模型运行顺利(不足为奇,它是基于 pandas 构建的)

但是,当我使用 cudf 数据框时,我得到以下信息:

File "/home/MASKED/preprocess.py", line 276, in _get_pos_class
    class_values = df[class_feat].unique()
  File "/home/jacob/miniconda3/envs/rapidsAI/lib/python3.7/site-packages/pandas/core/series.py", line 1872, in unique
    result = super().unique()
  File "/home/jacob/miniconda3/envs/rapidsAI/lib/python3.7/site-packages/pandas/core/base.py", line 1047, in unique
    result = unique1d(values)
  File "/home/jacob/miniconda3/envs/rapidsAI/lib/python3.7/site-packages/pandas/core/algorithms.py", line 407, in unique
    uniques = table.unique(values)
  File "pandas/_libs/hashtable_class_helper.pxi", line 4719, in pandas._libs.hashtable.PyObjectHashTable.unique
  File "pandas/_libs/hashtable_class_helper.pxi", line 4666, in pandas._libs.hashtable.PyObjectHashTable._unique
TypeError: unhashable type: 'Series'

我想我不明白为什么它在访问 cudf 数据框时看到一个不可散列的系列,而不是熊猫——它们都是系列?我假设会发生的情况是,当使用它不具备的方法调用 cudf 数据帧时,会发生以下两种情况之一:

  • 它将数据发送回 CPU 以供 Pandas 处理;或者,
  • 它会因为根本不认识这个方法而崩溃

但似乎正在发生的事情是,它知道 cudf 数据帧是一个数据帧,并尝试用 pandas 处理它,但随后 pandas 看到了不同的东西。

我想了解为什么会这样,因为我相信我会遇到更多这样的问题。

感谢您的任何见解。

4

0 回答 0