import numpy as np
import pandas as pd
from numpy import genfromtxt
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import BaggingClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.model_selection import ShuffleSplit

# Read in train/test sets
train = pd.read_csv('../input/train.csv', header=0,sep=',')
test = pd.read_csv('../input/test.csv', header=0,sep=',')




##### Fields to copy since we need them later but they must be dropped from train/test
# Copy yTrain
yTrain = train['Survived'].copy()

# Copy Ids from test so we can create the csv file
ids = test['PassengerId'].copy()
#####



##### Cleaning the data in this section, giving labels values
# Replace nan values in Embarked feature
train['Embarked'] = train['Embarked'].fillna('N')
test['Embarked'] = train['Embarked'].fillna('N')

# Replace nan values in Fare feature
train['Fare'] = train['Fare'].fillna(-1)
test['Fare'] = train['Fare'].fillna(-1)

# Replace nan values in Age feature
train['Age'] = train['Age'].fillna(-1)
test['Age'] = test['Age'].fillna(-1)

# Change male to 0 and female to 1
train['Sex'].replace(['male','female'],[0,1],inplace=True)
train['Sex'].astype(dtype='int64')
test['Sex'].replace(['male','female'],[0,1],inplace=True)
test['Sex'].astype(dtype='int64')


# Replace Name with labels depending on title
for item in train['Name']:
    if "Mr." in item:
        train['Name'].replace(item, 0,inplace=True)
    elif "Master." in item:
        train['Name'].replace(item, 1,inplace=True)
    elif "Miss." in item:
        train['Name'].replace(item, 2,inplace=True)
    elif "Mrs." in item:
        train['Name'].replace(item, 3,inplace=True)
    elif "Sir." in item:
        train['Name'].replace(item, 3,inplace=True)
    elif "Dr." in item:
        train['Name'].replace(item, 3,inplace=True)
    else:
        train['Name'].replace(item, 4,inplace=True)
train['Name'].astype(dtype='int64')

for item in test['Name']:
    if "Mr." in item:
        test['Name'].replace(item, 0,inplace=True)
    elif "Master." in item:
        test['Name'].replace(item, 1,inplace=True)
    elif "Miss." in item:
        test['Name'].replace(item, 2,inplace=True)
    elif "Mrs." in item:
        test['Name'].replace(item, 3,inplace=True)
    elif "Sir." in item:
        test['Name'].replace(item, 3,inplace=True)
    elif "Dr." in item:
        test['Name'].replace(item, 3,inplace=True)
    else:
        test['Name'].replace(item, 4,inplace=True)
test['Name'].astype(dtype='int64')


# replace values in embarked field with labels 
train['Embarked'].replace(['S','C','Q','N'],[0,1,2,4],inplace=True)
train['Embarked'].astype(dtype='int64')
test['Embarked'].replace(['S','C','Q','N'],[0,1,2,4],inplace=True)
test['Embarked'].astype(dtype='int64')
#####



##### Must drop fields that we aren't going to use
# Drop Cabin and Ticket fields
train.drop('Cabin',axis=1,inplace=True)  
train.drop('Ticket',axis=1,inplace=True)  
test.drop('Cabin',axis=1,inplace=True)  
test.drop('Ticket',axis=1,inplace=True)  

# Drop the feature containing yTrain 
train.drop('Survived',axis=1,inplace=True)
#####


#test.drop('PassengerId',axis=1,inplace=True)
#train.drop('PassengerId',axis=1,inplace=True)

train.info()
test.info()

randforest = RandomForestClassifier(n_estimators=500,max_features='sqrt')
clf = BaggingClassifier(randforest, n_estimators=20)
clf.fit(train, yTrain)

score = cross_val_score(clf, train, yTrain).mean()

ypred = clf.predict(test)

print(score)

test = pd.DataFrame( { 'PassengerId': ids, 'Survived': ypred } )
test.shape
test.head()
test.to_csv( 'titanic_pred.csv' , index = False )



