web-dev-qa-db-fra.com

Arff Loader: AttributeError: l'objet 'dict' n'a pas d'attribut 'data'

J'essaie de charger un fichier .arff dans un tableau numpy à l'aide de la bibliothèque liac-arff. ( https://github.com/renatopp/liac-arff )

Ceci est mon code.

import arff, numpy as np
dataset = arff.load(open('mydataset.arff', 'rb'))
data = np.array(dataset.data)

lors de l'exécution, j'obtiens l'erreur.

ArffLoader.py", line 8, in <module>
data = np.array(dataset.data)
AttributeError: 'dict' object has no attribute 'data'

J'ai vu des discussions similaires, Smartsheet Data Tracker: AttributeError: l'objet 'dict' n'a pas d'attribut 'append' . Je suis nouveau sur Python et je ne parviens pas à résoudre ce problème. Comment puis-je réparer cela?

14
Erdnase

Version courte

dataset est une dict. Pour un dict, vous accédez aux valeurs en utilisant la notation d'indexation python, dataset[key], où key pourrait être une chaîne, un entier, un flottant, un tuple ou tout autre type de données immuable intéressé). 

Dans votre cas, la clé est sous la forme d'une chaîne. Pour y accéder, vous devez donner la chaîne de votre choix sous forme d'index, comme suit:

import arff
import numpy as np
dataset = arff.load(open('mydataset.arff', 'rb'))
data = np.array(dataset['data'])

(vous ne devriez pas non plus mettre les importations sur la même ligne, bien que ce soit juste un problème de lisibilité)

Explication plus détaillée

dataset est une dict qui, dans certaines langues, est appelée map ou hashtable. Dans dict, vous accédez aux valeurs de la même manière que vous indexez dans une liste ou un tableau, sauf que "index" peut être n'importe quel type de données "hashable" (qui est, idéalement, un identifiant unique pour chaque valeur possible) . Cet "index" s'appelle une "clé". En pratique, du moins pour les types intégrés et la plupart des packages majeurs, il ne s'agit que de types de données immuables ou haschaables, mais il n'existe pas de règle réelle exigeant que cela soit le cas.

Vous venez de MATLAB? Si c'est le cas, vous essayez probablement d'utiliser la technique d'accès MATLAB'sstruct. Vous pourriez imaginer une dict comme une struct beaucoup plus rapide et plus flexible, mais la syntaxe d'accès aux valeurs est différente.

19
TheBlackCat

Il est facile de charger des données arff dans python avec scipy.

from scipy.io import arff

import pandas as pd

data = arff.loadarff('dataset.arff')

df = pd.DataFrame(data[0])

df.head()
1
Thirumal Alagu