2013-03-31 53 views
0

這裏的情況是:的Python - CSV模塊,獲取信息從一個文件

我遇到的第一個問題是從一個CSV文件獲取信息。我正在編寫的代碼的目的是爲了獲得ZCTAs(郵政編碼)上的大量信息,對於許多不同的羣組(目前有六個正在使用,但代碼旨在靈活地擁有任意數量的隊列)。一個文件包含每個ZCTA的羣體。對於每個ZCTA,另一個文件具有每個隊列的「病例」(觀察到癌症的病例)的數量。另一份文件對於每個人羣,對於愛荷華州(這項研究的重點),都具有粗略的比率,人們可以「期望」看到癌症人羣的人數。還有一些其他文件,但這些是重點,因爲這是我展示問題的地方。

我的代碼做什麼,首先是閱讀人口的文件,並得到由ZCTA每個隊列的人口。每個ZCTA和信息都存儲在一個列表中,然後存儲在列表(嵌套)列表中,其中包含所有ZCTA。該代碼然後獲得原油價格。然後,根據每個ZCTA的適當隊列乘以原始速率,並與每個ZCTA內的所有其他隊列進行總結,以獲得每個ZCTA我們可以預期看到患有癌症的總人數。人口也被總結。該信息存儲在另一個列表中,以及包含所有ZCTA的列表。該信息將成爲焦點(所有ZCTA列表,每個ZCTA包含總人口和預期病例總數)。

因此,問題是我需要採取這個新獲得的列表,並獲得觀察情況的數量,對於每個隊列,將這些總和相加,將它們附加到適當的ZCTA並將其寫入新文件。我的代碼實現了這一點,除了最底層的22個ZCTAs沒有得到觀察到的病例數。我不知道這是否是代碼,或什麼,但它適用於所有其他的906,但沒有得到底部22

讀者會發現我已經討論過的文件樣本數據(觀察到的情況下,文件和輸出文件)在:Gist

這裏是我使用的代碼:

`expectedcsv = open('ExpectedCases.csv', 'w', newline= '') 
expectedwriter = csv.writer(expectedcsv, delimiter = ',') 
expectedHeader = ['zcta', 'expected', 'pop', 'observed'] 
thecasesreader = csv.reader(thecasescsv, delimiter = ',') 
for zcta in zctaPop: 
    caseCounter = 0 
    thecasescsv = open('NewCaseFile.csv', 'r', newline = '') 
    thecasesreader = csv.reader(thecasescsv, delimiter = ',') 
    for case in thecasesreader: 
     if case[0] == zcta[0]: 
     for i in range(3, len(case)): 
      caseCounter += int(case[i]) 
    zcta.append(caseCounter) 
    expectedwriter.writerow(zcta) 
expectedcsv.close() 
thecasescsv.close()` 

別的東西,我也想提出的是,在稍後的代碼,所有這些的實際目的是爲每個網格點創建一個SMR過濾器。網格點在某種程度上是任意的,它們被放置在整個愛荷華州上(通過座標)。 SMR是觀察到的數量除以預期病例的數量。閾值,即特定過濾器的預期個案數量,由用戶設定。因此,如果用戶想要在150個預期情況下(對於每個網格點)創建過濾器,則代碼會遍歷每個ZCTA,總結預期情況,直到發現超過150個爲止。到最後一個ZCTA的距離是過濾器的「半徑」。

要做到這一點,我建立了一個距離矩陣(從每個網格點的每一個ZCTA的距離),然後進行排序的,最接近最遠。由於文件的大小(2300 X 930),我必須逐行閱讀這個文件,並從其他文件中獲取所有信息。因此,從最近的ZCTA開始,我得到了人羣,預期病例和觀察病例(上面討論了這個文件的問題),並將它們分別添加到它們各自的計數器(一個用於人羣,一個用於觀察,另一個用於預期) 。然後進入下一個最接近的ZCTA並執行相同操作,直到超出閾值。

這裏的問題是,我不能使用CSV模塊讀取這些文件,因爲我已經從另一個文件中讀取和索引會丟失。所以,我不得不使用普通的filename.read(),然後需要一些有趣的使用maketrans.translate。我不確定它的效率或者效果很好。一切似乎都很好,但如果沒有解決上述問題,就無法說清楚。我已經包含下面的代碼,但想知道是否有人有更好的想法/建議?

`expectedCSV = open('ExpectedCases.csv', 'r', newline = '') 
table = str.maketrans('\r', ' ') 
content = expectedCSV.read() 
expectedCSV.close() 
content = content.translate(table) 
content = content.split(sep = '\n') 
newContent = [] 
for item in content: 
    newContent.append((item.split(sep= ','))) 
content = ' ' 
for item in newContent: 
    if item[0] == currentZcta: 
      expectedTotal += (float(item[1])) 
      totalPop += (float(item[2])) 
      totalObservedCount += (float(item[3]))` 

另外,我無法弄清楚如何變藍色的方法和變量紅色,一些本網站的更多真棒用戶做。我非常希望學習如何爲將來的職位做到這一點。

如果有人需要澄清,以幫助解答更多信息或任何/制定解決方案,請通過各種手段,請教!感謝您花時間閱讀!

回答

0

所以,我最終通過計算與預期和人口沿觀察,通過開放計算的每個ZCTA文件「解決」這一點。這並沒有真正解決我正在處理的問題,而是找到了解決方法。我有些失望,更多的人沒有看到和/或迴應。如果有人想出一個解決實際問題的辦法,無論如何,請將其發佈到此處。 -Mike