[英]Most appropriate data structure (Python)
我是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數據結構,這樣我就可以通過指定'Scenario','Year'和'Month'來訪問'Value'。 請問最好的方法是什么(或者有哪些選擇)?
在我的腦海中,我認為這些數據是一種帶有軸,用於場景,年和月的“數字長方體”,因此每個值都位於坐標(場景,年,月)。 出於這個原因,我很想嘗試將這些值讀入3D numpy數組,並使用Scenario,Year和Month作為索引。 這是明智的做法嗎?
我想我也可以創建一個字典,其中鍵是類似的
str(Scenario)+str(Year)+str(Month)
這會更好嗎? 還有其他選擇嗎?
(通過'更好',我想我的意思是'訪問速度更快',盡管如果一種方法比另一種方法的內存密集程度要低得多,那么也很了解它。
非常感謝!
我會使用元組詞典。 簡單,快速,並且哈希表查找以檢索單個值:
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]
我會使用sqlite3將數據存儲到磁盤。 您將能夠通過SQL查詢讀取完整的數據集或子集。 然后,您可以將該數據加載到numpy數組或其他Python數據結構中 - 這對於任務來說最方便。
如果您確實選擇使用sqlite,請注意sqlite具有TIMESTAMP數據類型。 將年份和月份合並為一個TIMESTAMP可能是個好主意。 當您將TIMESTAMP讀入Python時,可以告訴sqlite3
自動將TIMESTAMP轉換為datetime.datetime
對象,這將減少您必須編寫的一些樣板代碼。 它還可以更容易地形成SQL查詢,這些查詢要求兩個日期之間的所有行。
如果您每次都要通過不同的參數訪問您的值,那么sqlite是一個不錯的選擇。
如果不是這種情況,並且您將始終通過此三元組(方案,年,月)訪問,則可以使用元組(不可變列表)作為鍵,並將值作為值。
在代碼中它看起來像:
d = {}
d[1, 1961, 12] = 0.5
或者在更通用的循環代碼中:
d[scenario, year, month] = value
稍后您可以通過以下方式訪問它:
print d[scenario, year, month]
Python會自動為你創建元組。
制作一本你所描述的字典詞典字典。 如果您需要數據作為數字,請在讀取數據時將其轉換為數字,並將數字存儲在數字中。 它會比使用字符串作為鍵更快。 如果需要代碼幫助,請告訴我。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.