使用pandas我创建了一个时间序列图,如下所示:
import numpy as np
import pandas as pd
rng = pd.date_range('2016-01-01', periods=60, freq='D')
ts = pd.Series(np.random.randn(len(rng)), index=rng)
ax = ts.plot()
ax.axhline(y=ts.mean(), xmin=-1, xmax=1, color='r', linestyle='--', lw=2)
我想仅使用二月份的数据在平均水平添加另一条水平线。平均值只是ts.loc['2016-02']
,但是如何在该级别添加一条不会覆盖整个数字的水平线,但仅限于2月份的日期?
答案 0 :(得分:3)
或者您可以创建一个新的时间序列,其值为平均值,索引仅跨越二月。
ts_feb_mean = ts['2016-02'] * 0 + ts['2016-02'].mean()
一起看起来像是:
import numpy as np
import pandas as pd
rng = pd.date_range('2016-01-01', periods=60, freq='D')
ts = pd.Series(np.random.randn(len(rng)), index=rng)
# Feb mean
ts_fm = ts['2016-02'] * 0 + ts['2016-02'].mean()
ts_fm = ts_fm.reindex_like(ts)
# Total mean
ts_mn = ts * 0 + ts.mean()
# better control over ax
fig, ax = plt.subplots(1, 1)
ts.plot(ax=ax)
ts_mn.plot(ax=ax)
ts_fm.plot(ax=ax)
答案 1 :(得分:1)
您可以使用xmin
和xmax
来控制图表中行的开始和结束位置。但这只占图表的百分比。
import numpy as np
import pandas as pd
np.random.seed([3, 1415])
rng = pd.date_range('2016-01-01', periods=60, freq='D')
ts = pd.Series(np.random.randn(len(rng)), index=rng)
ts_feb = ts['2016-02']
# used to figure out where to start and stop
ts_len = float(len(ts))
ts_len_feb = float(len(ts_feb))
ratio = ts_len_feb / ts_len
ax = ts.plot()
ax.axhline(y=ts.mean() * 5, xmin=0, xmax=1, color='r', linestyle='--', lw=2)
ax.axhline(y=ts_feb.mean() * 5, xmin=(1. - ratio), xmax=1, color='g', linestyle=':', lw=2)