{
  "cells": [
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "474cb36d-9bd4-6878-e2f5-c83178862f29"
      },
      "outputs": [],
      "source": [
        "import numpy as np\n",
        "import pandas as pd"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "10c21343-5962-75cb-7d19-d4fff5bb884f"
      },
      "outputs": [],
      "source": [
        "# Loading datasets\n",
        "train_df = pd.read_csv('../input/train.csv')\n",
        "test_df = pd.read_csv('../input/test.csv')\n",
        "combine = [train_df, test_df]\n",
        "\n",
        "passenger_ids = test_df['PassengerId']"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "e6546039-1fee-cd93-3896-1adc33308ad9"
      },
      "outputs": [],
      "source": [
        "# Estimating missing values\n",
        "# Feature: Age\n",
        "guess_age_df = train_df[['Sex', 'Pclass', 'Age']].groupby(['Sex', 'Pclass']).median()\n",
        "guess_age_df = guess_age_df.reset_index()\n",
        "\n",
        "for dataset in combine:\n",
        "    for sex in ['male', 'female']:\n",
        "        for pclass in [1, 2, 3]:\n",
        "            dataset.loc[ (dataset['Age'].isnull()) & (dataset['Sex'] == sex) & \\\n",
        "                         (dataset['Pclass'] == pclass), 'Age' ] = \\\n",
        "            guess_age_df.loc[ (guess_age_df['Sex'] == sex) & \\\n",
        "                              (guess_age_df['Pclass'] == pclass), 'Age'].values[0]\n",
        "\n",
        "# Feature: Embarked\n",
        "guess_embarked = train_df['Embarked'].mode()[0]\n",
        "for dataset in combine:\n",
        "    dataset['Embarked'].fillna( guess_embarked, inplace=True )\n",
        "\n",
        "# Feature: Fare\n",
        "guess_fare = train_df['Fare'].median()\n",
        "for dataset in combine:\n",
        "    dataset['Fare'].fillna( guess_fare, inplace=True )"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "2b7f7af0-f9f9-de20-37bd-1cea2df4fb4f"
      },
      "outputs": [],
      "source": [
        "# Obtaining new features\n",
        "# Title\n",
        "for dataset in combine:\n",
        "    # creates it\n",
        "    dataset['Title'] = dataset['Name'].str.extract(', (\\w+)\\.', expand=True)\n",
        "\n",
        "    # replace some values\n",
        "    dataset['Title'] = dataset['Title'].replace(['Capt', 'Col', 'Don', 'Dr', 'Jonkheer',\\\n",
        "                                                 'Lady', 'Major', 'Rev', 'Sir'], 'Rare')\n",
        "    dataset['Title'] = dataset['Title'].replace(['Mlle', 'Ms'], 'Miss')\n",
        "    dataset['Title'] = dataset['Title'].replace('Mme', 'Mrs')\n",
        "\n",
        "    # transform it to numerical\n",
        "    dataset['Title'] = dataset['Title'].map({'Master': 1, 'Miss': 2, 'Mr': 3, \\\n",
        "                                            'Mrs': 4, 'Rare': 5})\n",
        "    dataset['Title'] = dataset['Title'].fillna(0).astype(int)\n",
        "\n",
        "# AgeBand\n",
        "for dataset in combine:\n",
        "    dataset['AgeBand'] = pd.cut(train_df['Age'], 5)\n",
        "    \n",
        "    # discretizing\n",
        "    for index, value in enumerate(train_df['AgeBand'].unique()):\n",
        "        dataset.loc[ dataset['AgeBand'] == value, 'Age' ] = index\n",
        "\n",
        "# Creating new feature: FamilySize\n",
        "for dataset in combine:\n",
        "    dataset['FamilySize'] = dataset['SibSp'] + dataset['Parch'] + 1\n",
        "    \n",
        "# Discretize continuous features: Age\n",
        "for dataset in combine:\n",
        "    dataset['FareBand'] = pd.cut(train_df['Fare'], 4)\n",
        "    \n",
        "    # discretizing\n",
        "    for index, value in enumerate(train_df['FareBand'].unique()):\n",
        "        dataset.loc[ dataset['FareBand'] == value, 'Fare' ] = index"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "bb0b4919-2e6f-d2a3-036a-5362450eb613"
      },
      "outputs": [],
      "source": [
        "# Dropping features\n",
        "drop_columns = ['Ticket', 'Cabin', 'PassengerId', 'Name', 'AgeBand', 'SibSp', 'Parch', 'FareBand']\n",
        "\n",
        "train_df = train_df.drop(drop_columns, axis=1)\n",
        "test_df = test_df.drop(drop_columns, axis=1)\n",
        "\n",
        "combine = [train_df, test_df]"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "e6676c31-0548-c6dd-3772-64a20d3ccffe"
      },
      "outputs": [],
      "source": [
        "print(test_df['Fare'].isnull().any())\n",
        "\n",
        "train_df.head()"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "74df3948-7274-a02b-125f-80702640178b"
      },
      "outputs": [],
      "source": [
        "# Mapping features to numerical\n",
        "for dataset in combine:\n",
        "    # Feature: Sex\n",
        "    dataset['Sex'] = dataset['Sex'].map({'male': 0, 'female': 1})\n",
        "    # Embarked\n",
        "    dataset['Embarked'] = dataset['Embarked'].map({'C': 0, 'Q': 1, 'S': 2})\n",
        "    \n",
        "for dataset in combine:\n",
        "    dataset['Sex'] = dataset['Sex'].astype(int)\n",
        "    dataset['Age'] = dataset['Embarked'].astype(int)\n",
        "    dataset['Age'] = dataset['Age'].astype(int)\n",
        "    dataset['Fare'] = dataset['Fare'].astype(int)\n",
        "    dataset['Title'] = dataset['Title'].astype(int)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "0e673fec-4edf-ea83-3926-60f632ba3f8b"
      },
      "outputs": [],
      "source": [
        "from sklearn.cross_validation import train_test_split\n",
        "\n",
        "train, test = train_test_split(train_df, train_size=0.8)\n",
        "\n",
        "X_train = train.drop('Survived', axis=1)\n",
        "y_train = train['Survived']\n",
        "X_test = test.drop('Survived', axis=1)\n",
        "y_test = test['Survived']"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "91e2a129-506d-869e-ed02-28d327c125e5"
      },
      "outputs": [],
      "source": [
        "from sklearn.ensemble import RandomForestClassifier\n",
        "\n",
        "random_forest = RandomForestClassifier()\n",
        "random_forest.fit(X_train, y_train)\n",
        "random_forest.score(X_test, y_test)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "5e3b6823-cdd6-2f62-c347-5243e336d9f7"
      },
      "outputs": [],
      "source": [
        "final_clf = RandomForestClassifier()\n",
        "final_clf.fit(train_df.drop('Survived', axis=1), train_df['Survived'])\n",
        "predictions = final_clf.predict(test_df)\n",
        "\n",
        "submission_df = pd.DataFrame({ 'PassengerId': passenger_ids, 'Survived': predictions})\n",
        "submission_df"
      ]
    }
  ],
  "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
}