# This Python 3 environment comes with many helpful analytics libraries installed
# It is defined by the kaggle/python docker image: https://github.com/kaggle/docker-python
# For example, here's several helpful packages to load in 

import numpy as np # linear algebra
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)

# Input data files are available in the "../input/" directory.
# For example, running this (by clicking run or pressing Shift+Enter) will list the files in the input directory

import os
print(os.listdir("../input"))

# Any results you write to the current directory are saved as output.
from scipy.sparse import csr_matrix, hstack
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import Ridge, Lasso, LinearRegression, LogisticRegression
from sklearn.tree import DecisionTreeClassifier, DecisionTreeRegressor
from sklearn.metrics import accuracy_score,roc_auc_score, confusion_matrix, classification_report, mean_squared_error
from sklearn.model_selection import train_test_split, cross_val_score, StratifiedKFold, GridSearchCV
from sklearn.preprocessing import OneHotEncoder
from matplotlib import pyplot as plt
import seaborn as sns
pd.set_option('display.max_columns', 100)


"""
**Завдання цього модулю проаналізувати датасет результатів ЗНО 2018 року та побудувати моделі, які б передбачували:**

- оцінку з предмету фізика (задача регресії)
- склав/не склав ЗНО з фізики (задача классифікації)
"""
"""
**TO-DO**

Далі виконуємо завдання згідно https://github.com/SerhiyProtsenko/SumDUDataScienceCourse/tree/master/module 

Що необхідно зробити?
1. EDA (exploratory data analysis)
2. Генерація нових фітч.
3. Скелінг фітч за потреби
4. Перетворення категоріальних фітч в pd.get_dummies, onehot encoding, countvectorise, tfidf (за потреби в залежності від датасету)
5. train_test_split та cross_val_score
6. Створення моделей для класифікації: sklearn.linear_model.LogisticRegression(за бажанням), sklearn.tree.DecisionTreeClassifier
7. Для регресії : sklearn.linear_model.LinearRegression(за бажанням), .Ridge(за бажанням), .Lasso(за бажанням), DecisionTreeRegressor
8. Аналіз метрик якості: регресія sklearn.metrics.mean_squared_error, sklearn.metrics.mean_absolute_error.
9. Аналіз метрик якості: класифікація  from sklearn.metrics import accuracy_score, roc_auc_score, confusion_matrix, classification_report. Знати коли можна використовувати accuracy_score та roc_auc_score, знати про баланс класів
10. Після аналізу метрик повернутися до п. 1,2,3 та згенерувати додаткові фітчі
11. Зробити пошук оптимальних гіперпараметрів за допомогою sklearn.model_selection.GridSearchCV або відповідними моделями LassoCV(за бажанням), RidgeCV(за бажанням) і т.і.
12. Повернутися до п.9-10 та за потреби 1,2,3
13. Зробити висновки
14. Пояснити, що ви робили своїми словами
"""
"""
1. Прохання ознайомитися з описом датасету

https://docs.google.com/spreadsheets/d/1CrqVAfFHqhNoQjS-pyezW6jo1cbuajY4BJWD21UwXEE/edit?usp=sharing 
"""
data=pd.read_csv('../input/OpenData2018.csv', sep=";")
data.head()
#Залишимо в датасеті тільки частину даних
columns=['Birth', 'SEXTYPENAME', 'REGNAME', 'AREANAME', 'TERNAME',
       'REGTYPENAME', 'TerTypeName', 'ClassProfileNAME', 'ClassLangName',
       'EONAME', 'EOTYPENAME', 'UkrBall100', 'UkrTestStatus','mathBall100','mathTestStatus', 'physBall100', 'physTestStatus' ]
X_full=data[columns]
X_full.shape
# Залишимо в датасеті тільки тих, які склали укр.мову, математику та фізику
X_full.dropna(subset=['UkrTestStatus','mathTestStatus','physTestStatus'], inplace=True)
X_full.shape
X_full.head()
"""
**TO-DO**

****
1. Зробіть EDA (exploratory data analysis)
2. Зробіть висновки з EDA
"""
X_full.describe(include='all')
X_full.info()
"""
**TO-DO**

1. Необхідно зробити предпроцессінг даних, а саме:
   - з'ясуйте, які фітчі категоріальні та потребують OneHot перетворення, які залишимо бінарними, які числові і потребують стандартизації (за бажанням)
   - зробіть необхідні перетворення фітч.


"""
#TO-DO з'ясуйте, які фітчі категоріальні та потребують OneHot перетворення, які залишимо бінарними, які числові і потребують стандартизації

#columns_OneHot=['REGNAME', 'AREANAME', 'TERNAME', ........]
#columns_bin=['SEXTYPENAME', 'TerTypeName', ........]
#columns_numeric=['Birth', 'UkrBall100'...........]
#TO-DO Перетворіть бінарні фітчі на 0 та 1

#X_full['SEXTYPENAME']=X_full['SEXTYPENAME'].apply(lambda x: 0 if x=='жіноча' else 1)
#X_full['Ter......
#X_full['Uk.....
#X_full['.....
#X_full['.....



#TO-DO Заповніть пропуски для усих типів фітч, для категоріальних наприклад стрінгом 'non', а для інших нулями або середніми значеннями
# Також пам'ятайте, що тагрет також має пропуски і їх необхідно обробити

#X_full[columns_OneHot]=X_full[columns_OneHot].fillna('non')
#X_full[columns_bin]=X_full[columns_bin].fillna(0)
#X_full[columns_numeric]=........
#X_full['physBall100']=......


#TO-DO  категоріальні фітчі  потребують OneHot перетворення
#onehot_encoder=OneHotEncoder()
#encoded_categorical_columns =onehot_encoder.fit_transform(X_full[columns_OneHot])
#encoded_categorical_columns.shape
#TO-DO числові фітчі потребують OneHot перетворення

#tmp_scaled = StandardScaler().fit_transform(X_full[columns_numeric])
#TO-DO з`єднайте все в один датасет

#X = csr_matrix(hstack([encoded_categorical_columns,tmp_scaled, X_full[columns_bin]]))
#TO-DO створимо окремо таргети для задачі класифікації та регресії

#y_reg=X_full['physBall100']
#y_cl=X_full['physTestStatus']
#TO-DO Враховуйте баланс класів коли будете робити висновки!
#y_cl.value_counts(normalize=True)
"""
**TO-DO**

Далі виконуємо завдання з п.5 згідно https://github.com/SerhiyProtsenko/SumDUDataScienceCourse/tree/master/module 

Що необхідно зробити?
1. EDA (exploratory data analysis)
2. Генерація нових фітч.
3. Скелінг фітч за потреби
4. Перетворення категоріальних фітч в pd.get_dummies, onehot encoding, countvectorise, tfidf (за потреби в залежності від датасету)
5. train_test_split та cross_val_score
6. Створення моделей для класифікації: sklearn.linear_model.LogisticRegression, sklearn.tree.DecisionTreeClassifier
7. Для регресії : sklearn.linear_model.LinearRegression, .Ridge, .Lasso, DecisionTreeRegressor
8. Аналіз метрик якості: регресія sklearn.metrics.mean_squared_error, sklearn.metrics.mean_absolute_error.
9. Аналіз метрик якості: класифікація  from sklearn.metrics import accuracy_score, roc_auc_score, confusion_matrix, classification_report. Знати коли можна використовувати accuracy_score та roc_auc_score, знати про баланс класів
10. Після аналізу метрик повернутися до п. 1,2,3 та згенерувати додаткові фітчі
11. Зробити пошук оптимальних гіперпараметрів за допомогою sklearn.model_selection.GridSearchCV або відповідними моделями LassoCV, RidgeCV і т.і.
12. Повернутися до п.9-10 та за потреби 1,2,3
13. Зробити висновки
14. Пояснити, що ви робили своїми словами
"""
#lg=LogisticRegression()
#skf=StratifiedKFold(n_splits=5, shuffle=True, random_state=17)
#cross_val_score(......)
#lg.fit(.....)
#cf=confusion_matrix(....)

#sns.heatmap(cf,annot=True )
#plt.ylabel='predict'
#plt.xlabel='real target'
#plt.show()
#rd=Lasso()
#cross_val_score(.....)

#.........
#.............
# Висновки