Я пытался построить линию тренда с наложенной на нее точкой выброса. Выбросы либо выше верхней полосы, либо ниже нижней. Проблема в том, что когда я пытаюсь построить некоторые из наложенных выбросов, индекс будет работать неправильно и даст мне искаженное изображение.
Я пытался исправить это в течение нескольких часов и, наконец, заметил, что если я переключу порядок печати, это будет работать. Я не мог понять, что пошло не так, и хотел бы некоторые идеи! Спасибо!
Код, который работает:
ax = sp[sp.counts > sp.upper].counts.plot(marker='D',linestyle='none',label='increase')
sp.plot(ax=ax)
sp[sp.counts < sp.lower].counts.plot(marker='D',linestyle='none',label='decrease')
ax.legend(bbox_to_anchor=(1, 1))
Правильное изображение:
Код, который не:
ax = sp.plot()
sp[sp.counts > sp.upper].counts.plot(marker='D',ax=ax,linestyle='none',label='upper')
sp[sp.counts <= sp.lower].counts.plot(marker='D',linestyle='none',label='lower')
ax.legend(bbox_to_anchor=(1, 1))
Не работает Изображение:
И если я удалю sp[sp.counts <= sp.lower]
, он снова будет работать. (И у sp[sp.counts > sp.upper]
все хорошо!)
Вот другие способы, которыми я пытался исправить код выше и не работал:
- использовать matplotlib вместо построения панд
- используйте
fig, ax = plt.subplots()
для определения топора
- переключить порядок двух выпадающих участков
- используйте только один набор выбросов
sp[(sp.counts < sp.lower) | (sp.counts > sp.upper)]
, это на самом деле работает, но будет иметь только один цвет.
Вот структура данных:
sp.counts [sp.counts> sp.upper]
время
2015-11-01 6369
2015-11-08 6502
2015-11-22 6505
2015-12-06 6589
2015-12-13 6674
2016-09-25 6791
2016-11-20 7051
Имя: count, dtype: int64
sp [sp.counts
время
2015-05-31 5841
2015-12-27 5526
2016-11-27 6117
Имя: count, dtype: int64
sp.tail (5)
counts ave upper lower
время
2017-08-27 6956 6834.25 7083.758 6584.742
2017-09-03 6794 6828.30 7075.566 6581.034
2017-09-10 6694 6815,85 7063,873 6567,827
2017-09-17 6784 6810,35 7055,943 6564,757
2017-09-24 6889 6805,70 7040,911 6570,489