当前位置:  开发笔记 > 编程语言 > 正文

如何在Pandas的"白昼时期"覆盖数据以进行绘图

如何解决《如何在Pandas的"白昼时期"覆盖数据以进行绘图》经验,为你挑选了1个好方法。

我有一个DataFrame,其中包含以下形式的一些(更具感知力)数据:

In[67] df
Out[67]: 
                             latency
timestamp                           
2016-09-15 00:00:00.000000  0.042731
2016-09-15 00:16:24.376901  0.930874
2016-09-15 00:33:19.268295  0.425996
2016-09-15 00:51:30.956065  0.570245
2016-09-15 01:09:23.905364  0.044203
                             ...
2017-01-13 13:08:31.707328  0.071137
2017-01-13 13:25:41.154199  0.322872
2017-01-13 13:38:19.732391  0.193918
2017-01-13 13:57:36.687049  0.999191

所以它跨越了大约50天,时间戳不是每天都在同一时间.我想在每天覆盖一些情节,即在同一个地块上检查每一天的时间序列.50天可能是太多的线,但我认为有一种"每日季节性"我想调查,这似乎是一个有用的可视化之前更严格.

如何在表示"单日"时间段的同一图表上叠加此数据


我的想法

我对熊猫还不是很熟悉,但我设法将我的数据分组到日常垃圾箱中

In[67]: df.groupby(pd.TimeGrouper('D'))
Out[68]: 

现在我一直在努力确定我应该如何创建一个新的DataFrame结构,以便可以在白天覆盖这些图.这是我无法弄清楚的基本问题 - 如何利用DataFrameGroupBy对象覆盖图?一个非常基本的看似方法是迭代每个GroupBy对象,但我这样做的问题是配置x轴使得它只显示独立于特定日期的"每日时间段",而不是捕获整个时间戳.

将数据拆分成单独的帧并在同一图中调用它们并使用某种日期强制来在这个更一般的答案中使用该方法对我来说似乎并不是很好.


您可以使用类似的方式生成伪数据:

import datetime 

start_date = datetime.datetime(2016, 9, 15)
end_date = datetime.datetime.now()

dts = []
cur_date = start_date
while cur_date < end_date:
    dts.append((cur_date, np.random.rand()))
    cur_date = cur_date + datetime.timedelta(minutes=np.random.uniform(10, 20))

piRSquared.. 6

考虑数据帧df(主要由OP提供的代码生成)

import datetime 

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

start_date = datetime.datetime(2016, 9, 15)
end_date = datetime.datetime.now()

dts = []
cur_date = start_date
while cur_date < end_date:
    dts.append((cur_date, np.random.rand()))
    cur_date = cur_date + datetime.timedelta(minutes=np.random.uniform(10, 20))


df = pd.DataFrame(dts, columns=['Date', 'Value']).set_index('Date')

真正的诀窍是将索引拆分为日期和时间组件以及拆除堆栈.然后插值以填充缺失值

d1 = df.copy()
d1.index = [d1.index.time, d1.index.date]
d1 = d1.Value.unstack().interpolate()

从这里我们可以 d1.plot(legend=0)

ax = d1.plot(legend=0)
ax.figure.autofmt_xdate()

在此输入图像描述

但这不是很有帮助.


你可能会尝试这样的东西......希望这会有所帮助

n, m = len(d1.columns) // 7 // 4 + 1, 4
fig, axes = plt.subplots(n, m, figsize=(10, 15), sharex=False)

for i, (w, g) in enumerate(d1.T.groupby(pd.TimeGrouper('W'))):
    r, c = i // m, i % m
    ax = g.T.plot(ax=axes[r, c], title=w, legend=0)

fig.autofmt_xdate()

在此输入图像描述


怎么做几个星期

创建一个多索引

包括代表一周的时期

包括星期几

包括一天中的时间

unstack 将每周时间段放入列中

仍然不相信轴格式


d2 = df.copy()

idx = df.index
d2.index = [idx.weekday_name, idx.time, idx.to_period('W').rename('Week')]

ax = d2.Value.unstack().interpolate().iloc[:, :2].plot()
ax.figure.autofmt_xdate()

在此输入图像描述



1> piRSquared..:

考虑数据帧df(主要由OP提供的代码生成)

import datetime 

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

start_date = datetime.datetime(2016, 9, 15)
end_date = datetime.datetime.now()

dts = []
cur_date = start_date
while cur_date < end_date:
    dts.append((cur_date, np.random.rand()))
    cur_date = cur_date + datetime.timedelta(minutes=np.random.uniform(10, 20))


df = pd.DataFrame(dts, columns=['Date', 'Value']).set_index('Date')

真正的诀窍是将索引拆分为日期和时间组件以及拆除堆栈.然后插值以填充缺失值

d1 = df.copy()
d1.index = [d1.index.time, d1.index.date]
d1 = d1.Value.unstack().interpolate()

从这里我们可以 d1.plot(legend=0)

ax = d1.plot(legend=0)
ax.figure.autofmt_xdate()

在此输入图像描述

但这不是很有帮助.


你可能会尝试这样的东西......希望这会有所帮助

n, m = len(d1.columns) // 7 // 4 + 1, 4
fig, axes = plt.subplots(n, m, figsize=(10, 15), sharex=False)

for i, (w, g) in enumerate(d1.T.groupby(pd.TimeGrouper('W'))):
    r, c = i // m, i % m
    ax = g.T.plot(ax=axes[r, c], title=w, legend=0)

fig.autofmt_xdate()

在此输入图像描述


怎么做几个星期

创建一个多索引

包括代表一周的时期

包括星期几

包括一天中的时间

unstack 将每周时间段放入列中

仍然不相信轴格式


d2 = df.copy()

idx = df.index
d2.index = [idx.weekday_name, idx.time, idx.to_period('W').rename('Week')]

ax = d2.Value.unstack().interpolate().iloc[:, :2].plot()
ax.figure.autofmt_xdate()

在此输入图像描述

推荐阅读
linjiabin43
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有