Как рассчитать количество времени, которое эта линия выше линии тренда в Python - PullRequest
0 голосов
/ 09 апреля 2020

Мне было интересно, как я могу вычислить количество времени, когда данные находятся выше линии тренда. Код выглядит так на данный момент.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

csv = pd.read_csv('data.csv')
data = csv[['time', 'amount']]
x = data['time']
y = data['amount']

plt.plot(x, y, 'bo-')

z = np.polyfit(x, y, 1)
p = np.poly1d(z)
plt.plot(x,p(x),"r--")

plt.show()

Это CSV-файл

time,amount
10,5
9,5.5
8,5
7,6.3
6,6
5,4

И график показывает это на данный момент

https://imgur.com/a/3Pi25uD

Я бы хотел получить что-то подобное, показанное на графике.

https://imgur.com/a/5BK7Bc1

Как бы я go сделал это?

1 Ответ

1 голос
/ 09 апреля 2020
Маски

Numpy могут использоваться для ограничения кривых тем, где выполняется некоторое условие. Условие рассчитывается только для значений массивов, поэтому во избежание пропусков можно использовать плотный массив:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

data = pd.DataFrame(data=[[10, 5], [9, 5.5], [8, 5], [7, 6.3], [6, 6], [5, 4]], columns=['time', 'amount'])
data = data.sort_values(['time'])
x = np.array(data['time'])
y = np.array(data['amount'])

plt.plot(x, y, 'bo-')

z = np.polyfit(x, y, 1)
p = np.poly1d(z)

x_dense = np.linspace(x[0], x[-1], 500)
y_dense = np.interp(x_dense, x, y)

mask = y_dense < p(x_dense)
x_masked = np.ma.array(x_dense, mask=mask)

plt.plot(x_dense, p(x_dense), "r-", lw=0.2)
plt.plot(x_masked, p(x_masked), "r--")
plt.fill_between(x_dense, p(x_dense), y_dense, where=~mask, color='crimson', alpha=.3)

plt.show()

resulting plot

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...