在时间序列股票数据图中添加45度线

时间:2018-09-04 11:39:15

标签: python pandas matplotlib time-series

我想这应该很简单。但是我似乎无法使其正常工作。

我有一些库存数据

import pandas as pd
import numpy as np
df = pd.DataFrame(index=pd.date_range(start = "06/01/2018", end = "08/01/2018"),
data = np.random.rand(62)*100)

我正在对此进行一些分析,结果是在图形上绘制了一些线。

我想在图形上的某处绘制一条45线,以作为我在图形上绘制的线的参考。

我尝试过的是

x = df.tail(len(df)/20).index
x = x.reset_index()
x_first_val = df.loc[x.loc[0].date].adj_close

为了得到某个点然后使用斜率= 1并计算y值..但这听起来是错误的。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

有可能:

import pandas as pd
import numpy as np

df = pd.DataFrame(index=pd.date_range(start = "06/01/2018", end = "08/01/2018"),
                  data=np.random.rand(62)*100,
                  columns=['data'])

#  Get values for the time:
index_range = df.index[('2018-06-18' < df.index)  & (df.index < '2018-07-21')]

# get the timestamps in nanoseconds (since epoch)
timestamps_ns = index_range.astype(np.int64) 
# convert it to a relative number of days (for example, could be seconds)
time_day = (timestamps_ns - timestamps_ns[0]) / 1e9 / 60 / 60 / 24  

# Define y-data for a line:
slope = 3  # unit: "something" per day
something = time_day * slope

trendline = pd.Series(something, index=index_range)

# Graph:
df.plot(label='data', alpha=0.8)
trendline.plot(label='some trend')
plt.legend(); plt.ylabel('something');

给出:

example graph

编辑-第一个答案,使用dayofyear代替时间戳:

import pandas as pd
import numpy as np

df = pd.DataFrame(index=pd.date_range(start = "06/01/2018", end = "08/01/2018"),
                  data=np.random.rand(62)*100,
                  columns=['data'])

# Define data for a line:
slope = 3  # unit: "something" per day

index_range = df.index[('2018-06-18' < df.index)  & (df.index < '2018-07-21')]

dayofyear = index_range.dayofyear  #  it will not work around the new year...
dayofyear = dayofyear - dayofyear[0]
something = dayofyear * slope

trendline = pd.Series(something, index=index_range)

# Graph:
df.plot(label='data', alpha=0.8)
trendline.plot(label='some trend')
plt.legend(); plt.ylabel('something');