Используете методы передискретизации и прокрутки python одновременно? - PullRequest
0 голосов
/ 28 мая 2020

Вопрос: Можно ли pandas методы .resample и .rolling одновременно использовать в одном фрейме данных или их нужно использовать отдельно и объединять, как показано здесь?

Цель: показать среднесуточное значение и две планки сигма-ошибок.
Ограничение №1: сигма - это скользящее стандартное отклонение от данных повторной выборки.

(записано в блокноте jupyter с использованием python версии 3.7.6)

Сначала получите импорт:

from IPython.display import display
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.lines as mlines
%matplotlib inline #for Jupyter notebook

Получите фрейм данных:

d = '{"1565339252694":211,"1565643283246":713,"1565732434460":826,"1564937619508":1088,"1566004913874":103,"1564845723595":157,"1566039033056":488,"1565120486228":813,"1565574258586":202,"1565597131739":320,"1565567861777":637,"1564927455741":457,"1564898426897":548,"1565921741303":434,"1565531879865":266,"1565622786709":516,"1565635341159":214,"1565906602842":110,"1565970909040":201,"1565829166816":599,"1565060457762":77,"1564723924978":196,"1564845940192":72,"1564868392706":237,"1565031449064":77,"1564760407639":410,"1565129708152":236,"1564692064751":228,"1565033309282":178,"1565232485626":122,"1565563337502":74,"1564763021871":148,"1564844839631":37,"1565107302938":196,"1565894905111":656,"1565481371394":1090,"1565978566706":170,"1565550849979":230,"1565804397817":154,"1565869844078":282,"1566055721680":517,"1565538904192":1127,"1565704625452":76,"1564773598175":199,"1565898684399":355,"1564869481686":1027,"1565838802729":350,"1566009264441":608,"1564672410748":1281,"1565647319981":467,"1565476924567":236,"1564957011436":414,"1565228002163":266,"1564802501037":1059,"1565917090526":297,"1566000693222":522,"1566066829974":167,"1565396646508":655,"1564671968179":631,"1565134764693":786,"1564674654133":478,"1565062624812":1305,"1566076103735":273,"1565362228228":486,"1564752840472":550,"1564667142150":109,"1564949279630":132,"1565415508061":207,"1564877657859":169,"1565472231224":189,"1564794002291":179,"1566012793776":563,"1565712486541":578,"1564922490307":171,"1565580297164":184,"1565210388048":152,"1565361829463":98,"1565806732472":904,"1565875676674":307,"1565357260033":1077,"1566007825333":271,"1565621348663":563,"1565318821648":301,"1564786697362":140,"1565148197423":1311,"1565185754140":932,"1565475621674":286,"1566059034024":492,"1565555652756":599,"1565093573944":559,"1565980189150":277,"1565104804780":284,"1564710166464":566,"1564900156129":43,"1564759728117":611,"1565142499190":1196,"1565791325717":812,"1565519094946":583,"1565583325239":215,"1564686458856":180,"1565539243475":488,"1565849298532":261,"1565048158008":260,"1564960068982":118,"1564961536557":1249,"1565989908936":525,"1565895317480":468,"1564681826210":1055,"1564742874921":826,"1565450417680":967,"1564625654952":435,"1565013479619":273,"1564868193431":265,"1565307280504":608,"1565144930178":964,"1565239567168":525,"1565712403948":514,"1565580805354":513,"1566061231203":1301,"1565790491531":229,"1565980093126":961,"1566043901010":232,"1565559108935":1088,"1565798899666":706,"1565815173820":1208,"1564769014866":718,"1565966266683":532,"1565133638785":580,"1564689369459":640,"1564852380626":255,"1565977075970":392,"1565885311611":1274,"1565136961018":254,"1565898199709":1236,"1565103006254":452,"1564672458546":539,"1564938844948":1070,"1565373397164":691,"1564760556150":864,"1565201328619":902,"1565626067541":611,"1565133752648":410,"1566014969736":119,"1565893831919":83,"1564755238758":482,"1565490486843":895,"1565118025727":697,"1565212179131":1044,"1565839722175":1088,"1565836582333":505,"1564660415936":874,"1564961119121":1974,"1565046620145":378,"1565720074856":831,"1565102870302":468,"1565666664645":616,"1565622955981":1095,"1565888426496":901,"1565133750200":689,"1564799647204":1007,"1564759975496":678,"1564774484583":1137,"1564936935789":599,"1565144697922":579,"1565798276078":451,"1564963127208":1003,"1566066157746":1078,"1565321967517":168,"1565107738886":608,"1564852314972":974,"1564951672811":599,"1565795240000":666,"1564790720002":584,"1564682536221":1075,"1565844619665":1070,"1565877212731":387,"1564762690816":350,"1564768325219":813,"1564766588889":529,"1565635469837":577,"1565991291926":275,"1566051113590":415,"1564861863382":516,"1565227522872":1331,"1566022317204":814,"1565838363267":656,"1564667986151":874,"1565814463888":887,"1565619791783":927}'
df = pd.read_json(d, orient='index')
df.columns = ['value']
df = df.sort_index()

ОБРАТИТЕ ВНИМАНИЕ В СЛЕДУЮЩИХ ДВУХ ШАГАХ НЕЗАВИСИМОГО ИСПОЛЬЗОВАНИЯ ПЕРЕДАЧИ И ПРОКАТКИ. ВОПРОС ЗАДАВАЕТСЯ, ЕСТЬ ЛИ СПОСОБ СОВМЕСТИТЬ ЭТИ ШАГИ.

Далее пересчет , чтобы получить среднесуточное значение:

df_resample = df.resample("D").agg({'value':['median','mean','count','std','skew',pd.DataFrame.kurt]}, axis=1)
df_resample.columns = ['daily_median','daily_mean','daily_count','daily_std','daily_skew','daily_kurtosis']
df_resample.index = df_resample.index.rename('date')
display(df_resample)

Затем вычислите 7 дней прокатка стандартное отклонение:

df_rolling = df.rolling("7D").agg({'value':['median','mean','std']}, axis=1)
df_rolling.columns=['weekly_median', 'weekly_mean', 'weekly_std']
df_rolling.loc[:,'date'] = df_rolling.index.date.astype(str)

Для скользящих значений сохраняется последнее дневное значение, соответствующее размеру df_resample. ПРИМЕЧАНИЕ: это соответствует df_resample, только если у всех дней есть значение.

df_rolling = df_rolling.drop_duplicates(subset=['date'], keep='last')
df_rolling = df_rolling.set_index('date')
display(df_rolling)

Вот предлагаемый метод использования повторной выборки с прокруткой (ie. Объединить фреймы данных):

df_merge = df_resample.merge(df_rolling, left_index=True, right_index=True)
display(df_merge)

Наконец, среднесуточное значение наносится на график с планками ошибок (с использованием 2 * 7-дневного скользящего стандартного отклонения):

plt.figure(figsize=(15,5))
daily_mean = df_merge.daily_mean
weekly_mean = df_merge.weekly_mean
weekly_std = df_merge.weekly_std

# plots
p1 = plt.plot(daily_mean, color='k')
p2 = plt.fill_between(weekly_std.index, weekly_mean-2*weekly_std, weekly_mean+2*weekly_std, color='b', alpha=0.2)

# lenged
_line = mlines.Line2D([], [], color='black', marker='_', markersize=15, label='daily mean')
plt.legend(handles = [_line, p2], labels = ['daily mean','weekly std'], loc="upper left")

# format
plt.title("Daily Mean Value", fontdict = {'fontsize' : 20})
plt.xticks(rotation=90)

plt.show();

enter image description here

Ссылки :

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