{ "cells": [ { "cell_type": "markdown", "id": "3415114e-9577-4487-89eb-4931620ad9f0", "metadata": {}, "source": [ "# Predict Sales" ] }, { "cell_type": "code", "execution_count": 1, "id": "f271eb45-1470-4764-8c2e-31374efa1fe5", "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np\n", "import os\n", "import s3fs\n", "import re\n", "from sklearn.linear_model import LogisticRegression\n", "from sklearn.ensemble import RandomForestClassifier\n", "from sklearn.metrics import accuracy_score, confusion_matrix, classification_report, recall_score\n", "from sklearn.utils import class_weight\n", "from sklearn.neighbors import KNeighborsClassifier\n", "from sklearn.pipeline import Pipeline\n", "from sklearn.compose import ColumnTransformer\n", "from sklearn.preprocessing import OneHotEncoder\n", "from sklearn.impute import SimpleImputer\n", "from sklearn.model_selection import GridSearchCV\n", "from sklearn.preprocessing import StandardScaler, MaxAbsScaler, MinMaxScaler\n", "from sklearn.metrics import make_scorer, f1_score, balanced_accuracy_score\n", "import seaborn as sns\n", "import matplotlib.pyplot as plt\n", "from sklearn.metrics import roc_curve, auc, precision_recall_curve, average_precision_score\n", "from sklearn.exceptions import ConvergenceWarning, DataConversionWarning\n", "\n", "import pickle\n", "import warnings\n", "#import scikitplot as skplt" ] }, { "cell_type": "code", "execution_count": 2, "id": "3fecb606-22e5-4dee-8efa-f8dff0832299", "metadata": {}, "outputs": [], "source": [ "warnings.filterwarnings('ignore')\n", "warnings.filterwarnings(\"ignore\", category=ConvergenceWarning)\n", "warnings.filterwarnings(\"ignore\", category=DataConversionWarning)" ] }, { "cell_type": "markdown", "id": "ae591854-3003-4c75-a0c7-5abf04246e81", "metadata": {}, "source": [ "### Load Data" ] }, { "cell_type": "code", "execution_count": 3, "id": "59dd4694-a812-4923-b995-a2ee86c74f85", "metadata": {}, "outputs": [], "source": [ "# Create filesystem object\n", "S3_ENDPOINT_URL = \"https://\" + os.environ[\"AWS_S3_ENDPOINT\"]\n", "fs = s3fs.S3FileSystem(client_kwargs={'endpoint_url': S3_ENDPOINT_URL})" ] }, { "cell_type": "code", "execution_count": 4, "id": "017f7e9a-3ba0-40fa-bdc8-51b98cc1fdb3", "metadata": {}, "outputs": [], "source": [ "def load_train_test():\n", " BUCKET = \"projet-bdc2324-team1/Generalization/musique\"\n", " File_path_train = BUCKET + \"/Train_set.csv\"\n", " File_path_test = BUCKET + \"/Test_set.csv\"\n", " \n", " with fs.open( File_path_train, mode=\"rb\") as file_in:\n", " dataset_train = pd.read_csv(file_in, sep=\",\")\n", " # dataset_train['y_has_purchased'] = dataset_train['y_has_purchased'].fillna(0)\n", "\n", " with fs.open(File_path_test, mode=\"rb\") as file_in:\n", " dataset_test = pd.read_csv(file_in, sep=\",\")\n", " # dataset_test['y_has_purchased'] = dataset_test['y_has_purchased'].fillna(0)\n", " \n", " return dataset_train, dataset_test" ] }, { "cell_type": "code", "execution_count": 5, "id": "c479b230-b4bd-4cfb-b76b-d9faf6d95772", "metadata": {}, "outputs": [], "source": [ "dataset_train, dataset_test = load_train_test()" ] }, { "cell_type": "code", "execution_count": 6, "id": "c24c446d-4e1c-4ac1-a048-f0b8d8559f36", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "customer_id 0\n", "nb_tickets 0\n", "nb_purchases 0\n", "total_amount 0\n", "nb_suppliers 0\n", "vente_internet_max 0\n", "purchase_date_min 0\n", "purchase_date_max 0\n", "time_between_purchase 0\n", "nb_tickets_internet 0\n", "street_id 0\n", "structure_id 327067\n", "mcp_contact_id 135224\n", "fidelity 0\n", "tenant_id 0\n", "is_partner 0\n", "deleted_at 354365\n", "gender 0\n", "is_email_true 0\n", "opt_in 0\n", "last_buying_date 119201\n", "max_price 119201\n", "ticket_sum 0\n", "average_price 115193\n", "average_purchase_delay 119203\n", "average_price_basket 119203\n", "average_ticket_basket 119203\n", "total_price 4008\n", "purchase_count 0\n", "first_buying_date 119201\n", "country 56856\n", "gender_label 0\n", "gender_female 0\n", "gender_male 0\n", "gender_other 0\n", "country_fr 56856\n", "nb_campaigns 0\n", "nb_campaigns_opened 0\n", "time_to_open 224310\n", "y_has_purchased 0\n", "dtype: int64" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dataset_train.isna().sum()" ] }, { "cell_type": "code", "execution_count": 7, "id": "825d14a3-6967-4733-bfd4-64bf61c2bd43", "metadata": {}, "outputs": [], "source": [ "def features_target_split(dataset_train, dataset_test):\n", " features_l = ['nb_tickets', 'nb_purchases', 'total_amount', 'nb_suppliers', 'vente_internet_max', 'purchase_date_min', 'purchase_date_max', \n", " 'time_between_purchase', 'nb_tickets_internet', 'fidelity', 'is_email_true', 'opt_in', #'is_partner',\n", " 'gender_female', 'gender_male', 'gender_other', 'nb_campaigns', 'nb_campaigns_opened']\n", " X_train = dataset_train[features_l]\n", " y_train = dataset_train[['y_has_purchased']]\n", "\n", " X_test = dataset_test[features_l]\n", " y_test = dataset_test[['y_has_purchased']]\n", " return X_train, X_test, y_train, y_test" ] }, { "cell_type": "code", "execution_count": 8, "id": "69eaec12-b30f-4d30-a461-ea520d5cbf77", "metadata": {}, "outputs": [], "source": [ "X_train, X_test, y_train, y_test = features_target_split(dataset_train, dataset_test)" ] }, { "cell_type": "code", "execution_count": 9, "id": "d039f31d-0093-46c6-9743-ddec1381f758", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Shape train : (354365, 17)\n", "Shape test : (151874, 17)\n" ] } ], "source": [ "print(\"Shape train : \", X_train.shape)\n", "print(\"Shape test : \", X_test.shape)" ] }, { "cell_type": "markdown", "id": "a1d6de94-4e11-481a-a0ce-412bf29f692c", "metadata": {}, "source": [ "### Prepare preprocessing and Hyperparameters" ] }, { "cell_type": "code", "execution_count": 10, "id": "b808da43-c444-4e94-995a-7ec6ccd01e2d", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{0.0: 0.5481283836040216, 1.0: 5.694439980716696}" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Compute Weights\n", "weights = class_weight.compute_class_weight(class_weight = 'balanced', classes = np.unique(y_train['y_has_purchased']),\n", " y = y_train['y_has_purchased'])\n", "\n", "weight_dict = {np.unique(y_train['y_has_purchased'])[i]: weights[i] for i in range(len(np.unique(y_train['y_has_purchased'])))}\n", "weight_dict" ] }, { "cell_type": "code", "execution_count": 11, "id": "b32a79ea-907f-4dfc-9832-6c74bef3200c", "metadata": {}, "outputs": [], "source": [ "numeric_features = ['nb_tickets', 'nb_purchases', 'total_amount', 'nb_suppliers', 'vente_internet_max', 'purchase_date_min', 'purchase_date_max', \n", " 'time_between_purchase', 'nb_tickets_internet', 'fidelity', 'is_email_true', 'opt_in', #'is_partner',\n", " 'gender_female', 'gender_male', 'gender_other', 'nb_campaigns', 'nb_campaigns_opened']\n", "\n", "numeric_transformer = Pipeline(steps=[\n", " #(\"imputer\", SimpleImputer(strategy=\"mean\")), \n", " (\"scaler\", StandardScaler()) \n", "])\n", "\n", "categorical_features = ['opt_in'] \n", "\n", "# Transformer for the categorical features\n", "categorical_transformer = Pipeline(steps=[\n", " #(\"imputer\", SimpleImputer(strategy=\"most_frequent\")), # Impute missing values with the most frequent\n", " (\"onehot\", OneHotEncoder(handle_unknown='ignore', sparse_output=False))\n", "])\n", "\n", "preproc = ColumnTransformer(\n", " transformers=[\n", " (\"num\", numeric_transformer, numeric_features),\n", " (\"cat\", categorical_transformer, categorical_features)\n", " ]\n", ")" ] }, { "cell_type": "code", "execution_count": 12, "id": "9809a688-bfbc-4685-a77f-17a8b2b79ab3", "metadata": {}, "outputs": [], "source": [ "# Set loss\n", "balanced_scorer = make_scorer(balanced_accuracy_score)\n", "recall_scorer = make_scorer(recall_score)" ] }, { "cell_type": "code", "execution_count": 13, "id": "4f9b2bbf-5f8a-4ac1-8e6c-51bd0dd8ac85", "metadata": {}, "outputs": [], "source": [ "def draw_confusion_matrix(y_test, y_pred):\n", " conf_matrix = confusion_matrix(y_test, y_pred)\n", " sns.heatmap(conf_matrix, annot=True, fmt='d', cmap='Blues', xticklabels=['Class 0', 'Class 1'], yticklabels=['Class 0', 'Class 1'])\n", " plt.xlabel('Predicted')\n", " plt.ylabel('Actual')\n", " plt.title('Confusion Matrix')\n", " plt.show()\n", "\n", "\n", "def draw_roc_curve(X_test, y_test):\n", " y_pred_prob = pipeline.predict_proba(X_test)[:, 1]\n", "\n", " # Calcul des taux de faux positifs (FPR) et de vrais positifs (TPR)\n", " fpr, tpr, thresholds = roc_curve(y_test, y_pred_prob, pos_label=1)\n", " \n", " # Calcul de l'aire sous la courbe ROC (AUC)\n", " roc_auc = auc(fpr, tpr)\n", " \n", " plt.figure(figsize = (14, 8))\n", " plt.plot(fpr, tpr, label=\"ROC curve(area = %0.3f)\" % roc_auc)\n", " plt.plot([0, 1], [0, 1], color=\"red\",label=\"Random Baseline\", linestyle=\"--\")\n", " plt.grid(color='gray', linestyle='--', linewidth=0.5)\n", " plt.xlabel('Taux de faux positifs (FPR)')\n", " plt.ylabel('Taux de vrais positifs (TPR)')\n", " plt.title('Courbe ROC : modèle logistique')\n", " plt.legend(loc=\"lower right\")\n", " plt.show()" ] }, { "cell_type": "code", "execution_count": 14, "id": "cf400c70-0192-42cc-9919-f61bae8382b0", "metadata": {}, "outputs": [], "source": [ "def draw_features_importance(pipeline, model):\n", " coefficients = pipeline.named_steps['logreg'].coef_[0]\n", " feature_names = pipeline.named_steps['logreg'].feature_names_in_\n", " \n", " # Tracer l'importance des caractéristiques\n", " plt.figure(figsize=(10, 6))\n", " plt.barh(feature_names, coefficients, color='skyblue')\n", " plt.xlabel('Importance des caractéristiques')\n", " plt.ylabel('Caractéristiques')\n", " plt.title('Importance des caractéristiques dans le modèle de régression logistique')\n", " plt.grid(True)\n", " plt.show()\n", "\n", "def draw_prob_distribution(X_test):\n", " y_pred_prob = pipeline.predict_proba(X_test)[:, 1]\n", " plt.figure(figsize=(8, 6))\n", " plt.hist(y_pred_prob, bins=10, range=(0, 1), color='blue', alpha=0.7)\n", " \n", " plt.xlim(0, 1)\n", " plt.ylim(0, None)\n", " \n", " plt.title('Histogramme des probabilités pour la classe 1')\n", " plt.xlabel('Probabilité')\n", " plt.ylabel('Fréquence')\n", " plt.grid(True)\n", " plt.show()\n" ] }, { "cell_type": "code", "execution_count": 15, "id": "206d9a95-7c37-4506-949b-e77d225e42c5", "metadata": {}, "outputs": [], "source": [ "# Hyperparameter\n", "param_grid = {'logreg__C': np.logspace(-10, 6, 17, base=2),\n", " 'logreg__penalty': ['l1', 'l2'],\n", " 'logreg__class_weight': ['balanced', weight_dict]} " ] }, { "cell_type": "code", "execution_count": 16, "id": "7ff2f7bd-efc1-4f7c-a3c9-caa916aa2f2b", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
Pipeline(steps=[('preprocessor',\n", " ColumnTransformer(transformers=[('num',\n", " Pipeline(steps=[('scaler',\n", " StandardScaler())]),\n", " ['nb_tickets', 'nb_purchases',\n", " 'total_amount',\n", " 'nb_suppliers',\n", " 'vente_internet_max',\n", " 'purchase_date_min',\n", " 'purchase_date_max',\n", " 'time_between_purchase',\n", " 'nb_tickets_internet',\n", " 'fidelity', 'is_email_true',\n", " 'opt_in', 'gender_female',\n", " 'gender_male',\n", " 'gender_other',\n", " 'nb_campaigns',\n", " 'nb_campaigns_opened']),\n", " ('cat',\n", " Pipeline(steps=[('onehot',\n", " OneHotEncoder(handle_unknown='ignore',\n", " sparse_output=False))]),\n", " ['opt_in'])])),\n", " ('logreg',\n", " LogisticRegression(class_weight={0.0: 0.5481283836040216,\n", " 1.0: 5.694439980716696},\n", " max_iter=5000, solver='saga'))])In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
Pipeline(steps=[('preprocessor',\n", " ColumnTransformer(transformers=[('num',\n", " Pipeline(steps=[('scaler',\n", " StandardScaler())]),\n", " ['nb_tickets', 'nb_purchases',\n", " 'total_amount',\n", " 'nb_suppliers',\n", " 'vente_internet_max',\n", " 'purchase_date_min',\n", " 'purchase_date_max',\n", " 'time_between_purchase',\n", " 'nb_tickets_internet',\n", " 'fidelity', 'is_email_true',\n", " 'opt_in', 'gender_female',\n", " 'gender_male',\n", " 'gender_other',\n", " 'nb_campaigns',\n", " 'nb_campaigns_opened']),\n", " ('cat',\n", " Pipeline(steps=[('onehot',\n", " OneHotEncoder(handle_unknown='ignore',\n", " sparse_output=False))]),\n", " ['opt_in'])])),\n", " ('logreg',\n", " LogisticRegression(class_weight={0.0: 0.5481283836040216,\n", " 1.0: 5.694439980716696},\n", " max_iter=5000, solver='saga'))])
ColumnTransformer(transformers=[('num',\n", " Pipeline(steps=[('scaler', StandardScaler())]),\n", " ['nb_tickets', 'nb_purchases', 'total_amount',\n", " 'nb_suppliers', 'vente_internet_max',\n", " 'purchase_date_min', 'purchase_date_max',\n", " 'time_between_purchase',\n", " 'nb_tickets_internet', 'fidelity',\n", " 'is_email_true', 'opt_in', 'gender_female',\n", " 'gender_male', 'gender_other', 'nb_campaigns',\n", " 'nb_campaigns_opened']),\n", " ('cat',\n", " Pipeline(steps=[('onehot',\n", " OneHotEncoder(handle_unknown='ignore',\n", " sparse_output=False))]),\n", " ['opt_in'])])
['nb_tickets', 'nb_purchases', 'total_amount', 'nb_suppliers', 'vente_internet_max', 'purchase_date_min', 'purchase_date_max', 'time_between_purchase', 'nb_tickets_internet', 'fidelity', 'is_email_true', 'opt_in', 'gender_female', 'gender_male', 'gender_other', 'nb_campaigns', 'nb_campaigns_opened']
StandardScaler()
['opt_in']
OneHotEncoder(handle_unknown='ignore', sparse_output=False)
LogisticRegression(class_weight={0.0: 0.5481283836040216,\n", " 1.0: 5.694439980716696},\n", " max_iter=5000, solver='saga')
Pipeline(steps=[('preprocessor',\n", " ColumnTransformer(transformers=[('num',\n", " Pipeline(steps=[('scaler',\n", " StandardScaler())]),\n", " ['nb_tickets', 'nb_purchases',\n", " 'total_amount',\n", " 'nb_suppliers',\n", " 'vente_internet_max',\n", " 'purchase_date_min',\n", " 'purchase_date_max',\n", " 'time_between_purchase',\n", " 'nb_tickets_internet',\n", " 'fidelity', 'is_email_true',\n", " 'opt_in', 'gender_female',\n", " 'gender_male',\n", " 'gender_other',\n", " 'nb_campaigns',\n", " 'nb_campaigns_opened']),\n", " ('cat',\n", " Pipeline(steps=[('onehot',\n", " OneHotEncoder(handle_unknown='ignore',\n", " sparse_output=False))]),\n", " ['opt_in'])])),\n", " ('logreg',\n", " LogisticRegression(class_weight={0.0: 0.5481283836040216,\n", " 1.0: 5.694439980716696},\n", " max_iter=5000, solver='saga'))])In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
Pipeline(steps=[('preprocessor',\n", " ColumnTransformer(transformers=[('num',\n", " Pipeline(steps=[('scaler',\n", " StandardScaler())]),\n", " ['nb_tickets', 'nb_purchases',\n", " 'total_amount',\n", " 'nb_suppliers',\n", " 'vente_internet_max',\n", " 'purchase_date_min',\n", " 'purchase_date_max',\n", " 'time_between_purchase',\n", " 'nb_tickets_internet',\n", " 'fidelity', 'is_email_true',\n", " 'opt_in', 'gender_female',\n", " 'gender_male',\n", " 'gender_other',\n", " 'nb_campaigns',\n", " 'nb_campaigns_opened']),\n", " ('cat',\n", " Pipeline(steps=[('onehot',\n", " OneHotEncoder(handle_unknown='ignore',\n", " sparse_output=False))]),\n", " ['opt_in'])])),\n", " ('logreg',\n", " LogisticRegression(class_weight={0.0: 0.5481283836040216,\n", " 1.0: 5.694439980716696},\n", " max_iter=5000, solver='saga'))])
ColumnTransformer(transformers=[('num',\n", " Pipeline(steps=[('scaler', StandardScaler())]),\n", " ['nb_tickets', 'nb_purchases', 'total_amount',\n", " 'nb_suppliers', 'vente_internet_max',\n", " 'purchase_date_min', 'purchase_date_max',\n", " 'time_between_purchase',\n", " 'nb_tickets_internet', 'fidelity',\n", " 'is_email_true', 'opt_in', 'gender_female',\n", " 'gender_male', 'gender_other', 'nb_campaigns',\n", " 'nb_campaigns_opened']),\n", " ('cat',\n", " Pipeline(steps=[('onehot',\n", " OneHotEncoder(handle_unknown='ignore',\n", " sparse_output=False))]),\n", " ['opt_in'])])
['nb_tickets', 'nb_purchases', 'total_amount', 'nb_suppliers', 'vente_internet_max', 'purchase_date_min', 'purchase_date_max', 'time_between_purchase', 'nb_tickets_internet', 'fidelity', 'is_email_true', 'opt_in', 'gender_female', 'gender_male', 'gender_other', 'nb_campaigns', 'nb_campaigns_opened']
StandardScaler()
['opt_in']
OneHotEncoder(handle_unknown='ignore', sparse_output=False)
LogisticRegression(class_weight={0.0: 0.5481283836040216,\n", " 1.0: 5.694439980716696},\n", " max_iter=5000, solver='saga')
\n", " | nb_tickets | \n", "nb_purchases | \n", "total_amount | \n", "nb_suppliers | \n", "vente_internet_max | \n", "purchase_date_min | \n", "purchase_date_max | \n", "time_between_purchase | \n", "nb_tickets_internet | \n", "fidelity | \n", "gender_female | \n", "gender_male | \n", "gender_other | \n", "nb_campaigns | \n", "nb_campaigns_opened | \n", "
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
\n", " | mean | \n", "mean | \n", "mean | \n", "mean | \n", "mean | \n", "mean | \n", "mean | \n", "mean | \n", "mean | \n", "mean | \n", "mean | \n", "mean | \n", "mean | \n", "mean | \n", "mean | \n", "
category | \n", "\n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " |
0 | \n", "0.113637 | \n", "0.006274 | \n", "1.586366 | \n", "0.005821 | \n", "0.000647 | \n", "548.790455 | \n", "548.773103 | \n", "-0.977118 | \n", "0.001585 | \n", "0.000776 | \n", "0.000000 | \n", "0.000032 | \n", "0.999968 | \n", "13.984219 | \n", "1.302720 | \n", "
1 | \n", "0.810841 | \n", "0.128432 | \n", "9.611292 | \n", "0.125295 | \n", "0.018186 | \n", "525.437516 | \n", "525.275222 | \n", "-0.729328 | \n", "0.054312 | \n", "0.111832 | \n", "0.245480 | \n", "0.495929 | \n", "0.258591 | \n", "18.413562 | \n", "3.718711 | \n", "
2 | \n", "1.159419 | \n", "0.339253 | \n", "15.182143 | \n", "0.337577 | \n", "0.323824 | \n", "501.529129 | \n", "501.415505 | \n", "-0.554439 | \n", "0.969939 | \n", "0.304757 | \n", "0.392570 | \n", "0.297258 | \n", "0.310173 | \n", "17.395042 | \n", "2.608084 | \n", "
3 | \n", "2.153080 | \n", "0.744161 | \n", "27.820044 | \n", "0.734881 | \n", "0.600982 | \n", "287.051054 | \n", "286.675385 | \n", "0.105360 | \n", "1.776035 | \n", "0.659878 | \n", "0.288813 | \n", "0.253244 | \n", "0.457943 | \n", "16.790421 | \n", "4.173954 | \n", "
4 | \n", "2.044749 | \n", "0.777640 | \n", "27.353145 | \n", "0.754549 | \n", "0.079213 | \n", "297.179255 | \n", "295.019902 | \n", "1.898178 | \n", "0.293760 | \n", "0.894877 | \n", "0.666980 | \n", "0.301424 | \n", "0.031596 | \n", "16.954707 | \n", "6.060621 | \n", "
5 | \n", "3.237988 | \n", "0.958520 | \n", "46.637380 | \n", "0.807655 | \n", "0.484785 | \n", "387.464785 | \n", "380.145068 | \n", "7.111357 | \n", "2.080397 | \n", "1.164958 | \n", "0.497758 | \n", "0.259769 | \n", "0.242473 | \n", "27.006406 | \n", "12.457719 | \n", "
6 | \n", "3.592233 | \n", "1.102881 | \n", "49.989226 | \n", "0.878014 | \n", "0.599906 | \n", "268.627019 | \n", "250.949344 | \n", "17.539247 | \n", "2.525994 | \n", "1.420921 | \n", "0.534607 | \n", "0.304259 | \n", "0.161134 | \n", "14.073285 | \n", "4.604134 | \n", "
7 | \n", "3.747016 | \n", "1.391266 | \n", "40.710335 | \n", "0.914702 | \n", "0.160990 | \n", "309.716173 | \n", "274.795570 | \n", "34.796876 | \n", "0.844250 | \n", "1.963028 | \n", "0.650364 | \n", "0.263464 | \n", "0.086172 | \n", "26.186317 | \n", "8.891703 | \n", "
8 | \n", "5.698276 | \n", "1.567006 | \n", "63.033699 | \n", "0.907915 | \n", "0.334248 | \n", "326.485952 | \n", "257.940194 | \n", "68.425460 | \n", "2.794279 | \n", "2.413009 | \n", "0.606583 | \n", "0.251567 | \n", "0.141850 | \n", "30.987461 | \n", "11.676332 | \n", "
9 | \n", "14.505956 | \n", "3.211571 | \n", "107.288514 | \n", "1.011628 | \n", "0.157119 | \n", "369.696066 | \n", "209.280306 | \n", "160.348544 | \n", "3.514464 | \n", "5.394498 | \n", "0.669314 | \n", "0.223766 | \n", "0.106920 | \n", "45.928247 | \n", "18.241634 | \n", "
10 | \n", "2262.859155 | \n", "45.619718 | \n", "11051.732394 | \n", "1.464789 | \n", "0.154930 | \n", "467.111875 | \n", "31.146796 | \n", "435.950994 | \n", "54.295775 | \n", "64.704225 | \n", "0.507042 | \n", "0.295775 | \n", "0.197183 | \n", "53.352113 | \n", "26.070423 | \n", "