Генерация списка категориальных переменных, в которых обычно распределены категориальные числа - PullRequest
1 голос
/ 02 апреля 2020

Я стремлюсь генерировать некоторые синтетические c данные из 1000 строк (которые должны быть представлены в pd.DataFrame объекте), заполненные набором категориальных переменных.

Предположим, у меня есть объект dict всех возможных категориальных переменных. которые могут существовать.

Список отсортирован в порядке приоритетов, с 'Aaa' наивысшим приоритетом и 'NR' наименьшим приоритетом.

credit_score_types = {
    'Aaa':0,
    'Aa1':1,
    'Aa2':2,
    'Aa3':3,
    'A1':4,
    'A2':5,
    'A3':6,
    'Baa1':7,
    'Baa2':8,
    'Baa3':9,
    'Ba1':10,
    'Ba2':11,
    'Ba3':12,
    'B1':13,
    'B2':14,
    'B3':15,
    'Caa':16,
    'Ca':17,
    'C':18,
    'e, p':19,
    'WR':20,
    'unsolicited':21,
    'NR':22
}

Объект dict key с медиана value будет представлять собой «пик» нормального распределения .

В этом случае 'Ba2' будет «пиком» Нормальное распределение .

Ожидаемый результат:

Произвольно назначить pd.DataFrame с 1000 строками (или заполненный list с длиной 1000 ) используя категориальные переменные из вышеприведенного объекта dict. Присвоение категориальных переменных будет следовать нормальному распределению.

'Baa2' будет иметь наибольшее количество.

Если гистограмма строится со счетчиком каждого категориального вхождения, я бы наблюдал график нормально распределенной формы (аналогично приведенному ниже).

Graph to illustrate the expected shape when plotting the categorical variables.

1 Ответ

1 голос
/ 02 апреля 2020

Нормальное распределение является непрерывным и не категориальным. Вы могли бы рассмотреть объединение нормально распределенных данных с интервалами шириной 1,0: то есть «Baa2» с пиком 11 фактически будет считать все нормально распределенные значения в интервале [10.5, 11.5], «Baa1» будет подсчитывать все значения в интервале [9.5, 10.5] ... «Aaa» будет считать все значения в интервале [-0,5, 0,5] и т. Д. ...

import numpy as np 
import matplotlib.pyplot as plt

credit_score_types = {
    'Aaa':0,
    'Aa1':1,
    'Aa2':2,
    'Aa3':3,
    'A1':4,
    'A2':5,
    'A3':6,
    'Baa1':7,
    'Baa2':8,
    'Baa3':9,
    'Ba1':10,
    'Ba2':11,
    'Ba3':12,
    'B1':13,
    'B2':14,
    'B3':15,
    'Caa':16,
    'Ca':17,
    'C':18,
    'e, p':19,
    'WR':20,
    'unsolicited':21,
    'NR':22
}

# generate normally distributed data, fix random state 
np.random.seed(42)
mu, sigma = credit_score_types['Ba2'], 5
X = np.random.normal(mu, sigma, 1000)

fig, ax = plt.subplots()

counts, bins = np.histogram(X, bins = np.linspace(-0.5, 22.5, 23))

# create a new dictionary of category names and counts
data = dict(zip(credit_score_types.keys(), counts))
ax.bar(data.keys(), data.values())
plt.xticks(rotation = 'vertical')

plt.show()

enter image description here

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