├── README.md ├── .gitignore ├── test.csv ├── code_quality_score.ipynb └── train.csv /README.md: -------------------------------------------------------------------------------- 1 | # Requirements 2 | 3 | You are given a jupyter notebook (`ipynb` file), containing models for scoring the code quality using proxy metrics, which are listed and described below. Your task is to fix problems in the notebook to make the model better. Most of the problems are associated with data preprocessing and model training. 4 | 5 | ## Feature explanation 6 | 7 | * MAX_CYCLOMATIC - the maximum cyclomatic complexity of the functions in the code 8 | * MEAN_CYCLOMATIC - the mean cyclomatic complexity of the functions in the code 9 | * MEDIAN_CYCLOMATIC - the median cyclomatic complexity of the functions in the code 10 | 11 | **Note:** cyclomatic complexity is a metric that measures the complexity of the code by the number of conditions and loops in it. 12 | 13 | --- 14 | 15 | * MAX_COGNITIVE - the maximum cognitive complexity of the functions in the code 16 | * MEAN_COGNITIVE - the mean cognitive complexity of the functions in the code 17 | * MEDIAN_COGNITIVE - the median cognitive complexity of the functions in the code 18 | 19 | **Note:** cognitive complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike cyclomatic complexity, which determines how difficult your code will be to test, cognitive complexity tells you how difficult your code will be to read and understand. 20 | 21 | --- 22 | 23 | * LENGTH - the length of the code in lines 24 | * CALCULATED_LENGTH, VOLUME, DIFFICULTY, MAINTAINABILITY, EFFORT, TIME, BUGS - theoretical metrics estimated by the Halstead complexity model. 25 | 26 | **Note:** Halstead complexity measures are used to estimate the effort required to develop, maintain, and modify a program. The Halstead complexity measures are based on the number of distinct operators and operands in a program. 27 | 28 | --- 29 | 30 | * REVIEWER_1 - the code quality score evaluated by the first reviewer. 31 | * REVIEWER_2 - the code quality score evaluated by the first reviewer. 32 | 33 | **Note 1:** the reviewers were asked to score the code quality on a scale from 1 to 5, where 1 is the worst and 5 is the best, which was then converted to a scale from 0 to 1, where 0 is the worst and 1 is the best. 34 | 35 | **Note 2:** there were 8 reviewers, but the code samples were split between them in a way that each sample was scored by 2 reviewers. The scores provided by each reviewer were scaled to have the same std and mean for each reviewer. 36 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | pip-wheel-metadata/ 24 | share/python-wheels/ 25 | *.egg-info/ 26 | .installed.cfg 27 | *.egg 28 | MANIFEST 29 | 30 | # PyInstaller 31 | # Usually these files are written by a python script from a template 32 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 33 | *.manifest 34 | *.spec 35 | 36 | # Installer logs 37 | pip-log.txt 38 | pip-delete-this-directory.txt 39 | 40 | # Unit test / coverage reports 41 | htmlcov/ 42 | .tox/ 43 | .nox/ 44 | .coverage 45 | .coverage.* 46 | .cache 47 | nosetests.xml 48 | coverage.xml 49 | *.cover 50 | *.py,cover 51 | .hypothesis/ 52 | .pytest_cache/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | target/ 76 | 77 | # Jupyter Notebook 78 | .ipynb_checkpoints 79 | 80 | # IPython 81 | profile_default/ 82 | ipython_config.py 83 | 84 | # pyenv 85 | .python-version 86 | 87 | # pipenv 88 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 89 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 90 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 91 | # install all needed dependencies. 92 | #Pipfile.lock 93 | 94 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 95 | __pypackages__/ 96 | 97 | # Celery stuff 98 | celerybeat-schedule 99 | celerybeat.pid 100 | 101 | # SageMath parsed files 102 | *.sage.py 103 | 104 | # Environments 105 | .env 106 | .venv 107 | env/ 108 | venv/ 109 | ENV/ 110 | env.bak/ 111 | venv.bak/ 112 | 113 | # Spyder project settings 114 | .spyderproject 115 | .spyproject 116 | 117 | # Rope project settings 118 | .ropeproject 119 | 120 | # mkdocs documentation 121 | /site 122 | 123 | # mypy 124 | .mypy_cache/ 125 | .dmypy.json 126 | dmypy.json 127 | 128 | # Pyre type checker 129 | .pyre/ 130 | -------------------------------------------------------------------------------- /test.csv: -------------------------------------------------------------------------------- 1 | ,MAX_COGNITIVE,MEAN_COGNITIVE,MEDIAN_COGNITIVE,MAX_CYCLOMATIC,MEAN_CYCLOMATIC,MEDIAN_CYCLOMATIC,LENGTH,CALCULATED_LENGTH,VOLUME,DIFFICULTY,EFFORT,TIME,BUGS,MAINTAINABILITY,REVIEWER_1,REVIEWER_2,CODE_QUALITY 2 | 86,57,13.0,1.0,21,6.0,2.0,86,239.3499674845013,482.8650465939079,E,3528.629186647788,196.034954813766,0.1609550155313026,C,0.1940563828117282,0.5687814733736574,0.3814189280926928 3 | 85,21,21.0,21.0,9,9.0,9.0,24,51.01955000865388,96.0,C,256.0,14.22222222222222,0.032,D,0.7902841296780507,0.300758891343087,0.5455215105105689 4 | 94,20,7.0,3.0,5,3.5,3.5,30,86.66829050039843,135.7068586817104,C,376.9634963380845,20.942416463226916,0.0452356195605701,E,0.7902841296780507,0.184230676650929,0.48725740316448984 5 | 8,42,42.0,42.0,17,17.0,17.0,82,128.0419249893113,406.2440974517238,E,3815.1619586770585,211.95344214872543,0.1354146991505746,B,0.069456325978715,0.1742961999339288,0.1218762629563219 6 | 89,15,3.5,2.0,8,2.6,2.0,72,239.31111664374467,402.1173000519233,C,1613.3730697205212,89.63183720669562,0.1340391000173077,C,0.2508478939066806,0.5687814733736574,0.409814683640169 7 | 22,9,4.25,3.0,5,3.0,2.5,21,52.86060383799767,84.0,A,135.6923076923077,7.538461538461539,0.028,E,0.9441285402517696,0.184230676650929,0.5641796084513493 8 | 7,9,3.0,2.5,6,2.4166666666666665,2.0,82,252.98086890659343,462.7962075615274,D,2034.1507727704343,113.00837626502413,0.1542654025205091,C,0.7902841296780507,0.3517535682962757,0.5710188489871633 9 | 10,50,11.2,2.0,16,4.6,2.0,80,241.98710676103488,446.79700005769257,C,1691.4457859326933,93.96921032959408,0.1489323333525642,B,0.168418293842436,0.4316533983187794,0.30003584608060774 10 | 45,15,1.6666666666666667,0.0,8,1.7777777777777777,1.0,42,106.0419249893113,195.0419599705384,A,237.44238605109027,13.191243669505017,0.0650139866568461,B,0.6479410542740227,0.9533322700963858,0.8006366621852042 11 | 68,50,50.0,50.0,15,15.0,15.0,45,92.32026322986492,206.3233125324521,C,814.4341284175739,45.246340467643,0.0687744375108173,B,0.7902841296780507,0.168418293842436,0.47935121176024337 12 | 33,42,4.583333333333333,1.0,14,2.583333333333333,1.5,85,199.17639004747704,458.34698093619465,E,2566.74309324269,142.5968385134828,0.1527823269787315,A,0.763364022071831,0.9533322700963858,0.8583481460841084 13 | 110,18,9.25,8.0,5,3.75,4.0,30,77.05865002596161,129.65784284662087,A,144.06426982957873,8.003570546087708,0.0432192809488736,D,0.1940563828117282,0.184230676650929,0.18914352973132859 14 | 2,14,14.0,14.0,6,6.0,6.0,12,26.0,39.86313713864836,A,39.86313713864836,2.2146187299249087,0.0132877123795494,E,0.4047489604799482,0.4701936142833818,0.43747128738166496 15 | 51,18,18.0,18.0,7,7.0,7.0,15,26.0,49.82892142331044,A,62.28615177913805,3.4603417655076694,0.0166096404744368,E,0.4316533983187794,0.4701936142833818,0.4509235063010806 16 | 117,28,3.8333333333333335,1.0,12,3.083333333333333,1.5,94,349.21187563522585,564.0,D,2538.0,141.0,0.188,A,0.763364022071831,0.9533322700963858,0.8583481460841084 17 | 73,30,30.0,30.0,11,11.0,11.0,36,112.0419249893113,171.1759500778849,B,357.2367653799337,19.846486965551872,0.0570586500259616,D,0.7902841296780507,0.168418293842436,0.47935121176024337 18 | 30,23,23.0,23.0,8,8.0,8.0,18,35.219280948873624,64.52932501298082,A,77.43519001557698,4.301955000865387,0.0215097750043269,D,0.6479410542740227,0.493198041195634,0.5705695477348284 19 | 43,11,3.1666666666666665,2.0,5,2.333333333333333,2.0,18,35.219280948873624,64.52932501298082,A,77.43519001557698,4.301955000865387,0.0215097750043269,D,0.8179777885488322,0.9985132059990826,0.9082454972739573 20 | 84,50,50.0,50.0,21,21.0,21.0,85,232.64052645972987,474.7218125612984,E,3497.950197820093,194.3305665455607,0.1582406041870994,B,-0.0188702239790042,0.0555660823185287,0.018347929169762252 21 | 75,15,3.25,2.5,8,2.375,2.0,63,204.1761330130197,337.5257762909393,B,559.5822080612941,31.08790044784967,0.1125085920969797,E,0.8656544815719871,1.247726663525528,1.0566905725487574 22 | 62,9,3.2,3.0,5,2.4,2.0,21,46.05374780501028,82.0447025077789,C,208.8410609288917,11.602281162716206,0.0273482341692596,C,0.9946665874362028,0.9533322700963858,0.9739994287662943 23 | 102,23,4.818181818181818,2.0,11,3.4545454545454546,2.0,92,363.26562344023614,558.0802055221151,E,3343.4983741548144,185.74990967526747,0.1860267351740383,A,0.6479410542740227,0.763364022071831,0.7056525381729268 24 | 16,9,3.75,3.0,5,2.75,2.5,14,24.406371956566694,46.50699332842308,B,89.6920585619588,4.982892142331044,0.0155023311094743,D,1.0961072421180065,0.5687814733736574,0.8324443577458319 25 | 24,19,5.636363636363637,4.0,10,3.272727272727273,3.0,132,460.6320454848324,832.0990587593776,D,4031.578538214449,223.9765854563583,0.2773663529197925,A,0.2508478939066806,0.7229626432600752,0.4869052685833779 26 | -------------------------------------------------------------------------------- /code_quality_score.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": null, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "# Dont forget to create a virtual environment to avoid conflicts with other packages\n", 10 | "%pip install pandas seaborn numpy matplotlib scikit-learn" 11 | ] 12 | }, 13 | { 14 | "cell_type": "code", 15 | "execution_count": null, 16 | "metadata": {}, 17 | "outputs": [], 18 | "source": [ 19 | "import pandas as pd\n", 20 | "import numpy as np\n", 21 | "import matplotlib.pyplot as plt\n", 22 | "import seaborn as sns\n", 23 | "import joblib\n" 24 | ] 25 | }, 26 | { 27 | "cell_type": "code", 28 | "execution_count": null, 29 | "metadata": {}, 30 | "outputs": [], 31 | "source": [ 32 | "from sklearn.metrics import mean_absolute_error\n", 33 | "\n", 34 | "\n", 35 | "def plot_results(y_true, y_pred, color=None):\n", 36 | " if color is None:\n", 37 | " color = np.abs(y_true - y_pred)\n", 38 | " fig, ax = plt.subplots()\n", 39 | " sc = plt.scatter(y_true, y_pred, c=color, cmap=\"viridis\")\n", 40 | " cb = fig.colorbar(sc)\n", 41 | " cb.set_label(\"Error\")\n", 42 | "\n", 43 | " plt.plot([0, 1], [0, 1], \"g--\")\n", 44 | " plt.xlabel(\"true\")\n", 45 | " plt.ylabel(\"pred\")\n", 46 | " plt.tight_layout()\n", 47 | "\n", 48 | "\n", 49 | "def check_model(model, X_train, X_test, y_train, y_test):\n", 50 | " model.fit(X_train, y_train)\n", 51 | " predictions = model.predict(X_test)\n", 52 | "\n", 53 | " print(f\"MAE (TRAIN): {mean_absolute_error(model.predict(X_train), y_train)}\")\n", 54 | " print(f\"MAE (TEST): {mean_absolute_error(predictions, y_test)}\")\n", 55 | "\n", 56 | " plot_results(\n", 57 | " y_test, predictions, color=X_test[\"ERROR\"] if \"ERROR\" in X_test else None\n", 58 | " )" 59 | ] 60 | }, 61 | { 62 | "cell_type": "code", 63 | "execution_count": null, 64 | "metadata": {}, 65 | "outputs": [], 66 | "source": [ 67 | "df_train = pd.read_csv('train.csv', index_col=0)\n", 68 | "df_test = pd.read_csv('test.csv', index_col=0)\n", 69 | "\n", 70 | "df_train['CODE_QUALITY'] = np.mean(df_train[['REVIEWER_1','REVIEWER_2']], axis=1)\n", 71 | "df_test['CODE_QUALITY'] = np.mean(df_test[['REVIEWER_1','REVIEWER_2']], axis=1)\n" 72 | ] 73 | }, 74 | { 75 | "cell_type": "code", 76 | "execution_count": null, 77 | "metadata": {}, 78 | "outputs": [], 79 | "source": [ 80 | "from sklearn.model_selection import train_test_split\n", 81 | "\n", 82 | "X_train = df_train.drop(['CODE_QUALITY'], axis=1)\n", 83 | "X_test = df_test.drop(['CODE_QUALITY'], axis=1)\n", 84 | "\n", 85 | "y_train = df_train['CODE_QUALITY']\n", 86 | "y_test = df_test['CODE_QUALITY']\n" 87 | ] 88 | }, 89 | { 90 | "cell_type": "code", 91 | "execution_count": null, 92 | "metadata": {}, 93 | "outputs": [], 94 | "source": [ 95 | "from sklearn.linear_model import LinearRegression\n", 96 | "\n", 97 | "local_X_train, local_X_test = X_train.copy(), X_test.copy()\n", 98 | "local_y_train, local_y_test = y_train.copy(), y_test.copy()\n", 99 | "\n", 100 | "# Normalize\n", 101 | "local_X_train = local_X_train.select_dtypes(include=np.number).apply(lambda x: (x - x.mean()) / x.std())\n", 102 | "local_X_test = local_X_test.select_dtypes(include=np.number).apply(lambda x: (x - x.mean()) / x.std())\n", 103 | "\n", 104 | "# One hot encoding\n", 105 | "local_X_train = pd.get_dummies(local_X_train)\n", 106 | "local_X_test = pd.get_dummies(local_X_test)\n", 107 | "\n", 108 | "model = LinearRegression()\n", 109 | "check_model(model, local_X_train, local_X_test, local_y_train, local_y_test)\n", 110 | "\n", 111 | "joblib.dump(model, 'linear_regression.joblib');\n" 112 | ] 113 | }, 114 | { 115 | "cell_type": "code", 116 | "execution_count": null, 117 | "metadata": {}, 118 | "outputs": [], 119 | "source": [ 120 | "from sklearn.neighbors import KNeighborsRegressor\n", 121 | "\n", 122 | "local_X_train, local_X_test = X_train.copy(), X_test.copy()\n", 123 | "local_y_train, local_y_test = y_train.copy(), y_test.copy()\n", 124 | "\n", 125 | "# Normalize\n", 126 | "local_X_train = local_X_train.select_dtypes(include=np.number).apply(lambda x: (x - x.mean()) / x.std())\n", 127 | "local_X_test = local_X_test.select_dtypes(include=np.number).apply(lambda x: (x - x.mean()) / x.std())\n", 128 | "\n", 129 | "# One hot encoding\n", 130 | "local_X_train = pd.get_dummies(local_X_train)\n", 131 | "local_X_test = pd.get_dummies(local_X_test)\n", 132 | "\n", 133 | "model = KNeighborsRegressor()\n", 134 | "check_model(model, local_X_train, local_X_test, local_y_train, local_y_test)\n", 135 | "\n", 136 | "joblib.dump(model, 'knn_regression.joblib');" 137 | ] 138 | }, 139 | { 140 | "cell_type": "code", 141 | "execution_count": null, 142 | "metadata": {}, 143 | "outputs": [], 144 | "source": [ 145 | "from sklearn.tree import DecisionTreeRegressor\n", 146 | "\n", 147 | "local_X_train, local_X_test = X_train.copy(), X_test.copy()\n", 148 | "local_y_train, local_y_test = y_train.copy(), y_test.copy()\n", 149 | "\n", 150 | "# Normalize\n", 151 | "local_X_train = local_X_train.select_dtypes(include=np.number).apply(lambda x: (x - x.mean()) / x.std())\n", 152 | "local_X_test = local_X_test.select_dtypes(include=np.number).apply(lambda x: (x - x.mean()) / x.std())\n", 153 | "\n", 154 | "# One hot encoding\n", 155 | "local_X_train = pd.get_dummies(local_X_train)\n", 156 | "local_X_test = pd.get_dummies(local_X_test)\n", 157 | "\n", 158 | "model = DecisionTreeRegressor()\n", 159 | "check_model(model, local_X_train, local_X_test, local_y_train, local_y_test)\n", 160 | "\n", 161 | "joblib.dump(model, 'decision_tree_regression.joblib');" 162 | ] 163 | }, 164 | { 165 | "cell_type": "code", 166 | "execution_count": null, 167 | "metadata": {}, 168 | "outputs": [], 169 | "source": [] 170 | } 171 | ], 172 | "metadata": { 173 | "kernelspec": { 174 | "display_name": ".venv", 175 | "language": "python", 176 | "name": "python3" 177 | }, 178 | "language_info": { 179 | "codemirror_mode": { 180 | "name": "ipython", 181 | "version": 3 182 | }, 183 | "file_extension": ".py", 184 | "mimetype": "text/x-python", 185 | "name": "python", 186 | "nbconvert_exporter": "python", 187 | "pygments_lexer": "ipython3", 188 | "version": "3.10.9" 189 | }, 190 | "orig_nbformat": 4, 191 | "vscode": { 192 | "interpreter": { 193 | "hash": "8f3af7c72321252da151736edcd756595c89b77e8e09e269aaaaf8baff46bed9" 194 | } 195 | } 196 | }, 197 | "nbformat": 4, 198 | "nbformat_minor": 2 199 | } 200 | -------------------------------------------------------------------------------- /train.csv: -------------------------------------------------------------------------------- 1 | ,MAX_COGNITIVE,MEAN_COGNITIVE,MEDIAN_COGNITIVE,MAX_CYCLOMATIC,MEAN_CYCLOMATIC,MEDIAN_CYCLOMATIC,LENGTH,CALCULATED_LENGTH,VOLUME,DIFFICULTY,EFFORT,TIME,BUGS,MAINTAINABILITY,REVIEWER_1,REVIEWER_2,CODE_QUALITY 2 | 109,28,28.0,28.0,11,11.0,11.0,24,41.21928094887362,91.37651812938248,C,292.404858014024,16.244714334112444,0.0304588393764608,E,0.0555660823185287,0.1981986229946224,0.12688235265657555 3 | 13,17,9.5,9.5,8,5.0,5.0,21,28.75488750216347,72.64806399138325,C,190.70116797738103,10.594509332076724,0.024216021330461,C,0.4316533983187794,0.4047489604799482,0.4182011793993638 4 | 63,21,6.0,3.0,5,2.4,2.0,18,45.01955000865388,68.53238859703687,A,68.53238859703687,3.807354922057604,0.0228441295323456,D,0.9441285402517696,0.7343534101412322,0.8392409751965009 5 | 71,10,3.6,2.0,5,2.8,2.0,25,72.0,108.04820237218406,B,229.60243004089116,12.755690557827286,0.0360160674573946,E,0.3517535682962757,0.9068474293328818,0.6293004988145787 6 | 26,23,3.727272727272727,0.0,12,2.8181818181818183,1.0,129,351.1940651927299,776.8854478806707,E,5791.327884201362,321.7404380111868,0.2589618159602235,B,0.3517535682962757,0.7229626432600752,0.5373581057781754 7 | 113,52,20.666666666666668,7.0,19,8.333333333333334,3.0,100,210.1173000519232,545.9431618637298,E,3882.2624843643,215.68124913135,0.1819810539545766,A,0.4316533983187794,0.1981986229946224,0.3149260106567009 8 | 50,11,4.4,2.0,5,2.6,2.0,15,35.219280948873624,53.77443751081735,A,53.77443751081735,2.987468750600964,0.0179248125036057,C,0.7902841296780507,0.7343534101412322,0.7623187699096414 9 | 74,58,58.0,58.0,23,23.0,23.0,92,239.31111664374467,513.8165500663464,D,2675.6056936381697,148.6447607576761,0.1712721833554488,B,0.168418293842436,0.5687814733736574,0.3685998836080467 10 | 54,21,7.0,7.0,11,3.8,4.0,145,422.0537478050103,903.1787101219028,E,7295.990517703495,405.3328065390831,0.3010595700406342,A,0.4047489604799482,0.9533322700963858,0.679040615288167 11 | 60,21,7.0,4.0,4,2.4,3.0,21,55.30296890880645,84.0,A,84.0,4.666666666666667,0.028,D,0.5205660117923657,0.4047489604799482,0.462657486136157 12 | 3,36,36.0,36.0,11,11.0,11.0,30,47.77443751081735,117.20671786825557,C,293.0167946706389,16.278710815035495,0.0390689059560851,C,0.4316533983187794,0.1742961999339288,0.3029747991263541 13 | 95,74,74.0,74.0,20,20.0,20.0,98,235.1694071936684,544.3497074644085,D,2588.98031598926,143.83223977718112,0.1814499024881361,A,0.2508478939066806,0.069456325978715,0.1601521099426978 14 | 6,9,5.2,7.0,5,2.8,3.0,24,45.01955000865388,91.37651812938248,A,121.83535750584332,6.768630972546851,0.0304588393764608,C,0.4316533983187794,0.4605806331273488,0.4461170157230641 15 | 56,9,4.0,2.5,5,3.25,3.0,30,84.99664330558272,135.7068586817104,C,478.9653835825073,26.60918797680596,0.0452356195605701,D,0.6479410542740227,0.763364022071831,0.7056525381729268 16 | 98,83,83.0,83.0,34,34.0,34.0,150,393.1601712439863,919.3924525417452,E,5931.564209946742,329.53134499704123,0.3064641508472484,A,0.069456325978715,0.1981986229946224,0.1338274744866687 17 | 90,5,1.4,0.0,3,1.8,2.0,7,10.0,18.09473750504809,A,18.09473750504809,1.0052631947248942,0.0060315791683493,E,0.5205660117923657,0.493198041195634,0.5068820264939998 18 | 112,53,14.2,6.0,21,6.4,3.0,117,322.5129733894199,693.8962684948577,E,5034.149398884262,279.67496660468123,0.2312987561649525,B,0.1940563828117282,0.4047489604799482,0.2994026716458382 19 | 48,15,2.6666666666666665,2.0,6,2.083333333333333,2.0,115,385.1296877173589,704.8675469486712,E,4993.807366517704,277.4337425843169,0.2349558489828904,A,0.9068474293328818,0.7229626432600752,0.8149050362964785 20 | 99,31,31.0,31.0,10,10.0,10.0,26,46.05374780501028,101.57915548582147,C,313.9719351379937,17.442885285444092,0.0338597184952738,E,0.2508478939066806,0.1940563828117282,0.2224521383592044 21 | 76,9,4.5,3.5,5,3.0,2.5,21,47.77443751081735,82.0447025077789,B,143.57822938861307,7.976568299367392,0.0273482341692596,C,0.7229626432600752,0.5687814733736574,0.6458720583168662 22 | 27,22,22.0,22.0,8,8.0,8.0,18,37.97416845103709,66.60791492653966,B,119.8942468677714,6.660791492653967,0.0222026383088465,D,0.493198041195634,0.4701936142833818,0.4816958277395079 23 | 18,23,23.0,23.0,9,9.0,9.0,21,37.97416845103709,77.70923408096293,B,163.18939157002217,9.066077309445676,0.0259030780269876,D,0.5205660117923657,0.300758891343087,0.41066245156772635 24 | 11,10,3.4,2.0,5,2.6,2.0,24,56.1057163358342,98.09910819000817,B,241.47472785232785,13.415262658462655,0.0326997027300027,E,0.5205660117923657,0.9068474293328818,0.7137067205626237 25 | 61,26,4.888888888888889,3.5,10,3.055555555555556,2.5,193,712.4913353133068,1316.2945397461317,E,10523.774845270322,584.6541580705734,0.4387648465820438,B,0.6479410542740227,0.4047489604799482,0.5263450073769854 26 | 106,16,3.636363636363636,2.0,9,2.727272727272727,2.0,125,301.8442939431394,729.1112517705927,E,3980.947434667437,221.16374637041315,0.2430370839235309,A,-0.0188702239790042,0.6692504138258306,0.3251900949234132 27 | 97,22,22.0,22.0,8,8.0,8.0,18,37.97416845103709,66.60791492653966,B,119.8942468677714,6.660791492653967,0.0222026383088465,E,0.493198041195634,0.300758891343087,0.3969784662693605 28 | 78,9,4.0,5.0,5,2.8,3.0,30,86.66829050039843,135.7068586817104,C,376.9634963380845,20.942416463226916,0.0452356195605701,C,0.6352017210259677,0.4605806331273488,0.5478911770766582 29 | 59,13,6.333333333333333,5.0,5,3.333333333333333,3.5,39,94.43856189774723,178.81353752812512,C,464.9151975731253,25.828622087395853,0.059604512509375,E,0.7902841296780507,0.6352017210259677,0.7127429253520092 30 | 1,9,3.2,2.0,5,2.6,2.0,24,56.1057163358342,98.09910819000817,B,241.47472785232785,13.415262658462655,0.0326997027300027,C,1.0961072421180065,0.9853446533928016,1.040725947755404 31 | 92,13,5.0,2.0,8,3.6666666666666665,2.0,26,61.30296890880645,108.41805003750012,B,263.30097866250026,14.62783214791668,0.0361393500125,C,0.493198041195634,0.4316533983187794,0.4624257197572067 32 | 42,9,3.5,3.0,5,2.6666666666666665,2.5,27,58.05785641096992,110.36149671375918,B,212.8400293765356,11.824446076474198,0.036787165571253,C,0.5687814733736574,0.9985132059990826,0.7836473396863699 33 | 41,48,16.5,7.0,19,7.5,4.0,111,225.7821709900309,613.1153771223285,E,3961.668590636584,220.09269947981025,0.2043717923741095,B,0.8179777885488322,0.1981986229946224,0.5080882057717273 34 | 4,73,73.0,73.0,28,28.0,28.0,102,352.1262152617935,612.0,C,2517.7894736842104,139.87719298245614,0.204,B,0.3517535682962757,-0.0581259774323188,0.14681379543197845 35 | 15,23,2.533333333333333,0.0,11,2.1333333333333333,1.0,68,205.76878450632643,368.9860033197427,D,1614.3137645238742,89.68409802910412,0.1229953344399142,B,0.6479410542740227,0.763364022071831,0.7056525381729268 36 | 17,9,4.25,3.0,5,3.0,2.5,21,42.80863530717375,79.95445336320968,B,152.64032005703666,8.480017780946481,0.0266514844544032,E,0.9441285402517696,0.493198041195634,0.7186632907237018 37 | 52,27,3.25,2.0,14,2.5625,2.0,72,275.6627143478162,414.3519001557698,D,1988.889120747695,110.4938400415386,0.1381173000519232,A,0.9946665874362028,0.7343534101412322,0.8645099987887175 38 | 40,23,4.333333333333333,3.0,9,2.555555555555556,2.0,120,258.7430298092722,677.2627427729669,C,2709.050971091868,150.502831727326,0.2257542475909889,A,0.763364022071831,0.7343534101412322,0.7488587161065317 39 | 38,29,6.428571428571429,4.0,13,3.857142857142857,3.0,78,236.8771237954945,435.6270750562503,D,2265.260790292501,125.84782168291676,0.14520902501875,A,0.493198041195634,0.2060338184255314,0.3496159298105827 40 | 5,9,3.8,2.0,5,2.8,2.0,26,66.60335893412778,110.44611534953322,B,250.3445281256086,13.90802934031159,0.0368153717831777,E,0.9068474293328818,0.5687814733736574,0.7378144513532696 41 | 53,15,5.25,4.5,8,3.375,3.0,117,359.41438217180234,704.6170341243292,D,3146.4795144517457,174.80441746954142,0.2348723447081097,B,0.532061456707459,0.7343534101412322,0.6332074334243456 42 | 108,38,38.0,38.0,11,11.0,11.0,57,151.96160537041902,287.53046480343187,B,546.3078831265206,30.350437951473364,0.0958434882678106,E,0.1742961999339288,0.1981986229946224,0.1862474114642756 43 | 66,8,3.4,3.0,4,2.2,2.0,15,35.219280948873624,53.77443751081735,A,53.77443751081735,2.987468750600964,0.0179248125036057,D,0.8179777885488322,0.532061456707459,0.6750196226281455 44 | 0,9,2.3529411764705883,2.0,5,2.117647058823529,2.0,68,219.33658100079683,375.60221301187687,E,2347.5138313242305,130.41743507356836,0.1252007376706256,B,1.0600022475637358,0.9985132059990826,1.0292577267814091 45 | 34,16,12.5,12.5,6,4.0,4.0,15,26.0,49.82892142331044,A,62.28615177913805,3.4603417655076694,0.0166096404744368,E,0.5687814733736574,0.4701936142833818,0.5194875438285196 46 | 28,70,70.0,70.0,21,21.0,21.0,145,278.0838499786226,834.458687813703,E,6385.42300240051,354.7457223555839,0.278152895937901,A,0.300758891343087,0.4047489604799482,0.35275392591151755 47 | 55,11,2.833333333333333,2.0,5,2.1666666666666665,2.0,18,35.219280948873624,64.52932501298082,A,77.43519001557698,4.301955000865387,0.0215097750043269,D,0.9441285402517696,0.9068474293328818,0.9254879847923256 48 | 35,61,61.0,61.0,24,24.0,24.0,169,332.1091091048304,1006.259176455382,E,9141.76968798616,507.87609377700886,0.3354197254851273,A,0.0555660823185287,-0.1563614535107621,-0.05039768559611671 49 | 23,25,8.75,3.5,5,3.0,2.5,25,63.35824643629125,104.2481250360578,A,166.7970000576925,9.266500003205138,0.0347493750120192,D,0.4605806331273488,0.5687814733736574,0.5146810532505031 50 | 31,60,36.5,36.5,20,13.0,13.0,64,185.26046567326583,342.88332829555736,E,2577.3396843549394,143.18553801971885,0.1142944427651857,B,0.6479410542740227,0.4047489604799482,0.5263450073769854 51 | 93,27,27.0,27.0,10,10.0,10.0,29,63.61549134016113,123.18989788986396,D,540.1403215170959,30.007795639838665,0.0410632992966213,D,0.1981986229946224,0.2060338184255314,0.2021162207100769 52 | 57,19,19.0,19.0,8,8.0,8.0,21,41.21928094887362,79.95445336320968,C,223.8724694169871,12.43735941205484,0.0266514844544032,E,0.493198041195634,0.184230676650929,0.3387143589232815 53 | 91,11,3.2,2.0,5,2.4,2.0,21,46.05374780501028,82.0447025077789,C,208.8410609288917,11.602281162716206,0.0273482341692596,E,0.5205660117923657,0.5687814733736574,0.5446737425830115 54 | 101,13,5.2,4.0,5,3.0,3.0,21,52.86060383799767,84.0,A,135.6923076923077,7.538461538461539,0.028,C,0.763364022071831,0.4047489604799482,0.5840564912758895 55 | 32,32,32.0,32.0,10,10.0,10.0,24,55.30296890880645,96.0,A,109.71428571428572,6.095238095238095,0.032,D,0.1981986229946224,-0.2003201200717993,-0.0010607485385884519 56 | 100,9,2.6666666666666665,2.0,5,2.333333333333333,2.0,21,46.05374780501028,82.0447025077789,C,208.8410609288917,11.602281162716206,0.0273482341692596,E,1.0600022475637358,0.7229626432600752,0.8914824454119055 57 | 14,19,2.8181818181818183,2.0,4,1.9090909090909087,2.0,38,111.8901503327572,182.6794870381889,D,761.1645293257873,42.28691829587707,0.0608931623460629,E,0.9068474293328818,0.763364022071831,0.8351057257023564 58 | 96,19,4.6,3.0,10,3.3,2.0,139,514.2613730712553,893.2508009035917,D,4031.08053741108,223.94891874506,0.2977502669678639,A,0.8179777885488322,1.0961072421180065,0.9570425153334193 59 | 19,80,28.33333333333333,3.0,26,10.333333333333334,3.0,81,162.7164928725825,418.7639251168273,D,2261.325195630868,125.6291775350482,0.1395879750389424,B,0.2508478939066806,0.6479410542740227,0.44939447409035166 60 | 29,18,18.0,18.0,7,7.0,7.0,17,33.28421251514428,60.94436251225966,B,111.73133127247604,6.2072961818042245,0.0203147875040865,D,0.5687814733736574,0.4701936142833818,0.5194875438285196 61 | 49,23,2.789473684210526,2.0,12,2.3684210526315788,2.0,92,353.78347512548123,556.0842589809777,E,3707.228393206518,205.95713295591767,0.1853614196603258,A,0.7229626432600752,0.9533322700963858,0.8381474566782305 62 | 82,23,8.0,3.0,5,3.0,2.5,24,66.60335893412778,101.95026032264605,B,217.4938886883116,12.082993816017307,0.0339834201075486,D,0.6692504138258306,0.2060338184255314,0.437642116125681 63 | 115,68,68.0,68.0,24,24.0,24.0,110,366.7274243667519,664.8833531294299,D,2879.282995331684,159.96016640731577,0.2216277843764766,A,0.168418293842436,0.4047489604799482,0.2865836271611921 64 | 116,24,3.25,2.0,16,2.833333333333333,2.0,132,518.7906980842362,850.4685414520322,D,4268.697871518854,237.14988175104747,0.2834895138173441,A,0.7229626432600752,0.4701936142833818,0.5965781287717284 65 | 79,29,29.0,29.0,11,11.0,11.0,36,72.0,155.58941141594505,C,466.7682342478352,25.93156856932417,0.0518631371386483,C,-0.0435406326953228,0.069456325978715,0.012957846641696098 66 | 69,16,3.4444444444444446,2.0,8,2.7777777777777777,2.0,66,179.65148445440323,348.83654644490844,D,1678.7758797661218,93.26532665367344,0.1162788488149694,B,0.6479410542740227,0.4047489604799482,0.5263450073769854 67 | 80,65,65.0,65.0,27,27.0,27.0,127,280.71716048325214,730.8707127747606,E,4626.256107457261,257.01422819207005,0.2436235709249202,A,0.6352017210259677,0.2060338184255314,0.42061776972574955 68 | 20,119,119.0,119.0,31,31.0,31.0,148,308.9451768949495,866.9811872788806,E,5592.878639504936,310.71547997249644,0.2889937290929602,B,0.1742961999339288,0.184230676650929,0.1792634382924289 69 | 111,22,22.0,22.0,8,8.0,8.0,18,35.219280948873624,64.52932501298082,A,77.43519001557698,4.301955000865387,0.0215097750043269,E,0.5205660117923657,0.4701936142833818,0.49537981303787376 70 | 72,22,22.0,22.0,8,8.0,8.0,18,17.509775004326936,54.0,B,108.0,6.0,0.018,D,0.7902841296780507,0.4316533983187794,0.610968763998415 71 | 77,22,6.4,3.0,5,2.6,2.0,26,61.30296890880645,108.41805003750012,B,263.30097866250026,14.62783214791668,0.0361393500125,C,0.9441285402517696,0.7343534101412322,0.8392409751965009 72 | 25,11,2.230769230769231,2.0,9,2.3076923076923075,2.0,81,296.6075250475963,472.4640911473441,D,2391.849461433429,132.88052563519054,0.157488030382448,C,1.1427575359020303,0.9068474293328818,1.024802482617456 73 | 37,23,23.0,23.0,10,10.0,10.0,30,66.60335893412778,127.43782540330756,C,339.8342010754868,18.879677837527044,0.0424792751344358,C,0.3517535682962757,0.184230676650929,0.2679921224736023 74 | 81,97,25.0,6.0,19,6.8,4.0,189,643.7877672458433,1261.0883896326127,D,5854.105050820865,325.2280583789369,0.4203627965442042,B,0.5687814733736574,0.2060338184255314,0.38740764589959437 75 | 104,8,3.25,2.5,4,2.25,2.0,36,91.19344939991072,162.84823041805248,B,293.12681475249445,16.284823041805247,0.0542827434726841,D,0.493198041195634,0.5687814733736574,0.5309897572846457 76 | 46,70,70.0,70.0,17,17.0,17.0,42,130.38196255841368,204.0352017953581,A,211.59206112111207,11.755114506728448,0.068011733931786,B,0.2508478939066806,0.8656544815719871,0.5582511877393339 77 | 107,9,3.0,2.0,5,2.4,2.0,18,35.219280948873624,64.52932501298082,A,77.43519001557698,4.301955000865387,0.0215097750043269,C,0.493198041195634,0.9853446533928016,0.7392713472942178 78 | 39,37,3.263157894736842,2.0,15,2.3684210526315788,2.0,72,196.9737366025116,388.2468544400708,E,2101.1006240286183,116.72781244603436,0.1294156181466902,A,0.6479410542740227,0.8656544815719871,0.7567977679230049 79 | 65,9,4.75,4.0,5,3.0,2.5,18,47.77443751081735,70.32403072095333,A,105.48604608143,5.860335893412778,0.0234413435736511,E,0.493198041195634,0.763364022071831,0.6282810316337325 80 | 58,16,4.9,4.0,9,3.7,3.0,129,381.4264620457393,785.2827065212939,D,3604.576357802661,200.2542421001478,0.2617609021737646,A,0.8179777885488322,0.763364022071831,0.7906709053103316 81 | 12,10,3.727272727272727,2.0,5,2.636363636363636,2.0,61,173.2315700763964,320.1235783200587,D,1409.5764013125165,78.30980007291758,0.1067078594400195,C,0.532061456707459,0.4605806331273488,0.4963210449174039 82 | 105,73,15.428571428571429,7.0,11,5.285714285714286,4.0,133,341.9747842438563,794.9782298254889,E,4856.594276752078,269.8107931528932,0.264992743275163,C,0.4316533983187794,0.532061456707459,0.4818574275131192 83 | 88,67,8.384615384615385,3.0,12,2.8461538461538463,2.0,99,306.1928094887362,579.9401185176296,D,3015.688616291674,167.53825646064854,0.1933133728392098,A,0.8179777885488322,0.6692504138258306,0.7436141011873314 84 | 70,16,16.0,16.0,9,9.0,9.0,23,66.60335893412778,97.70233280920246,B,195.4046656184049,10.85581475657805,0.0325674442697341,C,0.300758891343087,0.1981986229946224,0.2494787571688547 85 | 87,13,2.583333333333333,2.0,12,2.6666666666666665,2.0,83,195.03468059740075,444.67681638330095,D,1943.872940189858,107.9929411216588,0.1482256054611003,B,0.8179777885488322,0.4605806331273488,0.6392792108380905 86 | 36,36,8.8,2.0,16,4.8,2.0,77,259.8664756744443,436.7767513318052,C,1771.923866198346,98.440214788797,0.145592250443935,B,0.3517535682962757,0.4605806331273488,0.4061671007118123 87 | 21,64,34.5,34.5,24,13.5,13.5,78,227.95057052383703,433.2579304308557,E,2667.956729495269,148.21981830529273,0.1444193101436185,A,0.0555660823185287,0.1940563828117282,0.12481123256512845 88 | 83,8,4.25,3.0,4,2.5,2.0,15,35.219280948873624,53.77443751081735,A,53.77443751081735,2.987468750600964,0.0179248125036057,D,0.5205660117923657,0.7229626432600752,0.6217643275262205 89 | 9,26,3.2142857142857144,1.0,13,2.5,1.5,86,310.722134501717,505.9073022451184,D,2595.3044605174573,144.18358113985877,0.1686357674150394,C,0.9068474293328818,0.7343534101412322,0.820600419737057 90 | 103,14,5.428571428571429,4.0,6,3.4285714285714284,3.0,49,107.74844088268092,232.98948760601,C,965.2421629391844,53.62456460773247,0.0776631625353366,D,0.7229626432600752,0.4701936142833818,0.5965781287717284 91 | 114,9,4.25,3.0,5,3.0,2.5,23,61.30296890880645,95.90827503317318,B,205.5177322139425,11.417651789663472,0.0319694250110577,E,0.1742961999339288,0.5687814733736574,0.37153883665379306 92 | 67,15,4.857142857142857,3.0,5,2.571428571428572,2.0,30,91.19344939991072,135.7068586817104,A,203.5602880225656,11.308904890142534,0.0452356195605701,B,0.8179777885488322,0.5687814733736574,0.6933796309612448 93 | 64,20,6.75,3.5,6,3.0,2.5,12,28.75488750216347,41.51317942364757,A,62.26976913547136,3.4594316186372978,0.0138377264745491,D,0.8179777885488322,0.6352017210259677,0.7265897547874 94 | 47,11,4.2,3.0,5,2.6,2.0,24,66.60335893412778,101.95026032264605,B,217.4938886883116,12.082993816017307,0.0339834201075486,C,0.5205660117923657,0.9985132059990826,0.7595396088957241 95 | 44,22,22.0,22.0,9,9.0,9.0,24,46.05374780501028,93.76537429460444,C,272.7719979479402,15.153999885996676,0.0312551247648681,E,0.8656544815719871,0.2060338184255314,0.5358441499987593 96 | --------------------------------------------------------------------------------