Добавление линии 45 градусов к графику данных запаса временного ряда - PullRequest
0 голосов
/ 04 сентября 2018

Полагаю, это должно быть просто .. Но я не могу заставить его работать.

У меня есть некоторые данные о запасах

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

Чтобы получить некоторую точку, а затем использовать slope = 1 и рассчитать значения y ... но это звучит неправильно.

Есть идеи?

1 Ответ

0 голосов
/ 04 сентября 2018

Вот возможность:

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

edit - первый ответ, используя 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');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...