diff --git a/Solutions.ipynb b/Solutions.ipynb
index 2f255e8..776c763 100644
--- a/Solutions.ipynb
+++ b/Solutions.ipynb
@@ -1,5 +1,139629 @@
{
"cells": [
+ {
+ "cell_type": "markdown",
+ "id": "f85f6b9e",
+ "metadata": {},
+ "source": [
+ "# Lab | Cleaning numerical data"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e058abdc",
+ "metadata": {},
+ "source": [
+ "For this lab, we will be using the dataset in the Customer Analysis Business Case. This dataset can be found in files_for_lab folder."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "ce316d8a",
+ "metadata": {},
+ "source": [
+ "### 1. Import the necessary libraries."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "4b50c2f3",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import pandas as pd\n",
+ "import re\n",
+ "import pandas as pd\n",
+ "import numpy as np\n",
+ "import re\n",
+ "import matplotlib.pyplot as plt\n",
+ "import seaborn as sns\n",
+ "from datetime import datetime\n",
+ "import scipy.stats as stats"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "445f4cd7",
+ "metadata": {},
+ "source": [
+ "### 2. Load the we_fn_use_c_marketing_customer_value_analysis.csv into the variable customer_df."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "id": "a1129754",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "customer_df = pd.read_csv(\"/Users/ignaciolorenzoqueralt/Documents/Ironhack/labs/lab-cleaning-numerical-data/files_for_lab/we_fn_use_c_marketing_customer_value_analysis.csv\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "5040316b",
+ "metadata": {},
+ "source": [
+ "### 3. First look at its main features (head, shape, info)."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "0d867b71",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " Customer | \n",
+ " State | \n",
+ " Customer Lifetime Value | \n",
+ " Response | \n",
+ " Coverage | \n",
+ " Education | \n",
+ " Effective To Date | \n",
+ " EmploymentStatus | \n",
+ " Gender | \n",
+ " Income | \n",
+ " ... | \n",
+ " Months Since Policy Inception | \n",
+ " Number of Open Complaints | \n",
+ " Number of Policies | \n",
+ " Policy Type | \n",
+ " Policy | \n",
+ " Renew Offer Type | \n",
+ " Sales Channel | \n",
+ " Total Claim Amount | \n",
+ " Vehicle Class | \n",
+ " Vehicle Size | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " BU79786 | \n",
+ " Washington | \n",
+ " 2763.519279 | \n",
+ " No | \n",
+ " Basic | \n",
+ " Bachelor | \n",
+ " 2/24/11 | \n",
+ " Employed | \n",
+ " F | \n",
+ " 56274 | \n",
+ " ... | \n",
+ " 5 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " Corporate Auto | \n",
+ " Corporate L3 | \n",
+ " Offer1 | \n",
+ " Agent | \n",
+ " 384.811147 | \n",
+ " Two-Door Car | \n",
+ " Medsize | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " QZ44356 | \n",
+ " Arizona | \n",
+ " 6979.535903 | \n",
+ " No | \n",
+ " Extended | \n",
+ " Bachelor | \n",
+ " 1/31/11 | \n",
+ " Unemployed | \n",
+ " F | \n",
+ " 0 | \n",
+ " ... | \n",
+ " 42 | \n",
+ " 0 | \n",
+ " 8 | \n",
+ " Personal Auto | \n",
+ " Personal L3 | \n",
+ " Offer3 | \n",
+ " Agent | \n",
+ " 1131.464935 | \n",
+ " Four-Door Car | \n",
+ " Medsize | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " AI49188 | \n",
+ " Nevada | \n",
+ " 12887.431650 | \n",
+ " No | \n",
+ " Premium | \n",
+ " Bachelor | \n",
+ " 2/19/11 | \n",
+ " Employed | \n",
+ " F | \n",
+ " 48767 | \n",
+ " ... | \n",
+ " 38 | \n",
+ " 0 | \n",
+ " 2 | \n",
+ " Personal Auto | \n",
+ " Personal L3 | \n",
+ " Offer1 | \n",
+ " Agent | \n",
+ " 566.472247 | \n",
+ " Two-Door Car | \n",
+ " Medsize | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
3 rows × 24 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Customer State Customer Lifetime Value Response Coverage Education \\\n",
+ "0 BU79786 Washington 2763.519279 No Basic Bachelor \n",
+ "1 QZ44356 Arizona 6979.535903 No Extended Bachelor \n",
+ "2 AI49188 Nevada 12887.431650 No Premium Bachelor \n",
+ "\n",
+ " Effective To Date EmploymentStatus Gender Income ... \\\n",
+ "0 2/24/11 Employed F 56274 ... \n",
+ "1 1/31/11 Unemployed F 0 ... \n",
+ "2 2/19/11 Employed F 48767 ... \n",
+ "\n",
+ " Months Since Policy Inception Number of Open Complaints Number of Policies \\\n",
+ "0 5 0 1 \n",
+ "1 42 0 8 \n",
+ "2 38 0 2 \n",
+ "\n",
+ " Policy Type Policy Renew Offer Type Sales Channel \\\n",
+ "0 Corporate Auto Corporate L3 Offer1 Agent \n",
+ "1 Personal Auto Personal L3 Offer3 Agent \n",
+ "2 Personal Auto Personal L3 Offer1 Agent \n",
+ "\n",
+ " Total Claim Amount Vehicle Class Vehicle Size \n",
+ "0 384.811147 Two-Door Car Medsize \n",
+ "1 1131.464935 Four-Door Car Medsize \n",
+ "2 566.472247 Two-Door Car Medsize \n",
+ "\n",
+ "[3 rows x 24 columns]"
+ ]
+ },
+ "execution_count": 3,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "customer_df.head(3)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "id": "941ba5f9",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(9134, 24)"
+ ]
+ },
+ "execution_count": 4,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "customer_df.shape"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "id": "4eb75a9a",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 5,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "customer_df.info"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "407e1d74",
+ "metadata": {},
+ "source": [
+ "### 4. Rename the columns so they follow the PE8 (snake case)."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "id": "03540b59",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " customer | \n",
+ " state | \n",
+ " customer_lifetime_value | \n",
+ " response | \n",
+ " coverage | \n",
+ " education | \n",
+ " effective_to_date | \n",
+ " employmentstatus | \n",
+ " gender | \n",
+ " income | \n",
+ " ... | \n",
+ " months_since_policy_inception | \n",
+ " number_of_open_complaints | \n",
+ " number_of_policies | \n",
+ " policy_type | \n",
+ " policy | \n",
+ " renew_offer_type | \n",
+ " sales_channel | \n",
+ " total_claim_amount | \n",
+ " vehicle_class | \n",
+ " vehicle_size | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " BU79786 | \n",
+ " Washington | \n",
+ " 2763.519279 | \n",
+ " No | \n",
+ " Basic | \n",
+ " Bachelor | \n",
+ " 2/24/11 | \n",
+ " Employed | \n",
+ " F | \n",
+ " 56274 | \n",
+ " ... | \n",
+ " 5 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " Corporate Auto | \n",
+ " Corporate L3 | \n",
+ " Offer1 | \n",
+ " Agent | \n",
+ " 384.811147 | \n",
+ " Two-Door Car | \n",
+ " Medsize | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " QZ44356 | \n",
+ " Arizona | \n",
+ " 6979.535903 | \n",
+ " No | \n",
+ " Extended | \n",
+ " Bachelor | \n",
+ " 1/31/11 | \n",
+ " Unemployed | \n",
+ " F | \n",
+ " 0 | \n",
+ " ... | \n",
+ " 42 | \n",
+ " 0 | \n",
+ " 8 | \n",
+ " Personal Auto | \n",
+ " Personal L3 | \n",
+ " Offer3 | \n",
+ " Agent | \n",
+ " 1131.464935 | \n",
+ " Four-Door Car | \n",
+ " Medsize | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " AI49188 | \n",
+ " Nevada | \n",
+ " 12887.431650 | \n",
+ " No | \n",
+ " Premium | \n",
+ " Bachelor | \n",
+ " 2/19/11 | \n",
+ " Employed | \n",
+ " F | \n",
+ " 48767 | \n",
+ " ... | \n",
+ " 38 | \n",
+ " 0 | \n",
+ " 2 | \n",
+ " Personal Auto | \n",
+ " Personal L3 | \n",
+ " Offer1 | \n",
+ " Agent | \n",
+ " 566.472247 | \n",
+ " Two-Door Car | \n",
+ " Medsize | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
3 rows × 24 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " customer state customer_lifetime_value response coverage education \\\n",
+ "0 BU79786 Washington 2763.519279 No Basic Bachelor \n",
+ "1 QZ44356 Arizona 6979.535903 No Extended Bachelor \n",
+ "2 AI49188 Nevada 12887.431650 No Premium Bachelor \n",
+ "\n",
+ " effective_to_date employmentstatus gender income ... \\\n",
+ "0 2/24/11 Employed F 56274 ... \n",
+ "1 1/31/11 Unemployed F 0 ... \n",
+ "2 2/19/11 Employed F 48767 ... \n",
+ "\n",
+ " months_since_policy_inception number_of_open_complaints number_of_policies \\\n",
+ "0 5 0 1 \n",
+ "1 42 0 8 \n",
+ "2 38 0 2 \n",
+ "\n",
+ " policy_type policy renew_offer_type sales_channel \\\n",
+ "0 Corporate Auto Corporate L3 Offer1 Agent \n",
+ "1 Personal Auto Personal L3 Offer3 Agent \n",
+ "2 Personal Auto Personal L3 Offer1 Agent \n",
+ "\n",
+ " total_claim_amount vehicle_class vehicle_size \n",
+ "0 384.811147 Two-Door Car Medsize \n",
+ "1 1131.464935 Four-Door Car Medsize \n",
+ "2 566.472247 Two-Door Car Medsize \n",
+ "\n",
+ "[3 rows x 24 columns]"
+ ]
+ },
+ "execution_count": 6,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "def standardize_headers(df):\n",
+ " df.columns = df.columns.str.lower().str.replace(' ', '_')\n",
+ "standardize_headers(customer_df)\n",
+ "\n",
+ "customer_df.head(3)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "30a9d36f",
+ "metadata": {},
+ "source": [
+ "### 5. Change effective to date column to datetime format."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "id": "cd0ce652",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "customer_df['effective_to_date'] = pd.to_datetime(customer_df['effective_to_date'])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "id": "57b9b87f",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " customer | \n",
+ " state | \n",
+ " customer_lifetime_value | \n",
+ " response | \n",
+ " coverage | \n",
+ " education | \n",
+ " effective_to_date | \n",
+ " employmentstatus | \n",
+ " gender | \n",
+ " income | \n",
+ " ... | \n",
+ " months_since_policy_inception | \n",
+ " number_of_open_complaints | \n",
+ " number_of_policies | \n",
+ " policy_type | \n",
+ " policy | \n",
+ " renew_offer_type | \n",
+ " sales_channel | \n",
+ " total_claim_amount | \n",
+ " vehicle_class | \n",
+ " vehicle_size | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " BU79786 | \n",
+ " Washington | \n",
+ " 2763.519279 | \n",
+ " No | \n",
+ " Basic | \n",
+ " Bachelor | \n",
+ " 2011-02-24 | \n",
+ " Employed | \n",
+ " F | \n",
+ " 56274 | \n",
+ " ... | \n",
+ " 5 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " Corporate Auto | \n",
+ " Corporate L3 | \n",
+ " Offer1 | \n",
+ " Agent | \n",
+ " 384.811147 | \n",
+ " Two-Door Car | \n",
+ " Medsize | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " QZ44356 | \n",
+ " Arizona | \n",
+ " 6979.535903 | \n",
+ " No | \n",
+ " Extended | \n",
+ " Bachelor | \n",
+ " 2011-01-31 | \n",
+ " Unemployed | \n",
+ " F | \n",
+ " 0 | \n",
+ " ... | \n",
+ " 42 | \n",
+ " 0 | \n",
+ " 8 | \n",
+ " Personal Auto | \n",
+ " Personal L3 | \n",
+ " Offer3 | \n",
+ " Agent | \n",
+ " 1131.464935 | \n",
+ " Four-Door Car | \n",
+ " Medsize | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " AI49188 | \n",
+ " Nevada | \n",
+ " 12887.431650 | \n",
+ " No | \n",
+ " Premium | \n",
+ " Bachelor | \n",
+ " 2011-02-19 | \n",
+ " Employed | \n",
+ " F | \n",
+ " 48767 | \n",
+ " ... | \n",
+ " 38 | \n",
+ " 0 | \n",
+ " 2 | \n",
+ " Personal Auto | \n",
+ " Personal L3 | \n",
+ " Offer1 | \n",
+ " Agent | \n",
+ " 566.472247 | \n",
+ " Two-Door Car | \n",
+ " Medsize | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
3 rows × 24 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " customer state customer_lifetime_value response coverage education \\\n",
+ "0 BU79786 Washington 2763.519279 No Basic Bachelor \n",
+ "1 QZ44356 Arizona 6979.535903 No Extended Bachelor \n",
+ "2 AI49188 Nevada 12887.431650 No Premium Bachelor \n",
+ "\n",
+ " effective_to_date employmentstatus gender income ... \\\n",
+ "0 2011-02-24 Employed F 56274 ... \n",
+ "1 2011-01-31 Unemployed F 0 ... \n",
+ "2 2011-02-19 Employed F 48767 ... \n",
+ "\n",
+ " months_since_policy_inception number_of_open_complaints number_of_policies \\\n",
+ "0 5 0 1 \n",
+ "1 42 0 8 \n",
+ "2 38 0 2 \n",
+ "\n",
+ " policy_type policy renew_offer_type sales_channel \\\n",
+ "0 Corporate Auto Corporate L3 Offer1 Agent \n",
+ "1 Personal Auto Personal L3 Offer3 Agent \n",
+ "2 Personal Auto Personal L3 Offer1 Agent \n",
+ "\n",
+ " total_claim_amount vehicle_class vehicle_size \n",
+ "0 384.811147 Two-Door Car Medsize \n",
+ "1 1131.464935 Four-Door Car Medsize \n",
+ "2 566.472247 Two-Door Car Medsize \n",
+ "\n",
+ "[3 rows x 24 columns]"
+ ]
+ },
+ "execution_count": 8,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "customer_df.head(3)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "60e33cbe",
+ "metadata": {},
+ "source": [
+ "### 6. Check NaN values per column."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "id": "f7a53dd5",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "customer 0\n",
+ "state 0\n",
+ "customer_lifetime_value 0\n",
+ "response 0\n",
+ "coverage 0\n",
+ "education 0\n",
+ "effective_to_date 0\n",
+ "employmentstatus 0\n",
+ "gender 0\n",
+ "income 0\n",
+ "location_code 0\n",
+ "marital_status 0\n",
+ "monthly_premium_auto 0\n",
+ "months_since_last_claim 0\n",
+ "months_since_policy_inception 0\n",
+ "number_of_open_complaints 0\n",
+ "number_of_policies 0\n",
+ "policy_type 0\n",
+ "policy 0\n",
+ "renew_offer_type 0\n",
+ "sales_channel 0\n",
+ "total_claim_amount 0\n",
+ "vehicle_class 0\n",
+ "vehicle_size 0\n",
+ "dtype: int64\n"
+ ]
+ }
+ ],
+ "source": [
+ "def count_null(df):\n",
+ " print(df.isnull().sum())\n",
+ "count_null(customer_df)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "b00cdcc1",
+ "metadata": {},
+ "source": [
+ "### 7. Define a function that differentiates between continuous and discrete variables. Hint: A number of unique values might be useful. Store continuous data into a continuous variable and do the same for discrete and categorical."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "id": "bde19dcd",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def continuous_or_discrete(df):\n",
+ " number_unique = 0\n",
+ " cont = []\n",
+ " disc_cat = []\n",
+ " for c in df.columns:\n",
+ " number_unique = df[c].nunique()\n",
+ " if number_unique > 10:\n",
+ " cont.append(c)\n",
+ " else:\n",
+ " disc_cat.append(c)\n",
+ " print(cont, \"\\n\")\n",
+ " print(disc_cat)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "id": "23d916da",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "['customer', 'customer_lifetime_value', 'effective_to_date', 'income', 'monthly_premium_auto', 'months_since_last_claim', 'months_since_policy_inception', 'total_claim_amount'] \n",
+ "\n",
+ "['state', 'response', 'coverage', 'education', 'employmentstatus', 'gender', 'location_code', 'marital_status', 'number_of_open_complaints', 'number_of_policies', 'policy_type', 'policy', 'renew_offer_type', 'sales_channel', 'vehicle_class', 'vehicle_size']\n"
+ ]
+ }
+ ],
+ "source": [
+ "continuous_or_discrete(customer_df)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "3f193f28",
+ "metadata": {},
+ "source": [
+ "### 8. For the categorical data, check if there is some kind of text in a variable so we would need to clean it. Hint: Use the same method you used in step 7. Depending on the implementation, decide what to do with the variables you get."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "id": "16578fb4",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def detect_text(df):\n",
+ " text_variables = []\n",
+ " cat = df.select_dtypes('object')\n",
+ " for c in cat.columns:\n",
+ " for x in cat[c]:\n",
+ " print(re.search(\"\\w\", x))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "id": "94d520b1",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "