{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# [NTDS'18] tutorial 1: introduction\n", "[ntds'18]: https://github.com/mdeff/ntds_2018\n", "\n", "[Michaƫl Defferrard](http://deff.ch), *PhD student*, [EPFL LTS2](http://lts2.epfl.ch)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Content\n", "\n", "1. [Conda and Anaconda](#conda)\n", "1. [Python](#python)\n", "1. [Jupyter notebooks](#jupyter)\n", "1. [Version control with git](#git)\n", "1. [Scientific Python](#scipy)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "## 1 Conda and Anaconda\n", "\n", "![conda](figures/conda.jpg)\n", "\n", "[Conda](https://conda.io) is a package and environment manager. It allows you to create environments, ideally one per project, and install packages into them. It is available for Windows, macOS and Linux.\n", "\n", "[Anaconda](https://anaconda.org/download) is a commercial distribution that comes with many of the packages used by data scientists. [Miniconda](https://conda.io/miniconda.html) is a lighter open distribution. Both install `conda`, from which you'll be able to install many packages.\n", "\n", "[conda-forge](https://conda-forge.org) is a community-driven collection of recipes to build conda packages. It contains many more packages than the official defaults channel." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Get basic information from your conda installation:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\r\n", " active environment : ntds_2018\r\n", " active env location : /home/michael/.conda/envs/ntds_2018\r\n", " shell level : 1\r\n", " user config file : /home/michael/.condarc\r\n", " populated config files : /home/michael/.condarc\r\n", " conda version : 4.5.11\r\n", " conda-build version : not installed\r\n", " python version : 3.7.0.final.0\r\n", " base environment : /usr (read only)\r\n", " channel URLs : https://conda.anaconda.org/conda-forge/linux-64\r\n", " https://conda.anaconda.org/conda-forge/noarch\r\n", " https://repo.anaconda.com/pkgs/main/linux-64\r\n", " https://repo.anaconda.com/pkgs/main/noarch\r\n", " https://repo.anaconda.com/pkgs/free/linux-64\r\n", " https://repo.anaconda.com/pkgs/free/noarch\r\n", " https://repo.anaconda.com/pkgs/r/linux-64\r\n", " https://repo.anaconda.com/pkgs/r/noarch\r\n", " https://repo.anaconda.com/pkgs/pro/linux-64\r\n", " https://repo.anaconda.com/pkgs/pro/noarch\r\n", " package cache : /home/michael/.conda/pkgs\r\n", " envs directories : /home/michael/.conda/envs\r\n", " /usr/envs\r\n", " platform : linux-64\r\n", " user-agent : conda/4.5.11 requests/2.19.1 CPython/3.7.0 Linux/4.18.8-arch1-1-ARCH arch/rolling glibc/2.28\r\n", " UID:GID : 1000:1000\r\n", " netrc file : None\r\n", " offline mode : False\r\n", "\r\n" ] } ], "source": [ "!conda info" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "List your environments:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "# conda environments:\r\n", "#\r\n", "eeg_denoising /home/michael/.conda/envs/eeg_denoising\r\n", "ntds_2018 * /home/michael/.conda/envs/ntds_2018\r\n", "numpy_mkl /home/michael/.conda/envs/numpy_mkl\r\n", "numpy_openblas /home/michael/.conda/envs/numpy_openblas\r\n", "python2 /home/michael/.conda/envs/python2\r\n", "scnn /home/michael/.conda/envs/scnn\r\n", "test /home/michael/.conda/envs/test\r\n", "base /usr\r\n", "\r\n" ] } ], "source": [ "!conda env list" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "List the packages in an environment:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "# packages in environment at /home/michael/.conda/envs/ntds_2018:\r\n", "#\r\n", "# Name Version Build Channel\r\n", "backcall 0.1.0 py_0 conda-forge\r\n", "blas 1.1 openblas conda-forge\r\n", "bleach 2.1.4 py_1 conda-forge\r\n", "bzip2 1.0.6 h470a237_2 conda-forge\r\n", "ca-certificates 2018.8.24 ha4d7672_0 conda-forge\r\n", "certifi 2018.8.24 py37_1001 conda-forge\r\n", "curl 7.61.0 h93b3f91_2 conda-forge\r\n", "cycler 0.10.0 py_1 conda-forge\r\n", "dbus 1.13.0 h3a4f0e9_0 conda-forge\r\n", "decorator 4.3.0 py_0 conda-forge\r\n", "entrypoints 0.2.3 py37_2 conda-forge\r\n", "expat 2.2.5 hfc679d8_2 conda-forge\r\n", "fontconfig 2.13.1 h65d0f4c_0 conda-forge\r\n", "freetype 2.9.1 h6debe1e_4 conda-forge\r\n", "gettext 0.19.8.1 h5e8e0c9_1 conda-forge\r\n", "git 2.19.0 pl526hbb17d3c_0 conda-forge\r\n", "glib 2.55.0 h464dc38_2 conda-forge\r\n", "gmp 6.1.2 hfc679d8_0 conda-forge\r\n", "gst-plugins-base 1.12.5 hde13a9d_0 conda-forge\r\n", "gstreamer 1.12.5 h61a6719_0 conda-forge\r\n", "html5lib 1.0.1 py_0 conda-forge\r\n", "icu 58.2 hfc679d8_0 conda-forge\r\n", "ipykernel 4.8.2 py37_0 conda-forge\r\n", "ipython 6.5.0 py37_0 conda-forge\r\n", "ipython_genutils 0.2.0 py_1 conda-forge\r\n", "ipywidgets 7.4.2 py_0 conda-forge\r\n", "jedi 0.12.1 py37_0 conda-forge\r\n", "jinja2 2.10 py_1 conda-forge\r\n", "jpeg 9c h470a237_1 conda-forge\r\n", "jsonschema 2.6.0 py37_2 conda-forge\r\n", "jupyter 1.0.0 py_1 conda-forge\r\n", "jupyter_client 5.2.3 py_1 conda-forge\r\n", "jupyter_console 5.2.0 py37_1 conda-forge\r\n", "jupyter_core 4.4.0 py_0 conda-forge\r\n", "jupyterlab 0.34.9 py37_0 \r\n", "jupyterlab_launcher 0.13.1 py_2 conda-forge\r\n", "kiwisolver 1.0.1 py37h2d50403_2 conda-forge\r\n", "krb5 1.14.6 0 conda-forge\r\n", "libffi 3.2.1 hfc679d8_5 conda-forge\r\n", "libgcc-ng 7.2.0 hdf63c60_3 conda-forge\r\n", "libgfortran 3.0.0 1 conda-forge\r\n", "libiconv 1.15 h470a237_3 conda-forge\r\n", "libpng 1.6.35 ha92aebf_2 conda-forge\r\n", "libsodium 1.0.16 h470a237_1 conda-forge\r\n", "libssh2 1.8.0 h5b517e9_2 conda-forge\r\n", "libstdcxx-ng 7.2.0 hdf63c60_3 conda-forge\r\n", "libuuid 2.32.1 h470a237_2 conda-forge\r\n", "libxcb 1.13 h470a237_2 conda-forge\r\n", "libxml2 2.9.8 h422b904_5 conda-forge\r\n", "markupsafe 1.0 py37h470a237_1 conda-forge\r\n", "matplotlib 3.0.0 py37h0b34cb6_1 conda-forge\r\n", "mistune 0.8.3 py_0 conda-forge\r\n", "nbconvert 5.3.1 py_1 conda-forge\r\n", "nbformat 4.4.0 py_1 conda-forge\r\n", "ncurses 6.1 hfc679d8_1 conda-forge\r\n", "networkx 2.2 py_1 conda-forge\r\n", "nomkl 3.0 0 \r\n", "notebook 5.6.0 py37_1 conda-forge\r\n", "numpy 1.15.1 py37_blas_openblashd3ea46f_1 [blas_openblas] conda-forge\r\n", "openblas 0.2.20 8 conda-forge\r\n", "openssl 1.0.2p h470a237_0 conda-forge\r\n", "pandas 0.23.4 py37hf8a1672_0 conda-forge\r\n", "pandoc 2.2.2 1 conda-forge\r\n", "pandocfilters 1.4.2 py_1 conda-forge\r\n", "parso 0.3.1 py_0 conda-forge\r\n", "pcre 8.41 hfc679d8_3 conda-forge\r\n", "perl 5.26.2 h470a237_0 conda-forge\r\n", "pexpect 4.6.0 py37_0 conda-forge\r\n", "pickleshare 0.7.4 py37_0 conda-forge\r\n", "pip 18.0 py37_1 conda-forge\r\n", "prometheus_client 0.3.1 py_1 conda-forge\r\n", "prompt_toolkit 1.0.15 py_1 conda-forge\r\n", "pthread-stubs 0.4 h470a237_1 conda-forge\r\n", "ptyprocess 0.6.0 py37_0 conda-forge\r\n", "pygments 2.2.0 py_1 conda-forge\r\n", "pygsp 0.5.1 py_0 conda-forge\r\n", "pyparsing 2.2.1 py_0 conda-forge\r\n", "pyqt 5.6.0 py37h8210e8a_7 conda-forge\r\n", "python 3.7.0 h5001a0f_2 conda-forge\r\n", "python-dateutil 2.7.3 py_0 conda-forge\r\n", "pytz 2018.5 py_0 conda-forge\r\n", "pyzmq 17.1.2 py37hae99301_0 conda-forge\r\n", "qt 5.6.2 hf70d934_9 conda-forge\r\n", "qtconsole 4.4.1 py37_1 conda-forge\r\n", "readline 7.0 haf1bffa_1 conda-forge\r\n", "scipy 1.1.0 py37_blas_openblash7943236_201 [blas_openblas] conda-forge\r\n", "send2trash 1.5.0 py_0 conda-forge\r\n", "setuptools 40.4.0 py37_1000 conda-forge\r\n", "simplegeneric 0.8.1 py_1 conda-forge\r\n", "sip 4.18.1 py37hfc679d8_0 conda-forge\r\n", "six 1.11.0 py37_1 conda-forge\r\n", "sqlite 3.25.1 hb1c47c0_0 conda-forge\r\n", "terminado 0.8.1 py37_1 conda-forge\r\n", "testpath 0.3.1 py37_1 conda-forge\r\n", "tk 8.6.8 ha92aebf_0 conda-forge\r\n", "tornado 5.1 py37h470a237_1 conda-forge\r\n", "traitlets 4.3.2 py37_0 conda-forge\r\n", "wcwidth 0.1.7 py_1 conda-forge\r\n", "webencodings 0.5.1 py_1 conda-forge\r\n", "wheel 0.31.1 py37_1001 conda-forge\r\n", "widgetsnbextension 3.4.1 py37_0 conda-forge\r\n", "xorg-libxau 1.0.8 h470a237_6 conda-forge\r\n", "xorg-libxdmcp 1.1.2 h470a237_7 conda-forge\r\n", "xz 5.2.4 h470a237_1 conda-forge\r\n", "zeromq 4.2.5 hfc679d8_5 conda-forge\r\n", "zlib 1.2.11 h470a237_3 conda-forge\r\n" ] } ], "source": [ "!conda list -n ntds_2018" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Install packages in an environment. The package will be installed in the activated environment if an environment name is not given." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Solving environment: - \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\bdone\r\n", "\r\n", "# All requested packages already installed.\r\n", "\r\n" ] } ], "source": [ "!conda install -n ntds_2018 git" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Want to know more?** Look at the [conda user guide](https://conda.io/docs/user-guide/overview.html)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "## 2 Python\n", "\n", "[Python](https://python.org) is one of the main programming languages used by data scientists, along [R](https://www.r-project.org) and [Julia](https://julialang.org). As an open and general purpose language, it is replacing [MATLAB](https://mathworks.com/products/matlab.html) in many scientific and engineering fields. Python is the default language used for machine learning.\n", "\n", "Below are very basic examples of Python code. **Want to learn more?** Look at the [Python Tutorial](https://docs.python.org/3/tutorial/index.html)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Control flow" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "hello\n" ] } ], "source": [ "if 1 == 1:\n", " print('hello')" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0\n", "1\n", "2\n", "3\n", "4\n" ] } ], "source": [ "for i in range(5):\n", " print(i)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "4\n", "3\n" ] } ], "source": [ "a = 4\n", "while a > 2:\n", " print(a)\n", " a -= 1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Data structures" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Lists are mutable, i.e. we can change the objects they store." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1, 2, 'hello', 3.2]\n", "[1, 2, 'world', 3.2]\n" ] } ], "source": [ "a = [1, 2, 'hello', 3.2]\n", "print(a)\n", "a[2] = 'world'\n", "print(a)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Tuples are not mutable." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(1, 2, 'hello')" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(1, 2, 'hello')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Sets contain unique values." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{1, 2, 3, 4}\n", "{2, 4}\n" ] } ], "source": [ "a = {1, 2, 3, 3, 4}\n", "print(a)\n", "print(a.intersection({2, 4, 6}))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Dictionaries map keys to values." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a = {'one': 1, 'two': 2, 'three': 3}\n", "a['two']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Functions" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "5" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def add(a, b):\n", " return a + b\n", "\n", "add(1, 4)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Classes" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "30" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "class A:\n", " d = 10\n", " \n", " def add(self, c):\n", " return self.d + c\n", "\n", "a = A()\n", "a.add(20)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "30\n", "-10\n" ] } ], "source": [ "class B(A):\n", " def sub(self, c):\n", " return self.d - c\n", "\n", "b = B()\n", "print(b.add(20))\n", "print(b.sub(20))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Dynamic typing" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'abc'" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x = 1\n", "x = 'abc'\n", "x" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'hello'" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "add('hel', 'lo')" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[1, 2, 3, 4, 5]" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "add([1, 2], [3, 4, 5])" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "130\n", "120 items\n" ] } ], "source": [ "print(int('120') + 10)\n", "print(str(120) + ' items')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "## 3 Jupyter notebooks\n", "\n", "[Jupyter](https://jupyter.org) notebooks allow to mix text, math, code, and results (numerical or figures) in a **single document**. It is intended for interactive computing and is very useful to explore data, teach concepts, create reports. Code can be written in many programming languages, including Python, Julia, R, MATLAB, C++." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Markdown text (and Latex math)\n", "\n", "A list:\n", "\n", "* item\n", "* item\n", "\n", "Text in a paragraph. Text can be *italic*, **bold**, `verbatim`. We can define [hyperlinks](https://github.com/mdeff/ntds_2018).\n", "\n", "A numbered list:\n", "\n", "1. item\n", "1. item\n", "\n", "Some inline math: $x = \\frac12$\n", "\n", "Some display math:\n", "$$ f(x) = \\frac{e^{-x}}{4} $$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Code and results" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "6.0" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "20 / 100 * 30" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Inline figures" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%matplotlib inline\n", "\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "y = np.random.uniform(size=100)\n", "plt.plot(y);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Want to learn more?** Look at the [documentation](https://jupyter.org/documentation)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "## 4 Version control with git\n", "\n", "![git](figures/git.jpg)\n", "\n", "[git](https://git-scm.com) is an open-source distributed version control system. It allows users to collaborate on projects (not only software!), synchronize and track their changes. It is most often used with an hosting service such as [GitHub](https://github.com) or [GitLab](https://about.gitlab.com). Those services add many tools to facilitate issue tracking, code review, continuous integration, etc.\n", "\n", "* Decentralized: draw on black board. Make it clear that all repos are the same.\n", "* Commit are local. We push / pull to sync with other repos.\n", "* Git is often used in a centralized fashion, with github / gitlab being the syncing point for everybody. It does not have to be, but github is easier to access than my laptop.\n", "* **Want to learn more?** Try this [interactive guide](https://try.github.io) or look at the more involved [user manual](https://git-scm.com/docs).\n", "\n", "### Basic usage\n", "\n", "1. Install with `conda install git`.\n", "1. Everybody make a clean clone (to be erased afterwards). Use HTTPS if not logged on GitHub.\n", "1. I add a fake file.\n", "1. I commit. It's not on github.\n", "1. I push. It is on github.\n", "1. They pull. They see it on their machines.\n", "\n", "Two kinds of users:\n", "* Those who don't want to use git, just do `git pull` before every lab. **Do not modify the content of the folder.** That is like your inbox, you only copy files from there and modify them outside.\n", "* The power users make a branch for each of their solutions!\n", "\n", "### Power users\n", "\n", "* Make a branch: `git branch milestone1_solution`\n", "* Work on that branch: `git checkout milestone1_solution`\n", "* Do and commit your modifications. You get a history of your changes!\n", "* Come back to master with `git checkout master` and get new stuff from the TAs with `git pull`. Again, you should never modify master (you could do it locally, but only the TAs have write access to the github repo).\n", "\n", "### Super-power users\n", "\n", "Those who want to backup or share their work on github.\n", "\n", "1. Create a github account.\n", "1. Create a repository (you could have forked mdeff/ntds_2018).\n", "1. Add a remote repo: `git remote add my_repo git@github.com:username/ntds_2018.git`\n", "1. Push your own branches to your repo: `git push -u my_repo milestone1_solution`.\n", "1. Go on your github and see your changes.\n", "\n", "### Contributors\n", "\n", "Same as before, except you can now make a pull request for your changes to be integrated into master and be available to all of us.\n", "\n", "### Collaborate with git and github\n", "\n", "All the code for your projects will have to be handled as a repository on GitHub.\n", "While you don't have to collaborate with git (i.e., you can create a single commit at the end with all of your code), we highly recommend you to use it.\n", "It is a very good way to manage your project, as it allows you to come back to previous states, synchronize your changes without being lost with versions, track who did what, discuss issues and code, etc.\n", "As such, we recommend you to use git from the start to get the basics. Once you feel ready, create a repository for your project and start working on a milestone there." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "## 5 Scientific Python\n", "\n", "Below are the basic packages used for scientific computing and data science. We'll introduce them as needed during the following tutorials.\n", "* [NumPy](http://www.numpy.org): N-dimensional arrays\n", "* [SciPy](https://www.scipy.org/scipylib/index.html): scientific computing\n", "* [matplotlib](https://matplotlib.org): powerful visualization\n", "* [pandas](https://pandas.pydata.org): data analysis\n", "\n", "**Want to learn more?** Look at the [Scipy Lecture Notes](http://www.scipy-lectures.org/).\n", "\n", "Finally, the below packages will be useful to work with networks and graphs.\n", "* [NetworkX](https://networkx.github.io): network science\n", "* [graph-tool](https://graph-tool.skewed.de): network science\n", "* [PyGSP](https://github.com/epfl-lts2/pygsp): graph signal processing" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.0" } }, "nbformat": 4, "nbformat_minor": 2 }