Биннинг с помощью генераторов (большой набор данных; бины фиксированной ширины; плавающие данные)
Если вы заранее знаете ширину желаемых корзин - даже если есть сотни или тысячи корзин - тогда я думаю, что развертывание вашего собственного решения будет быстрым (как для записи, так и для запуска). Вот некоторый Python, который предполагает, что у вас есть итератор, который дает вам следующее значение из файла:
from math import floor
binwidth = 20
counts = dict()
filename = "mydata.csv"
for val in next_value_from_file(filename):
binname = int(floor(val/binwidth)*binwidth)
if binname not in counts:
counts[binname] = 0
counts[binname] += 1
print counts
Значения могут быть числами с плавающей запятой, но это предполагает, что вы используете целочисленную ширину бина; вам может потребоваться немного изменить это, если вы хотите использовать ширину бина некоторого значения с плавающей запятой.
Что касается next_value_from_file()
, как упоминалось ранее, вы, вероятно, захотите написать собственный генератор или объект с методом iter(), чтобы сделать это эффективно. Псевдокод для такого генератора будет таким:
def next_value_from_file(filename):
f = open(filename)
for line in f:
# parse out from the line the value or values you need
val = parse_the_value_from_the_line(line)
yield val
Если заданная строка имеет несколько значений, заставьте parse_the_value_from_the_line()
либо возвращать список, либо быть генератором, и использовать этот псевдокод:
def next_value_from_file(filename):
f = open(filename)
for line in f:
for val in parse_the_values_from_the_line(line):
yield val
person
Dan H
schedule
29.12.2013