Python 用accumulate()计算汇总值,accumulate()
函数基于给定的函数返回一个可迭代对象,将一系列归约值汇总在一起,遍历迭代器得出当前汇总值。默认的函数是operator.add()
。可以使用乘积函数代替默认的求和函数来改变accumulate()
的行为。Python文档中有一个很巧妙的实例,使用max()
函数得到当前序列中的最大值。
可使用当前汇总值计算数据四等分值,计算每个样本值的当前汇总值,并用公式int(4 * value / total)
把它们四等分。
前面讲过用一系列经纬度坐标描述旅途的一系列路径段。基于距离把路径点四等分,可以找到旅行路线的中点。
旅行数据格式如下:
(Leg(start=Point(latitude=37.54901619777347, longitude=-76.33029518659048),
end=Point(latitude=37.840832, longitude=-76.273834), distance=17.7246),
Leg(start=Point(latitude=37.840832, longitude=-76.273834),
end=Point(latitude=38.331501, longitude=-76.459503), distance=30.7382),
...,
Leg(start=Point(latitude=38.330166, longitude=-76.458504),
end=Point(latitude=38.976334, longitude=-76.473503), distance=38.8019))
每个路径段对象包含起点、终点和距离3个元素,四等分算法如下所示:
distances = (leg.distance for leg in trip)
distance_accum = tuple(accumulate(distances))
total = distance_accum[-1] + 1.0
quartiles = tuple(int(4 * d / total) for d in distance_accum)
从路径段中提取距离数据,计算每段的累积距离,该序列的最后一项便是总距离,在总距离上加1.0确保4 * d / total
返回3.9983,然后截断取到3。如果不加1.0,最后一项的值会为4,从而产生一个不存在的“第五等分”。对某些数据(数值非常大)来说,可能需要加上一个更大的数值。
quartiles
的计算结果如下所示:
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3]
可以使用zip()
函数合并等分序列值与原始数据点,还可以使用类似于groupby()
的函数为每个等分创建路径段集合。