Проблемы при построении временных рядов против пользовательских логинов?

1

У меня большой размер данных pandas, который является журналом идентификаторов пользователей, которые входят в систему на веб-сайте:

  id        datetime
  130    2018-05-17 19:46:18
  133    2018-05-17 20:59:57
  133    2018-05-17 21:54:01
  142    2018-05-17 22:49:07
  114    2018-05-17 23:02:34
  136    2018-05-18 06:06:48
  136    2018-05-18 12:21:38
  180    2018-05-18 12:49:33
           .......

  120    2018-05-18 14:03:58
  120    2018-05-18 15:28:36

Как я могу визуализировать вышеупомянутый фрейм данных панд как график временных рядов? Например, я хотел бы представить частоту логинов каждого id человека как линию другого цвета (обратите внимание, что у меня около 400 ids). Что-то вроде этого сюжета (*):

Изображение 174551]

Я пытался:

from datetime import date
import matplotlib.dates as mdates
import matplotlib.pyplot as plt
import pandas as pd

# set your data as df
# strip only YYYY-mm-dd part from original 'datetime' column
df3.timestamp = df3.datetime.apply(lambda x: str(x)[:10])
df3.timestamp = df3.datetime.apply(lambda x: date(int(x[:4]), int(x[5:7]), int(x[8:10])))

# plot
plt.figure(figsize=(150,10))
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m'))
plt.gca().xaxis.set_major_locator(mdates.DayLocator())
plt.plot(df3.datetime[:800], df3.id[:800], '-')
plt.gcf().autofmt_xdate()

а также

import matplotlib.dates as dates

df5 = df3.set_index('datetime')
df5.plot(x_compat=True)
plt.gca().xaxis.set_major_locator(dates.DayLocator())

plt.gca().xaxis.set_major_formatter(dates.DateFormatter('%d\n\n%a'))
plt.gca().invert_xaxis()
plt.gcf().autofmt_xdate(rotation=0, ha="center")
plt.figure(figsize=(150,10))

Однако у меня есть что-то вроде этого:

Изображение 174551]

Любая идея о том, как получить сюжет, похожий на (*)?

Теги:
pandas
matplotlib
data-visualization
seaborn

1 ответ

1
Лучший ответ

Я немного поиграл с вашими образцами данных, чтобы один пользователь заходил на три дня. Проблема в вашей попытке состоит в том, что вы пытаетесь "просто построить" логины. Если вы хотите увидеть частоту входа в систему, вы должны это вычислить. Так что я прочитал данные и использовать правильный индекс DateTime, а затем использовать groupby затем resample для расчета частоты. Я думаю, что с 400 пользователями это может стать немного грязным, но это будет делать график ежедневных логинов для каждого пользователя.

import pandas
import io

d = """id,datetime
130,2018-05-17T19:46:18
133,2018-05-17T20:59:57
133,2018-05-17T21:54:01
142,2018-05-17T22:49:07
114,2018-05-17T23:02:34
136,2018-05-18T06:06:48
136,2018-05-18T12:21:38
130,2018-05-18T12:49:33
120,2018-05-18T14:03:58
130,2018-05-19T15:28:36"""

# for the data aboce, this is a quick way to parse it
df = pandas.read_csv(io.StringIO(d), parse_dates=['datetime'], index_col='datetime')

# This method is more roundabout but is perhaps useful if you have other data
df = pandas.read_csv(io.StringIO(d))
df.datetime = pandas.to_datetime(df.datetime)
df = df.set_index('datetime')

# Plot daily logins per user id
r = df.groupby('id').resample('D').apply(len).unstack('id').plot()

Изображение 174551

  • 0
    Спасибо за помощь! Тем не менее, я получил следующее: TypeError: Only valid with DatetimeIndex, TimedeltaIndex or PeriodIndex, but got an instance of 'RangeIndex'
  • 0
    Что странно, потому что у меня есть даты в формате datetime: id int64 datetime datetime64[ns] dtype: object
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню