用于从数据列创建图形的Python代码

时间:2012-03-26 18:41:15

标签: python csv histogram

我正在编写一个脚本,用于在制表符分隔的文本文件中生成特定列的直方图。目前,该程序将从我用作占位符的硬编码列号创建单个图形。

输入表如下所示:

 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值)

  4. 这里没有显示的一个组件是我最终将有一个单独的输入文件,其中包含一个标题列表(即“HDL”,“LDL”,“HEIGHT”)需要单独绘制,但随后一起显示网格状的。

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

1 个答案:

答案 0 :(得分:4)

好吧,我有一些意见和建议,希望有所帮助。

在我看来,你应该做的第一件事就是构建你的数据。 尝试为文件中的每一行创建一个类似

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

然后你会有一个这样的dict对象的列表,你将能够迭代它并按你希望的任何字段进行过滤。

这是第一个也是最重要的一点。

执行此操作后,模块化您的代码,不要只创建一个脚本来完成所有工作。确定冗余的代码片段(作为过滤循环),将其放入函数并调用它,传递所有必要的参数。

一个附加细节:您无需像在

中那样编码列表的大小
for E in input_table[1:3635]:

只需写下

for E in input_table[1:-1]

它应该适用于每个列表。当然,如果您停止将数据视为原始文本,则无需这样做。只需正常迭代您的dicts列表。

如果您有更多疑问,请告诉我。 旧金山