我正在尝试使用 Python/R 将数字数据放入固定数量的存储桶中。
我有 key:value 格式的数据{1 : 12.3, 2 : 4.7, 3 : 7.4, 4 : 15.9, ......, 50 : 24.1}
,也就是device_id:data_usages
我需要根据 value 分桶到九个桶(1,5,25,50,150,250,1000,5000,10000)
中,所以稍后我可以看到哪些数据点在哪个桶中。
什么函数可以在 Python OR R 中做到这一点?
我正在尝试使用 Python/R 将数字数据放入固定数量的存储桶中。
我有 key:value 格式的数据{1 : 12.3, 2 : 4.7, 3 : 7.4, 4 : 15.9, ......, 50 : 24.1}
,也就是device_id:data_usages
我需要根据 value 分桶到九个桶(1,5,25,50,150,250,1000,5000,10000)
中,所以稍后我可以看到哪些数据点在哪个桶中。
什么函数可以在 Python OR R 中做到这一点?
你真的不需要实现一个算法来实现这一点。有一些工具可以为您做到这一点。
您可以使用 Pandas 获取分配给存储桶的数据以进行进一步处理,或者使用 NumPy 简单地计算每个存储桶中有多少值。
您只需要使用您的数据创建一个 Pandas DataFrame,然后调用方便的cut
函数,该函数会将每个值放入您定义的存储桶/箱中。从文档中:
cut
当您需要将数据值分段和排序到 bin 中时使用。
In [1]: import pandas as pd
In [2]: import numpy as np # to create dummy data
创建一些虚拟数据,将其放入数据框中并定义箱:
In [3]: data = np.random.randint(low=1, high=10001, size=1000)
In [4]: df = pd.DataFrame(data=data, columns=["data"])
In [5]: bins = np.array([1,5,25,50,150,250,1000,5000,10000])
将数据与 bin 定义一起传递给cut
函数,并将其作为数据框中的新列重新分配:
In [6]: df["bucket"] = pd.cut(df.data, bins)
然后,您可以检查前几行以查看这些值现在已用相关存储桶标记:
In [7]: df.head()
Out[7]:
data bucket
0 8754 (5000, 10000]
1 2970 (1000, 5000]
2 6778 (5000, 10000]
3 2550 (1000, 5000]
4 5226 (5000, 10000]
这是一个使用 NumPy 的示例,用于了解分布,作为histogram。
使用上面定义的data
and ,我们将它们传递给 numpy函数,该函数将计算有多少数据点落入每个 bin 中:bins
histogram
In [8]: np.histogram(data, bins)
Out[8]:
(array([ 0, 2, 1, 8, 6, 61, 417, 505]),
array([ 1, 5, 25, 50, 150, 250, 1000, 5000, 10000]))
第一行告诉您每个 bin 中有多少值,第二行确认使用的 bin。
通过执行以下操作,您可以将数据字典转换为与我上面的虚拟数据相同的形式(转换为 numpy 数组):
data = np.array([v for v in your_dict.values()])
这是使用bisect Python 标准库的解决方案
from bisect import bisect
from random import sample
data = sample(range(10_000), 1_000)
breakpoints = [1, 5, 25, 50, 150, 250, 1_000, 5_000, 10_000]
buckets = {}
for i in data:
buckets.setdefault(breakpoints[bisect(breakpoints, i)], []).append(i)
这将产生一个包含键的字典breakpoints
和每个键的数据点(值)列表。