2012-03-26 38 views
1

我正在編寫一個腳本,用於生成製表符分隔文本文件中特定列的直方圖。目前,該程序將根據我用作佔位符的硬編碼列號創建單個圖形。用於創建來自數據列的圖形的Python代碼

輸入表看起來是這樣的:

SAMPID TRAIT COHORT AGE BMI WEIGHT WAIST HEIGHT LDL  HDL 
123  LDL  STUDY1 52 32.2 97.1  102  149  212.5 21.4 
456  LDL  STUDY1 33 33.7 77.0  101  161  233.2 61.2 
789  LDL  STUDY2 51 25.1 67.1  107  162  231.1 21.3 
abc  LDL  STUDY2 76 33.1 80.4  99  134  220.5 21.2 
... 

而且我有以下代碼:

import csv 
import numpy 
from matplotlib import pyplot 

r = csv.reader(open("path",'r'), delimiter = '\t') 

input_table=[] 
for row in r: 
    input_table.append(row) 

column=[] 
missing=0 
nonmissing=0 
for E in input_table[1:3635]: # the number of rows in the input table 
    if E[8] == "": missing+=1 # [8] is hard coded now, want to change this to column header name "LDL" 
    else: 
     nonmissing +=1 
     column.append(float(E[8])) 

pyplot.hist(column, bins=20, label="the label") # how to handle multiple histogram outputs if multiple  column headers are specified? 

print "n = ", nonmissing 
print "numer of missing values: ", missing 
pyplot.show() 

任何人都可以提出建議,讓我展開/改善我的程序做任何以下的?從列由標題名稱,而不是列號指定

  1. 圖形數據

  2. 迭代在包含多個報頭的名稱來創建/顯示幾個直方圖一次

  3. 列表創建一個圖,其僅包括數據的子集,如由列中的特定值所指定的(即針對特定樣本ID或特定COHORT值)

這裏沒有顯示的一個組件是我最終將有一個單獨的輸入文件,它將包含需要單獨繪圖的標題列表(即「HDL」,「LDL」,「HEIGHT」),但隨後一起顯示在網格狀的方式。

如果需要,我可以提供其他信息。

回答

4

那麼,我有一些意見和建議,希望它有幫助。

在我看來,你應該做的第一件事就是讓結構化你的數據。 嘗試創建,對於每一行從該文件,就像

{'SAMPID': <value_1>, 'TRAIL': <value_2>, ...} 

一本字典,然後你將有這樣的字典對象的列表,你可以通過任何你希望的領域進行迭代,並過濾。

這是第一個也是最重要的一點。

當你這樣做後,模塊化你的代碼,不要只是創建一個腳本來完成所有的工作。確定將是多餘的代碼片段(作爲過濾循環),將其放入函數並調用它,傳遞所有必要的參數。

一個aditional的細節:你不需要在

for E in input_table[1:3635]: 

到hadcode列表的大小,只要寫

for E in input_table[1:-1] 

它應該爲每一個清單做。當然,如果你不再以純文本的形式對待你的數據,那就沒有必要了。只是迭代你的正常列表。

如果您有更多疑問,請告訴我。 Francisco

+0

感謝您回覆我,我同意您在Python中更好地構建數據的建議。你知道CSV模塊的DictReader方法是否適合這項任務?我正在瀏覽文檔,但對我來說有點令人困惑,因爲我是編程新手(如果不是那麼明顯):​​) – alexhli 2012-03-26 21:28:28

+0

我從來沒有使用過這樣的lib,但據我所知可用的文檔http://docs.python.org/dev/library/csv.html對於DictReader方法來說,它完全是您用最小的努力完成結構工作所需要的。您的數據看起來組織得非常好,但我會記住文檔中關於'restKey'和'restVal'生成的字典字段的說法,這是確保數據正確性的一個好方法。但是,第一次嘗試,只是繞過它們。它應該很好地工作。 – Francisco 2012-03-27 18:13:43

相關問題