我不认为我正在尝试解决这个问题,而是要了解正在发生的事情,因此我可以将它应用到我更大的项目的上下文中。我正在重写一个 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 看到了不同的东西。
我想了解为什么会这样,因为我相信我会遇到更多这样的问题。
感谢您的任何见解。