简体   繁体   中英

Adding a 45 degree line to a time series stock data plot

I guess this is supposed to be simple.. But I cant seem to make it work.

I have some stock data

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)

I am doing some analysis on it, this results of my drawing some lines on the graph.

And I want to plot a 45 line somewhere on the graph as a reference for lines I drew on the graph.

What I have tried is

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

In order to get some point and then use slope = 1 and calculate y values.. but this sounds all wrong.

Any ideas?

Here is a possibility:

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');

which gives:

示例图

edit - first answer, using dayofyear instead of the timestamps:

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');

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM