Hinweise und Anmerkungen zu Jupyter Notebooks

(c) 2017/2018 Hochschule Augsburg - Fakultät für Informatik - Prof.Dr.Nik Klever

Hinweise und Anmerkungen zu Jupyter Notebooks

(c) 2016/2017 Prof.Dr.Nik Klever - Fakultät für Informatik - Hochschule Augsburg

Zellenstruktur

Jupyter Notebook ist - analog wie IPython - in einer Zellenstruktur aufgebaut. Es gibt im wesentlichen zwei Arten von Zellen:

  • Markdown (HTML) bzw. Text-Zellen
  • Code-Zellen, deren Code dem Kernel entsprechen muss

Markdown (HTML) Zellen

Die Markdown-Syntax von Jupyter Notebook ist identisch mit der Markdown Syntax von GitHub

Der hier folgende Inhalt einer Markdown Zelle

### Unterkapitel Überschrift

einfacher Text in einem **Paragraphen**

    Blocktext

#### Abschnitt Überschrift

##### geordnete Listen

1. Top 1
1. Top 2
1. Top 3

bzw.

##### ungeordnete Listen

- Listenpunkt 1
- Listenpunkt 2
- Listenpunkt 3

wird folgendermaßen umgesetzt:

Unterkapitel Überschrift

einfacher Text in einem Paragraphen

Blocktext

Abschnitt Überschrift

geordnete Listen
  1. Top 1
  2. Top 2
  3. Top 3

bzw.

ungeordnete Listen
  • Listenpunkt 1
  • Listenpunkt 2
  • Listenpunkt 3

Mathematische Formeln mittels LaTeX

Die folgende Zeile im Markdown-Format

Dies ist eine Formel $\frac{sin(x)}{cos(x)}$ im Textfluß, die in einfachen $ eingeschlossen wird.

wird folgendermaßen angezeigt:

Dies ist eine Formel $\frac{sin(x)}{cos(x)}$ im Textfluß, die in einfachen $ eingeschlossen wird.

Weitere Beispiele sind die folgende Zeilen im Markdown-Format

$\int_a^b{ax^2}$

oder

$e^x=\sum_{i=0}^\infty \frac{1}{i!}x^i$

die dann folgendermaßen angezeigt werden:

$\int_a^b{ax^2}$

oder

$e^x=\sum_{i=0}^\infty \frac{1}{i!}x^i$

In den folgenden Zeilen im Markdown-Format werden die LaTeX-Befehle in doppelten $ eingeschlossen:

$$\int_a^b{f(x)dx}$$

$$\lim_{a\to\infty}{ax^2}$$

$$\sum_{i=1}^N i^2$$

und werden deshalb alleinstehend in einer Zeile mittig angezeigt:

$$\int_a^b{f(x)dx}$$$$\lim_{a\to\infty}{ax^2}$$$$\sum_{i=1}^N i^2$$

Ein genereller Überblick über LaTeX Befehle findet sich in dem Hilfe-Text von Wikipedia und eine gute Übersicht über die Einbindung von Latex in Jupyter Notebooks findet sich im LaTeX Primer von Udacity.

Einbindung von Bildern und Grafik

Bilder können, wenn sie auf dem jeweiligen Ordner des Jupyter Notebooks vorhanden sind, einfach über den HTML-Markup

<img src="NameDerBildDatei">

eingebunden werden. Alternativ geht dies auch über die Markdown-Syntax

![Titel des Bildes](NameDerBildDatei)

Wenn die Bilder in entsprechenden anderen Ordner vorhanden sind, muss der entsprechende relative Pfad angegeben werden.

SVG (Scalable Vector Graphic)

entweder über die Einbindung eines Image-Links in einer Markdown-Zelle oder in einer Code-Zelle z.B. mit dem Magic-Befehl %%SVG

In [1]:
%%SVG
<svg width="140" height="170" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Code Source from http://commons.oreilly.com/wiki/index.php/SVG_Essentials/Getting_Started#Text -->
<title>Cat</title>
<desc>Stick Figure of a Cat</desc>

<circle cx="70" cy="95" r="50" style="stroke: black; fill: none;"/>
<circle cx="55" cy="80" r="5" stroke="black" fill="#339933"/>
<circle cx="85" cy="80" r="5" stroke="black" fill="#339933"/>
<g id="whiskers">
   <line x1="75" y1="95" x2="135" y2="85" style="stroke: black;"/>
   <line x1="75" y1="95" x2="135" y2="105" style="stroke: black;"/>
</g>
<use xlink:href="#whiskers" transform="scale(-1 1) translate(-140 0)"/>
<!-- ears -->
<polyline points="108 62,  90 10,  70 45,  50, 10,  32, 62"
   style="stroke: black; fill: none;" />
<!-- mouth -->
<polyline points="35 110, 45 120, 95 120, 105, 110"
    style="stroke: black; fill: none;" />

<!-- nose -->
<path d="M 75 90 L 65 90 A 5 10 0  0 0 75 90"
   style="stroke: black; fill: #ffcccc"/>
<text x="60" y="165" style="font-family: sans-serif; font-size: 14pt;
   stroke: none; fill: black;">Cat</text>
</svg>
Cat Stick Figure of a Cat Cat

Code Zellen

hier: Python

In [2]:
a=2
b=3
a+b
Out[2]:
5

Autovervollständigung

Wenn mit einem Buchstaben in einer Code-Zelle begonnen wird, kann mittels der Tab-Taste die Autovervollständigung aktiviert werden und die mit diesem Buchstaben beginnenden Variablen und Objekte können ausgewählt werden:

In [3]:
dies_ist_ein_langer_variablenname = 18
In [4]:
dies_ist_ein_langer_variablenname
Out[4]:
18

Autovervollständigung

Neue Code- oder Markdown Zelle

Sie können jederzeit neue Code- als auch Markdown-Zellen einfügen und/oder auch vorhergehende Zellen -über einen Doppelklick - nochmal bearbeiten und danach ausführen.

Typisches Problem mit Code-Zellen in Jupyter Notebook

Jupyter Notebook besitzt eine Zellenstruktur mit im wesentlichen zwei Typen von Zellen, Code-Zellen und Markdown-Zellen.

Indizierung der Code-Zellen

Beim Erzeugen eines neuen Notebooks wird default-mäßig eine Code-Zelle erzeugt. Code-Zellen wie hier in dem bereits bekannten Beispiel

Neues Notebook

besitzen links neben der eigentlichen Zelle noch eine Markierung In [ ]

Was bedeutet diese Markierung ?

In steht für Input und die leeren eckigen Klammern stehen dafür, dass diese Code-Zelle noch nicht ausgeführt worden ist.

Index-Ziffern als Indikator für die Reihenfolge der Ausführung

In dem zweiten Beispiel

Beispiel 2

sind jetzt in den eckigen Klammern vor den Code-Zellen entsprechende Index-Ziffern aufgeführt.

Diese Index-Ziffern werden durch die Reihenfolge der Ausführung der Code-Zellen festgelegt.

Ein [*] in den eckigen Klammern bedeutet, dass die Ausführung der entsprechenden Code-Zelle noch nicht beendet ist - z.B. eine Eingabe erwartet wird, die Ausführung sehr lange dauert oder sogar in einer Endlosschleife hängt.

Historie des obigen Beispiels

Hier ist die Entwicklung des Notebooks von dem obigen Beispiel historisch aufgeführt:

  1. Als erste Zelle wurde In[1] und
  2. als zweite Zelle In[2] ausgeführt, die Ausgabe des Print-Befehls (2) erscheint dann außerhalb der Zelle,
  3. anschließend wurde dann In[3] ausgeführt, die Ausgabe dieser Zelle wurde ebenfalls an die Zelle angehängt und mit der Markierung Out[3] versehen, dem Output zur entsprechenden Zelle. Im Gegensatz zur Ausgabe der zweiten Zelle, die eine Ausgabe auf die Standard-Ausgabe (sys.stdout) ist, ist diese Ausgabe der Rückgabewert des entsprechenden letzten Ausdrucks.
  4. Anschliessend wurde eine neue Zelle zwischen der ersten und zweiten Zelle eingefügt und danach auch ausgeführt als In[4], die Ausgabe erhält daher Out[4].
  5. Danach wurde eine weitere neue Zelle zwischen der ursprünglichen zweiten Zelle und der ursprünglichen dritten Zelle eingefügt und c = 5 wurde eingegeben, die Zelle wurde jedoch nicht ausgeführt - deswegen sind die eckigen Klammern in der Markierung In[ ] leer.
  6. Anschliessend wurde eine weitere neue Zelle nach der ursprünglichen dritten Zelle angehängt und dort wurde c eingegeben und die Zelle wurde anschliessend ausgeführt, da jedoch der Ausdruck c = 5 zwar zwei Zellen vorher als Text in die Zelle eingegeben wurde, aber die Zelle nicht ausgeführt wurde, ist die Variable c auch nicht definiert und es wird die Fehlermeldung NameError: name 'c' is not defined in der Standard-Ausgabe ausgegeben.

Bedeutung von [*] als Index

[*] als Index bedeutet, dass die entsprechende Code-Zelle entweder

  • eine Eingabe erwartet (z.B. über die Funktion input('Bitte geben sie ein:') (s.u.)
  • in einer Endlosschleife läuft (s.u.)
  • oder das Jupyter Notebook sich sonst irgendwie aufgehängt hat

Abhilfe kann über den Menüpunkt Kernel in der Menüzeile des Jupyter Notebooks und dem betreffenden Untermenüpunkt Interrupt (führt dann in der Regel zu einem KeyboardInterrupt) oder sogar Restart (wenn der Interrupt nicht erfolgreich ist) erfolgen. Bei einem Restart werden jedoch alle bisher vorhandenen Variablen und Objekte, die in den Code-Zellen bis zum Restart ausgeführt worden sind, gelöscht und es müssen alle Code-Zellen wieder neu ausgeführt werden.

Warten auf eine Eingabe

In [5]:
x = input("Bitte geben sie eine Zahl ein:")
Bitte geben sie eine Zahl ein:45
In [6]:
x
Out[6]:
'45'

Endlosschleife

In [7]:
while True:
    pass
---------------------------------------------------------------------------
KeyboardInterrupt                         Traceback (most recent call last)
<ipython-input-7-cccdd40a5a4c> in <module>()
      1 while True:
----> 2     pass

KeyboardInterrupt: 

Pygal für eine grafische Ausgabe

Die Dokumentation zu Pygal finden sie auf der entsprechenden Webseite von pygal

Pygal ist nicht in der Standardbibliothek von Python vertreten und muss daher vorher installiert werden. Die Installation erfolgt in einem Terminalfenster (unter Linux oder Mac) bzw. in einem Anaconda Prompt Fenster (unter Windows) mit dem folgenden Befehl:

pip install pygal

In dem untenstehenden Beispiel finden sie die grafische Ausgabe der quadratischen Funktion

$$f(x) = 4x^2+2x+2$$

im Bereich [-5,6[

In [8]:
import pygal

def f(x):
    return 4*x**2+2*x+2

tabelle = []
for x in range(-5,6):
    tabelle.append((x,f(x)))

print(tabelle)

xy = pygal.XY()
xy.add('f(x)=4x^2+2x+2',tabelle)

from IPython.display import SVG
SVG(xy.render())
[(-5, 92), (-4, 58), (-3, 32), (-2, 14), (-1, 4), (0, 2), (1, 8), (2, 22), (3, 44), (4, 74), (5, 112)]
Out[8]:
Pygal101020203030404050506060707080809090100100110110-5-5-4-4-3-3-2-2-1-1001122334455-5: 9211.392307692307702104.79020979020981-4: 5868.35384615384616265.27972027972027-3: 32125.3153846153846388.006993006993-2: 14182.27692307692308472.97202797202794-1: 4239.23846153846154520.17482517482520: 2296.2529.61538461538461: 8353.16153846153844501.29370629370632: 22410.1230769230769435.20979020979023: 44467.0846153846153331.36363636363644: 74524.0461538461537189.755244755244755: 112581.007692307692210.384615384615358f(x)=4x^2+2x+2