Jupyter Notebook

Užitečný nástroj, který vědcům a datovým analytikům ulehčuje práci, se jmenuje Jupyter Notebook. Je to webová verze pythonní konzole, kde můžeme psát příkazy a kontrolovat výstup.

Na rozdíl od klasické konzole se v Notebooku příkazy (a jejich výstup) ukládají, a je tedy jednoduché se k nim vracet, upravovat je a přidávat komentáře. Mezi příkazy se pak dá psát text ve značkovacím jazyce Markdown, a plynule tak přecházet od pokusů a poznámek přes kód, který se dá sdílet, až po slajdy k prezentaci nebo dokonce publikovatelnou vědeckou práci (na což už jsou ale potřeba další nástroje). V Jupyter Notebooku jsou psány i tyto materiály.

Samotný Jupyter je napsaný v Pythonu, ale podporuje i jiné jazyky. Název pochází z JUlia, PYThon, R; kromě nich existují kernely pro desítky dalších jazyků. Pro pythonní verzi stačí z PyPI nainstalovat balíček notebook (nebo jupyter, který „přitáhne” víc funkcionality).

Před instalací ale doporučuji aktualizovat samotný pip. (Virtuální prostředí bývají občas vytvářena s verzí pipu, která neumí pracovat s wheels – binárním formátem, ze kterého se instaluje mnohem rychleji než ze zdrojového kódu.)

$ python -m pip install --upgrade pip wheel
$ python -m pip install notebook

Tato instalace v některých případech vyžaduje nainstalované překladače jazyků jako C. Na školních systémech by měly být nainstalovány; v Linuxových distribucích jsou potřeba balíčky jako gcc a python3-devel. Kdyby se instalace nepovedla, potřebná závislost lze většinou dohledat pomocí chybových hlášek.

Nainstalovaný Notebook pusťte pomocí:

$ python -m notebook

V prohlížeči se otevře stránka se seznamem souborů v aktuálním adresáři; nový notebook se dá vytvořit přes tlačítko NewPython 3.

Jak na Notebook

Nově vytvořený notebook má jednu buňku (cell), do které zapište kód a stiskněte Shift+Enter. Tím se kód vykoná, zobrazí se výstup a vytvoří se nová buňka, kam se dá psát další kód.

Kód se spouští pomocí Shift+Enter (a podobných příkazů); nezáleží na pořadí buněk v dokumentu. Je ale dobré psát buňky tak, aby při postupném spouštění (nebo Run All z menu Cell) kód fungoval – např. dávat importy na začátek.

Notebook je založený na konzoli IPython, která přidává některé vychytávky: doplňování pomocí tab, spouštění shellových příkazů pomocí ! nebo zobrazení nápovědy pomocí zadání ? za výrazem. Vyzkoušejte např.:

str.l<TAB>
! ls -a<SHIFT+ENTER>
str.lower?<SHIFT+ENTER>

Kód v buňce může být víceřádkový. Je-li poslední příkaz v buňce výrazem, jeho hodnota se vypíše jako výsledek buňky:

In [2]:
1+1  # Nevypíše se (není poslední příkaz)
2+2  # Vypíše se
Out[2]:
4
In [3]:
seznam = [5, 6, 3, 2]
print(seznam)  # print() funguje
seznam.sort()
seznam         # Poslední výraz se vypíše
[5, 6, 3, 2]
Out[3]:
[2, 3, 5, 6]

Další možnosti, jako např. změna typu buňky na Markdown, jsou dostupné z menu nebo klávesovými zkratkami.

{
  "data": {
    "sessionMaterial": {
      "id": "session-material:2019/mipyt-zima:numpy:0",
      "title": "Notebook",
      "html": "\n          \n    \n\n    <div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div><div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<h1>Jupyter Notebook</h1>\n<p>U&#x17E;ite&#x10D;n&#xFD; n&#xE1;stroj, kter&#xFD; v&#x11B;dc&#x16F;m a datov&#xFD;m analytik&#x16F;m uleh&#x10D;uje pr&#xE1;ci, se jmenuje Jupyter Notebook. Je to webov&#xE1; verze pythonn&#xED; konzole, kde m&#x16F;&#x17E;eme ps&#xE1;t p&#x159;&#xED;kazy a kontrolovat v&#xFD;stup.</p>\n<p>Na rozd&#xED;l od klasick&#xE9; konzole se v Notebooku p&#x159;&#xED;kazy (a jejich v&#xFD;stup) ukl&#xE1;daj&#xED;, a je tedy jednoduch&#xE9; se k nim vracet, upravovat je a p&#x159;id&#xE1;vat koment&#xE1;&#x159;e. Mezi p&#x159;&#xED;kazy se pak d&#xE1; ps&#xE1;t text ve zna&#x10D;kovac&#xED;m jazyce Markdown, a plynule tak p&#x159;ech&#xE1;zet od pokus&#x16F; a pozn&#xE1;mek p&#x159;es k&#xF3;d, kter&#xFD; se d&#xE1; sd&#xED;let, a&#x17E; po slajdy k prezentaci nebo dokonce publikovatelnou v&#x11B;deckou pr&#xE1;ci (na co&#x17E; u&#x17E; jsou ale pot&#x159;eba dal&#x161;&#xED; n&#xE1;stroje).\nV Jupyter Notebooku jsou ps&#xE1;ny i tyto materi&#xE1;ly.</p>\n<p>Samotn&#xFD; Jupyter je napsan&#xFD; v Pythonu, ale podporuje i jin&#xE9; jazyky. N&#xE1;zev poch&#xE1;z&#xED; z JUlia, PYThon, R; krom&#x11B; nich existuj&#xED; <em>kernely</em>  pro <a href=\"https://github.com/ipython/ipython/wiki/IPython-kernels-for-other-languages\">des&#xED;tky dal&#x161;&#xED;ch jazyk&#x16F;</a>.\nPro pythonn&#xED; verzi sta&#x10D;&#xED; z PyPI nainstalovat bal&#xED;&#x10D;ek <code>notebook</code> (nebo <code>jupyter</code>, kter&#xFD; &#x201E;p&#x159;it&#xE1;hne&#x201D; v&#xED;c funkcionality).</p>\n<p>P&#x159;ed instalac&#xED; ale doporu&#x10D;uji aktualizovat samotn&#xFD; pip. (Virtu&#xE1;ln&#xED; prost&#x159;ed&#xED; b&#xFD;vaj&#xED; ob&#x10D;as vytv&#xE1;&#x159;ena s verz&#xED; pipu, kter&#xE1; neum&#xED; pracovat s wheels &#x2013; bin&#xE1;rn&#xED;m form&#xE1;tem, ze kter&#xE9;ho se instaluje mnohem rychleji ne&#x17E; ze zdrojov&#xE9;ho k&#xF3;du.)</p>\n<div class=\"highlight\"><pre><span></span><span class=\"gp\">$ </span>python -m pip install --upgrade pip wheel\n<span class=\"gp\">$ </span>python -m pip install notebook\n</pre></div><p>Tato instalace v n&#x11B;kter&#xFD;ch p&#x159;&#xED;padech vy&#x17E;aduje nainstalovan&#xE9; p&#x159;eklada&#x10D;e jazyk&#x16F; jako C. Na &#x161;koln&#xED;ch syst&#xE9;mech by m&#x11B;ly b&#xFD;t nainstalov&#xE1;ny; v Linuxov&#xFD;ch distribuc&#xED;ch jsou pot&#x159;eba bal&#xED;&#x10D;ky jako <code>gcc</code> a <code>python3-devel</code>. Kdyby se instalace nepovedla, pot&#x159;ebn&#xE1; z&#xE1;vislost lze v&#x11B;t&#x161;inou dohledat pomoc&#xED; chybov&#xFD;ch hl&#xE1;&#x161;ek.</p>\n<p>Nainstalovan&#xFD; Notebook pus&#x165;te pomoc&#xED;:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"gp\">$ </span>python -m notebook\n</pre></div><p>V prohl&#xED;&#x17E;e&#x10D;i se otev&#x159;e str&#xE1;nka se seznamem soubor&#x16F; v aktu&#xE1;ln&#xED;m adres&#xE1;&#x159;i; nov&#xFD; notebook se d&#xE1; vytvo&#x159;it p&#x159;es tla&#x10D;&#xED;tko <code>New</code>&#x2192;<code>Python 3</code>.</p>\n<h2>Jak na Notebook</h2>\n<p>Nov&#x11B; vytvo&#x159;en&#xFD; notebook m&#xE1; jednu bu&#x148;ku (<em>cell</em>), do kter&#xE9; zapi&#x161;te k&#xF3;d a stiskn&#x11B;te <kbd>Shift</kbd>+<kbd>Enter</kbd>. T&#xED;m se k&#xF3;d vykon&#xE1;, zobraz&#xED; se v&#xFD;stup a vytvo&#x159;&#xED; se nov&#xE1; bu&#x148;ka, kam se d&#xE1; ps&#xE1;t dal&#x161;&#xED; k&#xF3;d.</p>\n<p>K&#xF3;d se spou&#x161;t&#xED; pomoc&#xED; <kbd>Shift</kbd>+<kbd>Enter</kbd> (a podobn&#xFD;ch p&#x159;&#xED;kaz&#x16F;); nez&#xE1;le&#x17E;&#xED; na po&#x159;ad&#xED; bun&#x11B;k v dokumentu. Je ale dobr&#xE9; ps&#xE1;t bu&#x148;ky tak, aby p&#x159;i postupn&#xE9;m spou&#x161;t&#x11B;n&#xED; (nebo Run All z menu Cell) k&#xF3;d fungoval &#x2013; nap&#x159;. d&#xE1;vat importy na za&#x10D;&#xE1;tek.</p>\n<p>Notebook je zalo&#x17E;en&#xFD; na konzoli IPython, kter&#xE1; p&#x159;id&#xE1;v&#xE1; n&#x11B;kter&#xE9; vychyt&#xE1;vky: dopl&#x148;ov&#xE1;n&#xED; pomoc&#xED; <kbd>tab</kbd>, spou&#x161;t&#x11B;n&#xED; shellov&#xFD;ch p&#x159;&#xED;kaz&#x16F; pomoc&#xED; <code>!</code> nebo zobrazen&#xED; n&#xE1;pov&#x11B;dy pomoc&#xED; zad&#xE1;n&#xED; <code>?</code> za v&#xFD;razem. Vyzkou&#x161;ejte nap&#x159;.:</p>\n<div class=\"highlight\"><pre><code>str.l&lt;TAB&gt;\n! ls -a&lt;SHIFT+ENTER&gt;\nstr.lower?&lt;SHIFT+ENTER&gt;</code></pre></div><p>K&#xF3;d v bu&#x148;ce m&#x16F;&#x17E;e b&#xFD;t v&#xED;ce&#x159;&#xE1;dkov&#xFD;. Je-li posledn&#xED; p&#x159;&#xED;kaz v bu&#x148;ce v&#xFD;razem, jeho hodnota se vyp&#xED;&#x161;e jako v&#xFD;sledek bu&#x148;ky:</p>\n</div>\n</div>\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&#xA0;[2]:</div>\n<div class=\"inner_cell\">\n    <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"mi\">1</span><span class=\"o\">+</span><span class=\"mi\">1</span>  <span class=\"c1\"># Nevyp&#xED;&#x161;e se (nen&#xED; posledn&#xED; p&#x159;&#xED;kaz)</span>\n<span class=\"mi\">2</span><span class=\"o\">+</span><span class=\"mi\">2</span>  <span class=\"c1\"># Vyp&#xED;&#x161;e se</span>\n</pre></div>\n\n    </div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n    <div class=\"prompt output_prompt\">Out[2]:</div>\n\n\n\n\n<div class=\"output_text output_subarea output_execute_result\">\n<pre>4</pre>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&#xA0;[3]:</div>\n<div class=\"inner_cell\">\n    <div class=\"input_area\">\n<div class=\" highlight hl-ipython3\"><pre><span></span><span class=\"n\">seznam</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"mi\">5</span><span class=\"p\">,</span> <span class=\"mi\">6</span><span class=\"p\">,</span> <span class=\"mi\">3</span><span class=\"p\">,</span> <span class=\"mi\">2</span><span class=\"p\">]</span>\n<span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">seznam</span><span class=\"p\">)</span>  <span class=\"c1\"># print() funguje</span>\n<span class=\"n\">seznam</span><span class=\"o\">.</span><span class=\"n\">sort</span><span class=\"p\">()</span>\n<span class=\"n\">seznam</span>         <span class=\"c1\"># Posledn&#xED; v&#xFD;raz se vyp&#xED;&#x161;e</span>\n</pre></div>\n\n    </div>\n</div>\n</div>\n\n<div class=\"output_wrapper\">\n<div class=\"output\">\n\n\n<div class=\"output_area\">\n\n    <div class=\"prompt\"></div>\n\n\n<div class=\"output_subarea output_stream output_stdout output_text\">\n<pre>[5, 6, 3, 2]\n</pre>\n</div>\n</div>\n\n<div class=\"output_area\">\n\n    <div class=\"prompt output_prompt\">Out[3]:</div>\n\n\n\n\n<div class=\"output_text output_subarea output_execute_result\">\n<pre>[2, 3, 5, 6]</pre>\n</div>\n\n</div>\n\n</div>\n</div>\n\n</div>\n<div class=\"cell border-box-sizing text_cell rendered\"><div class=\"prompt input_prompt\">\n</div><div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Dal&#x161;&#xED; mo&#x17E;nosti, jako nap&#x159;. zm&#x11B;na typu bu&#x148;ky na Markdown, jsou dostupn&#xE9; z menu nebo kl&#xE1;vesov&#xFD;mi zkratkami.</p>\n</div>\n</div>\n</div>\n \n\n\n\n\n        "
    }
  }
}