определить записи, которые составляют 90% от общего числа - PullRequest
0 голосов
/ 06 октября 2018

У меня есть отчет, который определяет ключевые движущие силы общего числа / тренда.Я хотел бы автоматизировать функциональность, чтобы иметь возможность перечислять / идентифицировать базовые записи на основе процента от этого числа.Например, если чистое изменение для продаж виджетов на юге (в регионе) составляет -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% этого перемещения (в порядке убывания), поэтому 90% от -3200 будет 2880. И направленные перемещения / продажи для офиса в южном направлении 3 & 4 = -3000будет вывод для этого запроса:

region    OfficeLocation  sales
South     3                -1000
South     4                -2000

для Севера, общий объем продаж +1800.Я хотел бы определить / перечислить драйверы, которые составляют не менее 90% этого движения (в порядке убывания) - так что по крайней мере 90% из 1800 будет 1620. И направленные ходы / продажи для южного офиса 3 и 4 = -3000 будет выходной для этого запроса:

регион OfficeLocation продаж Север 33 1000 Север 44 800

Набор данных выше имеет положительные и отрицательные тенденции для юга / севера.Будем весьма благодарны за любую помощь, которую вы можете оказать!

1 Ответ

0 голосов
/ 06 октября 2018

Как упоминалось в комментарии, неясно, что делать в случае '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

Обратите внимание, что в случае ничьей выбирается только один элемент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...