{ "cells": [ { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# From Variables to Classes\n", "## A short Introduction \n", "\n", "Python - as any programming language - has many extensions and libraries at its disposal. Basically, there exist libraries for everything. \n", "\n", "
But what are **libraries**?
\n", "\n", "Basically, **libraries** are a collection of methods (_small pieces of code where you put sth in and get sth else out_) which you can use to analyse your data, visualise your data, run models ... do anything you like. \n", "\n", "As said, methods usually take _something_ as input. That _something_ is usually a **variable**. \n", "\n", "In the following, we will work our way from **variables** to **libraries**." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Variables \n", "\n", "Variables are one of the simplest types of objects in a programming language. An [object](https://en.wikipedia.org/wiki/Object_(computer_science) is a value stored in the memory of your computer, marked by a specific identifyer. Variables can have different types, such as [strings, numbers, and booleans](https://www.learnpython.org/en/Variables_and_Types). Differently to other programming languages, you do not need to declare the type of a variable, as variables are handled as objects in Python. \n", "\n", "```python\n", "x = 4.2 # floating point number\n", "y = 'Hello World!' # string\n", "z = True # boolean\n", "```" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Hello World! Hello universe\n", "\n" ] } ], "source": [ "x = 4.24725723 \n", "print(type(x))\n", "\n", "y = 'Hello World! Hello universe'\n", "print(y)\n", "\n", "z = True\n", "print(type(z))" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "We can use operations (normal arithmetic operations) to use variables for getting results we want. With numbers, you can add, substract, multiply, divide, basically taking the values from the memory assigned to the variable name and performing calculations. \n", "\n", "Let's have a look at operations with numbers and strings. We leave booleans to the side for the moment. We will simply add the variables below. \n", "\n", "```python \n", "n1 = 7 \n", "n2 = 42\n", "\n", "s1 = 'Looking good, '\n", "s2 = 'you are.'\n", "```" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "49\n", "Looking good, you are.\n" ] } ], "source": [ "n1 = 7\n", "n2 = 42\n", "\n", "s1 = 'Looking good, ' \n", "s2 = 'you are.'\n", "\n", "first_sum = n1 + n2\n", "print(first_sum)\n", "first_conc = s1 + s2\n", "print(first_conc)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Variables can be more than just a number. If you think of an Excel-Spreadsheet, a variable can be the content of a single cell, or multiple cells can be combined in one variable (e.g. one column of an Excel table). \n", "So let's create a list -_a collection of variables_ - from `x`, `n1`, and `n2`. Lists in python are created using [ ]. \n", "Now, if you want to calculate the sum of this list, it is really exhausting to sum up every item of this list manually. \n", "\n", "```python\n", "first_list = [x, n1, n2] \n", "# a sum of a list could look like\n", "second_sum = some_list[0] + some_list[1] + ... + some_list[n] # where n is the last item of the list, e.g. 2 for first_list. \n", "```" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Actually, writing the second sum like this is the same as before. It would be great, if this step of calculating the sum could be used many times without writing it out. And this is, what functions are for. For example, there already exists a sum function: \n", "\n", "```python \n", "sum(first_list)```" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "manual sum 53.2\n", "sum function 53.2\n" ] } ], "source": [ "first_list = [x, n1, n2]\n", "second_sum = first_list[0] + first_list[1] + first_list[2]\n", "print('manual sum {}'.format(second_sum))\n", "\n", "# This can also be done with a function \n", "print('sum function {}'.format(sum(first_list)))" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Functions \n", "The `sum()` method we used above is a **function**. \n", "Functions (later we will call them methods) are pieces of code, which take an input, perform some kind of operation, and (_optionally_) return an output. " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "In Python, functions are written like: \n", "\n", "```python\n", "def func(input):\n", " \"\"\"\n", " Description of the functions content # called the function header\n", " \"\"\"\n", " some kind of operation on input # called the function body\n", " \n", " return output\n", "```\n", "As an example, we write a `sumup` function which sums up a list." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The python sum function yields 53.2, \n", "and our sumup function yields 53.2.\n" ] } ], "source": [ "def sumup(inp):\n", " \"\"\"\n", " input: inp - list/array with floating point or integer numbers\n", " return: sumd - scalar value of the summed up list\n", " \"\"\"\n", " val = 0\n", " for i in inp:\n", " val = val + i\n", " return val\n", "\n", "# let's compare the implemented standard sum function with the new sumup function\n", "sum1 = sum(first_list)\n", "sum2 = sumup(first_list)\n", "print(\"The python sum function yields {}, \\nand our sumup function yields {}.\".format(*(sum1,sum2)))" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "the sum of the array is: 5050\n" ] } ], "source": [ "# summing up the numbers from 1 to 100\n", "import numpy as np\n", "ar_2_sum = np.linspace(1,100,100, dtype='i')\n", "\n", "print(\"the sum of the array is: {}\".format(sumup(ar_2_sum)))" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "As we see above, functions are quite practical and save a lot of time. Further, they help structuring your code. Some functions are directly available in python without any libraries or other external software. In the example above however, you might have noticed, that we `import`ed a library called `numpy`. \n", "In those libraries, functions are merged to one package, having the advantage that you don't need to import each single function at a time. \n", "Imagine you move and have to pack all your belongings. You can think of libraries as packing things with similar purpose in the same box (= library)." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Functions to Methods as part of classes\n", "When we talk about functions in the environment of classes, we usually call them methods. But what are **classes**? \n", "[Classes](https://docs.python.org/3/tutorial/classes.html) are ways to bundle functionality together. Logically, functionality with similar purpose (or different kind of similarity). \n", "One example could be: think of **apples**. \n", "\n", "Apples are now a class. You can apply methods to this class, such as `eat()` or `cut()`. Or more sophisticated methods including various recipes using apples comprised in a cookbook. \n", "The `eat()` method is straight forward. But the `cut()` method may be more interesting, since there are various ways to cut an apple.\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Let's assume there are two apples to be cut differently. In python, once you have assigned a class to a variable, you have created an **instance** of that class. Then, methods of are applied to that instance by using a . notation.\n", "```python\n", "Golden_Delicious = apple()\n", "Yoya = apple()\n", "\n", "Golden_Delicious.cut(4)\n", "Yoya.cut(8)\n", "```\n", "The two apples Golden Delicious and Yoya are _instances_ of the class apple. Real _incarnations_ of the abstract concept _apple_. The Golden Delicious is cut into 4 pieces, while the Yoya is cut into 8 pieces. " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "This is similar to more complex libraries, such as the `scikit-learn`. In one exercise, you used the command: \n", "```python\n", "from sklearn.cluster import KMeans\n", "```\n", "which simply imports the **class** `KMeans` from the library part `sklearn.cluster`. `KMeans` comprises several methods for clustering, which you can use by calling them similar to the apple example before." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ " For this, you need to create an _instance_ of the `KMeans` class. \n", "```python\n", "...\n", "kmeans_inst = KMeans(n_clusters=n_clusters) # first we create the instance of the KMeans class called kmeans_inst\n", "kmeans_inst.fit(data) # then we apply a method to the instance kmeans_inst\n", "...\n", "```\n", "An example:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# here we just create the data for clustering\n", "from sklearn.datasets.samples_generator import make_blobs\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline\n", "X, y = make_blobs(n_samples=100, centers=3, cluster_std= 0.5,\n", " random_state=0)\n", "\n", "plt.scatter(X[:,0], X[:,1], s=70)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": true, "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "# now we create an instance of the KMeans class\n", "from sklearn.cluster import KMeans\n", "nr_of_clusters = 3 # because we see 3 clusters in the plot above\n", "kmeans_inst = KMeans(n_clusters= nr_of_clusters) # create the instance kmeans_inst\n", "kmeans_inst.fit(X) # apply a method to the instance\n", "y_predict = kmeans_inst.predict(X) # apply another method to the instance and save it in another variable" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAW4AAAD8CAYAAABXe05zAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4wLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvpW3flQAAIABJREFUeJzs3Xd8XNWZ+P/PuXeKei+WLVuSe5fB\nvYBtjKnGtFASAimEEmp22V8I2U2W7252IdkAS8huEiAhtGRJ6BgwNu42xsbdluWmbvXeZjTl3vP7\nY+zB8szIkqzu8+bll5HunTtnBHrmzHOf8xwhpURRFEUZPLT+HoCiKIrSNSpwK4qiDDIqcCuKogwy\nKnAriqIMMipwK4qiDDIqcCuKogwyKnAriqIMMipwK4qiDDIqcCuKogwylt64aFJSkszMzOyNSyuK\nogxJu3fvrpFSJnfm3F4J3JmZmezatas3Lq0oijIkCSGKOnuuSpUoiqIMMipwK4qiDDIqcCuKogwy\nKnAriqIMMipwK4OKx+OhoqKCpqam/h6KovSbXqkqUZSeZpomH374IevXrwfAMAwyMzP57ne/S3Jy\npyqoFGXIUDNuZVB46623WLduHS6XC5fLhdfrJS8vj6effprW1tb+Hp6i9CkVuJUBr7m5ma1bt+J2\nu9t9X0qJy+Vi8+bN/TQyRekfKnArA15+fj4WS/Csnsfj4cCBA308IkXpXypwKwOe1Wrt8LjNZuuj\nkSjKwKACtzLgjRs3LuQxm83GokWL+nA0itL/VOBWBjyr1cq3v/3tgJm11Wpl1KhRXHzxxf00MkXp\nH6ocUBkUZs+eTXx8PKtWraK4uJjw8HCWLFnCkiVL0HW9v4enKH1KSCl7/KKzZs2SqjugoihK5wkh\ndkspZ3XmXDXjVpR+1NTUxObNmzl27BjR0dFceumljB8/HiFEfw8N0zTZuHEja9asoaGhgZiYGJYt\nW8bll1+uPuX0MxW4FaWfFBcX88wzz2AYBh6PB4ADBw4we/Zs7rzzzn4P3q+//jq7du3y1883Njay\natUqCgoKuP/++/t1bBe6Tt2cFEIUCiEOCiH2CSFUDkRRzpOUkt///ve0tbX5gzaA2+1m165d5OTk\n9OPooLy8nK+++ipg0ZPb7SYnJ4fCwsL+GZgCdK2qZKmUckZnczCKooRWVFRES0tL0GMul8vfk6W/\n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\nRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# lets plot the predicted cluster centers colored in the cluster color\n", "plt.scatter(X[:, 0], X[:, 1], c=y_predict, s=50, cmap='Accent')\n", "centers = kmeans_inst.cluster_centers_ # apply the method to find the new centers of the determined clusters\n", "plt.scatter(centers[:, 0], centers[:, 1], c='red', s=200, alpha=0.6); # plot the cluster centers" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Summary \n", "This short presentation is meant to make you familiar with the concept of variables, functions, methods and classes. All of which are objects! \n", "* Variables are normally declared by the user and link a value stored in the memory of your pc to a variable name. They are usually the input of functions \n", "* Functions are pieces of code taking an input and performing some operation on said input. Optionally, they return directly an output value \n", "* To facilitate the use of functions, they are sometimes bundled as methods within classes. Classes in turn can build up whole libraries in python. " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "* Similar to real book libraries, python libraries contain a collection of _recipes_ which can be applied to your data. \n", "* In terms of apples: You own different kinds of apples. A book about apple dishes (_class_) from the library contains different recipes (_methods_) which can be used for your different apples (_instances of the class_)." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Further links \n", "* [Data Science Handbook](https://jakevdp.github.io/PythonDataScienceHandbook/)\n", "* [Python for Geosciences](https://github.com/koldunovn/python_for_geosciences) \n", "* [Introduction to Python for Geoscientists](http://ggorman.github.io/Introduction-to-programming-for-geoscientists/) \n", "* [Full Video course on Object Oriented Programming](https://www.youtube.com/watch?v=ZDa-Z5JzLYM&list=PL-osiE80TeTsqhIuOqKhwlXsIBIdSeYtc)" ] } ], "metadata": { "celltoolbar": "Slideshow", "hide_input": false, "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.6.1" }, "latex_envs": { "LaTeX_envs_menu_present": true, "autocomplete": true, "bibliofile": "biblio.bib", "cite_by": "apalike", "current_citInitial": 1, "eqLabelWithNumbers": true, "eqNumInitial": 1, "hotkeys": { "equation": "Ctrl-E", "itemize": "Ctrl-I" }, "labels_anchors": false, "latex_user_defs": false, "report_style_numbering": false, "user_envs_cfg": false }, "toc": { "base_numbering": 1, "nav_menu": { "height": "105px", "width": "252px" }, "number_sections": false, "sideBar": true, "skip_h1_title": false, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": false, "toc_position": {}, "toc_section_display": "block", "toc_window_display": false }, "varInspector": { "cols": { "lenName": 16, "lenType": 16, "lenVar": 40 }, "kernels_config": { "python": { "delete_cmd_postfix": "", "delete_cmd_prefix": "del ", "library": "var_list.py", "varRefreshCmd": "print(var_dic_list())" }, "r": { "delete_cmd_postfix": ") ", "delete_cmd_prefix": "rm(", "library": "var_list.r", "varRefreshCmd": "cat(var_dic_list()) " } }, "types_to_exclude": [ "module", "function", "builtin_function_or_method", "instance", "_Feature" ], "window_display": false } }, "nbformat": 4, "nbformat_minor": 2 }