Python Генерировать уникальные диапазоны заданной c длины и классифицировать их - PullRequest
0 голосов
/ 26 мая 2020

У меня есть столбец фрейма данных, в котором указано, сколько раз пользователь выполнил действие. например.

>>> df['ActivityCount']
Users     ActivityCount
User0     220
User1     190
User2     105
User3     109
User4     271
User5     265
     ...
User95     64
User96     15
User97    168
User98    251
User99    278
Name: ActivityCount, Length: 100, dtype: int32


>>> activities = sorted(df['ActivityCount'].unique())
[9, 15, 16, 17, 20, 23, 25, 26, 28, 31, 33, 34, 36, 38, 39, 43, 49, 57, 59, 64, 65, 71, 76, 77, 78,
83, 88, 94, 95, 100, 105, 109, 110, 111, 115, 116, 117, 120, 132, 137, 138, 139, 140, 141, 144, 145, 148, 153, 155, 157, 162, 168, 177, 180, 182, 186, 190, 192, 194, 197, 203, 212, 213, 220, 223, 231, 232, 238, 240, 244, 247, 251, 255, 258, 260, 265, 268, 269, 271, 272, 276, 278, 282, 283, 285, 290]

Согласно их ActivityCount, я должен разделить пользователей на 5 разных категорий, например, A, B, C, D и E. Диапазон подсчета активности время от времени меняется. В приведенном выше примере это примерно среднее значение (9-290) (наименьшее и наибольшее в серии), это может быть (5-500) или (5 to 30). В приведенном выше примере я могу взять максимальное количество действий, разделить его на 5 и распределить каждого пользователя по категориям в диапазоне 58 (from 290/5), например, Range A: 0-58, Range B: 59-116, Range C: 117-174 ... et c

Есть ли другой способ добиться этого, используя pandas или numpy, чтобы я мог напрямую разделить столбец на указанные категории? Ожидаемый результат: -

>>> df
Users     ActivityCount  Category/Range 
User0     220             D
User1     190             D
User2     105             B 
User3     109             B
User4     271             E  
User5     265             E
     ...
User95     64             B
User96     15             A
User97    168             C
User98    251             E
User99    278             E

Ответы [ 2 ]

2 голосов
/ 26 мая 2020

Естественный способ сделать это - разделить данные на 5 частей, а затем разделить данные на ячейки на основе этих количеств. К счастью, pandas позволяет вам это легко сделать:

df["category"] = pd.cut(df.Activity, 5, labels= ["a","b", "c", "d", "e"])

Результат выглядит примерно так:

    Activity Category
34       115        b
15        43        a
57       192        d
78       271        e
26        88        b
6         25        a
55       186        d
63       220        d
1         15        a
76       268        e

Альтернативный вид - кластеризация

В приведенном выше Мы разделили данные на 5 бинов, в которых размеры разных бинов равны. Альтернативный, более сложный подход заключался бы в разделении данных на 5 кластеров и стремлении сделать точки данных в каждом кластере как можно более похожими друг на друга. В машинном обучении это известно как проблема кластеризации / классификации.

Один алгоритм кластеризации classi c - это k-means . Обычно он используется для данных с несколькими измерениями (например, ежемесячная активность, возраст, пол и т. Д. c). Следовательно, это очень упрощенный c случай кластеризации.

В этом случае кластеризацию k-средних можно выполнить следующим образом:

import scipy
from scipy.cluster.vq import vq, kmeans, whiten

df = pd.DataFrame({"Activity": l})

features = np.array([[x] for x in df.Activity])
whitened = whiten(features)
codebook, distortion = kmeans(whitened, 5) 
code, dist = vq(whitened, codebook)

df["Category"] = code

И результат будет выглядеть так:

    Activity  Category
40       138         1
79       272         0
72       255         0
13        38         3
41       139         1
65       231         0
26        88         2
59       197         4
76       268         0
45       145         1

Пара примечаний :

  • Названия категорий случайны. В этом случае метка «2» означает более высокую активность, чем уровень «1».
  • Я не переносил метки с 0-4 на AE. Это легко сделать, используя pandas 'map.
1 голос
/ 26 мая 2020

Попробуйте следующее решение:

df['Categ'] = pd.cut(df.ActivityCount, bins=5, labels=list('ABCDE'))

Создается столбец Категория - результат разделения ActivityCount на 5 ячеек, помеченных A , ... E .

Границы бинов устанавливаются путем деления всего диапазона на n поддиапазонов равного размера.

Вы также можете увидеть границы каждой корзины, позвонив по телефону:

pd.cut(df.ActivityCount, bins=5, labels=list('ABCDE'), retbins=True)[1]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...