问题是绘制一条日期分布不均匀的直线。使用系列值数据可以修复弯曲问题,但会丢失时间轴(日期)。有办法解决这个问题吗?
编辑:为什么日期不直接映射到x轴上的刻度:
0 -> 2017-02-17,
1 -> 2017-02-20,
... ?
现在橙色线似乎有12个滴答,但只有8个数据点。
import pandas as pd
import matplotlib.pyplot as plt
def straight_line(index):
y = [3 + 2*x for x in range(len(index))]
zserie = pd.Series(y, index=index)
return zserie
if __name__ == '__main__':
start = '2017-02-10'
end = '2017-02-17'
index = pd.date_range(start,end)
index1 = pd.DatetimeIndex(['2017-02-17', '2017-02-20', '2017-02-21', '2017-02-22',
'2017-02-23', '2017-02-24', '2017-02-27', '2017-02-28',],
dtype='datetime64[ns]', name='pvm', freq=None)
plt.figure(1, figsize=(8, 4))
zs = straight_line(index)
zs.plot()
zs = straight_line(index1)
zs.plot()
plt.figure(2, figsize=(8, 4))
zs = straight_line(index1)
plt.plot(zs.values)
答案 0 :(得分:1)
图表正确地将日期视为连续变量。 index_1
的日期应绘制在17,20,21,22,23,24,27和28的x坐标处。因此,带橙色线的图形是正确的。
问题在于您计算straight_line()
函数中y值的方式。您将日期视为仅仅是分类值并忽略日期之间的差距。线性回归计算不会这样做 - 它会将日期视为连续值。
要在示例代码中获得一条直线,您应该使用index_1
(返回一个pandas TimedeltaIndex)将td = (index - index[0])
中的值从绝对日期转换为相对差异,然后使用td
的天数,用于计算的x值。我已经在下面的reg_line()
函数中展示了如何执行此操作:
import pandas as pd
import matplotlib.pyplot as plt
def reg_line(index):
td = (index - index[0]).days #array containing the number of days since the first day
y = 3 + 2*td
zserie = pd.Series(y, index=index)
return zserie
if __name__ == '__main__':
start = '2017-02-10'
end = '2017-02-17'
index = pd.date_range(start,end)
index1 = pd.DatetimeIndex(['2017-02-17', '2017-02-20', '2017-02-21', '2017-02-22',
'2017-02-23', '2017-02-24', '2017-02-27', '2017-02-28',],
dtype='datetime64[ns]', name='pvm', freq=None)
plt.figure(1, figsize=(8, 4))
zs = reg_line(index)
zs.plot(style=['o-'])
zs = reg_line(index1)
zs.plot(style=['o-'])
产生下图:
注意:我已经在图表中添加了点,以便清楚地在图上绘制了哪些值。如您所见,即使该范围内的某些天没有值,橙色线也是直的。