Python 销售额的前80%

Python 销售额的前80%,python,Python,我的目标是只筛选销售业绩最好的80%的产品 我总共有100种产品,销售总额为15000,为了了解产品销售的百分比,我正在做这项工作 product_dict = {} for product in products: percent_from_sale = product.quantity / total_quantity * 100 product_dict[product] = percent_from_sale 因此,在此之后,我对关键产品和价值进行了预测,价值是该产品销

我的目标是只筛选销售业绩最好的80%的产品

我总共有100种产品,销售总额为15000,为了了解产品销售的百分比,我正在做这项工作

product_dict = {}
for product in products:
    percent_from_sale = product.quantity / total_quantity * 100
    product_dict[product] = percent_from_sale
因此,在此之后,我对关键产品和价值进行了预测,价值是该产品销售的百分比,但我如何才能只筛选前80%的产品

您可以将产品目录{product:sales}转换为销售目录[销售,产品] 按销售额从高到低的顺序对sales_列表进行排序

sales_list.sort(reverse=True, key=lambda x:x[0])
然后迭代计算累积和,直到小于80

您可以将产品目录{product:sales}转换为销售目录[销售,产品] 按销售额从高到低的顺序对sales_列表进行排序

sales_list.sort(reverse=True, key=lambda x:x[0])
然后迭代计算累积和,直到小于80

您可以定义在累计总和达到某个限制之前将产生哪些元素:

定义iter_直到RC、限制、键: 累计总和=0 对于src中的元素: 屈服要素 累计总和+=关键元素 如果累计总和>=限制: 打破 让我们生成类似于以下内容的输入:

从集合导入namedtuple 从随机导入洗牌 产品=名称双产品,名称数量 总数量=15000 products=[productfproduct{i},总数量//2**i代表范围1中的i,101] 洗牌产品 现在您可以在生成器函数上迭代。您可以创建前80%销售额的列表:

已分拣产品=已分拣产品,密钥=λx:x.数量,反向=真 top_80_%=未分类产品列表,总数量*0.8,λx:x.数量 您可以在代码形式问题中创建dict您正在尝试执行的操作:

您可以定义在累计总和达到某个限制之前将产生哪些元素:

定义iter_直到RC、限制、键: 累计总和=0 对于src中的元素: 屈服要素 累计总和+=关键元素 如果累计总和>=限制: 打破 让我们生成类似于以下内容的输入:

从集合导入namedtuple 从随机导入洗牌 产品=名称双产品,名称数量 总数量=15000 products=[productfproduct{i},总数量//2**i代表范围1中的i,101] 洗牌产品 现在您可以在生成器函数上迭代。您可以创建前80%销售额的列表:

已分拣产品=已分拣产品,密钥=λx:x.数量,反向=真 top_80_%=未分类产品列表,总数量*0.8,λx:x.数量 您可以在代码形式问题中创建dict您正在尝试执行的操作:


与@lllrnr101的答案类似,但排序略有不同

Use可以使用operator.itemgetter函数获取已排序元组乘积的列表,百分比由第二个参数percent确定。 然后迭代这些对,直到达到累计销售额的80%

import operator

product_dict = {
    product: percent
    for product in products
}

sorted_items = sorted(
    product_dict.items(),
    key=operator.itemgetter(1),
    reverse=True,
)

cumulative = 0
top_80_sales = {}
for product, percent in sorted_items:
    if cumulative < 0.8:
        top_80_sales[product] = percent
        cumulative += percent
    else:
        break

与@lllrnr101的答案类似,但排序略有不同

Use可以使用operator.itemgetter函数获取已排序元组乘积的列表,百分比由第二个参数percent确定。 然后迭代这些对,直到达到累计销售额的80%

import operator

product_dict = {
    product: percent
    for product in products
}

sorted_items = sorted(
    product_dict.items(),
    key=operator.itemgetter(1),
    reverse=True,
)

cumulative = 0
top_80_sales = {}
for product, percent in sorted_items:
    if cumulative < 0.8:
        top_80_sales[product] = percent
        cumulative += percent
    else:
        break

如果您可以使用pandas或numpy,您可以大幅降低所需的LOC并提高性能,尤其是对于大量产品

从熊猫开始,首先导入熊猫,并用从Olvin Roght获取的数据样本数据创建一个数据帧:

from collections import namedtuple
from random import shuffle

import pandas as pd

# create sample data
product = namedtuple("product", "name quantity")
total_quantity = 15000
products = [product(f"product{i}", total_quantity // (2 ** i)) for i in range(1, 101)]
shuffle(products)

# make into dataframe
prods = pd.DataFrame(products)
现在,按数量对数据帧进行排序:

prods_sort = prods.sort_values(by='quantity', ascending=False)
并获得前80%的产品:

top_products = prods_sort[
    ~prods_sort.loc[:, 'quantity'].cumsum().ge(
        prods_sort.loc[:, 'quantity'].sum() * .8
    ).shift(1, fill_value=False)

print(top_products)

# Out:
        name  quantity
40  product1      7500
94  product2      3750
65  product3      1875
我在这里做的是:

获取数量的累积和 检查累计总和是否大于/等于。ge。。。超过总和的80%,则生成布尔数组 将其移位1。shift1,fill_value=False也包括第一个值,该值大于/等于总和的80%,并用False填充,否则第一个值将用np.nan填充 使用此布尔数组对已排序的产品进行索引,以获得占总数量80%的产品
如果您可以使用pandas或numpy,您可以大幅降低所需的LOC并提高性能,尤其是对于大量产品

从熊猫开始,首先导入熊猫,并用从Olvin Roght获取的数据样本数据创建一个数据帧:

from collections import namedtuple
from random import shuffle

import pandas as pd

# create sample data
product = namedtuple("product", "name quantity")
total_quantity = 15000
products = [product(f"product{i}", total_quantity // (2 ** i)) for i in range(1, 101)]
shuffle(products)

# make into dataframe
prods = pd.DataFrame(products)
现在,按数量对数据帧进行排序:

prods_sort = prods.sort_values(by='quantity', ascending=False)
并获得前80%的产品:

top_products = prods_sort[
    ~prods_sort.loc[:, 'quantity'].cumsum().ge(
        prods_sort.loc[:, 'quantity'].sum() * .8
    ).shift(1, fill_value=False)

print(top_products)

# Out:
        name  quantity
40  product1      7500
94  product2      3750
65  product3      1875
我在这里做的是:

获取数量的累积和 检查累计总和是否大于/等于。ge。。。超过总和的80%,则生成布尔数组 将其移位1。shift1,fill_value=False也包括第一个值,该值大于/等于总和的80%,并用False填充,否则第一个值将用np.nan填充 使用此布尔数组对已排序的产品进行索引,以获得占总数量80%的产品
前80%的产品,或者那些占销售额80%的产品?@schwobasegg是的,你是对的,我问的问题怎么可能是对的=@AlexanderLek
ontsev在他问meIs numpy或pandas允许后我编辑了我的问题?两者都可以减少所需的LOC并大幅提高性能。前80%的产品,或占销售额80%的产品?@schwobaseggl是的,你是对的,我问问题怎么可能是对的=@AlexanderLekontsev我在他问meIs numpy或pandas后编辑了我的问题?两者都可以减少所需的LOC并大幅提高性能。