Code, Ergebnisse und Notizen in einem Dokument
Ein Jupyter-Notebook ist ein Dokument aus Zellen. Eine Codezelle enthält ausführbares Python; ihre Ausgabe (Zahlen, Tabellen, Diagramme) erscheint direkt darunter. Eine Markdown-Zelle enthält formatierten Text für Erklärungen, Gleichungen und Überschriften. Ein Hintergrundprozess namens Kernel führt den Code aus und merkt sich jede Variable zwischen den Zellen. Notebooks sind ideal, um Daten zu erkunden und eine Analyse zu erklären, weshalb sie in der quantitativen Forschung allgegenwärtig sind.
# Inside your project's virtual environment
python -m pip install jupyterlab
# Start it; a browser tab opens
jupyter lab
# Keyboard shortcuts you will use all day
# Shift+Enter run the cell and move on
# Esc then A/B insert a cell above/below
# Esc then M/Y turn a cell into markdown/codeDer Kernel merkt sich alles, und das ist die Gefahr
Zellen lassen sich in beliebiger Reihenfolge und beliebig oft ausführen, und der Kernel behält den letzten Wert jeder Variablen. Ein Notebook kann deshalb auf dem Bildschirm richtig aussehen und doch von einer gelöschten Zelle oder von ungeordneter Ausführung abhängen, und niemand sonst (auch Sie morgen nicht) kann es reproduzieren. Der Ausführungszähler neben jeder Codezelle ([3], [7]) zeigt die wahre Reihenfolge. Bevor Sie einem Notebook trauen oder es teilen, nutzen Sie Kernel neu starten und alle Zellen ausführen: Scheitert es oder ändern sich die Zahlen, war das Notebook nicht reproduzierbar.
# Cell [1]
fee = 0.001
# Cell [2]
cost = 10000 * fee
print(cost) # 10.0
# Cell [3]: you edit this to fee = 0.002 but never re-run cell [2]
fee = 0.002
print(cost) # still 10.0: the notebook now says fee=0.002 but shows the old costEin Notebook ist nur JSON
Eine .ipynb-Datei ist ein JSON-Dokument mit einer Liste cells. Jede Zelle hat einen cell_type ("code", "markdown" oder "raw") und eine source (Liste von Zeilen oder ein String); Codezellen speichern außerdem outputs und execution_count. Da es schlichtes JSON ist, lassen sich Notebooks mit dem Modul json lesen und bearbeiten, so wandeln Werkzeuge sie in Skripte um oder entfernen ihre Ausgaben. Das erklärt auch, warum Notebooks verrauschte Git-Diffs erzeugen: Ausgaben und Zähler ändern sich bei jedem Lauf.
import json
notebook = {
"nbformat": 4, "nbformat_minor": 5, "metadata": {},
"cells": [
{"cell_type": "markdown", "metadata": {}, "source": ["# Fee study\n", "Does the fee matter?"]},
{"cell_type": "code", "metadata": {}, "execution_count": 2,
"source": ["fee = 0.001\n", "print(10000 * fee)"],
"outputs": [{"output_type": "stream", "name": "stdout", "text": ["10.0\n"]}]},
],
}
# What the file looks like, and how to walk it
print(len(json.dumps(notebook, indent=1).splitlines()) > 10) # True
for cell in notebook["cells"]:
print(cell["cell_type"], "".join(cell["source"]).splitlines()[0])
# markdown # Fee study
# code fee = 0.001Gewohnheiten für saubere, verlässliche Notebooks
Halten Sie Notebooks kurz und linear: von oben nach unten, Importe und Einstellungen in der ersten Zelle, eine Idee pro Abschnitt mit Markdown-Überschrift. Verlagern Sie wiederverwendbare Logik in Funktionen eines normalen .py-Moduls (siehe Pakete) und importieren Sie sie, damit sie testbar ist; das Notebook ruft dann nur auf und zeichnet. Starten Sie vor jedem Commit neu und führen Sie alles aus. Unter Git leeren Sie zuerst die Ausgaben (ein Werkzeug wie nbstripout kann das automatisch), sonst committen Sie Megabytes an Diagrammen und unlesbare Diffs. Lassen Sie nie API-Schlüssel in einer Zelle oder Ausgabe stehen.
# Keep notebooks tidy under Git
python -m pip install nbstripout
nbstripout --install # strips outputs automatically on every commit
# Run a notebook top to bottom from the terminal (a reproducibility check)
jupyter nbconvert --to notebook --execute study.ipynb --output checked.ipynb
# Turn a notebook into a plain script
jupyter nbconvert --to script study.ipynb.py-Datei mit einem Test. Notebooks dienen dem Fragenstellen; Module den Antworten, auf die Sie sich verlassen. Das Lab behandelt Notebook-JSON als schlichte Dictionaries, genau so werden solche Werkzeuge geschrieben.- Zellen laufen in beliebiger Reihenfolge und der Kernel merkt sich alles: vor Vertrauen oder Teilen neu starten und alles ausführen.
- Ein
.ipynbist JSON:cells, jede mitcell_type,sourceund bei Codeoutputsundexecution_count. - Logik in Module, Ausgaben vor dem Commit leeren, Geheimnisse draußen halten.
Als Nächstes: reproduzierbare Forschungsabläufe, die Seeds, Umgebungen, Versionen und Datenprüfungen zusammenbringen, damit jeder ein Ergebnis neu erzeugen kann.
Lab: Was bewertet wird
- Mit
code_cellsden Code aus einem Notebook holen25 Pkt. - Mit
count_cellsdie Zellarten zählen25 Pkt. - Mit
clear_outputsdie Ausgaben vor dem Commit entfernen25 Pkt. - Mit
to_scriptein Notebook in ein Skript umwandeln25 Pkt.