Diagtwig de caja para datos continuos en Python

Tengo un archivo csv con 2 columnas:

Como hay un registro de casi 50k, me gustaría dividir la columna col1 (marca de fecha y hora) en meses o semanas y luego aplicar el diagtwig de caja en la marca de hora de wrt de datos de calor. Lo intenté en R, lleva mucho tiempo. Necesito ayuda para hacer en Python. Creo que necesito usar seaborn.boxplot .

Por favor guia

Agrupar por frecuencia y luego trazar grupos

Primero lea sus datos csv en un DataFrame de Pandas

 import numpy as np import Pandas as pd from matplotlib import pyplot as plt # assumes NO header line in csv df = pd.read_csv('\file\path', names=['time','temp'], parse_dates=[0]) 

Usaré algunos datos falsos, 30 días de muestras por hora.

 heat = np.random.random(24*30) * 100 dates = pd.date_range('1/1/2011', periods=24*30, freq='H') df = pd.DataFrame({'time':dates,'temp':heat}) 

Establecer las marcas de tiempo como el índice de DataFrame.

 df = df.set_index('time') 

Ahora agrupa por el período que quieras, siete días para este ejemplo

 gb = df.groupby(pd.Grouper(freq='7D')) 

Ahora puedes trazar cada grupo por separado

 for g, week in gb2: #week.plot() week.boxplot() plt.title(f'Week Of {g.date()}') plt.show() plt.close() 

Y … no me di cuenta de que podías hacer esto pero está muy bien

 ax = gb.boxplot(subplots=False) plt.setp(ax.xaxis.get_ticklabels(),rotation=30) plt.show() plt.close() 

Temps semanales


 heat = np.random.random(24*300) * 100 dates = pd.date_range('1/1/2011', periods=24*300, freq='H') df = pd.DataFrame({'time':dates,'temp':heat}) df = df.set_index('time') 

Para particionar los datos en cinco períodos de tiempo, obtenga cuadros de caja semanales de cada uno:

Determine el tiempo total; dividir por cinco; crear un alias de frecuencia; entonces groupby

 dt = df.index[-1] - df.index[0] dt = dt/5 alias = f'{dt.total_seconds()}S' gb = df.groupby(pd.Grouper(freq=alias)) 

Cada grupo es un DataFrame para iterar sobre los grupos; Crea grupos semanales a partir de cada uno y dibuja un cuadro.

 for g,d_frame in gb: gb_tmp = d_frame.groupby(pd.Grouper(freq='7D')) ax = gb_tmp.boxplot(subplots=False) plt.setp(ax.xaxis.get_ticklabels(),rotation=90) plt.show() plt.close() 

Podría haber una mejor manera de hacerlo, si es así, lo publicaré o tal vez alguien se llene gratis para editarlo. Parece que esto podría llevar a que el último grupo no tenga un conjunto completo de datos. …

Si sabe que sus datos son periódicos, solo puede usar cortes para dividirlos.

 n = len(df) // 5 for tmp_df in (df[i:i+n] for i in range(0, len(df), n)): gb_tmp = tmp_df.groupby(pd.Grouper(freq='7D')) ax = gb_tmp.boxplot(subplots=False) plt.setp(ax.xaxis.get_ticklabels(),rotation=90) plt.show() plt.close() 

Alias ​​de frecuencia
pandas.read_csv ()
pandas.grupador ()