Попытка объединить несогласованные данные в пределах диапазона


Я работаю с python. Я пытаюсь разбить набор данных на 1000 диапазонов элементов и найти среднее значение, включая сайты, которые не представлены как 0.0.

Ниже приведен пример этих данных.

X 2699528 0.000786782 X 2699555 0.493415 X 2699559 0.000786782 X 2699625 0.0748873 X 2699645 0.0712507 X 2699664 0.000786782 X 2699676 0.400653 X 2699683 0.0109586 X 2699711 0.000786782 X 2699739 0.00157294 X 2699906 0.0617229 X 2699919 0.000786782 X 2699934 0.000786782 X 2699968 0.498501 X 2700027 0.499971 X 2700040 0.000786782 X 2700089 0.0101799 X 2700147 0.000786782 X 2700157 0.0719793 X 2700185 0.00314341 X 2700189 0.000786782

Я хочу, чтобы данные выглядели так:

X 2700000 average1
X 2701000 average2
....
Проблема заключается в том, что в каждом диапазоне нет последовательного числа. Некоторые диапазоны могут иметь нулевые элементы в этом диапазоне. Кроме того, я не хочу просто среднее, но среднее с сайтами, которые не включены тоже. В принципе, если у меня есть
X 1 10
X 3 10
X 5 10
X 7 10
X 9 10
Я не хочу возвращать 10 как среднее значение, но 5 (пять 0 и пять 10).

Ниже приведен мой код.

import sys

sum = 0.0
startin = 2700000

for i in range(2700, 155000):
        m = (i * 1000) + 1000
        i = i * 1000
        for line in sys.stdin:
                data =line.strip().split('t')
                if data[0] == "CHROM":
                        continue
                if int(data[1]) >= i and int(data[1]) <= m:
                        sum += float(data[2])
        print i, (sum/1000)
        continue

Который возвращает

2700000 0.002568799204
2701000 0.002568799204
2702000 0.002568799204
2703000 0.002568799204
2704000 0.002568799204
2705000 0.002568799204
2706000 0.002568799204
2707000 0.002568799204
2708000 0.002568799204
2709000 0.002568799204
2710000 0.002568799204
2711000 0.002568799204
2712000 0.002568799204
2713000 0.002568799204
2714000 0.002568799204
2715000 0.002568799204
2716000 0.002568799204
2717000 0.002568799204
2718000 0.002568799204
2719000 0.002568799204
2720000 0.002568799204
2721000 0.002568799204
2722000 0.002568799204

Спасибо за любую помощь.

1 2

1 ответ:

Вместо итерации по всему набору данных для каждого возможного диапазона, вы можете просто использовать целочисленное деление, чтобы назначить все значения ведрам за одну итерацию.

buckets = defaultdict(float)
bucket_size = 1000

for line in lines:
    index,value = line.split()
    buckets[int(index)/bucket_size] += float(value)

for k,v in sorted(buckets.items()):
    print k,v/bucket_size