2012-03-26 8 views
1

私は、タブ区切りのテキストファイルで特定の列のヒストグラムを生成するスクリプトを作成しています。現在、プレースホルダとして使用しているハードコーディングされた列番号から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値)によって指定されるように、データのサブセットのみを含む。

ここには表示されていないコンポーネントの1つは、最終的に、個別にグラフ化する必要があるヘッダー(すなわち、「HDL」、「LDL」、「HEIGHT」)のリストを含む別個の入力ファイルを持つことです。グリッドのような方法。

必要に応じて追加情報を入力できます。

答えて

4

さて、私はいくつかのコメントや提案をしています。

私の意見では、あなたが望むすべてのものを得るためにまず行う必要があるのは、の構造です。 、ファイルから行ごとに、作成する

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

のような辞書を試してみてください。そして、あなたは、このようなdictのオブジェクトのリストを持って、そしてあなたが望む任意のフィールドでそれとフィルタを反復処理することができるようになります。

これが最初で最も重要なポイントです。

コードをモジュール化して、すべてのジョブを完了させるための単一のスクリプトを作成するだけではありません。冗長になるコードをフィルタリングループとして特定し、関数に入れて呼び出し、必要なすべての引数を渡します。

ワンaditional詳細:あなただけ

for E in input_table[1:-1] 

を書いて、それがすべてのリストについては、やるべき

for E in input_table[1:3635]: 

のようにあなたのリストのサイズをhadcodeする必要はありません。もちろん、生のテキストとしてデータを扱うのを止めれば、それは必要ではありません。 dictsのあなたのリストを正常に反復するだけです。

ご不明な点がございましたら、お知らせください。 Francisco

+0

私に戻ってくれてありがとう、私はあなたの意見に同意します。 CSVモジュールのDictReaderメソッドがこのタスクに適しているかどうか知っていますか?私はドキュメンテーションを見ていましたが、プログラミングに新しいので、少し混乱しています。(明らかでない場合) – alexhli

+0

私はそのようなライブラリを使ったことは一度もありませんが、 DictReaderメソッドについてはhttp://docs.python.org/dev/library/csv.htmlを参照してください。これは、最小限の労力で構造ジョブを完了させるために必要なものです。あなたのデータはきちんと整理されているようですが、データの正確性を保証する良い方法として、 'restKey'と 'restVal'生成されたdictフィールドに関するドキュメントには何が書かれているのでしょうか。しかし、最初の試行では、それらをバイパスしてください。うまくいくはずです。 – Francisco

関連する問題