通过合并两个时间序列来注释时间序列图

时间:2017-01-09 18:15:10

标签: python pandas

鉴于我有两个时间序列(或数据框中的两列),如下所示:

rng1 = pd.date_range('1/1/2017', periods=3, freq='H')
ts1 = pd.Series(np.random.randn(len(rng)), index=rng)
ts2 = pd.Series(['HE','NOT','SHE'], index=rng)

我想做一个ts1.plot()的情节,其中ts2用于注释ts1时间序列,但是我只想注释<> NOT的时间戳。

到目前为止,我发现使用标记将是我正在寻找的东西。例如,为'HE'设置一个标记,为'SHE'设置另一个标记,为'NOT'设置No标记。但是,我无法弄清楚如何使用另一个时间序列作为输入,只能注释时间戳&lt;&gt;一些价值。

1 个答案:

答案 0 :(得分:0)

您可以使用pandas dataframe groupby方法按您正在使用的标签拆分数据集,只需忽略您不想绘制的值。

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

rng = pd.date_range('1/1/2017', periods=3, freq='H')
ts1 = pd.Series(np.random.randn(len(rng)), index=rng)
ts2 = pd.Series(['HE','NOT','SHE'], index=rng)
df = pd.concat([ts1, ts2], keys=['foo', 'bar'], axis=1)

ax = None # trick to keep everything plotted on a single axis
labels = [] # keep track of the labels you actually use
for key, dat in df.groupby('bar'):
    if key == 'NOT':
        continue
    labels.append(key)
    ax = dat.plot(ax=ax, marker='s', ls='none', legend=False)
# handle the legend through matplotlib directly, rather than pandas' interface
ax.legend(ax.get_lines(), labels)
plt.show()