{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Jupyter notebooks\n", "\n", "Ta sẽ sử dụng notebooks để code Python. Lý do:\n", "\n", "- Notebooks là môi trường lập trình khá trực quan.\n", "- Code đến đâu kết quả hiển thị đến đó.\n", "- Không cần chạy lại chương trình từ đầu đến cuối, chỉ cần chạy lại cell cần điều chỉnh.\n", "- Giúp mọi người theo dõi code và visualization cùng một lúc.\n", "\n", "Thường ta sử dụng 2 chế độ cells:\n", "\n", "- text cells: dùng để ghi chú headers và paragraph kể cả LaTeX format.\n", "- code cells: dùng để code\n", "\n" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Hello, World!\n" ] } ], "source": [ "# dòng code mà ai cũng sẽ thử\n", "print(\"Hello, World!\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Magic commands\n", "\n", "Tập hợp các lệnh tiện ích cho việc phân tích dữ liệu trong Notebooks. Bạn có thể liệt kê danh sách magic commands thông qua lệnh `%lsmagic`" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "application/json": { "cell": { "!": "OSMagics", "HTML": "Other", "SVG": "Other", "bash": "Other", "capture": "ExecutionMagics", "debug": "ExecutionMagics", "file": "Other", "html": "DisplayMagics", "javascript": "DisplayMagics", "js": "DisplayMagics", "latex": "DisplayMagics", "markdown": "DisplayMagics", "perl": "Other", "prun": "ExecutionMagics", "pypy": "Other", "python": "Other", "python2": "Other", "python3": "Other", "ruby": "Other", "script": "ScriptMagics", "sh": "Other", "svg": "DisplayMagics", "sx": "OSMagics", "system": "OSMagics", "time": "ExecutionMagics", "timeit": "ExecutionMagics", "writefile": "OSMagics" }, "line": { "alias": "OSMagics", "alias_magic": "BasicMagics", "autoawait": "AsyncMagics", "autocall": "AutoMagics", "automagic": "AutoMagics", "autosave": "KernelMagics", "bookmark": "OSMagics", "cat": "Other", "cd": "OSMagics", "clear": "KernelMagics", "colors": "BasicMagics", "conda": "PackagingMagics", "config": "ConfigMagics", "connect_info": "KernelMagics", "cp": "Other", "debug": "ExecutionMagics", "dhist": "OSMagics", "dirs": "OSMagics", "doctest_mode": "BasicMagics", "ed": "Other", "edit": "KernelMagics", "env": "OSMagics", "gui": "BasicMagics", "hist": "Other", "history": "HistoryMagics", "killbgscripts": "ScriptMagics", "ldir": "Other", "less": "KernelMagics", "lf": "Other", "lk": "Other", "ll": "Other", "load": "CodeMagics", "load_ext": "ExtensionMagics", "loadpy": "CodeMagics", "logoff": "LoggingMagics", "logon": "LoggingMagics", "logstart": "LoggingMagics", "logstate": "LoggingMagics", "logstop": "LoggingMagics", "ls": "Other", "lsmagic": "BasicMagics", "lx": "Other", "macro": "ExecutionMagics", "magic": "BasicMagics", "man": "KernelMagics", "matplotlib": "PylabMagics", "mkdir": "Other", "more": "KernelMagics", "mv": "Other", "notebook": "BasicMagics", "page": "BasicMagics", "pastebin": "CodeMagics", "pdb": "ExecutionMagics", "pdef": "NamespaceMagics", "pdoc": "NamespaceMagics", "pfile": "NamespaceMagics", "pinfo": "NamespaceMagics", "pinfo2": "NamespaceMagics", "pip": "PackagingMagics", "popd": "OSMagics", "pprint": "BasicMagics", "precision": "BasicMagics", "prun": "ExecutionMagics", "psearch": "NamespaceMagics", "psource": "NamespaceMagics", "pushd": "OSMagics", "pwd": "OSMagics", "pycat": "OSMagics", "pylab": "PylabMagics", "qtconsole": "KernelMagics", "quickref": "BasicMagics", "recall": "HistoryMagics", "rehashx": "OSMagics", "reload_ext": "ExtensionMagics", "rep": "Other", "rerun": "HistoryMagics", "reset": "NamespaceMagics", "reset_selective": "NamespaceMagics", "rm": "Other", "rmdir": "Other", "run": "ExecutionMagics", "save": "CodeMagics", "sc": "OSMagics", "set_env": "OSMagics", "store": "StoreMagics", "sx": "OSMagics", "system": "OSMagics", "tb": "ExecutionMagics", "time": "ExecutionMagics", "timeit": "ExecutionMagics", "unalias": "OSMagics", "unload_ext": "ExtensionMagics", "who": "NamespaceMagics", "who_ls": "NamespaceMagics", "whos": "NamespaceMagics", "xdel": "NamespaceMagics", "xmode": "BasicMagics" } }, "text/plain": [ "Available line magics:\n", "%alias %alias_magic %autoawait %autocall %automagic %autosave %bookmark %cat %cd %clear %colors %conda %config %connect_info %cp %debug %dhist %dirs %doctest_mode %ed %edit %env %gui %hist %history %killbgscripts %ldir %less %lf %lk %ll %load %load_ext %loadpy %logoff %logon %logstart %logstate %logstop %ls %lsmagic %lx %macro %magic %man %matplotlib %mkdir %more %mv %notebook %page %pastebin %pdb %pdef %pdoc %pfile %pinfo %pinfo2 %pip %popd %pprint %precision %prun %psearch %psource %pushd %pwd %pycat %pylab %qtconsole %quickref %recall %rehashx %reload_ext %rep %rerun %reset %reset_selective %rm %rmdir %run %save %sc %set_env %store %sx %system %tb %time %timeit %unalias %unload_ext %who %who_ls %whos %xdel %xmode\n", "\n", "Available cell magics:\n", "%%! %%HTML %%SVG %%bash %%capture %%debug %%file %%html %%javascript %%js %%latex %%markdown %%perl %%prun %%pypy %%python %%python2 %%python3 %%ruby %%script %%sh %%svg %%sx %%system %%time %%timeit %%writefile\n", "\n", "Automagic is ON, % prefix IS NOT needed for line magics." ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%lsmagic" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'http://dpaste.com/0KPTZ7Y'" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# upload code lên https://pastebin.com/ và trả về URL. \n", "# Đây là nơi lưu trữ snippets trực tuyến, bạn có thể dùng URL bên dưới để chia sẻ code của mình\n", "%pastebin file.py" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# dùng notebook thay vì inline sẽ cho phép bạn thực hiện zoom và thay đổi kích thước biểu đồ của mình\n", "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", "\n", "plt.plot([[0, 0], [1, 1]], linewidth=2)\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "application/javascript": [ "/* Put everything inside the global mpl namespace */\n", "window.mpl = {};\n", "\n", "\n", "mpl.get_websocket_type = function() {\n", " if (typeof(WebSocket) !== 'undefined') {\n", " return WebSocket;\n", " } else if (typeof(MozWebSocket) !== 'undefined') {\n", " return MozWebSocket;\n", " } else {\n", " alert('Your browser does not have WebSocket support. ' +\n", " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", " 'Firefox 4 and 5 are also supported but you ' +\n", " 'have to enable WebSockets in about:config.');\n", " };\n", "}\n", "\n", "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", " this.id = figure_id;\n", "\n", " this.ws = websocket;\n", "\n", " this.supports_binary = (this.ws.binaryType != undefined);\n", "\n", " if (!this.supports_binary) {\n", " var warnings = document.getElementById(\"mpl-warnings\");\n", " if (warnings) {\n", " warnings.style.display = 'block';\n", " warnings.textContent = (\n", " \"This browser does not support binary websocket messages. \" +\n", " \"Performance may be slow.\");\n", " }\n", " }\n", "\n", " this.imageObj = new Image();\n", "\n", " this.context = undefined;\n", " this.message = undefined;\n", " this.canvas = undefined;\n", " this.rubberband_canvas = undefined;\n", " this.rubberband_context = undefined;\n", " this.format_dropdown = undefined;\n", "\n", " this.image_mode = 'full';\n", "\n", " this.root = $('
');\n", " this._root_extra_style(this.root)\n", " this.root.attr('style', 'display: inline-block');\n", "\n", " $(parent_element).append(this.root);\n", "\n", " this._init_header(this);\n", " this._init_canvas(this);\n", " this._init_toolbar(this);\n", "\n", " var fig = this;\n", "\n", " this.waiting = false;\n", "\n", " this.ws.onopen = function () {\n", " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", " fig.send_message(\"send_image_mode\", {});\n", " if (mpl.ratio != 1) {\n", " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", " }\n", " fig.send_message(\"refresh\", {});\n", " }\n", "\n", " this.imageObj.onload = function() {\n", " if (fig.image_mode == 'full') {\n", " // Full images could contain transparency (where diff images\n", " // almost always do), so we need to clear the canvas so that\n", " // there is no ghosting.\n", " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", " }\n", " fig.context.drawImage(fig.imageObj, 0, 0);\n", " };\n", "\n", " this.imageObj.onunload = function() {\n", " fig.ws.close();\n", " }\n", "\n", " this.ws.onmessage = this._make_on_message_function(this);\n", "\n", " this.ondownload = ondownload;\n", "}\n", "\n", "mpl.figure.prototype._init_header = function() {\n", " var titlebar = $(\n", " '
');\n", " var titletext = $(\n", " '
');\n", " titlebar.append(titletext)\n", " this.root.append(titlebar);\n", " this.header = titletext[0];\n", "}\n", "\n", "\n", "\n", "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", "\n", "}\n", "\n", "\n", "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", "\n", "}\n", "\n", "mpl.figure.prototype._init_canvas = function() {\n", " var fig = this;\n", "\n", " var canvas_div = $('
');\n", "\n", " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", "\n", " function canvas_keyboard_event(event) {\n", " return fig.key_event(event, event['data']);\n", " }\n", "\n", " canvas_div.keydown('key_press', canvas_keyboard_event);\n", " canvas_div.keyup('key_release', canvas_keyboard_event);\n", " this.canvas_div = canvas_div\n", " this._canvas_extra_style(canvas_div)\n", " this.root.append(canvas_div);\n", "\n", " var canvas = $('');\n", " canvas.addClass('mpl-canvas');\n", " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", "\n", " this.canvas = canvas[0];\n", " this.context = canvas[0].getContext(\"2d\");\n", "\n", " var backingStore = this.context.backingStorePixelRatio ||\n", "\tthis.context.webkitBackingStorePixelRatio ||\n", "\tthis.context.mozBackingStorePixelRatio ||\n", "\tthis.context.msBackingStorePixelRatio ||\n", "\tthis.context.oBackingStorePixelRatio ||\n", "\tthis.context.backingStorePixelRatio || 1;\n", "\n", " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", "\n", " var rubberband = $('');\n", " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", "\n", " var pass_mouse_events = true;\n", "\n", " canvas_div.resizable({\n", " start: function(event, ui) {\n", " pass_mouse_events = false;\n", " },\n", " resize: function(event, ui) {\n", " fig.request_resize(ui.size.width, ui.size.height);\n", " },\n", " stop: function(event, ui) {\n", " pass_mouse_events = true;\n", " fig.request_resize(ui.size.width, ui.size.height);\n", " },\n", " });\n", "\n", " function mouse_event_fn(event) {\n", " if (pass_mouse_events)\n", " return fig.mouse_event(event, event['data']);\n", " }\n", "\n", " rubberband.mousedown('button_press', mouse_event_fn);\n", " rubberband.mouseup('button_release', mouse_event_fn);\n", " // Throttle sequential mouse events to 1 every 20ms.\n", " rubberband.mousemove('motion_notify', mouse_event_fn);\n", "\n", " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", "\n", " canvas_div.on(\"wheel\", function (event) {\n", " event = event.originalEvent;\n", " event['data'] = 'scroll'\n", " if (event.deltaY < 0) {\n", " event.step = 1;\n", " } else {\n", " event.step = -1;\n", " }\n", " mouse_event_fn(event);\n", " });\n", "\n", " canvas_div.append(canvas);\n", " canvas_div.append(rubberband);\n", "\n", " this.rubberband = rubberband;\n", " this.rubberband_canvas = rubberband[0];\n", " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", " this.rubberband_context.strokeStyle = \"#000000\";\n", "\n", " this._resize_canvas = function(width, height) {\n", " // Keep the size of the canvas, canvas container, and rubber band\n", " // canvas in synch.\n", " canvas_div.css('width', width)\n", " canvas_div.css('height', height)\n", "\n", " canvas.attr('width', width * mpl.ratio);\n", " canvas.attr('height', height * mpl.ratio);\n", " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", "\n", " rubberband.attr('width', width);\n", " rubberband.attr('height', height);\n", " }\n", "\n", " // Set the figure to an initial 600x600px, this will subsequently be updated\n", " // upon first draw.\n", " this._resize_canvas(600, 600);\n", "\n", " // Disable right mouse context menu.\n", " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", " return false;\n", " });\n", "\n", " function set_focus () {\n", " canvas.focus();\n", " canvas_div.focus();\n", " }\n", "\n", " window.setTimeout(set_focus, 100);\n", "}\n", "\n", "mpl.figure.prototype._init_toolbar = function() {\n", " var fig = this;\n", "\n", " var nav_element = $('
');\n", " nav_element.attr('style', 'width: 100%');\n", " this.root.append(nav_element);\n", "\n", " // Define a callback function for later on.\n", " function toolbar_event(event) {\n", " return fig.toolbar_button_onclick(event['data']);\n", " }\n", " function toolbar_mouse_event(event) {\n", " return fig.toolbar_button_onmouseover(event['data']);\n", " }\n", "\n", " for(var toolbar_ind in mpl.toolbar_items) {\n", " var name = mpl.toolbar_items[toolbar_ind][0];\n", " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", " var image = mpl.toolbar_items[toolbar_ind][2];\n", " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", "\n", " if (!name) {\n", " // put a spacer in here.\n", " continue;\n", " }\n", " var button = $('