{"nbformat": 4, "cells": [{"source": ["from bokeh.plotting import figure, show, output_notebook\n", "from bokeh.models import HoverTool, ColumnDataSource\n", "import numpy as np\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "output_notebook()\n", "\n", "def get_product_agg(cols):\n", "    df_train = pd.read_csv('../input/train.csv', usecols = ['Semana', 'Producto_ID'] + cols,\n", "                           dtype  = {'Semana': 'int32',\n", "                                     'Producto_ID':'int32',\n", "                                     'Venta_hoy':'float32',\n", "                                     'Venta_uni_hoy': 'int32',\n", "                                     'Dev_uni_proxima':'int32',\n", "                                     'Dev_proxima':'float32',\n", "                                     'Demanda_uni_equil':'int32'})\n", "    agg  = df_train.groupby(['Semana', 'Producto_ID'], as_index=False).agg(['count','sum', 'min', 'max','median','mean'])\n", "    agg.columns  =  ['_'.join(col).strip() for col in agg.columns.values]\n", "    del(df_train)\n", "    return agg"], "metadata": {"_cell_guid": "e7869c4a-9e28-48fc-a2ef-4b0e637f28a1", "_uuid": "0b44cda088340d94e35bce388116f9d9722a0aee"}, "execution_count": null, "cell_type": "code", "outputs": []}, {"source": ["### a simple product aggregate. Kaggle computing power allows us to only calculate 1-2 fields at a time."], "metadata": {"_cell_guid": "e80e4d23-aa38-4448-83a2-5ec5dd6fb590", "_uuid": "ee3d1075422391285c9f2d76d92817ca833f551b"}, "cell_type": "markdown"}, {"source": ["agg1 = get_product_agg(['Demanda_uni_equil','Dev_uni_proxima'])"], "metadata": {"_cell_guid": "715cd718-01a3-4a75-8c84-90038aa50a86", "_uuid": "701846efb73c8e85bf03befd9bc5de91cf20a816"}, "execution_count": null, "cell_type": "code", "outputs": []}, {"source": ["agg1.shape"], "metadata": {"_cell_guid": "44e9889b-8eb8-46d3-8fd4-2635cfd352b4", "_uuid": "9a4c5ebe52da5690592776f7da60b8ee26f781e9"}, "execution_count": null, "cell_type": "code", "outputs": []}, {"source": ["agg1.head()"], "metadata": {"_cell_guid": "c94c620e-9f98-4322-b153-4c0c6e788bcb", "_uuid": "8ff3a8d7d1164a6c38aefe011744fb1e1c04dee9"}, "execution_count": null, "cell_type": "code", "outputs": []}, {"source": ["agg2 = get_product_agg(['Venta_uni_hoy'])\n", "agg = agg1.join(agg2)"], "metadata": {"_cell_guid": "81914e44-2158-46bc-99e9-82ce8b4d3bc8", "_uuid": "90e8181cb535d7e05e79af4d3810a99d3ba50d76"}, "execution_count": null, "cell_type": "code", "outputs": []}, {"source": ["Let's preprocess products a little bit. I borrowed some of the preprocessing from [here](https://www.kaggle.com/lyytinen/grupo-bimbo-inventory-demand/basic-preprocessing-for-products) "], "metadata": {"_cell_guid": "d1516281-8e37-4612-a2b2-977103496a0d", "_uuid": "a18de12224b63496760adee1b1f1ad3c435a19da"}, "cell_type": "markdown"}, {"source": ["products  =  pd.read_csv(\"../input/producto_tabla.csv\")\n", "products  =  pd.read_csv(\"../input/producto_tabla.csv\")\n", "products['short_name'] = products.NombreProducto.str.extract('^(\\D*)', expand=False)\n", "products['brand'] = products.NombreProducto.str.extract('^.+\\s(\\D+) \\d+$', expand=False)\n", "w = products.NombreProducto.str.extract('(\\d+)(Kg|g)', expand=True)\n", "products['weight'] = w[0].astype('float')*w[1].map({'Kg':1000, 'g':1})\n", "products['pieces'] =  products.NombreProducto.str.extract('(\\d+)p ', expand=False).astype('float')\n", "products.head()"], "metadata": {"_cell_guid": "04a73807-7d37-4af4-88b6-e4d8051c36e6", "_uuid": "a164f31f30eff2858d7b295dec5ae25bad1b6dbb"}, "execution_count": null, "cell_type": "code", "outputs": []}, {"source": ["products.tail()"], "metadata": {"_cell_guid": "63e72095-1d7c-493c-b56c-2b5337ca61a9", "_uuid": "276516664bfd109af20b248d66963ac107ff8eca"}, "execution_count": null, "cell_type": "code", "outputs": []}, {"source": ["products.short_name.value_counts(dropna=False)"], "metadata": {"_cell_guid": "34c9a3d0-15d7-4861-89db-39a5bab9e258", "_uuid": "e996b73085b29ab07bede7b448d08b2cd343b8a0"}, "execution_count": null, "cell_type": "code", "outputs": []}, {"source": ["There are some weird products that weight 42 Kilos. Check out this Exhibidor :\n", "\n", "![Exhibidor bimbo](https://mir-s3-cdn-cf.behance.net/project_modules/disp/55c94f24003843.5632c737c062c.jpeg)"], "metadata": {"_cell_guid": "fbc50852-7483-4c83-bbfe-469d7f9ade93", "_uuid": "2fae8b8b7b1054cbed3c44412dcd9bd94ddca703"}, "cell_type": "markdown"}, {"source": ["sns.distplot(products.weight.dropna())"], "metadata": {"_cell_guid": "9774b6d4-e1ef-4380-8d80-1da8faafcc1c", "_uuid": "caa56fa48e0434aafb29c92cd959aaf1fbc4f840"}, "execution_count": null, "cell_type": "code", "outputs": []}, {"source": ["distribution of pieces"], "metadata": {"_cell_guid": "b20dadc4-c16f-4f43-a08e-9130ee9f8a14", "_uuid": "c3076a74cdf73505723f603c49bdb17cc91af622"}, "cell_type": "markdown"}, {"source": ["sns.distplot(products.pieces.dropna())"], "metadata": {"_cell_guid": "ef97e550-9059-4b13-a6e1-f76a803c38c8", "_uuid": "58d0a679abd75bcd2056f2774dbf79425fff8f10"}, "execution_count": null, "cell_type": "code", "outputs": []}, {"source": ["#### Lets clean up product names a bit, we have ~1000 unique names once we cleaned the weights, but there is much more work to be done\n", "#### Products have some abbreviation leftovers that I did not clean, products have similar names but different word forms, etc."], "metadata": {"_cell_guid": "a7aaa941-34f4-4dce-b1c8-1e61aea5c54a", "_uuid": "6f8c00037e156f519378b79404a32177f09c14b8"}, "cell_type": "markdown"}, {"source": ["products.short_name.nunique()"], "metadata": {"_cell_guid": "88bc750e-013a-4189-a2ef-432ec472a0ad", "_uuid": "f04a558c9b9e6940bdb739fda8d965568f74f137"}, "execution_count": null, "cell_type": "code", "outputs": []}, {"source": ["Let's clean stop words and leave only the word stems (I did not clean abbreviations, sorry)"], "metadata": {"_cell_guid": "63fc9286-7768-48e0-9532-f2a5505fe825", "_uuid": "921ad58e737dbff54fe9b52b39bee796df10a851"}, "cell_type": "markdown"}, {"source": ["from nltk.corpus import stopwords\n", "print(stopwords.words(\"spanish\"))"], "metadata": {"_cell_guid": "ac67c908-f7b7-4ad7-b02d-c6a631a1fd18", "_uuid": "3a915653e6d6ec17d6c97361cf8bcac53fef5599"}, "execution_count": null, "cell_type": "code", "outputs": []}, {"source": ["products['short_name_processed'] = (products['short_name']\n", "                                        .map(lambda x: \" \".join([i for i in x.lower()\n", "                                                                 .split() if i not in stopwords.words(\"spanish\")])))"], "metadata": {"_cell_guid": "53a9be3d-bccd-4a0f-b585-a6009354cf20", "_uuid": "9b0cb48a5249c6161d074357f78898edcacee9e3"}, "execution_count": null, "cell_type": "code", "outputs": []}, {"source": ["products['short_name_processed'].nunique()"], "metadata": {"_cell_guid": "3c6734c5-6804-4aac-af3e-bac053126379", "_uuid": "57970e858ce0e67230de64ffd929f6d8a7e1fa5c"}, "execution_count": null, "cell_type": "code", "outputs": []}, {"source": ["from nltk.stem.snowball import SnowballStemmer\n", "stemmer = SnowballStemmer(\"spanish\")"], "metadata": {"_cell_guid": "2363d413-6e46-4832-a17c-e9af6aa25287", "_uuid": "48f4b15f15b3813f584ed0e17cf930b680be72be"}, "execution_count": null, "cell_type": "code", "outputs": []}, {"source": ["print(stemmer.stem(\"Tortillas\"))"], "metadata": {"_cell_guid": "500433cf-846d-446b-868e-3e91f02b5061", "_uuid": "e91fb9314c2d0610782c36b560bae5d1ce520cd5"}, "execution_count": null, "cell_type": "code", "outputs": []}, {"source": ["products['short_name_processed'] = (products['short_name_processed']\n", "                                        .map(lambda x: \" \".join([stemmer.stem(i) for i in x.lower().split()])))"], "metadata": {"_cell_guid": "97bc5e11-4284-4443-9f6c-b126395dd7cb", "_uuid": "3706ae311c9ab55f35db1a823332bf033ddc2dea"}, "execution_count": null, "cell_type": "code", "outputs": []}, {"source": ["products.short_name_processed.nunique()"], "metadata": {"_cell_guid": "390aaba1-256e-449a-afda-d1426ad0b423", "_uuid": "f046c81f4eea9c6e96f3be61f80070b45a7758b1"}, "execution_count": null, "cell_type": "code", "outputs": []}, {"source": ["from sklearn.feature_extraction.text import CountVectorizer\n", "vectorizer = CountVectorizer(analyzer = \"word\",   \\\n", "                             tokenizer = None,    \\\n", "                             preprocessor = None, \\\n", "                             stop_words = None,   \\\n", "                             max_features = 1000) \n", "\n", "product_bag_words = vectorizer.fit_transform(products.short_name_processed).toarray()\n", "product_bag_words.shape"], "metadata": {"_cell_guid": "df6f376f-3efe-4b36-87e2-99c997b227b6", "_uuid": "56c3eb324d7c8ba5c013a798d8540b46a7d78f91"}, "execution_count": null, "cell_type": "code", "outputs": []}, {"source": ["vectorizer.get_feature_names()"], "metadata": {"_cell_guid": "ffb46e27-3f4b-4a21-a223-f1321b9eaff2", "_uuid": "9211d5680af0b884c86e5f434ac69d60f89d18ca"}, "execution_count": null, "cell_type": "code", "outputs": []}, {"source": ["product_bag_words = pd.concat([products.Producto_ID, \n", "                               pd.DataFrame(product_bag_words, \n", "                                            columns= vectorizer.get_feature_names(), index = products.index)], axis=1)\n", "product_bag_words.head()"], "metadata": {"_cell_guid": "2ac0c6ee-cf8e-4f85-9572-5d571d8a6ba4", "_uuid": "6cbe3c7f769c09ee65960a4b1f789d7c51a5839b"}, "execution_count": null, "cell_type": "code", "outputs": []}, {"source": ["product_bag_words.drop('Producto_ID', axis=1).sum().sort_values(ascending=False).head(100)"], "metadata": {"_cell_guid": "2cee41cc-a05f-47c6-8c29-3ac2500780ce", "_uuid": "db8f0f4a2e4e296613e0099978e4ff8bc62f842f"}, "execution_count": null, "cell_type": "code", "outputs": []}, {"source": ["####  let's have a look, what is the product with the biggest demand of all times"], "metadata": {"_cell_guid": "a3870cf4-3b49-487d-a080-e911198a3f05", "_uuid": "1fec99b4c968ac048b381cf87146992acae6319a"}, "cell_type": "markdown"}, {"source": ["df = (pd.merge(agg1.reset_index(), products, on='Producto_ID', how='left').\n", "      groupby('short_name')['Demanda_uni_equil_sum'].sum().sort_values(ascending=False))"], "metadata": {"_cell_guid": "31c1df07-c20b-4225-b001-a0509a84d5a5", "_uuid": "82fec7b9a25fcb1f365f1937d5c34c85a71e4fb0"}, "execution_count": null, "cell_type": "code", "outputs": []}, {"source": ["plt.figure(figsize = (12,15))\n", "df.head(50).sort_values().plot(kind='barh')"], "metadata": {"_cell_guid": "d5a7167d-7959-45ee-8755-8dea14ef4154", "_uuid": "a2603b1c805ad43321733280a0dab374db11bddb"}, "execution_count": null, "cell_type": "code", "outputs": []}, {"source": ["The best seller is by far Nito. Check this out, looks yummy : \n", "\n", "![](http://static.manufactura.mx/media/2013/11/20/negrito.jpg)"], "metadata": {"_cell_guid": "4e7dfe4d-0baa-4d7f-8879-0f4642a17902", "_uuid": "ccb39616e66a1ec5e03df356362fba139f8e2b51"}, "cell_type": "markdown"}, {"source": ["#### a quick look at the distributions"], "metadata": {"_cell_guid": "68479d15-7c42-48c1-aa87-50bab8bc129e", "_uuid": "cc9db207d41411f03fcadcd1dc675a805146b6ec"}, "cell_type": "markdown"}, {"source": ["sns.distplot(df)"], "metadata": {"_cell_guid": "b911e954-9623-4a10-8e36-500bd3137fca", "_uuid": "24658a8d7321e7b976d339fed8f9d085ae950e58"}, "execution_count": null, "cell_type": "code", "outputs": []}, {"source": ["sns.distplot(np.log1p(df))"], "metadata": {"_cell_guid": "c5095009-9776-49f1-8fb4-a85cdafeba7b", "_uuid": "d8b16e6433b1721b8a33eaddd96e4c97e7cd3d4c"}, "execution_count": null, "cell_type": "code", "outputs": []}, {"source": ["#### expanding the aggregate"], "metadata": {"_cell_guid": "001cfb24-ae83-484b-a02b-deabe61ae4c4", "_uuid": "d9022ff4e9772a523781a62024e849e5164f9e65"}, "cell_type": "markdown"}, {"source": ["df = (pd.merge(agg.reset_index(), products, on='Producto_ID', how='left').\n", "      groupby('short_name')['Demanda_uni_equil_sum', 'Venta_uni_hoy_sum', 'Dev_uni_proxima_sum', 'Dev_uni_proxima_count']\n", "      .sum().sort_values(by = 'Demanda_uni_equil_sum', ascending=False))"], "metadata": {"_cell_guid": "5ea2b91b-d7fb-4ac0-ae3b-34cd5fd80805", "_uuid": "09f012618ae7746c50e7c4bc0ce47945c81b65a1"}, "execution_count": null, "cell_type": "code", "outputs": []}, {"source": ["df.describe().T"], "metadata": {"_cell_guid": "b84f61df-020d-4aad-9563-b259a1096514", "_uuid": "bfa04d61153c2839dc87958f493c0962c099c688"}, "execution_count": null, "cell_type": "code", "outputs": []}, {"source": ["There are interesting things. There are products for which Demanda_uni_equil_sum = 0 and other fields are not equal to 0"], "metadata": {"_cell_guid": "98e4a4bc-c5eb-4e67-b3e2-b3b806d83d07", "_uuid": "1be5e529a4f71e01ecfde732a5ad1e8632d01365"}, "cell_type": "markdown"}, {"source": ["df[df.Demanda_uni_equil_sum == 0].count()"], "metadata": {"_cell_guid": "5caa506d-4dbf-411f-a696-299b61499e25", "_uuid": "33437864645bd6c30436d4ccfcb4c92972101e26"}, "execution_count": null, "cell_type": "code", "outputs": []}, {"source": ["df[df.Demanda_uni_equil_sum == 0]"], "metadata": {"_cell_guid": "107dc561-465b-4891-9b7b-f2d2815d88e6", "_uuid": "d355b434fd308e39ddf63214e2fdbaddf766bc89"}, "execution_count": null, "cell_type": "code", "outputs": []}, {"source": ["Similarly there are products with 0 sales and only returns"], "metadata": {"_cell_guid": "963cee78-fbeb-4187-baf4-dc221db4fd97", "_uuid": "e824a38b093dfaaf93e71616c05f82e93b8453e3"}, "cell_type": "markdown"}, {"source": ["df[df.Venta_uni_hoy_sum == 0]"], "metadata": {"_cell_guid": "982b81eb-8fba-4278-894e-a3e9590bdaae", "_uuid": "fc3a7f4a35917b4b66bb12a97ef7fad5d7c3bbac"}, "execution_count": null, "cell_type": "code", "outputs": []}, {"source": ["there are products that were never returned"], "metadata": {"_cell_guid": "6f8e4d6f-3253-419f-974c-8a99d1f37b82", "_uuid": "f8df51b627f38ea6f9c020504904fdc0b82f1c64"}, "cell_type": "markdown"}, {"source": ["df[df.Dev_uni_proxima_sum == 0].count()"], "metadata": {"_cell_guid": "068cebb5-313f-4ded-b3e8-c3c9bb0a7210", "_uuid": "361f525ba62cba88ee97032a5365b9bb196128d5"}, "execution_count": null, "cell_type": "code", "outputs": []}, {"source": ["df[df.Dev_uni_proxima_sum == 0].head(20)"], "metadata": {"_cell_guid": "ac222e45-fc1f-4865-94c1-f96b98b183c6", "_uuid": "68d4076b3e8407eb29fe37c4555da959220cc1b8"}, "execution_count": null, "cell_type": "code", "outputs": []}, {"source": ["Let's cut products into 10 quantiles by summary adjusted demand."], "metadata": {"_cell_guid": "ffc10e12-4ebb-42a5-8655-a6875c1dac46", "_uuid": "29d3cc3983d2a180c25da2724f7107b5200b404d"}, "cell_type": "markdown"}, {"source": ["df['Q'] = pd.qcut(df.Demanda_uni_equil_sum, 10)\n", "df.Q.value_counts()"], "metadata": {"_cell_guid": "034c3de8-1c0b-41f0-8015-e0adce9150f3", "_uuid": "8ebdc5485226ba8487d9c60010645567d24d77c6"}, "execution_count": null, "cell_type": "code", "outputs": []}, {"source": ["df[df.Q == '[0, 49]'].index.values"], "metadata": {"_cell_guid": "fe1b43e9-c177-4408-9943-f22404791e81", "_uuid": "d7d4701c3ddb4b9ff3e5d5e75efd2f064f9cd518"}, "execution_count": null, "cell_type": "code", "outputs": []}, {"source": ["distribution of returns by product"], "metadata": {"_cell_guid": "039f8fbf-a2c0-4a95-b325-c688cc223461", "_uuid": "6ea90ec5df9902f8f85d0b94347eb9959f5ea26d"}, "cell_type": "markdown"}, {"source": ["sns.distplot(df.Dev_uni_proxima_sum)"], "metadata": {"_cell_guid": "fc7a6f17-b564-48dc-ba85-4518957250cf", "_uuid": "5a5c33084f9d219c3e8d45ab5ad53e14ac2d219c"}, "execution_count": null, "cell_type": "code", "outputs": []}, {"source": ["sns.distplot(np.log1p(df.Dev_uni_proxima_sum))"], "metadata": {"_cell_guid": "ab781ee1-c0e6-48af-9d1b-710c93e5715e", "_uuid": "54d272f19e6029244c57908e438fa9eed1519194"}, "execution_count": null, "cell_type": "code", "outputs": []}, {"source": ["Distribution of counts by product"], "metadata": {"_cell_guid": "7a7c54d8-70a8-4eca-bd15-100fc4a7a97f", "_uuid": "61498e64c2190f9d92220f4fee55c4df0100f9c8"}, "cell_type": "markdown"}, {"source": ["sns.distplot(df.Dev_uni_proxima_count)"], "metadata": {"_cell_guid": "42778e1e-611f-4eaa-8c0f-240daac9d4c2", "_uuid": "ffeba3277ae3eeb211fd796b89061bea3148a543"}, "execution_count": null, "cell_type": "code", "outputs": []}, {"source": ["sns.distplot(np.log1p(df.Dev_uni_proxima_count))"], "metadata": {"_cell_guid": "ff73b804-5d85-4dd1-931e-960894d67f4a", "_uuid": "e18f1c743aea0b583aa6a4b8cac349a61fcdc1d3"}, "execution_count": null, "cell_type": "code", "outputs": []}, {"source": ["#### lets aggregate by week and short_name now"], "metadata": {"_cell_guid": "17969596-071c-4664-9209-309a945e832a", "_uuid": "95382ed5de9a6da32f5b4878cf4c996a5dab6732"}, "cell_type": "markdown"}, {"source": ["df_hmp = (pd.merge(agg.reset_index(), products, on='Producto_ID', how='left').\n", "      groupby(['Semana','short_name'])['Demanda_uni_equil_sum', 'Venta_uni_hoy_sum', 'Dev_uni_proxima_sum', 'Dev_uni_proxima_count'].sum().reset_index())"], "metadata": {"_cell_guid": "a670aace-8628-44ec-a0bb-6178328170de", "_uuid": "64b55c06bf278c25f3b0a014adbfd504044a40ba"}, "execution_count": null, "cell_type": "code", "outputs": []}, {"source": ["df_hmp.head()"], "metadata": {"_cell_guid": "8f4c938b-ba6b-469c-ac95-cdc50f46e394", "_uuid": "bbbf089ccd6634cd7152bb6a25c925184b7ff8a4"}, "execution_count": null, "cell_type": "code", "outputs": []}, {"source": ["#### a quick check if demand distribution changes week to week"], "metadata": {"_cell_guid": "aebee476-554a-41dc-b672-76e3e6d66ee0", "_uuid": "6895d299c5f70251d83b457011eff8768cdd362c"}, "cell_type": "markdown"}, {"source": ["df_hmp['log1p_Demanda_uni_equil_sum'] = np.log1p(df_hmp.Demanda_uni_equil_sum)\n", "g = sns.FacetGrid(df_hmp, row = 'Semana')\n", "g = g.map(sns.distplot, 'log1p_Demanda_uni_equil_sum')"], "metadata": {"_cell_guid": "8e1fd517-47b4-41ef-9bd3-52d983390066", "_uuid": "d25a46939657cbda538c0a1e23995314711d5bc1"}, "execution_count": null, "cell_type": "code", "outputs": []}, {"source": ["#### Now let's look at which proucts sell by week with interactive heatmaps. Let's use our quantiles here."], "metadata": {"_cell_guid": "8dc355ec-fad6-4713-b3b4-451199dc39d4", "_uuid": "1e920cbc14ca5bca39e175ae6cd5b599861c8c25"}, "cell_type": "markdown"}, {"source": ["from bokeh.charts import HeatMap\n", "from bokeh.plotting import vplot\n", "\n", "heatmaps = []\n", "for i in df.Q.cat.categories.values:\n", "    hm = HeatMap(df_hmp[df_hmp.short_name.isin(df[df.Q == i].index.values)],\n", "                        x='short_name', y = 'Semana', values = 'Demanda_uni_equil_sum',\n", "                 hover_tool = True, title = 'Products with summary demand '+ str(i), xgrid = False,\n", "                 stat = 'sum',plot_width=950, plot_height=400, tools='hover, box_zoom, resize, save, wheel_zoom, reset',\n", "                 )\n", "    heatmaps.append(hm)\n", "show(vplot(*heatmaps))"], "metadata": {"_cell_guid": "a5b84d83-4fad-41b2-b406-98ca28647427", "_uuid": "224e0f854895e1e6f57425204e3ebe529671ad21"}, "execution_count": null, "cell_type": "code", "outputs": []}, {"source": ["#### Same series of charts but for returns"], "metadata": {"_cell_guid": "b9c2dd58-9eef-4214-8d2d-a6c13f049e18", "_uuid": "0278d4aeb4295673821f63b51f035c698392d9be"}, "cell_type": "markdown"}, {"source": ["from bokeh.charts import HeatMap\n", "from bokeh.plotting import vplot\n", "df['Q_ret'] = pd.qcut(df.Dev_uni_proxima_sum, 5)\n", "heatmaps = []\n", "for i in df.Q_ret.cat.categories.values:\n", "    hm = HeatMap(df_hmp[df_hmp.short_name.isin(df[df.Q_ret == i].index.values)],\n", "                        x='short_name', y = 'Semana', values = 'Demanda_uni_equil_sum',\n", "                 hover_tool = True, title = 'Products with summary returns '+ str(i), xgrid = False,\n", "                 stat = 'sum',plot_width=800, plot_height=400, tools='hover, box_zoom, resize, save, wheel_zoom, reset',\n", "                 )\n", "    heatmaps.append(hm)\n", "show(vplot(*heatmaps))"], "metadata": {"_cell_guid": "ec6bb6de-4456-49ef-82d9-1caa83041d0f", "_uuid": "99d6d7d7a483b8cada8b87dfb5fc01882dbe62ae"}, "execution_count": null, "cell_type": "code", "outputs": []}], "nbformat_minor": 1, "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"mimetype": "text/x-python", "nbconvert_exporter": "python", "version": "3.6.3", "name": "python", "file_extension": ".py", "pygments_lexer": "ipython3", "codemirror_mode": {"version": 3, "name": "ipython"}}}}