首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法用scipy.arff.loadarff加载arff数据集

无法用scipy.arff.loadarff加载arff数据集
EN

Stack Overflow用户
提问于 2019-12-10 16:28:19
回答 2查看 1.1K关注 0票数 2

我正在尝试从https://cometa.ujaen.es/ (例如艺术)下载arff数据集,并使用scipy.arff.loadarff将其加载到python中。

然而,似乎csv希望在头后有一种csv文件,并且无法解析绝大多数数据集。

例如。为复制这一问题:

代码语言:javascript
复制
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格式)您知道一些变通方法或一些手工解析功能吗?

谢谢你在这个话题上的任何帮助/建议。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-12-10 17:05:19

这是意料之中吗?(也称参与实施不完全符合arff格式)

是的,很不幸。正如在loadarff中提到的,“它不能读取带有稀疏数据的文件(文件中的{})”。文件yahoo_arts.arff在其@data部分中使用稀疏格式。

您可以尝试搜索PyPi中的"arff“来寻找替代方案。我没有使用任何这些,所以我没有任何具体的建议。

票数 1
EN

Stack Overflow用户

发布于 2019-12-10 21:38:59

正如Weckesser的回答所指出的,the不能读取稀疏的arff文件。我已经实现了一个快速的解决方法来解析稀疏的arff文件,如果它可以帮助其他人,我将在下面共享它。如果我有时间做一个干净的版本的话,我会尽力为这个版本做出贡献。

编辑:对不起,rusu_ro1,我没有看到你的版本,但我想它也能用。

代码语言:javascript
复制
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 df
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59271661

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档