Вот пример тренда, который я пытался сгладить с помощью экспоненциального сглаживания:
import numpy as np
import matplotlib.pyplot as plt
y1 = np.random.randn(100)
y2 = np.random.randn(100)+2
y3 = 2*np.random.randn(100)+2
y4 = np.random.randn(100)
y = np.append(np.append(np.append(y1,y2),y3),y4)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(y)
def exp_smoothing(y, alpha):
s=np.zeros(len(y))
s[0] = y[0]
for i in range(1,len(y)):
s[i] = alpha*y[i]+(1-alpha)*s[i-1]
return np.array(s)
ax.plot(exp_smoothing(y,.05), c='r')
plt.show()
Это дает следующий результат:
Красная линия дает хорошее представление об изменении среднего, но не об изменении дисперсии.
Я хотел бы изменить толщину линии, чтобы более толстые части указывали на участки исходного тренда с высокой дисперсией, а более тонкие участки указывали на участки исходного тренда с низкой дисперсией.
Единственный способ, которым я могу думать об этом, — построить не одну линию, а множество более мелких линий, с шириной каждого набора, используя set_lw
(см. документация).
Есть ли лучший способ сделать это?
fill_between()
. - person SergiyKolesnikov   schedule 15.03.2018