我正在寻找带有一堆记录的python DataFrame,这些记录代表我的用户操作,我想要 在单个图中绘制每个用户在我的应用中花费的时间
DataFrame看起来像:
uid, ts, action
A, 2017-07-01 09:01:10.0000, login
A, 2017-07-01 09:01:20.0000, logout
B, 2017-07-01 09:01:15.0000, login
A, 2017-07-01 09:03:15.0000, login
A, 2017-07-01 09:04:03.0000, logout
B, 2017-07-01 09:05:50.0000, logout
我正在寻找这样的情节:
B | ************
A | ** ****
+-------------------
time
答案 0 :(得分:1)
您需要的不仅仅是pandas
才能获得所需的输出。 Pandas
是一种数据分析工具,具有有限数量的可视化功能。事实上,它拥有的所有可视化功能都建立在matplotlib
之上。既然如此,我建议使用matplotlib工具包中的基本散点图。我已经使用您的起始数据集绘制类似于输出的内容。以下应该是一个不错的起点:
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import pandas as pd
d = {'action': ['login', 'logout', 'login', 'login', 'logout', 'logout'],
'ts': [pd.Timestamp('2017-07-01 09:01:10'),
pd.Timestamp('2017-07-01 09:01:20'),
pd.Timestamp('2017-07-01 09:01:15'),
pd.Timestamp('2017-07-01 09:03:15'),
pd.Timestamp('2017-07-01 09:04:03'),
pd.Timestamp('2017-07-01 09:05:50')],
'uid': ['A', 'A', 'B', 'A', 'A', 'B']}
df = pd.DataFrame(d)
uuids = {k:v for v, k in enumerate(df.uid.unique(), 1)}
df = df.assign(uid_n = df.uid.apply(lambda v: uuids.get(v)))
fig = plt.figure(figsize=(8,5))
ax = fig.add_subplot(111)
xfmt = mdates.DateFormatter('%Y-%m-%d %H:%M:%S')
ax.xaxis.set_major_formatter(xfmt)
ax.set_xlabel('time')
ax.set_xticks(df.ts.values)
ax.set_yticks(df.uid_n)
ax.set_yticklabels(df.uid)
ax.plot_date(x = df.ts, y = df.uid_n, marker='*', color='black')
plt.xticks(rotation=90)
plt.tight_layout()
plt.show()
此处使用的主要工具是matplotlib.pyplot
和matplotlib.dates
模块。第一个模块允许您创建轴,向其添加labels
和ticks
并添加绘图。第二个允许您在x轴上格式化日期值以显示日期值。
这里要提到的一件重要事情是我创建了一个名为uuid_n
的整数列,它在创建散点图的过程中使用。这是因为y轴上不接受字符串值。因此,我创建了一个字典,其中每个唯一的字符串值都映射到一个唯一的整数值。完成此操作后,您可以使用uuid
列创建ticks
和labels
。
上面的代码段应该产生以下结果:
我希望这会有所帮助。