9
votes

Structure de données la plus appropriée (Python)

Je suis nouveau à Python et que vous avez probablement une question très fondamentale sur le «meilleur» moyen de stocker des données dans mon code. Tout conseil très apprécié!

J'ai un long fichier .csv dans le format suivant: xxx

Mes valeurs de scénario exécutées de 1 à 100 ans vont de 1961 à 1990 et le mois va de 1 à 12. Mon fichier a donc 100 * 29 * 12 = 34800 lignes, chacun avec une valeur associée.

J'aimerais lire ce fichier dans une sorte de structure de données Python afin que je puisse accéder à une "valeur" en spécifiant le "scénario", "année" et "mois". Quelle est la meilleure façon de le faire s'il vous plaît (ou quelles sont les différentes options)?

dans ma tête, je pense à ces données comme une sorte de "nombre cuboïde" avec des axes pour scénario, année et mois, donc que chaque valeur est située aux coordonnées (scénario, année, mois). Pour cette raison, je suis tenté d'essayer de lire ces valeurs dans un tableau 3D NUMPY et d'utiliser un scénario, une année et un mois en tant que indices. Est-ce une chose raisonnable à faire?

Je suppose que je pourrais aussi faire un dictionnaire où les clés sont quelque chose comme xxx

serait-ce mieux? Y a-t-il d'autres options?

(Mieux vaut «Mieux», je suppose que je veux dire «plus rapide à accéder», bien que si une méthode est beaucoup moins de mémoire intensive qu'un autre, il serait bon de savoir à ce sujet aussi).

Merci beaucoup!


1 commentaires

WOW - Quel site fantastique! 5 personnes me donnaient de grandes réponses en moins de temps qu'il m'a fallu pour écrire la question initiale. MERCI!


4 Réponses :


4
votes

J'utiliserais SQLite3 pour stocker les données sur le disque. Vous serez en mesure de lire dans l'ensemble de données complet ou des sous-ensembles via des requêtes SQL. Vous pouvez ensuite charger ces données dans une matrice numpue ou une autre structure de données Python - tout ce qui est le plus pratique pour la tâche.

Si vous choisissez d'utiliser SQLite, notez également que SQLite a un type de données TIMESTAMP. C'est peut-être une bonne idée de combiner l'année et le mois en un seul horodatage. Lorsque vous lisez des horodatamps en python, sqlite3 peut être dit de convertir automatiquement les horodatages en denttime.dateTime objets, ce qui réduirait une partie du code de la chaudière que vous devriez autrement avoir à écrivez. Il sera également plus facile de former des requêtes SQL qui demandent toutes les lignes entre deux dates.


2 commentaires

Bravo Unutbu, cela ressemble à une bonne option. Je ferai de la lecture et de voir si c'est dans mes capacités actuelles. En attendant, je vais utiliser la suggestion de Fmark de ci-dessous.


@Jamess: pas de problème. Bienvenue pour!



0
votes

Faites un dictionnaire de dictionnaires de dictionnaires comme vous l'avez décrit. Si vous avez besoin de données comme des chiffres, convertissez-les en chiffres une fois lorsque vous les lisez et stocke des numéros dans les dicts. Il sera plus rapide que vous utilisez des chaînes comme des clés. Faites-moi savoir si besoin d'une aide avec le code.


0 commentaires

2
votes

SQLite est une bonne option si vous allez accéder à vos valeurs par différents paramètres à chaque fois.

Si ce n'est pas le cas, et vous aurez toujours accès par ce triplet (scénario, année, mois), vous Peut utiliser une tuple (liste immuable) comme clé et la valeur que votre valeur. p>

en code, il ressemblerait à: P>

print d[scenario, year, month]


0 commentaires

7
votes

J'utiliserais un dict de tuples. Recherche simple, rapide et hachable pour récupérer une valeur unique:

import csv

reader = csv.reader(open('data.csv', 'rb'))
header = reader.next()
data = {}

for row in reader:
    key = tuple([int(v) for v in row[:-1]])
    val = row[-1]
    data[key] = float(val)

# Retrieve a value
print data[1, 1961, 3]


2 commentaires

Merci fmark. J'ai copié et collé votre code et j'ai fonctionné brillamment. Je ne m'attendais à ce que quelqu'un écrive mon code pour moi, mais vous l'avez fait quand même :-)


C'est toujours un plaisir d'écrire une solution simple en python :)