2015-04-12 70 views
0

我完全失去了實時有效分級數據的方式。我想要做的是將一個給定的值賦給一個字典(或者其他一些更有效的結構)。例如,如果我知道日期範圍在0 - 100(或其他一些自定義邊界)之間,並且我有十個分檔,所以bin 1包括0到10等,那麼最好的實施是什麼,以便我可以只需將值放入數據結構中,它會自動知道放在這裏?Python實時數據分級

我看過here但這是當你將所有的數據放在一起時,而不是當它實時進入時。

我目前的設計很容易循環,並確定它屬於哪個籃子,但是如果我有大量循環迭代的輸入數據點有100k循環,那麼速度太慢。

+0

你正在尋找的數據結構是一個[kd樹(http://en.wikipedia.org/wiki/K-d_tre E)。 (如果你只有一個維度,AKA a *二叉搜索樹) – roippi

回答

2

我認爲bisect可能是你想要的東西,這是基於文檔的例子:

from bisect import bisect 

d = {"A": 0, "B": 0, "C": 0, "D": 0, "E": 0, "F": 0} 


def grade(score, breakpoints=[70, 80, 90, 100], grades='FBCDA'): 
    i = bisect(breakpoints, score) 
    return grades[i] 


for n in [66, 67, 77, 88, 80, 90, 91,100]: 
    d[grade(n)] += n 
print(d) 
{'A': 100, 'C': 168, 'B': 77, 'E': 0, 'D': 181, 'F': 145} 
+0

import bisect.bisect as bisect – kpie

1

我寫這個的話稱,倉0 = [最小值(最大值 - 最小值)/ Nbins)

class bins(): 
    def __init__(self,Min,Max,Nbins): 
     self.bins = {} 
     self.Min=float(Min) 
     self.Max=float(Max) 
     self.Nbins=Nbins 
     for k in range(0,Nbins): 
      self.bins[k]=[] 
    def AddToMap(self,n): 
     if(n<self.Min or n>=self.Max): 
      print("Object out of map range. [ "+str(n)+" ]") 
     else: 
      k = int((n-self.Min)/((self.Max-self.Min)/float(self.Nbins))) 
      self.bins[k].append(n) 

    def prt(self): 
     for k in self.bins: 
      print self.bins[k] 

b = bins(0,100,10) 
b.AddToMap(1) 
b.AddToMap(13) 
b.AddToMap(21) 
b.AddToMap(14) 
b.AddToMap(13) 
b.AddToMap(9) 
b.AddToMap(11) 
b.AddToMap(10) 
b.AddToMap(0) 
b.AddToMap(100) 
b.AddToMap(42) 

b.prt() 

產生

Object out of map range. [ 100 ] 
[1, 9, 0] 
[13, 14, 13, 11, 10] 
[21] 
[] 
[42] 
[] 
[] 
[] 
[] 
[]