我正在尝试从https://cometa.ujaen.es/ (例如艺术)下载arff数据集,并使用scipy.arff.loadarff将其加载到python中。
然而,似乎csv希望在头后有一种csv文件,并且无法解析绝大多数数据集。
例如。为复制这一问题:
from scipy.arff import loadarff
import urllib
urllib.request.urlretrieve('https://cometa.ujaen.es/public/full/yahoo_arts.arff', 'yahoo_arts.arff')
ds = loadarff('yahoo_arts.arff')(在这个案例中,ValueError: could not convert string to float: '{8 1')。
这是意料之中吗?(又名aka实现不完全符合arff格式)您知道一些变通方法或一些手工解析功能吗?
谢谢你在这个话题上的任何帮助/建议。
发布于 2019-12-10 17:05:19
这是意料之中吗?(也称参与实施不完全符合arff格式)
是的,很不幸。正如在loadarff中提到的,“它不能读取带有稀疏数据的文件(文件中的{})”。文件yahoo_arts.arff在其@data部分中使用稀疏格式。
您可以尝试搜索PyPi中的"arff“来寻找替代方案。我没有使用任何这些,所以我没有任何具体的建议。
发布于 2019-12-10 21:38:59
正如Weckesser的回答所指出的,the不能读取稀疏的arff文件。我已经实现了一个快速的解决方法来解析稀疏的arff文件,如果它可以帮助其他人,我将在下面共享它。如果我有时间做一个干净的版本的话,我会尽力为这个版本做出贡献。
编辑:对不起,rusu_ro1,我没有看到你的版本,但我想它也能用。
from scipy.sparse import coo_matrix
from functools import reduce
import pandas as pd
def loadarff(filename):
features = list()
data = list()
row_idx = 0
with open(filename, "rb") as f:
for line in f:
line = line.decode("utf8")
if line.startswith("@data"):
continue
elif line.startswith("@relation"):
continue
elif line.startswith("@attribute"):
try:
features.append(line.split(" ")[1])
except Exception as e:
print(f"Cannot parse {line}")
raise e
elif line.startswith("{"):
try:
line = line.replace("{", "").replace("}", "")
line = [[row_idx,]+[int(x) for x in v.split(" ")] for v in line.split(",")]
data.append(line)
row_idx += 1
except Exception as e:
print(f"Cannot parse {line}")
raise e
else:
print(f"Cannot parse {line}")
flatten = lambda l: [item for sublist in l for item in sublist]
data = flatten(data)
sparse_matrix = coo_matrix(([x[2] for x in data], ([x[0] for x in data], [x[1] for x in data])), shape=(row_idx, len(features)))
df = pd.DataFrame(sparse_matrix.todense(), columns=features)
return dfhttps://stackoverflow.com/questions/59271661
复制相似问题