diff --git a/sompy/examples/.ipynb_checkpoints/AirFlights_hexagonal_grid-checkpoint.ipynb b/sompy/examples/.ipynb_checkpoints/AirFlights_hexagonal_grid-checkpoint.ipynb
new file mode 100644
index 0000000..64ef117
--- /dev/null
+++ b/sompy/examples/.ipynb_checkpoints/AirFlights_hexagonal_grid-checkpoint.ipynb
@@ -0,0 +1,694 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Study of airflight delay causes with Self Organizing Maps - Example of hexagonal lattice"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "This notebook is intended to be a brief guide on how to use Self Organizing Maps with the **SOMPY** library in Python. We are going to use hexagonal lattice in this example in order to understand the main causes of airflight cancellations\n",
+ "\n",
+ "##### Data description\n",
+ "________________________\n",
+ "\n",
+ "The U.S. Department of Transportation's (DOT) Bureau of Transportation Statistics (BTS) tracks the on-time performance of domestic flights operated by large air carriers. Summary information on the number of on-time, delayed, canceled and diverted flights appears in DOT's monthly Air Travel Consumer Report, published about 30 days after the month's end, as well as in summary tables posted on this website. BTS began collecting details on the causes of flight delays in June 2003. Summary statistics and raw data are made available to the public at the time the Air Travel Consumer Report is released.\n",
+ "\n",
+ "This version of the dataset was compiled from the Statistical Computing Statistical Graphics 2009 Data Expo and is also available [here](http://stat-computing.org/dataexpo/2009/the-data.html), [here](https://www.transtats.bts.gov/Fields.asp?Table_ID=236) and [here](https://www.kaggle.com/giovamata/airlinedelaycauses)\n",
+ "\n",
+ "**Fields description**\n",
+ "__________________________\n",
+ "1.\t**Year**:\t2008\n",
+ "2.\t**Month**:\t1-12\n",
+ "3.\t**DayofMonth**:\t1-31\n",
+ "4.\t**DayOfWeek**:\t1 (Monday) - 7 (Sunday)\n",
+ "5.\t**DepTime**:\tactual departure time (local, hhmm)\n",
+ "6.\t**CRSDepTime**:\tscheduled departure time (local, hhmm)\n",
+ "7.\t**ArrTime**:\tactual arrival time (local, hhmm)\n",
+ "8.\t**CRSArrTime**:\tscheduled arrival time (local, hhmm)\n",
+ "9.\t**UniqueCarrier**:\tunique carrier code\n",
+ "10.\t**FlightNum**:\tflight number\n",
+ "11.\t**TailNum**:\tplane tail number\n",
+ "12.\t**ActualElapsedTime**:\tin minutes\n",
+ "13.\t**CRSElapsedTime**:\tin minutes\n",
+ "14.\t**AirTime**:\tin minutes\n",
+ "15.\t**ArrDelay**:\tarrival delay, in minutes\n",
+ "16.\t**DepDelay**:\tdeparture delay, in minutes\n",
+ "17.\t**Origin**:\torigin IATA airport code\n",
+ "18.\t**Dest**:\tdestination IATA airport code\n",
+ "19.\t**Distance**:\tin miles\n",
+ "20.\t**TaxiIn**:\ttaxi in time, in minutes\n",
+ "21.\t**TaxiOut**:\ttaxi out time in minutes\n",
+ "22.\t**Cancelled**:\twas the flight cancelled?\n",
+ "23.\t**CancellationCode**:\treason for cancellation (A = carrier, B = weather, C = NAS, D = security)\n",
+ "24.\t**Diverted**:\t1 = yes, 0 = no\n",
+ "25.\t**CarrierDelay**:\tin minutes\n",
+ "26.\t**WeatherDelay**:\tin minutes\n",
+ "27.\t**NASDelay**:\tNational Air System delay in minutes\n",
+ "28.\t**SecurityDelay**\tin minutes\n",
+ "29.\t**LateAircraftDelay**\tin minutes"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "backend module://ipykernel.pylab.backend_inline version unknown\n"
+ ]
+ }
+ ],
+ "source": [
+ "%matplotlib inline\n",
+ "import math\n",
+ "import glob\n",
+ "import matplotlib.pyplot as plt\n",
+ "import numpy as np\n",
+ "import pandas as pd\n",
+ "import urllib3\n",
+ "from sklearn.externals import joblib\n",
+ "import random\n",
+ "import matplotlib\n",
+ "from sompy.sompy import SOMFactory\n",
+ "from sompy.visualization.plot_tools import plot_hex_map\n",
+ "import logging\n"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "metadata": {},
+ "source": [
+ "!kaggle datasets download -d giovamata/airlinedelaycauses\n",
+ "!unzip airlinedelaycauses.zip"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Data Processing"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "df = pd.read_csv(\"./DelayedFlights.csv\")\n",
+ "\n",
+ "df = df[[\"Month\",\"DayofMonth\", \"DayOfWeek\",\"DepTime\", \"AirTime\",\n",
+ " \"Distance\", \"SecurityDelay\",\"WeatherDelay\", \"NASDelay\", \"CarrierDelay\",\n",
+ " \"ArrDelay\", \"DepDelay\", \"LateAircraftDelay\", \"Cancelled\"]]\n",
+ "clustering_vars = [\"Month\", \"DayofMonth\", \"DepTime\", \"AirTime\", \n",
+ " \"LateAircraftDelay\", \"DepDelay\", \"ArrDelay\", \"CarrierDelay\"]\n",
+ "df = df.fillna(0)\n",
+ "data = df[clustering_vars].values\n",
+ "names = clustering_vars"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " Month | \n",
+ " DayofMonth | \n",
+ " DayOfWeek | \n",
+ " DepTime | \n",
+ " AirTime | \n",
+ " Distance | \n",
+ " SecurityDelay | \n",
+ " WeatherDelay | \n",
+ " NASDelay | \n",
+ " CarrierDelay | \n",
+ " ArrDelay | \n",
+ " DepDelay | \n",
+ " LateAircraftDelay | \n",
+ " Cancelled | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " count | \n",
+ " 1.936758e+06 | \n",
+ " 1.936758e+06 | \n",
+ " 1.936758e+06 | \n",
+ " 1.936758e+06 | \n",
+ " 1.936758e+06 | \n",
+ " 1.936758e+06 | \n",
+ " 1.936758e+06 | \n",
+ " 1.936758e+06 | \n",
+ " 1.936758e+06 | \n",
+ " 1.936758e+06 | \n",
+ " 1.936758e+06 | \n",
+ " 1.936758e+06 | \n",
+ " 1.936758e+06 | \n",
+ " 1.936758e+06 | \n",
+ "
\n",
+ " \n",
+ " mean | \n",
+ " 6.111106e+00 | \n",
+ " 1.575347e+01 | \n",
+ " 3.984827e+00 | \n",
+ " 1.518534e+03 | \n",
+ " 1.078083e+02 | \n",
+ " 7.656862e+02 | \n",
+ " 5.805836e-02 | \n",
+ " 2.385512e+00 | \n",
+ " 9.675607e+00 | \n",
+ " 1.235367e+01 | \n",
+ " 4.201714e+01 | \n",
+ " 4.318518e+01 | \n",
+ " 1.629374e+01 | \n",
+ " 3.268348e-04 | \n",
+ "
\n",
+ " \n",
+ " std | \n",
+ " 3.482546e+00 | \n",
+ " 8.776272e+00 | \n",
+ " 1.995966e+00 | \n",
+ " 4.504853e+02 | \n",
+ " 6.886184e+01 | \n",
+ " 5.744797e+02 | \n",
+ " 1.623934e+00 | \n",
+ " 1.734036e+01 | \n",
+ " 2.808958e+01 | \n",
+ " 3.613493e+01 | \n",
+ " 5.672935e+01 | \n",
+ " 5.340250e+01 | \n",
+ " 3.585904e+01 | \n",
+ " 1.807562e-02 | \n",
+ "
\n",
+ " \n",
+ " min | \n",
+ " 1.000000e+00 | \n",
+ " 1.000000e+00 | \n",
+ " 1.000000e+00 | \n",
+ " 1.000000e+00 | \n",
+ " 0.000000e+00 | \n",
+ " 1.100000e+01 | \n",
+ " 0.000000e+00 | \n",
+ " 0.000000e+00 | \n",
+ " 0.000000e+00 | \n",
+ " 0.000000e+00 | \n",
+ " -1.090000e+02 | \n",
+ " 6.000000e+00 | \n",
+ " 0.000000e+00 | \n",
+ " 0.000000e+00 | \n",
+ "
\n",
+ " \n",
+ " 25% | \n",
+ " 3.000000e+00 | \n",
+ " 8.000000e+00 | \n",
+ " 2.000000e+00 | \n",
+ " 1.203000e+03 | \n",
+ " 5.800000e+01 | \n",
+ " 3.380000e+02 | \n",
+ " 0.000000e+00 | \n",
+ " 0.000000e+00 | \n",
+ " 0.000000e+00 | \n",
+ " 0.000000e+00 | \n",
+ " 9.000000e+00 | \n",
+ " 1.200000e+01 | \n",
+ " 0.000000e+00 | \n",
+ " 0.000000e+00 | \n",
+ "
\n",
+ " \n",
+ " 50% | \n",
+ " 6.000000e+00 | \n",
+ " 1.600000e+01 | \n",
+ " 4.000000e+00 | \n",
+ " 1.545000e+03 | \n",
+ " 9.000000e+01 | \n",
+ " 6.060000e+02 | \n",
+ " 0.000000e+00 | \n",
+ " 0.000000e+00 | \n",
+ " 0.000000e+00 | \n",
+ " 0.000000e+00 | \n",
+ " 2.400000e+01 | \n",
+ " 2.400000e+01 | \n",
+ " 0.000000e+00 | \n",
+ " 0.000000e+00 | \n",
+ "
\n",
+ " \n",
+ " 75% | \n",
+ " 9.000000e+00 | \n",
+ " 2.300000e+01 | \n",
+ " 6.000000e+00 | \n",
+ " 1.900000e+03 | \n",
+ " 1.370000e+02 | \n",
+ " 9.980000e+02 | \n",
+ " 0.000000e+00 | \n",
+ " 0.000000e+00 | \n",
+ " 6.000000e+00 | \n",
+ " 1.000000e+01 | \n",
+ " 5.500000e+01 | \n",
+ " 5.300000e+01 | \n",
+ " 1.800000e+01 | \n",
+ " 0.000000e+00 | \n",
+ "
\n",
+ " \n",
+ " max | \n",
+ " 1.200000e+01 | \n",
+ " 3.100000e+01 | \n",
+ " 7.000000e+00 | \n",
+ " 2.400000e+03 | \n",
+ " 1.091000e+03 | \n",
+ " 4.962000e+03 | \n",
+ " 3.920000e+02 | \n",
+ " 1.352000e+03 | \n",
+ " 1.357000e+03 | \n",
+ " 2.436000e+03 | \n",
+ " 2.461000e+03 | \n",
+ " 2.467000e+03 | \n",
+ " 1.316000e+03 | \n",
+ " 1.000000e+00 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Month DayofMonth DayOfWeek DepTime AirTime \\\n",
+ "count 1.936758e+06 1.936758e+06 1.936758e+06 1.936758e+06 1.936758e+06 \n",
+ "mean 6.111106e+00 1.575347e+01 3.984827e+00 1.518534e+03 1.078083e+02 \n",
+ "std 3.482546e+00 8.776272e+00 1.995966e+00 4.504853e+02 6.886184e+01 \n",
+ "min 1.000000e+00 1.000000e+00 1.000000e+00 1.000000e+00 0.000000e+00 \n",
+ "25% 3.000000e+00 8.000000e+00 2.000000e+00 1.203000e+03 5.800000e+01 \n",
+ "50% 6.000000e+00 1.600000e+01 4.000000e+00 1.545000e+03 9.000000e+01 \n",
+ "75% 9.000000e+00 2.300000e+01 6.000000e+00 1.900000e+03 1.370000e+02 \n",
+ "max 1.200000e+01 3.100000e+01 7.000000e+00 2.400000e+03 1.091000e+03 \n",
+ "\n",
+ " Distance SecurityDelay WeatherDelay NASDelay CarrierDelay \\\n",
+ "count 1.936758e+06 1.936758e+06 1.936758e+06 1.936758e+06 1.936758e+06 \n",
+ "mean 7.656862e+02 5.805836e-02 2.385512e+00 9.675607e+00 1.235367e+01 \n",
+ "std 5.744797e+02 1.623934e+00 1.734036e+01 2.808958e+01 3.613493e+01 \n",
+ "min 1.100000e+01 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 \n",
+ "25% 3.380000e+02 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 \n",
+ "50% 6.060000e+02 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 \n",
+ "75% 9.980000e+02 0.000000e+00 0.000000e+00 6.000000e+00 1.000000e+01 \n",
+ "max 4.962000e+03 3.920000e+02 1.352000e+03 1.357000e+03 2.436000e+03 \n",
+ "\n",
+ " ArrDelay DepDelay LateAircraftDelay Cancelled \n",
+ "count 1.936758e+06 1.936758e+06 1.936758e+06 1.936758e+06 \n",
+ "mean 4.201714e+01 4.318518e+01 1.629374e+01 3.268348e-04 \n",
+ "std 5.672935e+01 5.340250e+01 3.585904e+01 1.807562e-02 \n",
+ "min -1.090000e+02 6.000000e+00 0.000000e+00 0.000000e+00 \n",
+ "25% 9.000000e+00 1.200000e+01 0.000000e+00 0.000000e+00 \n",
+ "50% 2.400000e+01 2.400000e+01 0.000000e+00 0.000000e+00 \n",
+ "75% 5.500000e+01 5.300000e+01 1.800000e+01 0.000000e+00 \n",
+ "max 2.461000e+03 2.467000e+03 1.316000e+03 1.000000e+00 "
+ ]
+ },
+ "execution_count": 3,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df.describe()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Model Training "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "As the data is relatively high, the model takes some time to train. We didn't finetune the hyperparameters of the algorithm and this is a potential improvement topic."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "%time\n",
+ "# Train the model with different parameters. The more, the better. Each iteration is stored in disk for further study\n",
+ "for i in range(1000):\n",
+ " sm = SOMFactory().build(data, mapsize=[random.choice(list(range(15, 25))), \n",
+ " random.choice(list(range(10, 15)))],\n",
+ " normalization = 'var', initialization='random', component_names=names, lattice=\"hexa\")\n",
+ " sm.train(n_job=4, verbose=False, train_rough_len=30, train_finetune_len=100)\n",
+ " joblib.dump(sm, \"model_{}.joblib\".format(i))\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "scrolled": false
+ },
+ "outputs": [],
+ "source": [
+ "# Study the models trained and plot the errors obtained in order to select the best one\n",
+ "models_pool = glob.glob(\"./model*\")\n",
+ "errors=[]\n",
+ "for model_filepath in models_pool:\n",
+ " sm = joblib.load(model_filepath)\n",
+ " topographic_error = sm.calculate_topographic_error()\n",
+ " quantization_error = sm.calculate_quantization_error()\n",
+ " errors.append((topographic_error, quantization_error))\n",
+ "e_top, e_q = zip(*errors)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ "