Наиболее подходящая структура данных (Python) - PullRequest
9 голосов
/ 12 ноября 2010

Я новичок в Python и, возможно, задаю очень простой вопрос о «лучшем» способе хранения данных в моем коде.Любые советы приветствуются!

У меня есть длинный файл .csv в следующем формате:

Scenario,Year,Month,Value
1,1961,1,0.5
1,1961,2,0.7
1,1961,3,0.2
etc.

Значения моего сценария варьируются от 1 до 100, год идет с 1961 по 1990, и месяц идетот 1 до 12. Таким образом, мой файл имеет 100 * 29 * 12 = 34800 строк, каждая со связанным значением.

Я хотел бы прочитать этот файл в какую-то структуру данных Python, чтобы я мог получить доступ«Значение», указав «Сценарий», «Год» и «Месяц».Каков наилучший способ сделать это, пожалуйста (или каковы различные варианты)?

В моей голове я считаю эти данные своего рода «числовым кубом» с осями для сценария, года и месяца, чтобыкаждое значение находится в координатах (сценарий, год, месяц).По этой причине у меня возникает соблазн попробовать прочитать эти значения в трехмерном массиве и использовать в качестве индексов сценарий, год и месяц.Разве это разумно?

Полагаю, я мог бы также составить словарь, в котором бы ключи были что-то вроде

str(Scenario)+str(Year)+str(Month)

Было бы лучше?Существуют ли другие варианты?

(Под «лучше» я полагаю, я имею в виду «более быстрый доступ», хотя, если один метод намного менее требователен к памяти, чем другой, было бы также полезно узнать об этом).

Большое спасибо!

Ответы [ 4 ]

8 голосов
/ 12 ноября 2010

Я бы использовал набор кортежей.Простой, быстрый и просмотр хеш-таблицы для получения одного значения:

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]
4 голосов
/ 12 ноября 2010

Я бы использовал sqlite3 для хранения данных на диске. Вы сможете прочитать полный набор данных или подмножеств с помощью запросов SQL. Затем вы можете загрузить эти данные в пустой массив или другую структуру данных Python - все, что наиболее удобно для этой задачи.

Если вы решите использовать sqlite, также обратите внимание, что sqlite имеет тип данных TIMESTAMP. Это может быть хорошей идеей объединить год и месяц в один TIMESTAMP. Когда вы читаете TIMESTAMPs в Python, sqlite3 может быть приказано автоматически преобразовать TIMESTAMPs в datetime.datetime объекты, что уменьшит часть стандартного кода, который вам пришлось бы писать в противном случае. Это также облегчит формирование запросов SQL, которые запрашивают все строки между двумя датами.

2 голосов
/ 12 ноября 2010

sqlite - хороший вариант, если вы будете каждый раз получать доступ к своим значениям по разным параметрам.

Если это не так, и вы всегда будете получать доступ с помощью этой тройки (сценарий, год, месяц).), вы можете использовать Tuple (неизменяемый список) в качестве ключа и значение в качестве значения.

В коде это будет выглядеть следующим образом:

d = {}
d[1, 1961, 12] = 0.5

или в более общем коде цикла:

d[scenario, year, month] = value

позже вы можете просто получить к нему доступ с помощью:

print d[scenario, year, month]

Python автоматически создаст для вас кортеж.

0 голосов
/ 12 ноября 2010

Составьте словарь словарей из словарей, как вы описали.Если вам нужны данные в виде чисел, преобразуйте их в числа один раз, когда вы их читаете и сохраняете числа в диктофонах.Это будет быстрее, чем использование строк в качестве ключей.Дайте мне знать, если вам нужна помощь с кодом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...