我需要一些帮助来分类我的数据值。需要类似直方图的功能,但我不想列出事件,只列出每个bin的值的总和。
在下面的示例中,我列出了30天内Twitter粉丝的数量。假设我想要10个垃圾箱,那么每个垃圾箱将采用30/10 = 3天的值。对于前2天,bin 1的值将是1391 + 142 + 0 = 1533,bin 2 12618等,直到bin 10。
箱子的数量和持续时间最终可能会有所不同。例如,它还需要工作31天和5个箱子。
任何人都知道如何有效地做到这一点?是否有可用的Python函数?否则是for循环的实现,它能够将列表中的n个值加起来直到持续时间结束。
所有帮助都将受到高度赞赏:)谢谢!
followersList = [1391, 142, 0, 0, 12618, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 456, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
duration = 30
bins = 10
binWidth = round(duration / bins)
#
# for loop or python function that sums values for each bin
#
答案 0 :(得分:1)
你可以这样做:
bin_width = int(round(duration / bins))
followers = [sum(followersList[i:i+bin_width]) for i in xrange(0, duration, bin_width)]
答案 1 :(得分:0)
另一种方法是通过重塑和求和。我知道您已经有了一个有效的答案,但是您需要对numpy列表操作进行很多练习
import numpy
# this works when the list divides exactly into bins
followersList = [1391, 142, 0, 0, 12618, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 456, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
duration = len(followersList)
bins = 10
binWidth = round(duration / bins)
print(numpy.array(followersList).reshape(bins, binWidth).sum(axis=1))
# otherwhise we have to pad with zero till its a multiple of containers
followersList = [1391, 142, 0, 0, 12618, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 456, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]
binWidth = 3
bins = (len(followersList) - 1) // binWidth + 1 # ceiling division
print(
numpy.pad(followersList, (0, bins * binWidth - len(followersList)), 'constant').reshape(bins, binWidth).sum(axis=1))