尝试连接范围内的非常量数据
Trying to concatanate non-consistant data within range
我正在与 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
我不想 return 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
哪个 returns
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
感谢您的帮助。
您可以使用整数除法在单次迭代中将所有值分配给存储桶,而不是针对每个可能的范围遍历整个数据集。
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
我正在与 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
我不想 return 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
哪个 returns
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
感谢您的帮助。
您可以使用整数除法在单次迭代中将所有值分配给存储桶,而不是针对每个可能的范围遍历整个数据集。
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