我正在计算所有值之间的百分比差异,然后创建组。作为输出,我得到2个值的组合,但我想在一个组中合并所有值,其中小于30%的对方。
工作代码如下所示
from itertools import combinations
def pctDiff(A,B):
return abs(A-B)*200/(A+B)
def main():
dict2={}
dict ={'acct_number':10202,'acct_name':'abc','v1_rev':3000,'v2_rev':4444,'v4_rev':234534,'v5_rev':5665,'v6_rev':66,'v7_rev':66,'v3_rev':66}
vendors_revenue_list =['v1_rev','v2_rev','v3_rev','v4_rev','v5_rev','v6_rev','v7_rev','v8_rev']
#prepared list of vendors
for k in vendors_revenue_list:
if k in dict.keys():
dict2.update({k: dict[k]})
print(dict2)
#provides all possible combination
for a, b in combinations(dict2, 2):
groups = [(a,b) for a,b in combinations(dict2,2) if pctDiff(dict2[a],dict2[b]) <= 30]
print(groups)
输出
[('v2_rev', 'v5_rev'), ('v3_rev', 'v6_rev'), ('v3_rev', 'v7_rev'), ('v6_rev', 'v7_rev')]
所需输出应为
[('v2_rev', 'v5_rev'), ('v3_rev', 'v6_rev','v7_rev')]
5条答案
按热度按时间9jyewag01#
您可以对排序后的值使用二进制搜索函数,以获得与由参考值(对于用作参考点的每个值)30%以内的值组成的组对应的键范围:
输出:
whhtz7ly2#
我想不出用
combinations
来实现这一点的方法,所以我选择只嵌套一个循环,并将满足以下条件的值附加到元组:输出:
ubof19bj3#
我提出了这个解决方案,没有itertools包。
ecr0jaav4#
我认为您可能希望使用滑动窗口算法(例如,* 请参见 * Rolling or sliding window iterator?),首先,获取一个收入的排序列表,保留与企业的关联,然后,对于滑动窗口算法的每个结果,计算该结果中上项和下项之间的百分比差异,如果小于30%,则返回结果。
下面是一些示例代码:
cnwbcb6i5#
解决方案,用于处理我的所有场景
我唯一想理解的是