Изменение графика в сумме категориальных данных в Group By с несколькими столбцами - PullRequest
0 голосов
/ 23 апреля 2020

Я пытаюсь создать временной ряд изменения количества людей в определенной профессии с течением времени.

Я использовал функцию group_by для 'SURVDATE' (год и месяц опроса) и 'PROV' (провинция, в которой живет человек). Сейчас я сосредотачиваюсь на общем количестве людей определенной профессии в этой группе (провинции на каждый год).

Мой набор данных настроен таким образом, что в столбце «NOC_10» было 10 профессий, которые были дан соответствующий числовой код (ie Финансы = 1). Поэтому мне нужно суммировать или считать значения каждого занятия. Мне удалось сделать это с помощью .size () и .value_counts (). Sort_index ().

for date, df in data_QO.groupby(['SURVDATE', 'PROV', 'NOC_10']).size():
    print(df)

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

TypeError: not распаковать не повторяемый объект int

Поэтому мой вопрос таков: есть ли способ выполнить итерацию по группе по объекту так, чтобы я взял сумму числа людей в каждой профессии в каждой провинции в каждом месяце и построить график зависимости суммы от месяца для каждого занятия в каждой провинции?

Для пояснения мне удалось создать аналогичные графики для отраслевой переменной:

industries = [1, 2, 4, 5, 6, 7, 8, 9, 10, 11]
for ind in industries:
    data_ind_O = data_QO[(data_QO['NAICS_21'] == ind) & (data_QO['PROV'] == 35)].groupby(['SURVDATE', 'LFSSTAT']).size().unstack(fill_value=0)
    data_ind_Q = data_QO[(data_QO['NAICS_21'] == ind) & (data_QO['PROV'] == 24)].groupby(['SURVDATE', 'LFSSTAT']).size().unstack(fill_value=0)

    data_ind_O['ur_rate'] = data_ind_O[3] / (data_ind_O[1] + data_ind_O[2] + data_ind_O[3])
    data_ind_Q['ur_rate'] = data_ind_Q[3] / (data_ind_Q[1] + data_ind_Q[2] + data_ind_Q[3])

    plt.figure()
    data_ind_O['ur_rate'].plot(linewidth=0.5, color='red')
    data_ind_Q['ur_rate'].plot(linewidth=0.5, color='blue')

Снимок данных data_ind_O:

LFSSTAT       1   2   3   4   ur_rate
SURVDATE                             
2017-01-01  197  15   8  36  0.036364
2017-02-01  180  21  17  32  0.077982
2017-03-01  194  11  16  28  0.072398
2017-04-01  189  12  11  22  0.051887
2017-05-01  207   6   5  16  0.022936
2017-06-01  219   6   8  15  0.034335
2017-07-01  221  15   3  16  0.012552
2017-08-01  240  18   6  15  0.022727
2017-09-01  227   9   8  20  0.032787
2017-10-01  225   7   9  25  0.037344
2017-11-01  219   8   9  34  0.038136
2017-12-01  212  14   5  30  0.021645
2018-01-01  198  17  10  37  0.044444
2018-02-01  204  14  14  36  0.060345
2018-03-01  215  21  17  29  0.067194
2018-04-01  226  11   5  24  0.020661
2018-05-01  238   7   8  18  0.031621
2018-06-01  257   8   6  19  0.022140
2018-07-01  260  12   5  16  0.018051
2018-08-01  252   8  10   9  0.037037
2018-09-01  249  21   5  13  0.018182
2018-10-01  238  12   6  13  0.023438
2018-11-01  242  11   9  16  0.034351
2018-12-01  227  15   9  22  0.035857
2019-01-01  233  22   8  30  0.030418
2019-02-01  235  21  13  30  0.048327
2019-03-01  223  25   8  31  0.031250
2019-04-01  223  18  10  34  0.039841
2019-05-01  262  13   5  20  0.017857
2019-06-01  279  17   7  17  0.023102
2019-07-01  282  17   8  12  0.026059
2019-08-01  283  18   7  14  0.022727
2019-09-01  283  12  10  25  0.032787
2019-10-01  277   8  12  27  0.040404
2019-11-01  270  14  11  25  0.037288
2019-12-01  234  10  13  34  0.050584
LFSSTAT      1  2   3   4   ur_rate
SURVDATE                           
2017-01-01  31  4   5   5  0.125000
2017-02-01  34  1   7   6  0.166667
2017-03-01  27  3   9   7  0.230769
2017-04-01  30  1   3   6  0.088235
2017-05-01  41  2   2   5  0.044444
2017-06-01  41  1   3   5  0.066667
2017-07-01  37  4   2   4  0.046512
2017-08-01  33  5   3   5  0.073171
2017-09-01  42  4   3   9  0.061224
2017-10-01  41  1   3   5  0.066667
2017-11-01  31  3   1   5  0.028571
2017-12-01  31  4   2   4  0.054054
2018-01-01  40  0   0   3  0.000000
2018-02-01  41  2   1   6  0.022727
2018-03-01  37  0   2   9  0.051282
2018-04-01  30  1   4  10  0.114286
2018-05-01  39  1   0   4  0.000000
2018-06-01  42  1   0   1  0.000000
2018-07-01  38  7   0   0  0.000000
2018-08-01  38  2   3   0  0.069767
2018-09-01  30  5   2   8  0.054054
2018-10-01  21  1   9   6  0.290323
2018-11-01  24  1  11   3  0.305556
2018-12-01  28  0   5   3  0.151515
2019-01-01  27  3   6   7  0.166667
2019-02-01  25  4   3   5  0.093750
2019-03-01  21  5   1   3  0.037037
2019-04-01  22  6   4   4  0.125000
2019-05-01  29  2   5   6  0.138889
2019-06-01  28  4   1   2  0.030303
2019-07-01  34  1   1   3  0.027778
2019-08-01  28  2   2   2  0.062500
2019-09-01  19  3   2   6  0.083333
2019-10-01  18  2   4   6  0.166667
2019-11-01  21  6   3   5  0.100000
2019-12-01  23  2   4   9  0.137931

где ur_rate - уровень безработицы, который был найден путем деления общей численности рабочей силы (столбцы 1, 2 и 3) на общее количество безработных (столбец 3).

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

Заранее большое спасибо.

...