{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "_cell_guid": "53e65f34-8897-d0b3-a11f-9c71be4dab0a"
      },
      "source": [
        "This is a python jupyter notebook for Digit Recognition Competition in Kaggle were the objective will not be only to develop a model, will also be analyze the features and compare a variety of models that can help to solve this challenge.\n",
        "\n",
        "This notebook will be divided on the next sections:\n",
        "\n",
        " 1. Intro \n",
        " 2. Data cleaning and Transformation\n",
        " 3. Data Exploration \n",
        " 4. Data Modeling with\n",
        "     4.1 Dimensionality Reduction\n",
        "         4.1.1 PCA\n",
        "         \n",
        "     4.2 Classification\n",
        "         4.2.1 Decision Tree\n",
        "         4.2.2 Logistic Regression\n",
        "         4.2.3 SVM\n",
        "         4.2.4 Random Forest \n",
        "         4.2.5 Classifier Perceptron\n",
        " 5. Comparation\n",
        " 6. Conclusion\n",
        "\n",
        "let's take on count that the predictive models might need different preprocessing steps, so I will use different dataframes if needed"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "429053cf-aff1-7435-ff9a-c37ff654af5e"
      },
      "outputs": [],
      "source": [
        "import pandas as pd\n",
        "import numpy as np\n",
        "import matplotlib.pyplot as plt\n",
        "import matplotlib.cm as cm\n",
        "import matplotlib.gridspec as gridspec #to manipulate subplots grids\n",
        "%matplotlib inline\n",
        "from sklearn.model_selection import train_test_split\n",
        "from sklearn import preprocessing, manifold, svm, tree, linear_model, metrics, ensemble\n",
        "from sklearn.decomposition import PCA"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "_cell_guid": "a9f74047-e9b9-d4e0-3db3-22cafce970e1"
      },
      "source": [
        "### Intro"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "_cell_guid": "630cf2d4-6ee0-2e38-545c-d8893a6515ff"
      },
      "source": [
        "Data load and first look on the Dataset"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "11cef696-a426-4f51-7a28-39a3f2d44ed6"
      },
      "outputs": [],
      "source": [
        "df_digits = pd.read_csv('../input/train.csv')\n",
        "df_digits.info()"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "5ddca021-3c9e-e1b7-e499-2f0b5c8e00f2"
      },
      "outputs": [],
      "source": [
        "df_digits.head()"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "_cell_guid": "a4061a05-15d7-173b-62e5-b003be10191a"
      },
      "source": [
        "So, we have 42000 rows with 785 features, the first feature is the digit that the image represent and  the others are pixel value of the image. Let's see how are the original images."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "c0b367f7-df9b-e21b-cb4d-5580305b4457"
      },
      "outputs": [],
      "source": [
        "img = df_digits.iloc[1][1:].as_matrix()\n",
        "img = img.reshape((28,28))\n",
        "plt.imshow(img,cmap='gray')\n",
        "plt.title(df_digits.iloc[1,0])"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "_cell_guid": "0c313200-3960-38dc-3655-1929d4f41a3c"
      },
      "source": [
        "So now let's plot only 9 images in a matrix"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "80daee29-53fc-7d6b-11f1-1a08f197e57c"
      },
      "outputs": [],
      "source": [
        "f, axarr = plt.subplots(nrows = 3, ncols=3, sharey = True, sharex= True)\n",
        "i = 0\n",
        "for ir in range(3):\n",
        "    for ic in range(3):\n",
        "        img = df_digits.iloc[i][1:].as_matrix()\n",
        "        img = img.reshape((28,28))\n",
        "        axarr[ir,ic].imshow(img,cmap = 'gray')\n",
        "        axarr[ir,ic].set_title(df_digits.iloc[i,0])\n",
        "        i+=1\n",
        "f.subplots_adjust(hspace = 0.5)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "_cell_guid": "6138ecef-a475-2b6a-102f-d9af67d96878"
      },
      "source": [
        "We can see digits are centered, so we are guessing that the more dense pixel features will b the ones for the center of the picture and the less dense will be the ones that corresponds to the borders"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "_cell_guid": "c60e1034-63da-eb44-a9f1-4ac17363f603"
      },
      "source": [
        "### Data Cleaning and transformation"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "_cell_guid": "62b62bd3-b678-cb8d-baf8-30df700edf92"
      },
      "source": [
        "There is no need to transform the existent data due:\n",
        "    \n",
        "    1.- All the features are numeric, we don't have to parse features\n",
        "    \n",
        "    2.- We are guessing there are no missing data: the data are images converted to array\n",
        "    \n",
        "    3.- All the features have the same range of values, we can standarize but i will not do it yet."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "_cell_guid": "934e0ec9-6a5d-0e49-b502-c4504ce0d321"
      },
      "source": [
        "### The exploration"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "401baf60-1e89-dbc7-fcf4-316e3b1aa1f3",
        "collapsed": true
      },
      "outputs": [],
      "source": [
        "df_features = df_digits.iloc[:,1:]\n",
        "digits_labels = df_digits['label']"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "_cell_guid": "e335ec60-2ccc-c155-564d-88c6bc259cb0"
      },
      "source": [
        "First, I want to know the distribution between the labels"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "0f024013-3307-a8a2-c095-f50056ec2e17"
      },
      "outputs": [],
      "source": [
        "plt.hist(digits_labels)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "_cell_guid": "7b167c41-c02d-7f66-9f7e-acc15399d88a"
      },
      "source": [
        "Well, is a mostly equal distribution between the labels, so there shouldn't be a bias towards a certain digit"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "_cell_guid": "da0514f9-9178-d201-4bf9-ee2075d5995f"
      },
      "source": [
        "Now, I want to know how many pixels are not used in general"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "2437cb33-7fc9-1753-91e2-ba1c615aaf37"
      },
      "outputs": [],
      "source": [
        "plt.hist(df_features.max())"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "_cell_guid": "55ee450e-e090-7ce5-6493-79b5821383cb"
      },
      "source": [
        "We can see that are 81 are pixel not used in all the images (the first and second arrays are the qty and bin boundary values), but the great majority is used and have values greater than 229. This is not helpful."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "_cell_guid": "07e94c84-8c48-6b35-b7b1-7d9ac687685c",
        "collapsed": true
      },
      "source": [
        "Next, I want to check the average pixels usage for each digit in an image"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "956661fc-1519-67f3-2a9a-ab4fdf8d9bfb"
      },
      "outputs": [],
      "source": [
        "f, axarr = plt.subplots(2,5, figsize = (9,9))\n",
        "gs1 = gridspec.GridSpec(2,5)\n",
        "i=0\n",
        "for ir in range(2):\n",
        "    for ic in range(5):\n",
        "        temp = df_features[digits_labels==i]   \n",
        "        axarr[ir,ic].imshow(temp.mean().reshape(28,28))\n",
        "        i+=1\n",
        "f.subplots_adjust(hspace = -0.5)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "_cell_guid": "b23e845f-172c-4a30-3d2c-5fc78d542515"
      },
      "source": [
        "it seems that 0,2,3,5,6,8,7 and 9 have very common pixel arrange, but for 1 and 4 there is not so defined."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "_cell_guid": "ea087731-6ef8-15f8-461a-17db3e380c47"
      },
      "source": [
        "Remember, we have 784 features representing pixel values, but not every pixel is used nor representative of a digit. So lets use dimensionality reduction to choose the most digit's representative features. "
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "_cell_guid": "a32ff163-2de7-3ed8-9c70-8b1a6fc35aa4"
      },
      "source": [
        "But how many features do we need to have? We can try several options, so one of them is to count the average digit's pixels which have more than a certain value, like 200."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "5a615a4b-5e5d-47c0-f8fc-de0615c6a078"
      },
      "outputs": [],
      "source": [
        "count, bins= np.histogram(df_features.mean(),bins = 14)\n",
        "max(bins)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "afc7f824-73ad-fdf9-b003-b41f665613e4"
      },
      "outputs": [],
      "source": [
        "[x for x in zip(count, bins[1:])]"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "_cell_guid": "f2bfdfec-b179-b45b-952f-39d9aefad1f9"
      },
      "source": [
        "take in count that te bins array is bigger than the count array by 1, so I take from the second smallest bin boundary"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "15bbc621-cbaa-c8be-a444-882a3dea0b6c"
      },
      "outputs": [],
      "source": [
        "plt.plot(bins[1:]-5, count, 'ro-')\n",
        "plt.title('Mean Pixel\\'s Value Count')\n",
        "plt.xlabel('Mean Pixel Value')\n",
        "plt.ylabel('Count')"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "941cc935-518b-a745-c346-fa80eb5adbca"
      },
      "outputs": [],
      "source": [
        "sum(count[-2:])"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "_cell_guid": "0c721dee-b2c9-cd65-6725-65ccd25248c2"
      },
      "source": [
        "So, from the 784 features using 14 bins, at least 400 features have values near to 0. Only 37 features have values greather than 119, so there is an option for the dimensional reduction. so lets use PCA for Exploratory Analysis using 35 features (for sake of the square like plots)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "e1c8c37a-d0dd-5cf8-ab5e-8493efab3e08",
        "collapsed": true
      },
      "outputs": [],
      "source": [
        "n_components = 35"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "_cell_guid": "dcb37986-2a82-c908-0c4d-98eaba1a21bc"
      },
      "source": [
        "### Training - test Split"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "bcf7ac30-56c9-d342-75fc-4624d186af33"
      },
      "outputs": [],
      "source": [
        "sc = preprocessing.StandardScaler()\n",
        "df_features_std = sc.fit_transform(df_features)\n",
        "x_train, x_test, y_train, y_test = train_test_split(df_features_std, digits_labels, test_size = 0.25)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "_cell_guid": "090b5dfd-21fc-80db-bb47-90cc5fc8e57f"
      },
      "source": [
        "### Modeling: Dimensionality Reduction"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "_cell_guid": "8c0bd270-13dd-c4d5-bab6-dacef0e6feae"
      },
      "source": [
        "#### Modeling PCA"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "8318b98b-a7c9-f5b9-2c47-48cdf28f78b7"
      },
      "outputs": [],
      "source": [
        "pca_ = PCA(n_components=n_components)\n",
        "pca_.fit(df_features, digits_labels)\n",
        "eigen_val = pca_.components_.reshape(n_components, 28,28)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "31d3b4c9-fefe-9cbc-5ba7-5f19780a244c"
      },
      "outputs": [],
      "source": [
        "n_row = 5\n",
        "n_col = 7\n",
        "fig = plt.figure(figsize=(8,9))\n",
        "for i in range(n_row * n_col):\n",
        "    offset =0\n",
        "    plt.subplot(n_row, n_col, i + 1)\n",
        "    plt.imshow(eigen_val[i].reshape(28,28), cmap='jet')\n",
        "    title_text = 'Eigenvalue ' + str(i + 1)\n",
        "    plt.title(title_text, size=6.5)\n",
        "    plt.xticks(())\n",
        "    plt.yticks(())\n",
        "plt.show()"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "_cell_guid": "dacb565b-5a9b-8ae3-f8f8-5c28a051525e"
      },
      "source": [
        "we can see that the greater is the dimension the greater is the complexity.\n",
        "I Will like to use 7, 21, 35 and 42 features to check their performance on PCA."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "0fdc1910-9797-186e-7a2e-532fb86f6ae1",
        "collapsed": true
      },
      "outputs": [],
      "source": [
        "n_components_ = 7"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "86d7f37c-65eb-a7f8-73e4-a05a13092616",
        "collapsed": true
      },
      "outputs": [],
      "source": [
        "from random import randint\n",
        "colors = []\n",
        "for i in range(10):\n",
        "    colors.append('%06X' % randint(0, 0xFFFFFF))"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "ec1b22e1-d1eb-1dac-1c6e-bef816e140f3"
      },
      "outputs": [],
      "source": [
        "pca_ = PCA(n_components=n_components_)\n",
        "pca_features = pca_.fit_transform(x_train)\n",
        "fig = plt.figure(figsize= (12,12))"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "ce2d42de-d66a-b8a6-4ad5-d5c3196a8250"
      },
      "outputs": [],
      "source": [
        "fig = plt.figure(figsize=(12,8))\n",
        "for i in range(10):\n",
        "    to_plot = pca_features[:2000,:2][y_train[:2000].values==i]\n",
        "    plt.scatter(to_plot[:,0],to_plot[:,1], marker='.', cmap=colors[i])\n",
        "    plt.grid(b='on')"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "_cell_guid": "bea04376-e4be-aea0-72eb-deb86287a1b8"
      },
      "source": [
        "we can see some clusters, but they aren't defined, so let's see how it work with the classifiers"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "b4376991-5031-cf05-c55c-01c1a0e2732a"
      },
      "outputs": [],
      "source": [
        "clfs = [tree.DecisionTreeClassifier(), linear_model.LogisticRegression(),\n",
        "        svm.SVC(C=1000.0), ensemble.RandomForestClassifier(),\n",
        "        linear_model.Perceptron(n_iter=40, eta0=0.1, random_state = 0)]\n",
        "n_components_ = [7,21,35,37]\n",
        "clf_accu = np.zeros((len(clfs), len(n_components_)))\n",
        "print('ready to learn')"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "c3120a00-2b8e-edde-3757-b082dd201104"
      },
      "outputs": [],
      "source": [
        "for i,n_component_ in enumerate(n_components_):\n",
        "    print('----- # of components: %d -----' % (n_component_))\n",
        "    pca_ = PCA(n_components=n_component_)\n",
        "    pca_features = pca_.fit_transform(x_train)\n",
        "    pca_test = pca_.transform(x_test)\n",
        "    for j,clf_ in enumerate(clfs):        \n",
        "        clf_.fit(pca_features,y_train)\n",
        "        y_pred = clf_.predict(pca_test)\n",
        "        #print('Accuracy with %d components: %0.3f' % (n_components_,metrics.accuracy_score(y_test,y_pred)))\n",
        "        clf_accu[j,i] = metrics.accuracy_score(y_test,y_pred)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "e40d2b68-48ca-a1c6-da68-cc20c64ed8d2"
      },
      "outputs": [],
      "source": [
        "fig = plt.figure(figsize=(12,8))\n",
        "colors = ['ro-','yo-','go-','bo-','ko-']\n",
        "ax = fig.add_subplot(111)\n",
        "legends = []\n",
        "for i in range(len(clfs)):\n",
        "    ax.plot(n_components_,clf_accu[i], colors[i])\n",
        "    legends.append(str(type(clfs[i])).strip('>').split('.')[-1])\n",
        "ax.set_title('Classifiers Performance over # of components')\n",
        "ax.set_xlabel('Number of PCA components')\n",
        "ax.set_ylabel('Accuracy')\n",
        "ax.legend(legends)\n",
        "plt.show()"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "_cell_guid": "d8c1bbb1-8556-d7f2-06f6-c955226a8585"
      },
      "source": [
        ""
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "89d6bf0f-c76f-8358-7646-d86e9295756d"
      },
      "outputs": [],
      "source": [
        ""
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "_cell_guid": "eed4e003-31cb-6609-b857-d4d72cd046fc"
      },
      "source": [
        ""
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "_cell_guid": "c4d9bbee-b0ea-19bf-2571-c61e8fd5df17"
      },
      "source": [
        ""
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "8229924e-5412-f91c-ed16-b348a64af6f3"
      },
      "outputs": [],
      "source": [
        ""
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "5bc4bb54-3d3a-0e5a-c23f-db989004f0f8"
      },
      "outputs": [],
      "source": [
        ""
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "_cell_guid": "78b9c616-79e1-4a5e-1843-d17d9c0ec587"
      },
      "source": [
        ""
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "546e1d72-a400-55b0-5c34-a46b61870c40"
      },
      "outputs": [],
      "source": [
        ""
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "_cell_guid": "b12ec392-c2fc-542a-1a2c-f0294f7a07de"
      },
      "source": [
        ""
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "68bb7465-6d75-c3a4-0979-61bf3758b026"
      },
      "outputs": [],
      "source": [
        ""
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "_cell_guid": "c1da264d-b31a-5333-9fb0-2b33184d6356"
      },
      "source": [
        ""
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "_cell_guid": "87d7c708-1e96-9adb-db9c-950d5674ea0a"
      },
      "source": [
        ""
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "_cell_guid": "c7df4544-9625-b422-71ac-a711a0d578c6"
      },
      "source": [
        ""
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "_cell_guid": "a0a26d7e-241d-3a30-4e27-1f80dae8e241"
      },
      "source": [
        ""
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "8fe16a20-fd3d-0407-a8ac-84bd1ed44c2d",
        "collapsed": true
      },
      "outputs": [],
      "source": [
        ""
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "_cell_guid": "345d23cc-fca3-6a06-cdfe-f6fca3546444"
      },
      "source": [
        ""
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "fd5fbb12-cf87-bf56-6059-0a4c49bf1629"
      },
      "outputs": [],
      "source": [
        ""
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "_cell_guid": "ee3e7a19-bfb2-ab20-04f3-69d3f966ebf8"
      },
      "source": [
        ""
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "_cell_guid": "e8e80e7e-d14d-dd1f-94a0-5a3b173e6a2a"
      },
      "source": [
        ""
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "bdf11ae9-7963-caa9-bd4e-421f277de1cf"
      },
      "outputs": [],
      "source": [
        ""
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "_cell_guid": "b07f3f53-5020-4deb-b2c8-0b5860fad564"
      },
      "source": [
        ""
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "_cell_guid": "dac748af-ab82-4200-64f8-c5184578dc6e",
        "collapsed": true
      },
      "source": [
        ""
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "287c79b0-eb55-98c1-491e-8b35627c9363"
      },
      "outputs": [],
      "source": [
        ""
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "_cell_guid": "d81539f7-8f17-f679-98d7-dc409ce52437"
      },
      "source": [
        ""
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "_cell_guid": "ac2fb267-3069-e10e-0566-ee3ba86e37b0"
      },
      "source": [
        ""
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "_cell_guid": "e9e165c5-897e-0cf8-aa66-f2f17948374a"
      },
      "source": [
        ""
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "e7191a5a-3184-11dc-d4e8-8bc533726bda"
      },
      "outputs": [],
      "source": [
        ""
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "688190f3-07df-b666-b5f4-0ee8cf6eeadf"
      },
      "outputs": [],
      "source": [
        ""
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "_cell_guid": "6fc2e126-eab1-892d-a0e3-73b765acb07e"
      },
      "source": [
        ""
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "bf7aa28f-7f1e-6f46-fb73-ea3b67114db1"
      },
      "outputs": [],
      "source": [
        ""
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "ce723ed8-cdec-b803-bbc8-92e0110f3dd8"
      },
      "outputs": [],
      "source": [
        ""
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "_cell_guid": "8cd43abc-57cc-0ab4-0578-5c04d180487f"
      },
      "source": [
        ""
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "15646a41-cf70-0af3-0635-a6f9fcdfd54d",
        "collapsed": true
      },
      "outputs": [],
      "source": [
        ""
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "_cell_guid": "78f638ce-9a6e-b6da-52d5-3ecec8b874a6"
      },
      "source": [
        ""
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "10dfdfc7-a881-e9ae-a235-29b81973bdb7"
      },
      "outputs": [],
      "source": [
        ""
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "_cell_guid": "7ff561a4-6f9d-6d22-82f7-5c0e5a147bb8"
      },
      "source": [
        ""
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "_cell_guid": "c40ff95a-1e99-32d0-5647-dd8606caf660"
      },
      "source": [
        ""
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "8b7eaad1-7fea-6ad8-4377-4b508d7da685"
      },
      "outputs": [],
      "source": [
        ""
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "3a1fecd4-5a0b-dd3f-6984-707133ad6adc"
      },
      "outputs": [],
      "source": [
        ""
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "_cell_guid": "2c1ca95b-e614-476c-0e24-e921143c370e"
      },
      "source": [
        ""
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "77a6577a-0b3c-551b-d643-a875f64a0fdd",
        "collapsed": true
      },
      "outputs": [],
      "source": [
        ""
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "2fe1f259-8a31-1011-4f59-c969de326ca7",
        "collapsed": true
      },
      "outputs": [],
      "source": [
        ""
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "fb855466-cede-2ad7-3bdd-b8c72495e8c7"
      },
      "outputs": [],
      "source": [
        ""
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "a38366e0-295a-debf-f4be-0952cb9278ea"
      },
      "outputs": [],
      "source": [
        ""
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "_cell_guid": "f3f953b1-2d1a-3238-091d-ef827754e0d8"
      },
      "source": [
        ""
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "b38b8d9d-5d75-76d5-bfc2-e0176184b034"
      },
      "outputs": [],
      "source": [
        ""
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "27583891-2355-fda6-fcb4-fd52221c0482"
      },
      "outputs": [],
      "source": [
        ""
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "476e6356-7f80-b78b-d452-561f71b2dabf"
      },
      "outputs": [],
      "source": [
        ""
      ]
    }
  ],
  "metadata": {
    "_change_revision": 0,
    "_is_fork": 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.0"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}