import numpy as np
# Import the linear regression class
from sklearn.linear_model import LogisticRegressionCV
# Sklearn also has a helper that makes it easy to do cross-validation
from sklearn.cross_validation import KFold

import pandas

# We can use the pandas library in Python to read in the CSV file
# This creates a pandas dataframe and assigns it to the titanic variable
titanic = pandas.read_csv("../input/train.csv")
titanic_test = pandas.read_csv("../input/test.csv")


titanic["Age"]=titanic["Age"].fillna(titanic["Age"].median())
titanic["Age"]=titanic["Age"]/10;
titanic.loc[titanic["Sex"] == "male", "Sex"] = 0
titanic.loc[titanic["Sex"] == "female", "Sex"] = 1
titanic["Fare"] = titanic["Fare"].fillna(titanic["Fare"].median())
titanic["Fare"] = titanic["Fare"]/10;
titanic["Embarked"] = titanic["Embarked"].fillna('S')
titanic.loc[titanic["Embarked"] == 'S',"Embarked"] = 0
titanic.loc[titanic["Embarked"] == 'C',"Embarked"] = 1
titanic.loc[titanic["Embarked"] == 'Q',"Embarked"] = 2


titanic_test["Age"] = titanic_test["Age"].fillna(titanic["Age"].median())
titanic_test["Age"] = titanic_test["Age"]/10
titanic_test.loc[titanic_test["Sex"] == "male","Sex"] = 0
titanic_test.loc[titanic_test["Sex"] == "female","Sex"] = 1
titanic_test["Embarked"] = titanic_test["Embarked"].fillna('S')
titanic_test["Fare"] = titanic_test["Fare"].fillna(titanic_test["Fare"].median())
titanic_test["Fare"] = titanic_test["Fare"]/10
titanic_test.loc[titanic_test["Embarked"] == 'S',"Embarked"] = 0
titanic_test.loc[titanic_test["Embarked"] == 'C',"Embarked"] = 1
titanic_test.loc[titanic_test["Embarked"] == 'Q',"Embarked"] = 2

#print(titanic_test[predictors])

# The columns we'll use to predict the target
predictors = ["Pclass", "Sex", "Age", "SibSp", "Parch", "Embarked"]

lower_class = np.count_nonzero(titanic.loc[titanic["Pclass"] == 3,"Pclass"].values)
print("lower class " + str(lower_class))
survived = np.count_nonzero(titanic.loc[titanic["Pclass"] == 3,"Survived"].values)
not_survived = lower_class - survived
print("survide " + str(survived))
print("not_survived " + str(not_survived))
print("percentage " + str((survived/lower_class)*100))
      
middle_class = np.count_nonzero(titanic.loc[titanic["Pclass"] == 2,"Pclass"].values)
print("middle class " + str(middle_class))
survived = np.count_nonzero(titanic.loc[titanic["Pclass"] == 2,"Survived"].values)
not_survived = middle_class - survived
print("survide " + str(survived))
print("not_survived " + str(not_survived))
print("percentage " + str((survived/middle_class)*100))
      
upper_class = np.count_nonzero(titanic.loc[titanic["Pclass"] == 1,"Pclass"].values)
print("upper class " + str(upper_class))
survived = np.count_nonzero(titanic.loc[titanic["Pclass"] == 1,"Survived"].values)
not_survived = upper_class - survived
print("survide " + str(survived))
print("not_survived " + str(not_survived))
print("percentage " + str((survived/upper_class)*100))
print("Total :" +str(lower_class+middle_class+upper_class))

lower_class = np.count_nonzero(titanic.loc[titanic["Pclass"] == 3,"Pclass"].values)
print("lower class " + str(lower_class))
survived = np.count_nonzero(titanic.loc[titanic["Pclass"] == 3,"Survived"].values)
not_survived = lower_class - survived
print("survide " + str(survived))
print("not_survived " + str(not_survived))
lower_percentage = (survived/lower_class)*100
print("percentage " + str(lower_percentage))
      
middle_class = np.count_nonzero(titanic.loc[titanic["Pclass"] == 2,"Pclass"].values)
print("middle class " + str(middle_class))
survived = np.count_nonzero(titanic.loc[titanic["Pclass"] == 2,"Survived"].values)
not_survived = middle_class - survived
print("survide " + str(survived))
print("not_survived " + str(not_survived))
middle_percentage = (survived/middle_class)*100
print("percentage " + str(middle_percentage))
      
upper_class = np.count_nonzero(titanic.loc[titanic["Pclass"] == 1,"Pclass"].values)
print("upper class " + str(upper_class))
survived = np.count_nonzero(titanic.loc[titanic["Pclass"] == 1,"Survived"].values)
not_survived = upper_class - survived
print("survide " + str(survived))
upper_percentage = (survived/upper_class)*100
print("percentage " + str(upper_percentage))

Total = lower_class+middle_class+upper_class;
print("Total :" +str(Total))

sample_weight = np.zeros(Total)
sample_weight[:] = 1

upper_class_index = np.where(titanic["Pclass"]==1)[0]
sample_weight[upper_class_index] = upper_percentage/lower_percentage

middle_class_index = np.where(titanic["Pclass"]==2)[0]
sample_weight[middle_class_index] = middle_percentage/lower_percentage

# Initialize our algorithm class
alg = LogisticRegressionCV(random_state=1,Cs=5,max_iter = 100)
# Generate cross-validation folds for the titanic data set
# It returns the row indices corresponding to train and test
# We set random_state to ensure we get the same splits every time we run this

predictions = []
# Training the algorithm using the predictors and target
alg.fit(titanic[predictors], titanic["Survived"])
# We can now make predictions on the test fold

predictions = alg.predict(titanic_test[predictors])

# Map predictions to outcomes (the only possible outcomes are 1 and 0)
predictions[predictions >= .5] = 1
predictions[predictions < .5] = 0

#print(predictions)

#titanic_test = predictions
titanic_test = pandas.read_csv("../input/test.csv")
titanic_test.insert(len(titanic_test.columns),"Survived", predictions.astype(int))
#print(titanic_test.head(10))

# Create a new dataframe with only the columns Kaggle wants from the data set
submission = pandas.DataFrame({
        "PassengerId": titanic_test["PassengerId"],
        "Survived": titanic_test["Survived"]
    })

submission.to_csv("submitt.csv", sep=',',index=False, encoding='utf-8')

