2014-10-22 16 views
8

Jak mogę utworzyć boxplot dla serii czasowej pandy, w której mam pudełko na każdy dzień?Time-series boxplot w pandach

Przykładowy zestaw danych danych godzinowych, gdzie jedna skrzynka powinna składać się z 24 wartości:

import pandas as pd 
n = 480 
ts = pd.Series(randn(n), 
       index=pd.date_range(start="2014-02-01", 
            periods=n, 
            freq="H")) 
ts.plot() 

Zdaję sobie sprawę, że mogę zrobić dodatkową kolumnę na dzień, ale chciałbym mieć odpowiednie oznakowanie osi X i funkcja x-limit (jak w ts.plot()), więc możliwość pracy z indeksem daty i godziny byłaby świetna.

Jest podobne pytanie dla R/ggplot2 here, jeśli pomaga wyjaśnić, czego chcę.

+1

nie jest możliwe lepsze rozwiązanie tego [o] (https://stackoverflow.com/questions/17194581/best-way-to-generate-day-of-week-boxplots-from-a- pandas-timeseries), który używa tylko Pand, jego funkcji '.boxplot()' i '.pivot()' i nie wymaga Seaborn – cardamom

Odpowiedz

6

Jeśli jest to opcja dla Ciebie, polecam użycie Seaborn, która jest opakowaniem dla Matplotlib. Możesz zrobić to sam, zapętlając grupy ze swoich gier czasowych, ale to znacznie więcej pracy.

import pandas as pd 
import numpy as np 
import seaborn 
import matplotlib.pyplot as plt 

n = 480 
ts = pd.Series(np.random.randn(n), index=pd.date_range(start="2014-02-01", periods=n, freq="H")) 


fig, ax = plt.subplots(figsize=(12,5)) 
seaborn.boxplot(ts.index.dayofyear, ts, ax=ax) 

Co daje: enter image description here

Zauważ, że jestem przekazując day of year jako grouper do Seaborn, jeśli dane obejmuje wiele lat to nie będzie działać. Można następnie rozważyć coś takiego:

ts.index.to_series().apply(lambda x: x.strftime('%Y%m%d')) 

edycji, dla 3-godzinowy można wykorzystać jako panterka, ale działa tylko wtedy, gdy nie istnieją żadne minut lub mniej zdefiniowane. :

[(dt - datetime.timedelta(hours=int(dt.hour % 3))).strftime('%Y%m%d%H') for dt in ts.index] 
+0

Tak naprawdę używam seaborn mimo to, więc to zdecydowanie opcja. Dzięki!/edit: Czy jest jakiś sposób użycia tego dla dowolnych czasów, np. 3-godzinne boxy, 7-dniowe boxy itp.? –

+1

Tak, możesz przekazać cokolwiek do grupy Seaborns. Wyzwanie polega na zdefiniowaniu grup z indeksu Serii. Dodałem przykład dla 3-godzinnych okresów. Coś takiego mogło działać przez arbitralne okresy czasu. Niestety, nie jest to zbyt czytelne, możliwe że pewne uproszczenie jest możliwe dzięki użyciu 'Timegrouper 'Pandy. Otwarcie konkretnego pytania na temat grupy Seaborns może ci pomóc ci, którzy używają Seaborna, a ja nie. –

5

(mało rep komentować akceptowanego rozwiązania, więc dodanie odpowiedź zamiast.)

Przyjęty kod ma dwa małe błędy: (1) trzeba dodać numpy import i (2) nned do zamiany parametrów x i y w instrukcji boxplot. Poniżej przedstawiono przedstawiony wykres.

import numpy as np 
import pandas as pd 
import seaborn 
import matplotlib.pyplot as plt 

n = 480 
ts = pd.Series(np.random.randn(n), index=pd.date_range(start="2014-02-01", periods=n, freq="H")) 

fig, ax = plt.subplots(figsize=(12,5)) 
seaborn.boxplot(ts.index.dayofyear, ts, ax=ax) 
+0

Jesteś najlepszy! – zkytony

+0

Świetnie. Zmieniłem zaakceptowaną odpowiedź. –