2012-07-05 49 views
1

以下是许多txt文件之一的样子的副本。从txt文件中计算平均值,标准差的高效方法

Class 1: 
Subject A: 
posX posY posZ x(%) y(%) 
    0 2 0 81 72 
    0 2 180 63 38 
-1 -2 0 79 84 
-1 -2 180 85 95 
    . . . .  . 
Subject B: 
posX posY posZ x(%) y(%) 
    0 2  0 71  73 
-1 -2  0 69  88 
    . .  . .  . 
Subject C: 
posX posY posZ x(%) y(%) 
    0 2 0 86  71 
-1 -2 0 81  55 
    . . .  .  . 
Class 2: 
Subject A: 
posX posY posZ x(%) y(%) 
    0 2 0 81 72 
-1 -2 0 79 84 
    . . . .  . 
  • 的班级,学科行条目的所有变化数。
  • 的Class1-受试者A总是具有有0交替与180
  • 计算平均X(%),Y(%)的按类别和由主体
  • 计算x的标准偏差(%),Y posZ条目(%)按类别和主题
  • 也忽略180行的posZ计算平均值和std_deviations当

我已经开发了在Excel中笨拙的解决方案(采用宏观的和VBA),但我宁愿去了Python中更优化的解决方案。

numpy非常有帮助,但.mean(),.std()函数只能用于数组 - 我还在研究一些其他的功能以及熊猫的groupby函数。

我想最后的输出如下所示(1.级,2分科)

1. By Class     
      X  Y      
Average       
std_dev  

2. By Subject 
      X  Y 
Average 
std_dev     
+0

如果您已经在使用'numpy';请看['pandas'](http://pandas.pydata.org/)分组功能。 – jfs 2012-07-05 19:08:38

+0

您的问题是将数据文件读入您​​可以使用的东西吗?或者用已经读入的结构获得输出结果? – Amyunimus 2012-07-05 23:55:26

回答

1

我想用字典的工作(和字典的列表)是获得一个好办法熟悉使用python中的数据。要像这样格式化数据,您需要读取文本文件并逐行定义变量。

要启动:

for line in infile: 
    if line.startswith("Class"): 
     temp,class_var = line.split(' ') 
     class_var = class_var.replace(':','') 
    elif line.startswith("Subject"): 
     temp,subject = line.split(' ') 
     subject = subject.replace(':','') 

这将创建一个对应于当前等级和当前主题的变量。然后,你想读你的数字变量。只读这些值的一种好方法是通过try声明,该声明将尝试使它们成为整数。

else: 
     line = line.split(" ") 
     try: 
      keys = ['posX','posY','posZ','x_perc','y_perc'] 
      values = [int(item) for item in line] 
      entry = dict(zip(keys,values)) 
      entry['class'] = class_var 
      entry['subject'] = subject 
      outputList.append(entry) 
     except ValueError: 
      pass 

这会将它们放入字典形式,包括早先定义的类和主题变量,并将它们附加到outputList。你会这样结束了:

[{'posX': 0, 'x_perc': 81, 'posZ': 0, 'y_perc': 72, 'posY': 2, 'class': '1', 'subject': 'A'}, 
{'posX': 0, 'x_perc': 63, 'posZ': 180, 'y_perc': 38, 'posY': 2, 'class': '1', 'subject': 'A'}, ...] 

然后,您可以平均/由子集化字典的列表(应用规则像不含posZ = 180等)采取SD。以下是按照等级划分的平均值:

classes = ['1','2'] 
print "By Class:" 
print "Class","Avg X","Avg Y","X SD","Y SD" 
for class_var in classes: 

    x_m = np.mean([item['x_perc'] for item in output if item['class'] == class_var and item['posZ'] != 180]) 
    y_m = np.mean([item['y_perc'] for item in output if item['class'] == class_var and item['posZ'] != 180]) 
    x_sd = np.std([item['x_perc'] for item in output if item['class'] == class_var and item['posZ'] != 180]) 
    y_sd = np.std([item['y_perc'] for item in output if item['class'] == class_var and item['posZ'] != 180]) 

    print class_var,x_m,y_m,x_sd,y_sd 

你必须打印输出才能得到你想要的东西,但这应该让你开始。

相关问题