2017-01-28 2 views
0

У меня есть dataframe, содержащий данные о клиентах. Каждая строка относится к другому клиенту. Один из серий данных данных - это продажи в 2016 году заказчику. Я хотел бы классифицировать клиентов в децили. Каждый дециль будет иметь одну десятую от общего объема продаж. Decile 10 будет иметь лучших клиентов, которые составляют первые 10% от общего объема продаж.Классифицировать клиентов в Deciles с помощью Pandon Pandas?

Какой способ python для выполнения этой задачи?

+0

Можете ли вы предоставить образец ввода и нужные наборы данных? – MaxU

+0

Да - вот несколько [тестовых данных] (https://www.dropbox.com/s/0ga6kgptxpzjs1i/Test-Data.csv?dl=0). Он имеет три серии - идентификатор учетной записи, почтовый индекс и продажи. Серия продаж является той, которая будет использоваться для классификации учетных записей –

+0

и каков будет ваш желаемый набор данных? – MaxU

ответ

3

pandas имеет pd.qcut метод, который, при нанесении на Series, возвращает categorical seriesDataFrame ведет себя аналогично). Таким образом, чтобы получить обратно категорический индекс, вы можете сделать:

>>> import pandas as pd 
# mock data 
>>> df = pd.DataFrame({'sales_total': [1,2,162,126,126,12,7,1236,16,132,61,51]}) 
>>> cat_srs = pd.qcut(df['sales_total'], 10) 
>>> print(cat_srs) 
<<< 0   [1, 2.5] 
    1   [1, 2.5] 
    2  (159, 1236] 
    3   (1, 126] 
    4   (1, 126] 
    5  (8, 13.2] 
    6   (2.5, 8] 
    7  (159, 1236] 
    8  (13.2, 3] 
    9  (130.8, 159] 
    10   (56, 1] 
    11   (3, 56] 
    Name: dat, dtype: category 
    Categories (10, object): [...] 

Вы можете получить записи серии с оператором values, а затем оттуда получить их бин код с помощью codes оператора:

>>> deciles = cat_srs.values.codes 
>>> print(deciles) 
<<< array([0, 0, 9, 6, 6, 2, 1, 9, 3, 8, 5, 4], dtype=int8) 

Это то, что вам нужно. Отсюда вы можете назначить децили данные с помощью df['decile'] = deciles, записи в группе с использованием df.groupby('decile') и т. Д.

Один лайнер для всего вышеперечисленного pd.qcut(df['sales_total'], 10).values.codes.

Edit: отвечая на вопрос модифицированную ниже, в комментариях — я не знаю способ сделать это, который пекли в библиотеку. Но, полагая, что ваши данные относительно непрерывны, вы можете самостоятельно создавать классы:

+0

Спасибо за это. Если я не ошибаюсь, функция 'pd.qcut' основана на процентили, т. Е. Равное количество элементов в каждом ящике. Я ищу, чтобы сумма продаж в каждом бункере была приблизительно одинаковой. Decile 10 будет иметь наименьшие элементы (все с высокими продажами), в то время как Decile 1 будет иметь большинство элементов (и все с низкими продажами). –

+0

Ах, в этом случае вы пытаетесь решить NP-жесткую проблему, известную как [проблема раздела] (https://en.wikipedia.org/wiki/Partition_problem). Если у вас очень мало данных, вы можете избавиться от решения [здесь] (http://stackoverflow.com/questions/10035752/elegant-python-code-for-integer-partitioning). Я не знаю канонической реализации в Python, но вы можете, вероятно, повторно использовать код [здесь] (https://people.sc.fsu.edu/~jburkardt/py_src/partition_problem/partition_problem.html). –

+0

Извините, я слишком усложняю это. Если бы я делал это в Excel, я бы сортировал учетные записи на основе продаж. Decile 10 будет топ-счетами, чьи продажи составили 1/10 от общей суммы. Decile 9 будет следующей группой счетов, чьи продажи составили 1/10 от общей суммы и т. Д. –

Смежные вопросы