簡體   English   中英

最合適的數據結構(Python)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM