Как построить временной ряд для изучения частоты элементов? - PullRequest
0 голосов
/ 26 февраля 2020

Мне нужно было бы нанести на график значения времени, чтобы увидеть, как меняется частота. В частности сообщения генерируются от разных пользователей во времени. У меня есть набор данных, подобный следующему:

       GENDER          POST  DATE  COUNTER
0      men    (post 103)     36        43
1      men    (post 109)     38        2
2      men    (post 116)     41        12
3      men    (post 119)     42        32
4      men    (post 124)     44        2
..       ...           ...   ...      ...
82   women     (post 83)     29        34
83   women     (post 86)     30        2
84   women     (post 86)     65        9
85   women     (post 91)     32        5
86   women     (post 99)     35        5

, где DATE является числовым (последовательные числа, а не формат даты). Сначала я подумал о выборе интересующих меня столбцов с помощью seaborn:

from  matplotlib import pyplot
import seaborn

fg = seaborn.FacetGrid(data=df_, hue='GENDER', aspect=1.61)
fg.map(pyplot.scatter, 'DATE', 'COUNTER').add_legend()

но для того, чтобы получить что-то похожее на график, показанный на рисунке ниже:

https://imgur.com/bAKogi9

Я думаю, мне следует рассмотреть временной ряд для того, чтобы отслеживать сообщения во времени. На оси X каждого графика будет указана дата (DATE), а на оси Y - частота сообщения (COUNTER).

Файл CSV, который я рассматриваю для этого анализа, содержит следующие столбцы:

file = '...'

with open(file, newline='') as csvfile:
    df = csv.reader(csvfile, delimiter=';', quotechar='|')
    for row in df:
         print(' '.join(row)) 
df = pd.read_csv(file, sep=';') # or your sep in file
df.columns = [' ', 'GENDER', 'POST', 'DATE', 'COUNTER',' ']

Большое спасибо за ваше время и за помощь.

Обновление:

        GENDER  POST DATE COUNTER
0       (man 8) (post 4) 0  0   NaN
1       (woman 13)  (post 1) 2  0   NaN
2       (man 14)    (post 7) 2  2   NaN
3       (man 8) (post 4) 4  1 NaN
4       (woman 19)  (post 12) 4 1   NaN

1 Ответ

1 голос
/ 26 февраля 2020

Сначала давайте отфильтруем ваш фрейм данных, чтобы у вас было только несколько сообщений:

import seaborn as sns

post_list = ['(post 103)','(post 109)','(post 116)']
df2 = df[df.POST.isin(post_list)]

Затем, что-то вроде этого должно сделать:

for post in df2.POST.unique():
    sns.lineplot(x='DATE',y='COUNTER', hue='GENDER', data=df2[df2.POST==post])
plt.show()

Если вам все равно о доверительных интервалах вы можете добавить ci=None к вызову sns, что ускорит выполнение кода.

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