Python Real Time Binning of data

时间:2015-04-12 19:04:39

标签: python

我在实时有效地分类数据方面完全迷失了方向。我想要做的是将一个给定的值分配给一个字典(或者如果有一个更有效的话,可以将其他结构分配)。

例如,如果我知道日期范围在0到100之间(或其他一些自定义边界)并且我有十个箱子所以bin 1包括0到10等,那么最好的实现方式是什么,这样我就可以简单将值放入数据结构中,它会自动知道放在哪里?

我看过here,但这就是你把所有数据放在一起的时候,而不是当它实时进入的时候。

我目前的设计很简单,可以循环识别它属于哪个篮子,但是当我有大量有100k循环的迭代传入数据点时,这个速度很慢。

2 个答案:

答案 0 :(得分: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}

答案 1 :(得分:1)

我写这篇文章说bin 0 = [Min:(Max-Min)/ 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]
[]
[]
[]
[]
[]