2015-09-03 50 views
-4

我有一系列從程序輸出的數據集。我的目標是在pyplot或numpy中將數據集的平均值繪製爲折線圖。我的問題是輸出數據集的長度不可控。平均數據集長度不一

例如,我有四組長度在200和400點之間變化的數據集,x值歸一化爲0到1的數字,我想要計算四個數據集的中值線。

到目前爲止,我所能想到的是插入(線性足以)將更多的數據點添加到較短的序列,或者以某種方式週期性地從較長的序列中刪除值。有沒有人有什麼建議?

目前我用csv閱讀器導入並逐行添加到列表中,所以輸出是列表的列表,每個列表都有一組xy座標,我認爲它與2d數組相同?

我實際上認爲刪除多餘數據點比插入數據要容易得多,例如,從四個列表開始,我可以刪除沿着x軸的不必要的點,因爲它們被標準化並且正在增加,然後刪除點小通過引用最短列表的步長,步長(這個解釋可能不是那麼清楚,我會嘗試寫了一個例子,將其放到明天)

示例數據集中會

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

線2 = [[0.25,43],[0.5,53],[0.75,6.5],[1,98 6]]

+3

示例數據?期望的結果?程序輸出的數據集的形式是什麼? – Alexander

+0

@Alexander它看起來像一切實際上給予,一個;所期望的結果被表述爲'四個數據集的中線' – Ross

+2

@Ross。你在開玩笑嗎?沒有數據。是結果列表,詞典,熊貓系列等。這適用於如何問一個好的熊貓問題,但在這裏是相關的。 http://stackoverflow.com/questions/20109391/how-to-make-good-reproducible-pandas-examples – Alexander

回答

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)               

我不是說這是相當的代碼,但它做我所需要的...