2017-01-15 3 views
0

Ich habe Daten in einem Pandas DataFrame, und ich möchte ein interaktives Boxplot erstellen, mit dem ich die Anzahl der Tage auswählen kann, während ein Boxplot für die Werte in jeder der Kategorien in der Spalte ‚Kategorie‘Interaktive Boxplot mit Pandas und Jupyter Notebook

Dies ist, was mein Code/Daten sehen wie bisher:

import numpy as np 
import pandas as pd 

categories=('A','B','C') 

data = { 
      'days':  np.random.randint(120, size=100), 
      'category': np.random.choice(categories, 100), 
      'value':  100.0 * np.random.random_sample(100) 
     } 

df = pd.DataFrame(data) 

print(df) 

    category days  value 
0   A  4 77.383981 
1   A 31 63.011934 
2   A  5 1.165061 
3   C 59 23.588979 
4   A 57 14.906734 
5   C 106 33.366634 
6   A 29 90.658570 
7   B 25 16.137490 
8   A 118 34.526302 
9   C 76 4.111797 
10  A 11 30.195917 
..  ... ...  ... 
90  A 64 37.529774 
91  A 76 3.771360 
92  C 112 93.948775 
93  C 14 34.855189 
94  B 64 83.106007 
95  A 10 78.346319 
96  B 86 66.645889 
97  A 46 12.969012 
98  C 29 57.925427 
99  A 59 34.526146 

[100 rows x 3 columns] 

ich mag einen boxplot des Wertes für jede der Kategorien erstellen (für eine ausgewählte/angegebene Anzahl von Tagen), wobei die verschiedenen Kategorien entlang der X-Achse aufgetragen sind.

Wie mache ich das mit Pandas (oder Matplotlib)?

+0

(1) Können Sie gehen mehr in Detail was "interaktives Plot in Jupiter" bedeuten würde? Wie ich es sehe, ist Jupyter bereits ziemlich interaktiv, so dass das Aufrufen einer Zelle mit einem neuen Wert eine andere Handlung erzeugt. (2) Was ist die Anzahl der Tage? Ein einzelner Wert wie '42'? Wie würde ich die Anzahl der Tage auswählen? – ImportanceOfBeingErnest

+0

@ImportanceOfBeingErnest: (1) Ich stieß zuerst auf dieses Feature in Jupyter, indem ich dieses Video anschaute: https://www.youtube.com/watch?v=ZrRpN_IrcBA (Konzept wurde um die 24:50 Uhr eingeführt). (2) Anzahl der Tage ist eine ganze Zahl. Mit interaktiven Widgets können Sie den Wert aus einer Dropdown-Box auswählen. –

+0

Das wäre eine Information gewesen, die man in die Frage einbeziehen könnte. Siehe aktualisierte Antwort zur Implementierung dieser Dropdown-Box. – ImportanceOfBeingErnest

Antwort

2

Sie können den Datenrahmen einfach durch die Anzahl der Tage filtern und dann den entsprechenden Boxplot plotten.

numer_of_days = 42 
df_filtered= df.loc[df['days'] < numer_of_days] # use operators like ==, >=, <, etc. 
df_filtered[["category", "value"]].boxplot(by="category", return_type='axes') 

enter image description here


Um ein Drop-Down-Feld zu erhalten, können Sie die ipywidgets.interact() Funktion verwenden, zu denen Sie eine Funktion, die den Datenrahmen für diesen speziellen Tag Plots. (Im Folgenden beschränkt ich die Anzahl der Tage bis 12, so dass ein Drop-Down-Sinn macht eigentlich aus diejenigen, die einen Tag für die Auswahl.)

import numpy as np 
import pandas as pd 
from ipywidgets import interact 
%matplotlib notebook 

categories=('A','B','C') 

data = { 
      'days':  np.random.randint(12, size=100), 
      'category': np.random.choice(categories, 100), 
      'value':  100.0 * np.random.random_sample(100) 
     } 

df = pd.DataFrame(data) 

def select_days(number_of_days): 
    df_filtered= df.loc[df['days'] == int(number_of_days)] 
    ax = df_filtered[["category", "value"]].boxplot(by="category", return_type='axes') 
    ax["value"].set_title("Day " + number_of_days) 
    print df_filtered 

days = [str(day) for day in np.arange(12)] 

interact(select_days, number_of_days=days) 

enter image description here