平均不同长度的数据集

时间:2015-09-03 05:28:48

标签: python numpy

我有一系列从程序输出的数据集。我的目标是将数据集的平均值绘制为pyplot或numpy中的折线图。我的问题是输出数据集的长度是不可控的。

例如,我有四个长度在200到400点之间变化的数据集,x值标准化为从0到1的数字,我想计算四个数据集的中间线。

到目前为止,我所能想到的是插入(线性地足够)将额外的数据点添加到较短的序列,或以某种方式周期性地从较长的序列中移除值。有没有人有任何建议?

目前我正在使用csv reader导入并逐行追加到列表中,因此输出是一个列表列表,每个列表都有一组xy坐标,我认为它们与二维数组相同?

我实际上认为删除多余的数据点比插入更容易,例如,从四个列表开始,我可以沿着x轴移除不必要的点,因为它们被标准化并且增加,然后剔除点太小通过引用最短列表步长来计算步长(这个解释可能不太清楚,我会尝试编写一个例子并明天将其放置)

示例数据集将是

1行= [[0.33,2],[0.66,5],[1,5]]

第2行= [[0.25,43],[0.5,53],[0.75,6.5],[1,986]]

1 个答案:

答案 0 :(得分:0)

所以我使用的解决方案是按照上面的建议进行插值,我在下面提供了简化版本的代码:

首先将数据导入为字典,以便于访问和操作:

def average(files, newfile):    
    import csv                                                                  
    dict={}                                                                     
    ln=[]                                                                       
    max=0                                                                       
    for x in files:                                                             
        with open(x+'.csv', 'rb') as file:                                      
            reader = csv.reader(file, delimiter=',')                            
            l=[]                                                                
            for y in reader:                                                    
                l.append(y)                                                     
            dict[x]=l                                                           
            ln.append(x)

接下来建立最长数据集的长度:

    for y in ln:                                                                
        if max == 0:                                                            
            max = len(dict[y])                                                  
        elif len(dict[y]) >= max:                                               
            max = len(dict[y])                                                  

接下来需要定义每个数据集所需的迭代次数:

    for y in ln:                                                                
        dif = max - len(dict[y])                                                

最后,中间值通过线性插值计算并插入到数据集

        for i in range(dif):                                                    
            loc = int( i* len(dict[y])/dif)                                     
            if loc ==0:                                                         
                loc =1                                                          
            new = [(float(dict[y][loc-1][x])+float(dict[y][loc][x]))/2
            for x in range(len(dict[y][loc]))]
            dict[y].insert(loc,new)                                             
然后取平均值非常简单:

    for x in range(len(dict[ln[0]])):                                           
        t = [sum(float(dict[u][x][0]) for u in ln)/len(ln), 
        sum(float(dict[u][x][1])/4 for u in ln)]
        avg.append(t)                                                           

我不是说它是漂亮的代码,但是我做了我需要的......