import pandas
import scipy 
from sklearn.linear_model import LogisticRegression as Classifier

def pre_process_df(inp_raw):
    inp = inp_raw.copy(deep=True)
    # u'PassengerId'
    # inp.drop('PassengerId', axis=1, inplace=True)
    # u'Survived'
    # u'Pclass'
    col = 'Pclass'
    for i in inp[col].unique():
        if not pandas.isnull(i):
          inp[col+'_%i'%i] = inp[col].apply(lambda x: 1.0 if x==i else 0.0)
    inp.drop(col, axis=1, inplace=True)
    # u'Name'
    inp.drop('Name', axis=1, inplace=True)
    # u'Sex'
    inp.Sex = inp.Sex.apply(lambda x:
                            0.0 if x=='male' else
                            1.0 if x=='female' else 0.5)
    # u'Age'
    col = 'Age'
    inp[col].fillna(inp[col].mean(), inplace=True)
    # u'SibSp'
    col = 'SibSp'
    inp[col].fillna(inp[col].mean(), inplace=True)
    # u'Parch'
    col = 'Parch'
    inp[col].fillna(inp[col].mean(), inplace=True)
    # FamSize
    inp.FamSize = inp.SibSp + inp.Parch
    # u'Ticket'
    inp.drop('Ticket', axis=1, inplace=True)
    # u'Fare'
    col = 'Fare'
    inp[col].fillna(inp[col].mean(), inplace=True)
    # u'Cabin'
    col = 'Cabin'
    temp = inp.Cabin.apply(lambda x: x[:1] if not pandas.isnull(x) else scipy.nan)
    for i in temp.unique():
        if not pandas.isnull(i):
          inp[col+'_%s'%i] = temp.apply(lambda x: 1.0 if x==i else 0.0)
    inp.drop(col, axis=1, inplace=True)
    # u'Embarked'
    col = 'Embarked'
    for i in inp[col].unique():
        if not pandas.isnull(i):
          inp[col+'_%s'%i] = inp[col].apply(lambda x: 1.0 if x==i else 0.0)
    inp.drop(col, axis=1, inplace=True)
    return inp



def main():
    train_df = pandas.read_csv('../input/train.csv', dtype={"Age": np.float64},)
    test_df = pandas.read_csv('../input/test.csv', dtype={"Age": np.float64},).merge(
        pandas.read_csv('../input/gender_submission.csv'),
        on='PassengerId')

    train_df = pre_process_df(train_df)
    test_df = pre_process_df(test_df)

    for i in set(list(train_df.columns)+list(test_df)):
        for df in [train_df, test_df]:
            if i not in df.columns:
                df[i]=0.0

    # train_df = post_process_df(train_df)
    # test_df = post_process_df(test_df)


    x_train = train_df.drop("Survived", axis=1).drop("PassengerId", axis=1)
    y_train = train_df["Survived"]
    x_test = test_df.drop("Survived", axis=1).drop("PassengerId", axis=1)
    y_test = test_df["Survived"]



    classifier =  Classifier()
    classifier.fit(x_train, y_train)
    y_pred = classifier.predict(x_test)
   
    print('%23s'%classifier.__class__.__name__, 
            round(classifier.score(x_train, y_train) * 100, 2),
            round(classifier.score(x_test, y_test) * 100, 2))

    submission = pandas.DataFrame({
        "PassengerId": test_df["PassengerId"],
        "Survived": y_pred
    })
    submission.to_csv('../output/submission.csv', index=False)


