【问题标题】:identify records that make up 90% of total识别占总数 90% 的记录
【发布时间】:2019-03-11 22:50:17
【问题描述】:

我有一份报告确定了总体数字/趋势的关键驱动因素。我想自动化该功能,以便能够根据该数字的百分比列出/识别基础记录。例如,如果南部(地区)小部件销售的净变化为 -5,000.00,但有正面和负面的影响——我想确定构成该因素的所有潜在驱动因素中至少约 90%(-4,500.00)——从大到小总共 5,000.00。

data

region    OfficeLocation  sales
South     1                -500
South     2                300
South     3                -1000
South     4                -2000
South     5                 300
South     6                -700
South     7                -400
South     8                 800
North     11                300
North     22               -400
North     33                1000
North     44                800
North     55                900
North     66                -800

对于南方,总销售额为 -3200。我想识别/列出至少占此移动 90% 的驱动程序(按降序排列) - 所以 -3200 的 90% 将是 2880。南办公室 3 和 4 的定向移动/销售 = -3000将是此请求的输出:

region    OfficeLocation  sales
South     3                -1000
South     4                -2000

对于 North,总销售额为 +1800。我想确定/列出构成此移动至少 90% 的驱动程序(按降序排列)-因此 1800 的至少 90% 将是 1620。南办公室 3 和 4 的定向移动/销售 = - 3000 将是此请求的输出:

区域办事处位置销售 北 33 1000 北 44 800

上面的数据集有南/北的正面和负面趋势。您能提供的任何帮助将不胜感激!

【问题讨论】:

  • 销售额总和为正的'North' 组的预期输出是什么?
  • ^ 很重要。 3 和 4 不占总运动的 90%,只占净结果
  • 没错,这份报告只是试图找出适合网络运动的关键驱动因素。我认为我的示例创建得很差。实际上,当潜在的推动者在整体净运动中所占的部分要小得多时,总数字要大得多

标签: python pandas pandas-groupby


【解决方案1】:

如评论中所述,尚不清楚在 'North' 案例中该怎么做,因为那里的总和是正数,但忽略这一点,您可以执行以下操作:

In [200]: df[df.groupby('region').sales.apply(lambda g: g <= g.loc[(g.sort_values().cumsum() > 0.9*g.sum()).idxmin()])]
Out[200]:
   region  OfficeLocation  sales
2   South               3  -1000
3   South               4  -2000
13  North              66   -800

如果在肯定的情况下,您希望尽可能少地找到一起具有占销售额总和 90% 的属性的元素,则可以采用上述解决方案:

def is_driver(group):
    s = group.sum()
    if s > 0:
        group *= -1
        s *= -1
    a = group.sort_values().cumsum() > 0.9*s
    return group <= group.loc[a.idxmin()]

In [168]: df[df.groupby('region').sales.apply(is_driver)]
Out[168]:
   region  OfficeLocation  sales
2   South               3  -1000
3   South               4  -2000
10  North              33   1000
12  North              55    900

请注意,在平局的情况下,只会选择一个元素。

【讨论】:

  • fuglede,谢谢你的帮助!我猜我想说什么,但不是——我希望北方和南方的结果是分开的,我们能够找到解释南方净运动的最大驱动因素和解释网络的最大驱动因素向北运动
  • 那么在'North' 的情况下,您想找到足够多的阳性结果来弥补90% 的阳性结果吗?如果是这样,为什么在您添加的示例中是 800 而不是 900?
  • fuglede- 抱歉,睡眠不足- 这太棒了!非常感谢你,你是个天才!
猜你喜欢
  • 2014-08-28
  • 2018-08-28
  • 1970-01-01
  • 2020-02-07
  • 2020-11-10
  • 2023-04-07
  • 2014-07-17
  • 2015-10-30
  • 1970-01-01
相关资源
最近更新 更多