Звучит так, как будто вы хотите линейно проецировать, используя два (я буду использовать первый и последний) локальные минимумы и максимумы. Таким образом, вы должны определить эти точки, а затем подобрать функцию для линейного прохождения через них и построить эту функцию с набором точек, выходящих за пределы ваших данных:
from random import random
import pandas as pd
from scipy import signal
import numpy as np
import matplotlib.pyplot as plt
#create random walk
random.seed(1)
random_walk = list()
random_walk.append(-1 if random() < 0.5 else 1)
for i in range(1, 20):
movement = -1 if random() < 0.5 else 1
value = random_walk[i-1] + movement
random_walk.append(value)
df = pd.DataFrame(random_walk, columns=["data"])
n=3
# Find local peaks
df['min'] = df.iloc[signal.argrelextrema(df.data.values, np.less_equal, order=n)[0]]['data']
df['max'] = df.iloc[signal.argrelextrema(df.data.values, np.greater_equal, order=n)[0]]['data']
min_points = [t for t in tuple(zip(df.index, df['min'])) if t[1] == t[1]] # zips and removes NaNs
max_points = [t for t in tuple(zip(df.index, df['max'])) if t[1] == t[1]] # zips and removes NaNs
min_end_points = (min_points[0], min_points[-1])
max_end_points = (max_points[0], max_points[-1])
plt.scatter(df.index, df['min'], c='r')
plt.scatter(df.index, df['max'], c='g')
min_fit = np.poly1d(np.polyfit([x[0] for x in min_end_points], [x[1] for x in min_end_points], 1))
max_fit = np.poly1d(np.polyfit([x[0] for x in max_end_points], [x[1] for x in max_end_points], 1))
x_proj = np.linspace(0, 30, 30)
plt.plot(df.index, df['data'])
plt.plot(x_proj, min_fit(x_proj), '-r')
plt.plot(x_proj, max_fit(x_proj), '-b')
plt.show()
Результат:
Если вы хотите проецировать, используя любую другую комбинацию точек (или все), которая также возможна. Вам просто нужно изменить, какие локальные минимумы или максимумы вы используете. Вы также можете создать список функций и вывести их все, если хотите.