Маски
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](https://i.stack.imgur.com/k8uSI.png)