Ga naar hoofdinhoud

Datavisualisatie met Bokeh-tutorial: Data­structuren plotten

Leer basisvisualisaties van verschillende datastructuren met Bokeh.
· 6 min lezen

Verken met AI

In onze eerste tutorial Datavisualisatie met Bokeh leerde je hoe je visualisaties vanaf nul opbouwt met glyphs. Nu kun je dit concept uitbreiden en grafieken bouwen vanuit verschillende datastructuren, zoals arrays en dataframes. In deze tutorial leer je hoe je data plot met NumPy-arrays, dataframes in Pandas en ColumnDataSource met Bokeh. De ColumnDataSource is de kern van Bokeh en maakt het mogelijk om data te delen over meerdere grafieken en widgets.

Bokeh-grafieken van NumPy-arrays

Lijndiagrammen maken van NumPy-arrays

# Import packages
import numpy as np
import random
from bokeh.io import output_file, show
from bokeh.plotting import figure

# Create an array
x_array = np.array([10,20,30,40,50,60])
y_array = np.array([50,60,70,80,90,100])

# Create a line plot
plot = figure()
plot.line(x_array, y_array)

# Output plot
show(plot)

Spreidingsdiagrammen maken van NumPy-arrays

# Import packages
import numpy as np
import random
from bokeh.io import output_file, show
from bokeh.plotting import figure

# Create arrays
x_arr = np.array([10,11,12,13,14,15,16])
y_arr = np.array([17,18,19,20,21,22,23])

# Create plot
plot = figure(title = "Scatter plot", x_axis_label = "Label name of x axis", y_axis_label ="Label name of y axis")
plot.circle(x_arr,y_arr, size = 30, alpha = 0.5)

# show plot
show(plot)

Dit levert de volgende grafiek op:

Grafieken maken met Pandas-dataframes

Lijnen plotten met Pandas-dataframes

De data in dit voorbeeld is afkomstig van Kaggle. De dataset bevat alle aandelen die in de S&P 500-index zijn opgenomen voor vijf jaar tot en met december 2018. Het bestand bevat zeven kolommen:

  • Date - dag van de week, datum in formaat jj-mm-dd
  • Open - openingskoers van het aandeel
  • High - hoogste koers van de dag
  • Low - laagste koers van de dag
  • Close - slotkoers van de dag
  • Volume - verhandeld volume op de dag
  • Name - tickersymbool van het aandeel

We willen de trend van het aandeel van Google over de periode van vijf jaar zien. Eerst laden we de data met Pandas en bekijken daarna de eerste vijf rijen van het Pandas-dataframe.

# Import packages
import pandas as pd
# Load data
df = pd.read_csv('all_stocks_5yr.csv')
df.head()
# Focus on Google's stock
df_goog = df[df['Name'] == 'GOOG']
# Convert date column to a time series
df_goog['date'] = pd.to_datetime(df_goog['date'])

plot = figure(title= "Pandas Line Plot", x_axis_type = 'datetime', x_axis_label = 'date', y_axis_label= 'Prices')
plot.line(x = df_goog['date'], y = df_goog['high'])

# Output plot
show(plot)

In de grafiek was het nodig om de datums om te zetten naar datetime om de datums langs de x-as weer te geven. Daarnaast is de line-functie (glyph in Bokeh) gebruikt om een tijdreeksplot te maken van Google’s hoogste koersen.

Een spreidingsdiagram maken vanuit een Pandas-dataframe

In deze sectie gebruiken we de open-source S&P 500-aandelengegevens die beschikbaar zijn op Kaggle. In dit voorbeeld willen we de correlatie zien tussen de aandelenkoersen van Google en die van Apple. Je kunt meer leren over correlatie hier.

# Import required packages
# Import packages
import pandas as pd
from bokeh.io import output_file, show
from bokeh.plotting import figure

# Load data
df = pd.read_csv('all_stocks_5yr.csv')

# Select Google and Apple stock
df_goog = df[df['Name'] == 'GOOG']
df_apple = df[df['Name'] == 'AAPL']

# Select only 'date' and 'high' columns for Google and Apple
df_goog = df_goog[['date','high']]
df_apple = df_apple[['date','high']]
# Rename 'high' column to 'high_goog' and 'high_apple'
df_goog.rename(columns={'high': 'high_goog'}, inplace=True)
df_apple.rename(columns={'high': 'high_apple'}, inplace=True)

df_merged = pd.merge(df_goog, df_apple, how='inner', on='date')
# See the first five rows
df_merged.head(5)

Door te mergen zorg je ervoor dat de dagkoersen op datum bij elkaar horen. Dit voorkomt het probleem dat je koersen van verschillende datums met elkaar correleert, wat tot onjuiste statistische conclusies zou leiden.

# Create scatter plot
plot = figure(title= "Pandas Scatter Plot", x_axis_label = "Apple high prices", y_axis_label= "Google high prices")
plot.circle(x = df_merged['high_apple'], y = df_merged['high_goog'],color = 'red', size = 10, alpha = 0.8)

# Output the plot
show(plot)

De cirkels geven het verband weer tussen de hoogste koersen van Apple en Google. Er is een algemene positieve correlatie tussen de aandelenkoersen van Google en Apple.

Bokeh-grafieken maken met ColumnDataSource

Het doel van ColumnDataSource is dat je verschillende grafieken kunt maken met dezelfde data. Kort gezegd kun je er een basis van data mee opbouwen die je in meerdere grafieken en analyses kunt hergebruiken. Dit bespaart je tijd, omdat je data in Jupyter Notebook niet telkens opnieuw hoeft te laden.

De ColumnDataSource lijkt op een Python-dictionary, waarbij de waarde van de data in een kolom een sleutelstringnaam heeft voor precies die kolom.

Lijndiagrammen maken met ColumnDataSource

# Import packages
from bokeh.io import output_file, show
from bokeh.plotting import figure, ColumnDataSource

# Create the ColumnDataSource object
df_goog['date'] = pd.to_datetime(df_goog['date'])
data = ColumnDataSource(df_goog)

# Create time series plot
plot = figure(x_axis_type='datetime',
              title='GOOG high prices ts plot',
             x_axis_label = "Date",
              y_axis_label = "Prices in $")
plot.line(x='date', y = 'high_goog', source = data, color = 'green')
show(plot)

De grafiek laat zien hoe Google’s hoogste koersen zich over een periode van 5 jaar hebben ontwikkeld, met de lijn die elk koerspunt van het aandeel aangeeft.

Om deze grafiek te maken, hebben we het volledige Google-dataframe doorgegeven aan de functie ColumnDataSource en opgeslagen als een variabele met de naam data.

Vervolgens hebben we met het argument source deze data aan de plotfunctie doorgegeven. Hierdoor kun je bij het maken van de grafiek de kolomnamen rechtstreeks gebruiken in plaats van het dataframe steeds opnieuw aan te roepen.

Tot slot hebben we de line-functie gebruikt om de groene lijn te genereren die de datapunten weergeeft.

Spreidingsdiagrammen maken met ColumnDataSource

In deze code hebben we het volledige Google-dataframe doorgegeven aan de ColumnDataSource (zoals in het lijndiagramvoorbeeld). Het dataframe wordt in de ColumnDataSource opgeslagen als een variabele met de naam data. We maken eerst het lijndiagram door de kolomnamen direct aan te roepen. Tot slot hebben we de diamond-functie gebruikt om de rode ruiten te genereren die de afzonderlijke datapunten weergeven.

# Import packages
from bokeh.io import output_file, show
from bokeh.plotting import figure, ColumnDataSource

# Create the ColumnDataSource object
df_goog['date'] = pd.to_datetime(df_goog['date'])
data = ColumnDataSource(df_goog)

# Create time series plot
plot = figure(x_axis_type='datetime',
              title='GOOG high prices ts plot',
             x_axis_label = "Date",
              y_axis_label = "Prices in $")
plot.line(x='date', y = 'high_goog', source = data, color = 'green')
plot.diamond(x='date', y = 'high_goog', source = data, color = 'red')
show(plot)

De grafiek toont de ontwikkeling van het aandeel van Google over een periode van 5 jaar, met de rode ruiten die elk koerspunt van het aandeel aangeven.

Conclusie

Deze tutorial introduceerde de meest voorkomende datastructuren die je waarschijnlijk in Python tegenkomt en hoe je ze kunt gebruiken om je data tot leven te brengen. Hoewel Bokeh niet je enige optie is voor visualisatie in Python, onderscheidt het zich van Matplotlib of Seaborn door het gebruiksgemak en de interactieve mogelijkheden. In onze volgende tutorial ga je praktisch aan de slag met layouts om effectieve en interactieve visualisaties te maken. Wil je dieper duiken in alle datavisualisatiemogelijkheden die Bokeh biedt, bekijk dan de cursus Interactive Data Visualization with Bokeh van DataCamp.

Onderwerpen

Gerelateerd