首页 > 解决方案 > 无法使用 scipy.arff.loadarff 加载 arff 数据集

问题描述

我正在尝试从https://cometa.ujaen.es/(例如https://cometa.ujaen.es/datasets/yahoo_arts)下载 arff 数据集,并使用scipy.arff.loadarff.

但是,似乎 scipy 期望在标头之后有一种 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')。

这是预期的吗?(又名 scipy 实现不完全符合 arff 格式)你知道一些解决方法或一些手工解析功能吗?

感谢您提供有关此主题的任何帮助/建议。

标签: pythonscipy

解决方案


您可以用作解决方法:

import numpy as np
import pandas as pd


with open('yahoo_arts.arff', 'r') as fp:
    file_content = fp.readlines()


def parse_row(line, len_row):
    line = line.replace('{', '').replace('}', '')

    row = np.zeros(len_row)
    for data in line.split(','):
        index, value = data.split()
        row[int(index)] = float(value)

    return row


columns = []
len_attr = len('@attribute')

# get the columns
for line in file_content:
    if line.startswith('@attribute '):
        col_name = line[len_attr:].split()[0]
        columns.append(col_name)

rows = []
len_row = len(columns)
# get the rows
for line in file_content:
    if line.startswith('{'):
        rows.append(parse_row(line, len_row))

df = pd.DataFrame(data=rows, columns=columns)

df.head()

输出: 在此处输入图像描述


推荐阅读