创建具有不同bin大小的bin值字典-python

问题描述 投票:0回答:1

我想创建一个具有不同bin大小和增量的bin值字典。例如,

Starting increment is 5, through 10 (e.g. 0-5, 6-10)
Then, increments of 10, through 100 (e.g. 11-20, 21-30...91-100)
Then increments of 25, through 200 (e.g. 101-125, 126-150...176-200)

在字典中,

bin_dict = {0-10 :[0-5, 6-10], 10-100:[11-20, 21-30, ...91-100], 100-200:[101-125, 126-150..]}

我尝试了以下代码:

def create_bin_ranges(bn_val):
    ## Create a list of bin ranges.
    dict_bin_ranges = {}
    list_bin_ranges = []

    for i in bn_val:
        step = i
        bin_range = np.arange(0, step+i, step)
        list_bin_ranges.append(bin_range)
        dict_bin_ranges[i] = list_bin_ranges
    return dict_bin_ranges

我得到的结果:(这不是我想要的)

values = create_bin_ranges([5,10,100])
print(values)
>> {5: [array([0, 5]), array([ 0, 10]), array([  0, 100])],
   10: [array([0, 5]), array([ 0, 10]), array([  0, 100])],
   100: [array([0, 5]), array([ 0, 10]), array([  0, 100])]}

我被困住了,任何建议或帮助都会很棒。

python-3.x binning
1个回答
0
投票

我认为您首先需要明确定义垃圾箱背后的逻辑。一种解决方案是为range更改的所有步骤定义一个列表:

  • start_bin
  • end_bin
  • step

例如,这导致:

steps = [(0, 10, 5), (10, 100, 10), (100, 200, 25)]

一旦我们知道要去哪里,就很容易建立所有垃圾箱:

这里,我使用str.format为输出键定义了一个自定义功能。

str.format

然后建立列表:

def f(v1, v2):
    return "{}-{}".format(str(v1), str(v2))

输出

# List + dict comprehension
out = {f(min_, max_): [[i+1, i+step] for i in range(min_, max_, step)] for min_, max_, step in steps}

# Or with nested for loops
out = {}
for min_, max_, step in steps:
    bin_ = []
    for i in range(min_, max_, step):
        bin_.append([i+1, i+step])
    out[f(min_, max_)] = bin_
print(out)

希望有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.