"""
### Информация о тестовой выборке ###
"""
import pandas as pd
import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
train=pd.read_csv('../input/titanic/train.csv')
train.shape
train.head()
# Проверка наличия пропусков
train.isnull().sum()
# Статистика целевой переменной
train['Survived'].value_counts()
train['Survived'].value_counts(normalize=True)
# Общая информация о числовых признаках
train.describe()
train['Sex'].value_counts()
"""
### Обработка признаков
"""
# Кодирование категориальных признаков
embark=pd.get_dummies(train['Embarked'])
gender=pd.get_dummies(train['Sex'])
# Пропуски возраста заполняются средним значением 30
train['Age'].fillna(30,inplace=True)
train['Age']=train['Age'].astype('int')
# Возраст разделен на 6 категорий
def age_grp(age):
    if age<13:
        return '<13'
    elif (age>=13) &(age<18):
        return '13-18'
    elif (age>=18) &(age<=24):
        return '18-24'
    elif (age>=25) &(age<=34):
        return '25-34'
    elif (age>=35) &(age<=44):
        return '35-44'
    else:
        return '45+'
train['Age_grp']=train['Age'].apply(lambda x: age_grp(x))
age=pd.get_dummies(train['Age_grp'])
train_df=pd.concat([train,embark,gender,age],axis=1)
train_df.columns
def is_var(val):
    if val>0:
        return 1
    else:
        return 0
# Добавление нового признака - Family - количество членов одной семьи на Титанике
train_df['Family']=train_df['Parch'] + 1 + train_df['SibSp']
train_df['Parch']=train_df['Parch'].apply(lambda x: is_var(x))
train_df['SibSp']=train_df['SibSp'].apply(lambda x: is_var(x))
sel_cols=['Fare', 
    'Pclass', 'SibSp',
       'Parch',  'C', 'Q',
       'S', 'female', 'male', '18-24', '25-34', '35-44', '45+', '<13','13-18', 'Family'
]
train_df.fillna(0,inplace=True)
X=train_df[sel_cols]
y=train_df['Survived']
train_X,val_X,train_y,val_y=train_test_split(X,y,test_size=0.3,random_state=1)
"""
### Логистическая регрессия ###
"""
lr=LogisticRegression(max_iter=400)
lr.fit(train_X,train_y)
lr.score(train_X,train_y)
lr.score(val_X,val_y)
"""
### Предсказание на тестовых данных ###
"""
test=pd.read_csv('../input/titanic/test.csv')
test.shape
test.columns
# Обработка аналогично обучающей выборке
embark=pd.get_dummies(test['Embarked'])
gender=pd.get_dummies(test['Sex'])
test['Age'].fillna(30,inplace=True)
test['Age']=test['Age'].astype('int')
test['Age_grp']=test['Age'].apply(lambda x: age_grp(x))
age=pd.get_dummies(test['Age_grp'])
test_df=pd.concat([test,embark,gender,age],axis=1)
test_df['Family']=test_df['Parch']+1+test_df['SibSp']
test_df['Parch']=test_df['Parch'].apply(lambda x: is_var(x))
test_df['SibSp']=test_df['SibSp'].apply(lambda x: is_var(x))
test_df.fillna(0,inplace=True)
test_X=test_df[sel_cols]
test_X.columns
test_y=lr.predict(test_X)
"""
### Создание файла для отправки на Kaggle ###
"""
sub=pd.read_csv('../input/titanic/gender_submission.csv')
sub['Survived']=test_y
sub.head()
sub.to_csv('submission.csv',index=False)