From d1ff495912d423821fe8a42b5e23451e42763390 Mon Sep 17 00:00:00 2001 From: Chunrui Huang Date: Sat, 20 Feb 2021 12:02:05 -0800 Subject: [PATCH 01/16] example code from sklearn --- .../plot_document_clustering.ipynb | 285 ++++++++++ tour_model_eval/plot_kmeans_digits.ipynb | 531 ++++++++++++++++++ 2 files changed, 816 insertions(+) create mode 100644 tour_model_eval/plot_document_clustering.ipynb create mode 100644 tour_model_eval/plot_kmeans_digits.ipynb diff --git a/tour_model_eval/plot_document_clustering.ipynb b/tour_model_eval/plot_document_clustering.ipynb new file mode 100644 index 0000000..828ce5a --- /dev/null +++ b/tour_model_eval/plot_document_clustering.ipynb @@ -0,0 +1,285 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%matplotlib inline" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "# Clustering text documents using k-means\n", + "\n", + "This is an example showing how the scikit-learn can be used to cluster\n", + "documents by topics using a bag-of-words approach. This example uses\n", + "a scipy.sparse matrix to store the features instead of standard numpy arrays.\n", + "\n", + "Two feature extraction methods can be used in this example:\n", + "\n", + " - TfidfVectorizer uses a in-memory vocabulary (a python dict) to map the most\n", + " frequent words to features indices and hence compute a word occurrence\n", + " frequency (sparse) matrix. The word frequencies are then reweighted using\n", + " the Inverse Document Frequency (IDF) vector collected feature-wise over\n", + " the corpus.\n", + "\n", + " - HashingVectorizer hashes word occurrences to a fixed dimensional space,\n", + " possibly with collisions. The word count vectors are then normalized to\n", + " each have l2-norm equal to one (projected to the euclidean unit-ball) which\n", + " seems to be important for k-means to work in high dimensional space.\n", + "\n", + " HashingVectorizer does not provide IDF weighting as this is a stateless\n", + " model (the fit method does nothing). When IDF weighting is needed it can\n", + " be added by pipelining its output to a TfidfTransformer instance.\n", + "\n", + "Two algorithms are demoed: ordinary k-means and its more scalable cousin\n", + "minibatch k-means.\n", + "\n", + "Additionally, latent semantic analysis can also be used to reduce\n", + "dimensionality and discover latent patterns in the data.\n", + "\n", + "It can be noted that k-means (and minibatch k-means) are very sensitive to\n", + "feature scaling and that in this case the IDF weighting helps improve the\n", + "quality of the clustering by quite a lot as measured against the \"ground truth\"\n", + "provided by the class label assignments of the 20 newsgroups dataset.\n", + "\n", + "This improvement is not visible in the Silhouette Coefficient which is small\n", + "for both as this measure seem to suffer from the phenomenon called\n", + "\"Concentration of Measure\" or \"Curse of Dimensionality\" for high dimensional\n", + "datasets such as text data. Other measures such as V-measure and Adjusted Rand\n", + "Index are information theoretic based evaluation scores: as they are only based\n", + "on cluster assignments rather than distances, hence not affected by the curse\n", + "of dimensionality.\n", + "\n", + "Note: as k-means is optimizing a non-convex objective function, it will likely\n", + "end up in a local optimum. Several runs with independent random init might be\n", + "necessary to get a good convergence.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Author: Peter Prettenhofer \n", + "# Lars Buitinck\n", + "# License: BSD 3 clause\n", + "from sklearn.datasets import fetch_20newsgroups\n", + "from sklearn.decomposition import TruncatedSVD\n", + "from sklearn.feature_extraction.text import TfidfVectorizer\n", + "from sklearn.feature_extraction.text import HashingVectorizer\n", + "from sklearn.feature_extraction.text import TfidfTransformer\n", + "from sklearn.pipeline import make_pipeline\n", + "from sklearn.preprocessing import Normalizer\n", + "from sklearn import metrics\n", + "\n", + "from sklearn.cluster import KMeans, MiniBatchKMeans\n", + "\n", + "import logging\n", + "from optparse import OptionParser\n", + "import sys\n", + "from time import time\n", + "\n", + "import numpy as np\n", + "\n", + "\n", + "# Display progress logs on stdout\n", + "logging.basicConfig(level=logging.INFO,\n", + " format='%(asctime)s %(levelname)s %(message)s')\n", + "\n", + "# parse commandline arguments\n", + "op = OptionParser()\n", + "op.add_option(\"--lsa\",\n", + " dest=\"n_components\", type=\"int\",\n", + " help=\"Preprocess documents with latent semantic analysis.\")\n", + "op.add_option(\"--no-minibatch\",\n", + " action=\"store_false\", dest=\"minibatch\", default=True,\n", + " help=\"Use ordinary k-means algorithm (in batch mode).\")\n", + "op.add_option(\"--no-idf\",\n", + " action=\"store_false\", dest=\"use_idf\", default=True,\n", + " help=\"Disable Inverse Document Frequency feature weighting.\")\n", + "op.add_option(\"--use-hashing\",\n", + " action=\"store_true\", default=False,\n", + " help=\"Use a hashing feature vectorizer\")\n", + "op.add_option(\"--n-features\", type=int, default=10000,\n", + " help=\"Maximum number of features (dimensions)\"\n", + " \" to extract from text.\")\n", + "op.add_option(\"--verbose\",\n", + " action=\"store_true\", dest=\"verbose\", default=False,\n", + " help=\"Print progress reports inside k-means algorithm.\")\n", + "\n", + "print(__doc__)\n", + "op.print_help()\n", + "\n", + "\n", + "def is_interactive():\n", + " return not hasattr(sys.modules['__main__'], '__file__')\n", + "\n", + "\n", + "# work-around for Jupyter notebook and IPython console\n", + "argv = [] if is_interactive() else sys.argv[1:]\n", + "(opts, args) = op.parse_args(argv)\n", + "if len(args) > 0:\n", + " op.error(\"this script takes no arguments.\")\n", + " sys.exit(1)\n", + "\n", + "\n", + "# #############################################################################\n", + "# Load some categories from the training set\n", + "categories = [\n", + " 'alt.atheism',\n", + " 'talk.religion.misc',\n", + " 'comp.graphics',\n", + " 'sci.space',\n", + "]\n", + "# Uncomment the following to do the analysis on all the categories\n", + "# categories = None\n", + "\n", + "print(\"Loading 20 newsgroups dataset for categories:\")\n", + "print(categories)\n", + "\n", + "dataset = fetch_20newsgroups(subset='all', categories=categories,\n", + " shuffle=True, random_state=42)\n", + "\n", + "print(\"%d documents\" % len(dataset.data))\n", + "print(\"%d categories\" % len(dataset.target_names))\n", + "print()\n", + "\n", + "labels = dataset.target\n", + "true_k = np.unique(labels).shape[0]\n", + "\n", + "print(\"Extracting features from the training dataset \"\n", + " \"using a sparse vectorizer\")\n", + "t0 = time()\n", + "if opts.use_hashing:\n", + " if opts.use_idf:\n", + " # Perform an IDF normalization on the output of HashingVectorizer\n", + " hasher = HashingVectorizer(n_features=opts.n_features,\n", + " stop_words='english', alternate_sign=False,\n", + " norm=None)\n", + " vectorizer = make_pipeline(hasher, TfidfTransformer())\n", + " else:\n", + " vectorizer = HashingVectorizer(n_features=opts.n_features,\n", + " stop_words='english',\n", + " alternate_sign=False, norm='l2')\n", + "else:\n", + " vectorizer = TfidfVectorizer(max_df=0.5, max_features=opts.n_features,\n", + " min_df=2, stop_words='english',\n", + " use_idf=opts.use_idf)\n", + "X = vectorizer.fit_transform(dataset.data)\n", + "\n", + "print(\"done in %fs\" % (time() - t0))\n", + "print(\"n_samples: %d, n_features: %d\" % X.shape)\n", + "print()\n", + "\n", + "if opts.n_components:\n", + " print(\"Performing dimensionality reduction using LSA\")\n", + " t0 = time()\n", + " # Vectorizer results are normalized, which makes KMeans behave as\n", + " # spherical k-means for better results. Since LSA/SVD results are\n", + " # not normalized, we have to redo the normalization.\n", + " svd = TruncatedSVD(opts.n_components)\n", + " normalizer = Normalizer(copy=False)\n", + " lsa = make_pipeline(svd, normalizer)\n", + "\n", + " X = lsa.fit_transform(X)\n", + "\n", + " print(\"done in %fs\" % (time() - t0))\n", + "\n", + " explained_variance = svd.explained_variance_ratio_.sum()\n", + " print(\"Explained variance of the SVD step: {}%\".format(\n", + " int(explained_variance * 100)))\n", + "\n", + " print()\n", + "\n", + "\n", + "# #############################################################################\n", + "# Do the actual clustering\n", + "\n", + "if opts.minibatch:\n", + " km = MiniBatchKMeans(n_clusters=true_k, init='k-means++', n_init=1,\n", + " init_size=1000, batch_size=1000, verbose=opts.verbose)\n", + "else:\n", + " km = KMeans(n_clusters=true_k, init='k-means++', max_iter=100, n_init=1,\n", + " verbose=opts.verbose)\n", + "\n", + "print(\"Clustering sparse data with %s\" % km)\n", + "t0 = time()\n", + "km.fit(X)\n", + "print(\"done in %0.3fs\" % (time() - t0))\n", + "print()\n", + "\n", + "# Test what labels are\n", + "np.set_printoptions(threshold=np.inf)\n", + "print(\"----------Test---------------\")\n", + "print('labels is %s' % labels)\n", + "print('The type of labels is %s' % type(labels))\n", + "print('the shape of labels is n_samples %s' % labels.shape)\n", + "print('km.labels_ is %s' % km.labels_)\n", + "print('The type of km.labels_ is %s' % type(km.labels_))\n", + "print('the shape of km.labels_ is n_samples %s' % km.labels_.shape)\n", + "print('true_k is %s'% true_k)\n", + "print('np.unique(labels) is %s' % np.unique(labels))\n", + "print('np.unique(labels).shape is %s' % np.unique(labels).shape)\n", + "print(\"----------Test---------------\")\n", + "print()\n", + "\n", + "\n", + "\n", + "print(\"Homogeneity: %0.3f\" % metrics.homogeneity_score(labels, km.labels_))\n", + "print(\"Completeness: %0.3f\" % metrics.completeness_score(labels, km.labels_))\n", + "print(\"V-measure: %0.3f\" % metrics.v_measure_score(labels, km.labels_))\n", + "print(\"Adjusted Rand-Index: %.3f\"\n", + " % metrics.adjusted_rand_score(labels, km.labels_))\n", + "print(\"Silhouette Coefficient: %0.3f\"\n", + " % metrics.silhouette_score(X, km.labels_, sample_size=1000))\n", + "\n", + "print()\n", + "\n", + "\n", + "if not opts.use_hashing:\n", + " print(\"Top terms per cluster:\")\n", + "\n", + " if opts.n_components:\n", + " original_space_centroids = svd.inverse_transform(km.cluster_centers_)\n", + " order_centroids = original_space_centroids.argsort()[:, ::-1]\n", + " else:\n", + " order_centroids = km.cluster_centers_.argsort()[:, ::-1]\n", + "\n", + " terms = vectorizer.get_feature_names()\n", + " for i in range(true_k):\n", + " print(\"Cluster %d:\" % i, end='')\n", + " for ind in order_centroids[i, :10]:\n", + " print(' %s' % terms[ind], end='')\n", + " print()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.9" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/tour_model_eval/plot_kmeans_digits.ipynb b/tour_model_eval/plot_kmeans_digits.ipynb new file mode 100644 index 0000000..62f7cd6 --- /dev/null +++ b/tour_model_eval/plot_kmeans_digits.ipynb @@ -0,0 +1,531 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "%matplotlib inline" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "# A demo of K-Means clustering on the handwritten digits data\n", + "\n", + "In this example we compare the various initialization strategies for K-means in\n", + "terms of runtime and quality of the results.\n", + "\n", + "As the ground truth is known here, we also apply different cluster quality\n", + "metrics to judge the goodness of fit of the cluster labels to the ground truth.\n", + "\n", + "Cluster quality metrics evaluated (see `clustering_evaluation` for\n", + "definitions and discussions of the metrics):\n", + "\n", + "=========== ========================================================\n", + "Shorthand full name\n", + "=========== ========================================================\n", + "homo homogeneity score\n", + "compl completeness score\n", + "v-meas V measure\n", + "ARI adjusted Rand index\n", + "AMI adjusted mutual information\n", + "silhouette silhouette coefficient\n", + "=========== ========================================================\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Automatically created module for IPython interactive environment\n" + ] + } + ], + "source": [ + "print(__doc__)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Load the dataset\n", + "\n", + "We will start by loading the `digits` dataset. This dataset contains\n", + "handwritten digits from 0 to 9. In the context of clustering, one would like\n", + "to group images such that the handwritten digits on the image are the same.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "# digits: 10; # samples: 1797; # features 64\n", + "------Test------\n", + "data.shape is (1797, 64)\n", + "labels is [0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 9 5 5 6 5 0\n", + " 9 8 9 8 4 1 7 7 3 5 1 0 0 2 2 7 8 2 0 1 2 6 3 3 7 3 3 4 6 6 6 4 9 1 5 0 9\n", + " 5 2 8 2 0 0 1 7 6 3 2 1 7 4 6 3 1 3 9 1 7 6 8 4 3 1 4 0 5 3 6 9 6 1 7 5 4\n", + " 4 7 2 8 2 2 5 7 9 5 4 8 8 4 9 0 8 9 8 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7\n", + " 8 9 0 1 2 3 4 5 6 7 8 9 0 9 5 5 6 5 0 9 8 9 8 4 1 7 7 3 5 1 0 0 2 2 7 8 2\n", + " 0 1 2 6 3 3 7 3 3 4 6 6 6 4 9 1 5 0 9 5 2 8 2 0 0 1 7 6 3 2 1 7 3 1 3 9 1\n", + " 7 6 8 4 3 1 4 0 5 3 6 9 6 1 7 5 4 4 7 2 8 2 2 5 5 4 8 8 4 9 0 8 9 8 0 1 2\n", + " 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 9 5 5 6 5 0 9 8 9\n", + " 8 4 1 7 7 3 5 1 0 0 2 2 7 8 2 0 1 2 6 3 3 7 3 3 4 6 6 6 4 9 1 5 0 9 5 2 8\n", + " 2 0 0 1 7 6 3 2 1 7 4 6 3 1 3 9 1 7 6 8 4 3 1 4 0 5 3 6 9 6 1 7 5 4 4 7 2\n", + " 8 2 2 5 7 9 5 4 8 8 4 9 0 8 9 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0\n", + " 1 2 3 4 5 6 7 8 9 0 9 5 5 6 5 0 9 8 9 8 4 1 7 7 3 5 1 0 0 2 2 7 8 2 0 1 2\n", + " 6 3 3 7 3 3 4 6 6 6 4 9 1 5 0 9 5 2 8 2 0 0 1 7 6 3 2 1 7 4 6 3 1 3 9 1 7\n", + " 6 8 4 3 1 4 0 5 3 6 9 6 1 7 5 4 4 7 2 8 2 2 5 7 9 5 4 8 8 4 9 0 8 9 8 0 1\n", + " 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 9 5 5 6 5 0 9 8\n", + " 9 8 4 1 7 7 3 5 1 0 0 2 2 7 8 2 0 1 2 6 3 3 7 3 3 4 6 6 6 4 9 1 5 0 9 5 2\n", + " 8 2 0 0 1 7 6 3 2 1 7 4 6 3 1 3 9 1 7 6 8 4 3 1 4 0 5 3 6 9 6 1 7 5 4 4 7\n", + " 2 8 2 2 5 7 9 5 4 8 8 4 9 0 8 9 8 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9\n", + " 0 1 2 3 4 5 6 7 8 9 0 9 5 5 6 5 0 9 8 9 8 4 1 7 7 3 5 1 0 0 2 2 7 8 2 0 1\n", + " 2 6 3 3 7 3 3 4 6 6 6 4 9 1 5 0 9 5 2 8 2 0 0 1 7 6 3 2 1 7 4 6 3 1 3 9 1\n", + " 7 6 8 4 3 1 4 0 5 3 6 9 6 1 7 5 4 4 7 2 8 2 2 5 7 9 5 4 8 8 4 9 0 8 9 8 0\n", + " 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 9 5 5 6 5 0 9\n", + " 8 9 8 4 1 7 7 3 5 1 0 0 2 2 7 8 2 0 1 2 6 3 3 7 3 3 4 6 6 6 4 9 1 5 0 9 5\n", + " 2 8 2 0 0 1 7 6 3 2 1 7 4 6 3 1 3 9 1 7 6 8 4 3 1 4 0 5 3 6 9 6 1 7 5 4 4\n", + " 7 2 8 2 2 5 7 9 5 4 8 8 4 9 0 8 9 8 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9\n", + " 0 1 2 3 4 5 6 7 8 9 0 9 5 5 6 5 0 9 8 9 8 4 1 7 7 3 5 1 2 7 8 2 0 1 2 6 3\n", + " 3 7 3 3 4 6 6 6 4 9 1 5 0 9 5 2 8 2 0 0 1 7 6 3 2 1 4 6 3 1 3 9 1 7 6 8 4\n", + " 3 1 4 0 5 3 6 9 6 1 7 5 4 4 7 2 8 2 2 5 7 9 5 4 4 9 0 8 9 8 0 1 2 3 4 5 6\n", + " 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 9 5 5 6 5 0 9 8 9 8 4 1 7\n", + " 7 3 5 1 0 0 7 8 2 0 1 2 6 3 3 7 3 3 4 6 6 6 4 9 1 5 0 9 5 2 8 2 0 0 1 7 6\n", + " 3 2 1 7 4 6 3 1 3 9 1 7 6 8 4 3 1 4 0 5 3 6 9 6 1 7 5 4 4 7 2 8 2 2 5 7 9\n", + " 5 4 8 8 4 9 0 8 9 8 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6\n", + " 7 8 9 0 9 5 5 6 5 0 9 8 9 8 4 1 7 7 3 5 1 0 0 2 2 7 8 2 0 1 2 6 3 3 7 3 3\n", + " 4 6 6 6 4 9 1 5 0 9 5 2 8 2 0 0 1 7 6 3 2 1 7 4 6 3 1 3 9 1 7 6 8 4 3 1 4\n", + " 0 5 3 6 9 6 1 7 5 4 4 7 2 8 2 2 5 7 9 5 4 8 8 4 9 0 8 9 8 0 1 2 3 4 5 6 7\n", + " 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 9 5 5 6 5 0 9 8 9 8 4 1 7 7\n", + " 3 5 1 0 0 2 2 7 8 2 0 1 2 6 3 3 7 3 3 4 6 6 6 4 9 1 5 0 9 5 2 8 2 0 0 1 7\n", + " 6 3 2 1 7 4 6 3 1 3 9 1 7 6 8 4 3 1 4 0 5 3 6 9 6 1 7 5 4 4 7 2 8 2 2 5 7\n", + " 9 5 4 8 8 4 9 0 8 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7\n", + " 8 9 0 9 5 5 6 5 0 9 8 9 8 4 1 7 7 3 5 1 0 0 2 2 7 8 2 0 1 2 6 3 3 7 3 3 4\n", + " 6 6 6 4 9 1 5 0 9 5 2 8 2 0 0 1 7 6 3 2 1 7 4 6 3 1 3 9 1 7 6 8 4 3 1 4 0\n", + " 5 3 6 9 6 1 7 5 4 4 7 2 8 2 2 5 7 9 5 4 8 8 4 9 0 8 9 8 0 1 2 3 4 5 6 7 8\n", + " 9 0 1 2 3 4 5 6 9 0 1 2 3 4 5 6 7 8 9 0 9 5 5 6 5 0 9 8 9 8 4 1 7 7 3 5 1\n", + " 0 0 2 2 7 8 2 0 1 2 6 3 3 7 3 3 4 6 6 6 4 9 1 5 0 9 5 2 8 0 1 7 6 3 2 1 7\n", + " 4 6 3 1 3 9 1 7 6 8 4 3 1 4 0 5 3 6 9 6 1 7 5 4 4 7 2 2 5 7 9 5 4 4 9 0 8\n", + " 9 8 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 9 5 5 6\n", + " 5 0 9 8 9 8 4 1 7 7 3 5 1 0 0 2 2 7 8 2 0 1 2 6 3 3 7 3 3 4 6 6 6 4 9 1 5\n", + " 0 9 5 2 8 2 0 0 1 7 6 3 2 1 7 4 6 3 1 3 9 1 7 6 8 4 3 1 4 0 5 3 6 9 6 1 7\n", + " 5 4 4 7 2 8 2 2 5 7 9 5 4 8 8 4 9 0 8 9 8]\n", + "------Test------\n" + ] + } + ], + "source": [ + "import numpy as np\n", + "from sklearn.datasets import load_digits\n", + "\n", + "data, labels = load_digits(return_X_y=True)\n", + "(n_samples, n_features), n_digits = data.shape, np.unique(labels).size\n", + "\n", + "print(\n", + " f\"# digits: {n_digits}; # samples: {n_samples}; # features {n_features}\"\n", + ")\n", + "\n", + "print('------Test------')\n", + "np.set_printoptions(threshold=np.inf)\n", + "print('data.shape is ',data.shape)\n", + "print(\"labels is %s\" % labels)\n", + "print('------Test------')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Define our evaluation benchmark\n", + "\n", + "We will first our evaluation benchmark. During this benchmark, we intend to\n", + "compare different initialization methods for KMeans. Our benchmark will:\n", + "\n", + "* create a pipeline which will scale the data using a\n", + " :class:`~sklearn.preprocessing.StandardScaler`;\n", + "* train and time the pipeline fitting;\n", + "* measure the performance of the clustering obtained via different metrics.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "from time import time\n", + "from sklearn import metrics\n", + "from sklearn.pipeline import make_pipeline\n", + "from sklearn.preprocessing import StandardScaler\n", + "\n", + "\n", + "def bench_k_means(kmeans, name, data, labels):\n", + " \"\"\"Benchmark to evaluate the KMeans initialization methods.\n", + "\n", + " Parameters\n", + " ----------\n", + " kmeans : KMeans instance\n", + " A :class:`~sklearn.cluster.KMeans` instance with the initialization\n", + " already set.\n", + " name : str\n", + " Name given to the strategy. It will be used to show the results in a\n", + " table.\n", + " data : ndarray of shape (n_samples, n_features)\n", + " The data to cluster.\n", + " labels : ndarray of shape (n_samples,)\n", + " The labels used to compute the clustering metrics which requires some\n", + " supervision.\n", + " \"\"\"\n", + " t0 = time()\n", + " estimator = make_pipeline(StandardScaler(), kmeans).fit(data)\n", + " fit_time = time() - t0\n", + " results = [name, fit_time, estimator[-1].inertia_]\n", + "\n", + " # Define the metrics which require only the true labels and estimator\n", + " # labels\n", + " clustering_metrics = [\n", + " metrics.homogeneity_score,\n", + " metrics.completeness_score,\n", + " metrics.v_measure_score,\n", + " metrics.adjusted_rand_score,\n", + " metrics.adjusted_mutual_info_score,\n", + " ]\n", + " results += [m(labels, estimator[-1].labels_) for m in clustering_metrics]\n", + " \n", + " print('------Test------')\n", + " print('estimator[-1].labels_', estimator[-1].labels_)\n", + " print('------Test------')\n", + "\n", + " # The silhouette score requires the full dataset\n", + " results += [\n", + " metrics.silhouette_score(data, estimator[-1].labels_,\n", + " metric=\"euclidean\", sample_size=300,)\n", + " ]\n", + "\n", + " # Show the results\n", + " formatter_result = (\"{:9s}\\t{:.3f}s\\t{:.0f}\\t{:.3f}\\t{:.3f}\"\n", + " \"\\t{:.3f}\\t{:.3f}\\t{:.3f}\\t{:.3f}\")\n", + " print(formatter_result.format(*results))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Run the benchmark\n", + "\n", + "We will compare three approaches:\n", + "\n", + "* an initialization using `kmeans++`. This method is stochastic and we will\n", + " run the initialization 4 times;\n", + "* a random initialization. This method is stochastic as well and we will run\n", + " the initialization 4 times;\n", + "* an initialization based on a :class:`~sklearn.decomposition.PCA`\n", + " projection. Indeed, we will use the components of the\n", + " :class:`~sklearn.decomposition.PCA` to initialize KMeans. This method is\n", + " deterministic and a single initialization suffice.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "__________________________________________________________________________________\n", + "init\t\ttime\tinertia\thomo\tcompl\tv-meas\tARI\tAMI\tsilhouette\n", + "------Test------\n", + "estimator[-1].labels_ [2 8 8 3 9 3 1 0 3 3 2 6 4 3 9 5 1 0 8 3 2 6 8 3 6 5 1 6 8 3 2 3 5 5 1 5 2\n", + " 3 8 3 8 9 6 0 0 3 5 6 2 2 8 6 0 8 6 2 6 8 1 3 3 0 3 5 9 1 1 1 9 8 6 5 2 3\n", + " 3 6 5 6 2 2 6 0 1 3 5 6 0 8 1 3 6 5 3 8 0 8 8 9 3 8 9 2 5 5 1 3 1 6 0 5 9\n", + " 9 0 8 8 8 8 5 0 3 8 9 8 8 9 3 2 8 3 8 2 6 5 5 9 5 1 0 8 3 2 6 8 3 9 5 1 0\n", + " 8 3 2 6 8 3 9 5 1 0 8 3 2 3 5 5 1 5 2 3 8 3 8 9 6 0 0 3 5 6 2 2 5 5 0 8 5\n", + " 2 6 8 1 3 3 0 3 3 9 1 1 1 9 3 6 5 2 3 5 8 8 8 2 2 6 0 1 3 8 6 0 3 6 3 3 6\n", + " 0 1 8 9 0 6 9 2 5 0 1 3 1 6 0 5 9 9 0 5 8 5 8 5 5 6 8 8 9 3 2 8 3 8 2 8 5\n", + " 3 9 3 1 7 3 3 2 6 5 3 9 5 1 0 8 0 2 8 5 3 9 3 1 7 8 3 2 3 3 3 1 3 2 3 8 3\n", + " 8 9 8 0 0 3 3 8 2 2 5 8 0 3 5 2 6 5 1 5 3 7 3 3 9 1 1 1 9 0 8 5 2 0 3 5 3\n", + " 5 2 2 8 0 1 3 5 6 0 9 1 3 8 3 0 8 0 1 8 9 5 8 9 2 3 3 1 0 1 8 0 5 9 9 0 5\n", + " 3 5 5 3 0 6 5 9 3 3 9 6 2 8 0 3 2 6 4 3 9 3 1 7 6 3 2 6 4 3 9 5 1 7 8 3 2\n", + " 6 5 3 9 8 1 7 3 3 2 3 3 5 1 3 2 3 3 3 3 9 6 7 7 3 6 6 2 2 4 5 7 3 5 2 4 3\n", + " 1 3 3 7 3 3 9 1 1 1 9 3 6 3 2 3 3 4 8 5 2 2 6 7 1 3 5 6 0 6 1 3 6 3 3 6 6\n", + " 1 3 9 3 6 9 2 5 3 1 3 8 6 7 5 6 9 7 5 3 5 8 5 0 3 0 6 8 8 9 3 2 3 3 3 2 4\n", + " 4 3 9 3 1 0 8 3 2 4 8 3 0 3 1 0 8 3 2 4 4 3 9 3 1 0 8 3 2 8 3 3 1 3 2 3 6\n", + " 3 8 9 4 0 0 3 3 4 2 2 4 4 0 1 4 2 4 4 1 3 3 0 3 3 9 1 1 1 9 3 4 3 2 3 3 4\n", + " 8 5 2 2 4 0 1 4 4 4 0 9 1 3 4 3 3 4 0 1 8 9 3 8 9 2 3 3 1 3 1 4 0 3 9 9 0\n", + " 4 8 5 4 0 0 3 3 9 6 8 9 3 2 6 3 6 2 8 5 3 9 0 1 0 3 7 2 8 5 3 9 5 1 0 8 6\n", + " 2 8 5 3 6 5 1 7 3 6 2 6 9 5 1 5 2 6 8 6 3 9 8 7 6 3 5 8 2 2 3 8 0 8 8 2 8\n", + " 3 1 3 3 0 3 3 9 1 1 1 9 6 8 1 2 6 0 8 3 8 2 2 8 0 1 3 5 8 7 9 1 3 8 3 6 8\n", + " 0 1 8 9 3 8 0 2 3 3 1 6 1 8 0 5 9 7 0 8 8 8 5 5 0 7 5 9 3 8 0 6 2 8 6 8 2\n", + " 8 5 3 9 5 1 0 1 3 2 8 5 3 9 5 2 0 6 6 2 8 5 3 9 5 1 0 8 3 2 3 5 0 1 5 2 3\n", + " 3 3 3 9 8 0 0 3 5 8 2 2 8 5 0 6 5 2 4 5 1 3 3 0 3 3 9 1 1 1 9 3 8 8 2 3 5\n", + " 5 8 5 2 2 8 0 1 3 0 8 0 9 1 3 8 3 3 8 0 1 8 9 3 8 9 2 5 3 1 3 1 8 0 5 9 9\n", + " 0 5 6 0 5 5 0 3 5 9 6 3 9 3 2 8 3 8 4 5 3 9 3 1 0 3 3 2 4 5 3 9 3 1 0 3 3\n", + " 2 4 5 3 9 3 1 0 3 3 2 3 3 3 1 3 2 3 3 3 8 9 4 0 0 3 3 4 5 0 3 4 2 4 4 1 3\n", + " 3 0 3 3 6 1 1 1 9 3 4 3 2 3 3 4 3 4 2 2 4 0 1 3 5 4 9 1 3 4 3 3 4 0 1 3 7\n", + " 3 4 9 2 5 3 1 3 1 4 7 3 9 7 0 5 3 4 5 3 0 3 3 7 7 3 2 3 3 3 2 8 5 3 7 5 1\n", + " 0 0 3 2 8 4 3 7 5 1 0 8 3 2 8 4 3 9 3 1 0 5 3 2 3 5 5 1 0 2 3 5 3 8 7 8 0\n", + " 0 3 3 8 2 2 0 8 4 2 8 4 1 3 3 0 3 3 9 1 1 1 0 3 8 6 2 3 5 4 3 4 2 2 8 0 1\n", + " 3 4 8 0 9 1 3 8 0 3 8 0 1 3 9 3 8 9 2 5 3 1 3 1 8 0 3 9 9 0 5 8 4 4 5 0 3\n", + " 9 9 3 3 9 3 2 5 3 5 2 6 5 3 9 3 1 0 5 3 2 6 4 3 9 3 1 0 8 3 2 8 5 3 9 5 1\n", + " 0 5 3 2 3 3 5 1 5 2 3 5 3 5 9 8 0 0 5 1 8 2 2 5 5 0 5 5 2 8 5 1 3 3 0 3 3\n", + " 9 1 1 1 9 3 8 5 2 3 3 5 5 3 2 2 8 0 1 5 5 8 0 9 1 3 8 3 3 8 0 1 8 9 3 8 9\n", + " 2 5 5 1 3 1 8 0 5 9 9 0 5 5 5 5 5 0 3 5 9 8 8 9 3 2 8 3 8 2 6 4 3 9 3 1 5\n", + " 8 3 2 8 4 3 9 5 1 0 5 3 2 6 3 3 9 3 1 0 8 3 2 3 5 3 1 5 2 3 8 3 8 9 8 0 0\n", + " 3 3 8 2 2 4 4 0 8 4 2 6 4 1 3 3 0 3 3 9 1 1 1 9 3 8 3 2 3 1 5 8 3 2 2 6 0\n", + " 1 3 4 8 0 9 1 3 8 3 3 8 0 1 8 9 3 8 9 2 8 3 1 3 1 8 0 8 9 9 0 4 8 4 4 3 0\n", + " 3 5 9 8 8 9 3 2 8 2 6 5 3 9 3 1 0 3 3 2 6 5 3 9 3 1 0 3 3 2 6 5 3 9 3 1 0\n", + " 3 3 2 3 3 3 1 3 2 3 3 3 3 9 6 0 0 3 3 6 2 2 5 5 7 6 5 2 6 5 1 3 3 0 3 3 9\n", + " 1 1 1 9 3 6 3 2 3 3 5 3 5 2 2 6 0 1 3 5 6 0 9 1 3 6 3 3 6 0 1 3 9 3 6 9 2\n", + " 3 3 1 3 1 6 0 3 9 9 0 5 6 5 5 3 0 3 3 9 6 8 9 3 2 6 3 8 2 8 4 3 9 5 6 5 8\n", + " 6 2 8 4 3 9 5 1 6 2 8 4 3 9 5 8 0 8 7 9 6 5 5 1 8 2 6 8 5 8 9 8 0 5 5 5 8\n", + " 2 2 4 5 5 8 4 2 8 5 1 8 0 5 0 8 9 1 1 1 8 6 8 5 2 3 8 4 8 2 8 0 1 3 5 8 5\n", + " 8 1 3 8 3 0 8 5 1 8 9 3 8 9 2 5 3 8 3 8 8 0 8 9 9 0 4 3 5 5 3 8 5 9 5 2 8\n", + " 0 0 2 8 5 3 9 3 1 0 3 3 2 8 8 8 9 3 1 0 5 3 2 8 5 5 9 9 1 0 8 3 2 3 3 6 1\n", + " 3 2 3 3 3 5 7 8 0 0 0 3 8 2 2 5 5 0 8 5 2 8 5 1 8 0 0 3 0 9 1 1 1 9 3 8 3\n", + " 2 3 3 5 8 5 2 2 8 0 1 0 8 8 0 9 1 3 8 3 3 8 0 1 8 9 8 8 9 2 3 3 1 3 1 8 0\n", + " 3 9 9 0 5 8 5 5 3 0 3 3 9 8 8 9 3 2 8 3 3]\n", + "------Test------\n", + "k-means++\t0.157s\t69485\t0.613\t0.660\t0.636\t0.482\t0.632\t0.134\n", + "------Test------\n", + "estimator[-1].labels_ [8 5 5 7 6 7 4 0 7 7 8 0 1 7 6 9 4 0 5 7 8 0 5 0 6 5 4 0 5 7 8 7 9 9 4 9 8\n", + " 7 5 7 5 6 0 0 0 7 5 0 8 8 5 0 0 5 0 8 0 0 4 7 7 0 7 9 6 4 4 4 6 5 0 9 8 7\n", + " 5 0 5 0 8 8 0 0 4 7 9 0 0 5 4 7 0 9 7 5 0 5 5 6 7 5 6 8 5 9 4 7 4 0 0 5 6\n", + " 6 0 5 5 0 5 9 0 7 5 6 5 5 6 7 8 5 7 5 8 0 9 9 6 9 4 0 5 7 8 0 5 9 6 9 4 5\n", + " 5 7 8 0 5 0 6 9 4 5 5 7 8 7 9 9 4 9 8 7 5 7 5 6 0 0 0 7 9 0 8 8 5 5 0 5 5\n", + " 8 0 5 4 7 7 5 7 7 6 4 4 4 6 7 0 9 8 7 9 5 5 5 8 8 0 5 4 7 5 0 5 7 0 7 7 0\n", + " 0 4 5 6 0 0 6 8 9 0 4 7 4 0 5 5 6 6 5 9 5 9 5 9 9 6 5 5 6 7 8 5 7 5 8 5 9\n", + " 7 6 7 4 2 7 0 8 0 9 7 6 5 4 0 5 0 8 5 9 7 6 7 4 2 5 7 8 7 7 7 4 7 8 7 5 7\n", + " 5 6 5 0 0 7 7 5 8 8 9 5 0 7 5 8 0 9 4 9 7 2 7 7 6 4 4 4 6 0 5 5 8 0 7 9 7\n", + " 9 8 8 5 0 4 7 5 5 0 6 4 7 5 9 0 5 5 4 5 6 9 5 6 8 7 7 4 0 4 5 5 9 6 6 0 9\n", + " 7 9 9 7 0 0 9 6 7 7 6 0 8 5 0 7 8 0 1 7 6 5 4 2 0 7 8 5 1 7 6 5 4 2 5 7 8\n", + " 0 9 7 6 5 4 2 0 7 8 7 7 5 4 7 8 7 7 7 5 6 0 2 2 7 0 5 8 8 1 9 2 7 9 8 1 7\n", + " 4 7 7 2 7 7 6 4 4 4 6 7 0 0 8 7 5 1 0 9 8 8 5 2 4 7 9 5 0 6 4 7 0 7 7 0 0\n", + " 4 7 6 9 5 6 8 9 7 4 7 5 0 2 5 6 6 2 9 7 9 0 5 0 7 0 6 5 5 6 0 8 7 7 7 8 1\n", + " 1 7 6 7 4 5 0 7 8 1 5 7 6 7 4 0 5 7 8 1 1 7 6 7 4 0 5 7 8 5 7 7 4 7 8 7 0\n", + " 7 5 6 1 0 0 7 7 1 8 8 3 1 0 4 1 8 1 1 4 7 7 0 7 7 6 4 4 4 6 7 1 7 8 7 7 1\n", + " 4 9 8 8 1 0 4 1 1 1 0 6 4 7 1 7 7 1 0 4 5 6 7 5 6 8 7 7 4 7 4 1 0 7 6 6 5\n", + " 1 0 9 1 0 0 7 7 6 0 0 6 7 8 0 7 0 8 5 9 7 6 0 4 0 7 2 8 5 5 7 6 5 4 0 5 0\n", + " 8 5 7 7 6 5 4 2 7 0 8 0 6 5 4 5 8 0 5 0 5 6 0 2 0 7 5 0 8 8 7 5 0 5 5 8 5\n", + " 5 4 7 7 0 7 7 6 4 4 4 6 0 5 5 8 0 0 5 7 5 8 8 0 0 4 7 9 5 2 6 4 7 5 7 0 5\n", + " 0 4 5 6 7 5 0 8 7 7 4 0 4 5 0 5 6 2 0 5 5 5 5 5 0 2 9 6 7 5 0 2 8 5 0 5 8\n", + " 5 9 7 6 9 4 0 4 7 8 5 9 7 6 9 8 5 0 7 8 5 9 7 6 9 4 0 5 7 8 7 5 5 4 5 8 7\n", + " 7 7 7 6 5 5 0 7 5 5 8 8 5 9 5 0 9 8 1 9 4 7 7 0 0 0 6 4 4 4 6 7 5 5 8 7 9\n", + " 9 5 9 8 8 5 0 4 7 5 5 0 6 4 7 5 7 7 5 5 4 5 6 7 5 6 8 5 7 4 7 4 0 5 9 6 6\n", + " 0 9 0 0 5 5 5 7 9 6 0 7 6 7 8 5 7 5 1 9 7 6 7 4 0 7 7 8 1 9 7 6 7 4 5 7 7\n", + " 8 1 9 7 6 7 4 0 7 7 8 7 7 7 4 7 8 7 7 7 5 6 1 0 0 7 7 1 9 0 7 1 8 1 1 4 7\n", + " 7 0 7 7 6 4 4 4 6 7 1 7 8 7 7 1 7 1 8 8 1 0 4 7 9 1 6 4 7 1 7 7 1 0 4 7 2\n", + " 7 1 6 8 9 7 4 7 4 1 2 7 6 2 0 1 7 1 9 7 0 7 7 2 2 7 8 7 7 7 8 5 9 7 2 5 4\n", + " 0 0 7 8 5 5 7 2 5 4 0 5 7 8 5 1 7 6 7 4 0 9 7 8 7 5 5 4 5 8 7 9 7 5 2 5 0\n", + " 0 7 7 5 8 8 0 5 1 8 5 1 4 3 7 5 7 7 6 4 4 4 0 7 5 0 8 7 9 1 7 1 8 8 5 0 1\n", + " 7 1 5 0 6 4 7 5 0 7 5 0 4 5 6 7 5 6 8 5 7 4 7 4 5 0 7 6 6 5 9 5 1 1 5 0 7\n", + " 5 6 5 7 6 7 8 9 7 9 8 5 9 7 6 7 4 0 7 7 8 0 1 7 6 7 4 0 5 7 8 5 9 7 6 9 4\n", + " 0 5 7 8 7 7 9 4 9 8 7 9 7 5 6 5 0 0 0 4 5 8 8 9 5 0 5 9 8 5 9 4 7 7 0 7 7\n", + " 6 4 4 4 6 7 5 5 8 7 7 9 9 7 8 8 5 0 4 9 9 5 5 6 4 7 5 7 7 5 5 4 5 6 7 5 6\n", + " 8 9 9 4 7 4 3 0 5 6 6 0 9 3 9 9 9 0 7 9 6 5 5 6 7 8 5 7 5 8 0 1 9 6 7 4 9\n", + " 5 7 8 5 1 7 6 9 4 0 5 7 8 0 5 7 6 5 4 0 5 7 8 7 9 5 4 5 8 7 5 7 5 6 5 0 0\n", + " 7 7 5 8 8 1 1 0 5 1 8 0 1 4 7 7 0 7 7 6 4 4 4 6 7 5 7 8 7 4 9 5 7 8 8 0 0\n", + " 4 7 1 5 5 6 4 7 5 7 7 5 0 4 5 6 7 5 6 8 5 7 4 7 4 5 5 5 6 6 0 1 5 1 1 4 0\n", + " 7 7 6 5 5 6 7 8 5 8 0 9 7 6 7 4 0 7 7 8 0 9 7 6 7 4 0 7 7 8 0 9 7 6 7 4 0\n", + " 7 7 8 7 7 7 4 7 8 7 7 7 7 6 0 0 0 7 7 0 8 8 9 9 2 0 9 8 0 9 4 7 7 0 7 7 6\n", + " 4 4 4 6 7 0 7 8 7 7 9 0 9 8 8 0 0 4 7 9 0 0 6 4 7 0 7 7 0 0 4 0 6 7 0 6 8\n", + " 7 7 4 7 4 0 0 7 6 6 0 9 0 9 9 7 0 7 7 6 0 0 6 7 8 0 7 0 8 5 1 7 6 5 4 9 5\n", + " 0 8 5 1 0 6 5 4 0 8 5 1 7 6 5 4 5 5 2 6 0 5 9 4 5 8 0 0 5 5 6 5 0 9 5 9 5\n", + " 4 8 1 9 9 5 1 8 5 9 4 5 5 9 5 5 6 4 4 4 5 0 5 5 8 7 5 1 0 8 5 5 4 7 9 5 9\n", + " 5 4 7 5 5 0 5 9 4 5 6 7 5 6 8 5 7 4 7 5 5 0 5 6 6 5 1 7 5 9 7 5 5 6 5 8 5\n", + " 0 0 8 5 9 7 6 7 4 0 7 7 8 5 5 5 6 7 4 0 9 7 8 5 5 9 6 6 4 0 5 7 8 7 5 0 4\n", + " 5 8 7 7 7 9 2 5 0 0 0 0 5 8 8 9 9 0 5 9 8 5 9 4 5 0 5 7 0 6 4 4 4 6 7 5 7\n", + " 8 7 7 9 5 9 8 8 5 6 4 0 5 5 6 6 4 7 5 7 7 5 0 4 5 6 5 5 6 8 7 7 4 7 4 5 5\n", + " 7 6 6 0 9 5 9 5 7 5 7 7 6 5 5 6 7 8 5 7 7]\n", + "------Test------\n", + "random \t0.074s\t69952\t0.545\t0.616\t0.578\t0.415\t0.574\t0.117\n", + "------Test------\n", + "estimator[-1].labels_ [1 2 2 7 0 8 0 5 2 8 1 9 6 7 0 4 0 5 2 8 1 9 2 7 9 4 0 9 2 8 1 8 4 3 0 4 1\n", + " 8 2 8 2 0 9 5 5 7 4 9 1 1 2 2 5 2 9 1 9 2 0 7 7 5 7 7 0 0 0 0 0 2 9 4 1 8\n", + " 4 2 2 9 1 1 9 5 0 7 3 2 5 4 0 7 9 7 8 2 5 2 2 0 7 2 0 1 4 3 0 8 2 9 5 4 0\n", + " 0 5 2 2 2 2 4 5 8 4 2 2 2 0 7 1 2 8 2 1 9 3 7 9 3 0 5 2 8 1 9 3 7 0 3 0 5\n", + " 2 8 1 9 2 7 0 4 0 5 2 8 1 8 4 3 0 4 1 8 2 8 2 0 9 5 5 7 3 9 1 1 3 3 5 2 3\n", + " 1 9 2 0 7 7 5 7 7 0 0 0 0 0 8 9 4 1 8 3 2 2 2 1 1 9 5 0 7 2 9 5 7 9 7 8 9\n", + " 5 0 2 0 7 9 0 1 4 5 0 8 0 9 5 4 0 0 5 3 2 3 2 3 3 9 2 2 0 8 1 2 8 2 1 2 3\n", + " 7 0 8 0 5 8 4 1 2 3 7 0 4 0 5 2 5 1 2 3 7 0 4 0 5 2 8 1 8 4 4 0 8 1 8 2 8\n", + " 2 0 2 5 5 7 4 2 1 1 3 2 5 8 3 1 9 3 0 7 7 9 7 7 0 0 0 0 0 5 2 4 1 5 4 3 8\n", + " 3 1 1 2 5 0 7 7 2 5 0 0 7 2 7 5 2 5 0 2 0 7 2 5 1 8 7 0 5 0 2 5 4 0 0 5 3\n", + " 8 3 3 8 5 9 3 0 8 8 0 9 1 2 5 7 1 9 6 7 0 4 0 9 2 8 1 2 6 7 0 4 0 9 2 8 1\n", + " 9 3 8 0 4 0 9 8 8 1 8 4 4 0 8 1 8 8 8 2 0 9 9 5 7 4 2 1 1 6 3 9 8 3 1 6 7\n", + " 0 7 8 9 8 8 0 0 0 0 0 8 9 4 1 8 4 6 2 3 1 1 2 9 0 7 3 2 5 9 0 7 9 7 8 9 4\n", + " 0 8 0 7 2 0 1 4 7 0 8 2 9 9 4 9 0 9 3 8 3 2 4 5 8 4 9 2 2 0 8 1 8 8 8 1 6\n", + " 6 8 0 4 0 5 2 8 1 6 2 8 5 8 0 5 2 8 1 6 6 8 0 4 0 5 2 8 1 2 4 8 0 8 1 8 2\n", + " 8 2 0 6 5 5 8 4 6 1 1 6 6 5 0 6 1 6 6 0 8 8 5 8 8 0 0 0 0 0 8 6 4 1 8 8 6\n", + " 2 3 1 1 6 5 0 6 6 6 5 0 0 8 6 8 8 6 5 0 2 0 8 2 0 1 8 8 0 8 0 6 5 4 0 0 5\n", + " 6 2 3 6 4 5 8 4 0 9 2 5 8 1 2 8 2 1 2 3 7 0 4 0 5 8 9 1 2 7 8 0 4 0 5 2 9\n", + " 1 2 7 7 9 4 0 9 8 9 1 9 0 4 0 4 1 9 2 9 8 9 2 9 9 8 4 2 1 1 7 7 5 2 2 1 2\n", + " 8 0 7 7 5 7 7 9 0 0 0 0 9 2 4 1 9 4 7 8 2 1 1 2 5 0 7 3 2 9 0 0 7 2 7 9 2\n", + " 5 0 2 0 7 2 5 1 4 7 0 9 0 2 5 4 0 9 5 2 2 2 7 4 5 9 4 0 8 2 5 9 1 8 9 2 1\n", + " 2 3 7 0 4 0 5 2 8 1 2 3 7 0 4 1 5 9 8 1 2 3 7 0 4 0 5 2 8 1 8 4 4 0 4 1 8\n", + " 8 8 8 0 2 5 5 7 4 2 1 1 2 3 5 8 3 1 6 3 0 7 7 5 7 7 0 0 0 0 0 8 2 4 1 8 4\n", + " 3 2 3 1 1 2 5 0 7 2 2 5 0 0 7 2 7 8 2 5 0 2 0 7 2 0 1 4 7 0 8 0 2 5 4 0 0\n", + " 5 3 2 5 7 4 5 8 4 0 8 8 0 8 1 2 8 2 6 3 8 0 4 0 5 8 8 1 6 3 7 0 8 0 5 8 8\n", + " 1 6 3 7 9 8 0 5 7 8 1 8 8 8 0 8 1 8 8 8 2 9 6 5 5 7 8 6 3 5 8 6 1 6 6 0 7\n", + " 7 5 8 8 9 0 0 0 9 8 6 8 1 8 8 6 8 6 1 1 6 5 0 8 3 6 0 0 8 6 8 8 6 5 0 8 9\n", + " 7 6 9 1 4 7 0 8 0 6 5 8 0 9 5 6 8 6 3 8 5 8 7 9 9 8 1 8 8 8 1 2 3 7 9 4 0\n", + " 5 5 7 1 2 2 8 9 4 0 5 2 8 1 2 6 7 9 4 0 5 3 8 1 8 4 4 0 4 1 8 3 8 2 9 2 5\n", + " 5 7 4 2 1 1 5 2 6 1 2 6 0 7 7 5 7 7 9 0 0 0 5 8 2 4 1 4 4 6 7 6 1 1 2 5 6\n", + " 7 6 2 5 9 0 7 2 5 8 2 5 0 2 9 7 2 0 1 4 7 0 8 0 2 5 4 0 9 5 3 2 6 6 4 5 8\n", + " 4 0 8 7 0 8 1 3 8 3 1 2 3 7 0 4 0 5 7 8 1 9 6 7 0 4 0 5 2 8 1 2 3 7 0 3 0\n", + " 5 2 8 1 8 4 4 0 4 1 8 4 8 4 0 2 5 5 4 4 2 1 1 3 7 5 4 3 1 2 3 0 7 7 5 7 7\n", + " 0 0 0 0 0 8 2 4 1 8 4 3 4 7 1 1 2 5 0 7 7 2 5 0 0 7 2 7 8 2 5 0 2 0 7 2 0\n", + " 1 3 3 0 8 0 4 5 4 0 0 5 3 3 3 3 3 5 8 3 0 2 2 0 8 1 2 8 2 1 9 6 7 0 8 0 3\n", + " 2 8 1 2 6 7 0 4 0 5 2 8 1 9 2 7 0 4 6 5 2 8 1 8 4 4 0 4 1 8 2 8 2 0 2 5 5\n", + " 8 4 2 1 1 6 6 5 2 6 1 9 6 0 7 7 5 8 8 0 0 0 0 0 8 2 4 1 8 0 3 2 8 1 1 9 5\n", + " 0 7 6 2 5 0 6 7 2 7 8 2 5 0 2 0 8 2 0 1 4 7 0 8 0 2 5 4 0 0 5 6 2 6 6 8 5\n", + " 8 4 0 2 2 0 8 1 2 1 9 3 7 0 4 0 5 8 8 1 9 3 7 0 8 0 5 8 8 1 9 3 7 0 8 0 5\n", + " 8 8 1 8 8 4 0 8 1 8 8 8 8 0 9 5 5 7 8 9 1 1 3 3 9 9 3 1 9 3 0 7 7 5 7 7 0\n", + " 0 0 0 0 8 9 8 1 7 4 3 8 3 1 1 9 5 0 7 3 9 5 0 0 7 9 7 8 9 5 0 8 0 8 9 0 1\n", + " 8 7 0 8 0 9 5 8 0 0 5 3 8 7 3 4 5 8 4 0 9 2 0 8 1 9 8 2 1 2 6 7 0 4 0 3 2\n", + " 9 1 2 6 7 0 4 0 9 1 2 6 7 0 4 0 5 4 9 0 9 4 3 0 4 1 9 2 4 2 0 2 5 3 7 3 2\n", + " 0 1 6 3 3 2 6 1 2 3 0 2 5 3 5 2 5 0 0 0 2 9 2 4 0 8 2 6 2 1 2 5 0 7 3 2 3\n", + " 2 0 7 2 7 5 2 3 0 2 0 7 2 0 1 4 7 0 8 0 2 5 4 0 5 5 6 8 4 3 7 4 4 0 4 1 2\n", + " 5 5 1 2 3 7 0 4 0 5 7 8 1 2 2 7 0 4 0 5 3 8 1 2 3 3 0 0 0 5 2 8 1 8 4 4 0\n", + " 4 1 8 8 8 3 9 2 5 5 5 4 2 1 1 3 3 5 2 3 1 2 3 0 2 2 5 8 2 9 0 0 0 0 8 2 4\n", + " 1 8 0 3 2 3 1 1 2 5 0 7 2 2 5 0 0 7 2 7 8 2 5 0 2 0 4 2 0 1 8 7 0 8 0 2 5\n", + " 8 0 0 5 3 2 3 3 8 5 8 8 0 2 2 0 8 1 2 8 8]\n", + "------Test------\n", + "PCA-based\t0.030s\t72686\t0.636\t0.658\t0.647\t0.521\t0.643\t0.138\n", + "__________________________________________________________________________________\n" + ] + } + ], + "source": [ + "from sklearn.cluster import KMeans\n", + "from sklearn.decomposition import PCA\n", + "\n", + "print(82 * '_')\n", + "print('init\\t\\ttime\\tinertia\\thomo\\tcompl\\tv-meas\\tARI\\tAMI\\tsilhouette')\n", + "\n", + "kmeans = KMeans(init=\"k-means++\", n_clusters=n_digits, n_init=4,\n", + " random_state=0)\n", + "bench_k_means(kmeans=kmeans, name=\"k-means++\", data=data, labels=labels)\n", + "\n", + "kmeans = KMeans(init=\"random\", n_clusters=n_digits, n_init=4, random_state=0)\n", + "bench_k_means(kmeans=kmeans, name=\"random\", data=data, labels=labels)\n", + "\n", + "pca = PCA(n_components=n_digits).fit(data)\n", + "kmeans = KMeans(init=pca.components_, n_clusters=n_digits, n_init=1)\n", + "bench_k_means(kmeans=kmeans, name=\"PCA-based\", data=data, labels=labels)\n", + "\n", + "print(82 * '_')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Visualize the results on PCA-reduced data\n", + "\n", + ":class:`~sklearn.decomposition.PCA` allows to project the data from the\n", + "original 64-dimensional space into a lower dimensional space. Subsequently,\n", + "we can use :class:`~sklearn.decomposition.PCA` to project into a\n", + "2-dimensional space and plot the data and the clusters in this new space.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "reduced_data = PCA(n_components=2).fit_transform(data)\n", + "kmeans = KMeans(init=\"k-means++\", n_clusters=n_digits, n_init=4)\n", + "kmeans.fit(reduced_data)\n", + "\n", + "# Step size of the mesh. Decrease to increase the quality of the VQ.\n", + "h = .02 # point in the mesh [x_min, x_max]x[y_min, y_max].\n", + "\n", + "# Plot the decision boundary. For that, we will assign a color to each\n", + "x_min, x_max = reduced_data[:, 0].min() - 1, reduced_data[:, 0].max() + 1\n", + "y_min, y_max = reduced_data[:, 1].min() - 1, reduced_data[:, 1].max() + 1\n", + "xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))\n", + "\n", + "# Obtain labels for each point in mesh. Use last trained model.\n", + "Z = kmeans.predict(np.c_[xx.ravel(), yy.ravel()])\n", + "\n", + "# Put the result into a color plot\n", + "Z = Z.reshape(xx.shape)\n", + "plt.figure(1)\n", + "plt.clf()\n", + "plt.imshow(Z, interpolation=\"nearest\",\n", + " extent=(xx.min(), xx.max(), yy.min(), yy.max()),\n", + " cmap=plt.cm.Paired, aspect=\"auto\", origin=\"lower\")\n", + "\n", + "plt.plot(reduced_data[:, 0], reduced_data[:, 1], 'k.', markersize=2)\n", + "# Plot the centroids as a white X\n", + "centroids = kmeans.cluster_centers_\n", + "plt.scatter(centroids[:, 0], centroids[:, 1], marker=\"x\", s=169, linewidths=3,\n", + " color=\"w\", zorder=10)\n", + "plt.title(\"K-means clustering on the digits dataset (PCA-reduced data)\\n\"\n", + " \"Centroids are marked with white cross\")\n", + "plt.xlim(x_min, x_max)\n", + "plt.ylim(y_min, y_max)\n", + "plt.xticks(())\n", + "plt.yticks(())\n", + "plt.show()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.9" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} From ffedea52ede637a710d250cd93d4e285bfb165a7 Mon Sep 17 00:00:00 2001 From: Chunrui Huang Date: Sat, 20 Feb 2021 12:13:37 -0800 Subject: [PATCH 02/16] clean up output --- tour_model_eval/plot_kmeans_digits.ipynb | 265 +---------------------- 1 file changed, 10 insertions(+), 255 deletions(-) diff --git a/tour_model_eval/plot_kmeans_digits.ipynb b/tour_model_eval/plot_kmeans_digits.ipynb index 62f7cd6..e88eb15 100644 --- a/tour_model_eval/plot_kmeans_digits.ipynb +++ b/tour_model_eval/plot_kmeans_digits.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -39,17 +39,9 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Automatically created module for IPython interactive environment\n" - ] - } - ], + "outputs": [], "source": [ "print(__doc__)" ] @@ -68,69 +60,9 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "# digits: 10; # samples: 1797; # features 64\n", - "------Test------\n", - "data.shape is (1797, 64)\n", - "labels is [0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 9 5 5 6 5 0\n", - " 9 8 9 8 4 1 7 7 3 5 1 0 0 2 2 7 8 2 0 1 2 6 3 3 7 3 3 4 6 6 6 4 9 1 5 0 9\n", - " 5 2 8 2 0 0 1 7 6 3 2 1 7 4 6 3 1 3 9 1 7 6 8 4 3 1 4 0 5 3 6 9 6 1 7 5 4\n", - " 4 7 2 8 2 2 5 7 9 5 4 8 8 4 9 0 8 9 8 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7\n", - " 8 9 0 1 2 3 4 5 6 7 8 9 0 9 5 5 6 5 0 9 8 9 8 4 1 7 7 3 5 1 0 0 2 2 7 8 2\n", - " 0 1 2 6 3 3 7 3 3 4 6 6 6 4 9 1 5 0 9 5 2 8 2 0 0 1 7 6 3 2 1 7 3 1 3 9 1\n", - " 7 6 8 4 3 1 4 0 5 3 6 9 6 1 7 5 4 4 7 2 8 2 2 5 5 4 8 8 4 9 0 8 9 8 0 1 2\n", - " 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 9 5 5 6 5 0 9 8 9\n", - " 8 4 1 7 7 3 5 1 0 0 2 2 7 8 2 0 1 2 6 3 3 7 3 3 4 6 6 6 4 9 1 5 0 9 5 2 8\n", - " 2 0 0 1 7 6 3 2 1 7 4 6 3 1 3 9 1 7 6 8 4 3 1 4 0 5 3 6 9 6 1 7 5 4 4 7 2\n", - " 8 2 2 5 7 9 5 4 8 8 4 9 0 8 9 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0\n", - " 1 2 3 4 5 6 7 8 9 0 9 5 5 6 5 0 9 8 9 8 4 1 7 7 3 5 1 0 0 2 2 7 8 2 0 1 2\n", - " 6 3 3 7 3 3 4 6 6 6 4 9 1 5 0 9 5 2 8 2 0 0 1 7 6 3 2 1 7 4 6 3 1 3 9 1 7\n", - " 6 8 4 3 1 4 0 5 3 6 9 6 1 7 5 4 4 7 2 8 2 2 5 7 9 5 4 8 8 4 9 0 8 9 8 0 1\n", - " 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 9 5 5 6 5 0 9 8\n", - " 9 8 4 1 7 7 3 5 1 0 0 2 2 7 8 2 0 1 2 6 3 3 7 3 3 4 6 6 6 4 9 1 5 0 9 5 2\n", - " 8 2 0 0 1 7 6 3 2 1 7 4 6 3 1 3 9 1 7 6 8 4 3 1 4 0 5 3 6 9 6 1 7 5 4 4 7\n", - " 2 8 2 2 5 7 9 5 4 8 8 4 9 0 8 9 8 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9\n", - " 0 1 2 3 4 5 6 7 8 9 0 9 5 5 6 5 0 9 8 9 8 4 1 7 7 3 5 1 0 0 2 2 7 8 2 0 1\n", - " 2 6 3 3 7 3 3 4 6 6 6 4 9 1 5 0 9 5 2 8 2 0 0 1 7 6 3 2 1 7 4 6 3 1 3 9 1\n", - " 7 6 8 4 3 1 4 0 5 3 6 9 6 1 7 5 4 4 7 2 8 2 2 5 7 9 5 4 8 8 4 9 0 8 9 8 0\n", - " 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 9 5 5 6 5 0 9\n", - " 8 9 8 4 1 7 7 3 5 1 0 0 2 2 7 8 2 0 1 2 6 3 3 7 3 3 4 6 6 6 4 9 1 5 0 9 5\n", - " 2 8 2 0 0 1 7 6 3 2 1 7 4 6 3 1 3 9 1 7 6 8 4 3 1 4 0 5 3 6 9 6 1 7 5 4 4\n", - " 7 2 8 2 2 5 7 9 5 4 8 8 4 9 0 8 9 8 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9\n", - " 0 1 2 3 4 5 6 7 8 9 0 9 5 5 6 5 0 9 8 9 8 4 1 7 7 3 5 1 2 7 8 2 0 1 2 6 3\n", - " 3 7 3 3 4 6 6 6 4 9 1 5 0 9 5 2 8 2 0 0 1 7 6 3 2 1 4 6 3 1 3 9 1 7 6 8 4\n", - " 3 1 4 0 5 3 6 9 6 1 7 5 4 4 7 2 8 2 2 5 7 9 5 4 4 9 0 8 9 8 0 1 2 3 4 5 6\n", - " 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 9 5 5 6 5 0 9 8 9 8 4 1 7\n", - " 7 3 5 1 0 0 7 8 2 0 1 2 6 3 3 7 3 3 4 6 6 6 4 9 1 5 0 9 5 2 8 2 0 0 1 7 6\n", - " 3 2 1 7 4 6 3 1 3 9 1 7 6 8 4 3 1 4 0 5 3 6 9 6 1 7 5 4 4 7 2 8 2 2 5 7 9\n", - " 5 4 8 8 4 9 0 8 9 8 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6\n", - " 7 8 9 0 9 5 5 6 5 0 9 8 9 8 4 1 7 7 3 5 1 0 0 2 2 7 8 2 0 1 2 6 3 3 7 3 3\n", - " 4 6 6 6 4 9 1 5 0 9 5 2 8 2 0 0 1 7 6 3 2 1 7 4 6 3 1 3 9 1 7 6 8 4 3 1 4\n", - " 0 5 3 6 9 6 1 7 5 4 4 7 2 8 2 2 5 7 9 5 4 8 8 4 9 0 8 9 8 0 1 2 3 4 5 6 7\n", - " 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 9 5 5 6 5 0 9 8 9 8 4 1 7 7\n", - " 3 5 1 0 0 2 2 7 8 2 0 1 2 6 3 3 7 3 3 4 6 6 6 4 9 1 5 0 9 5 2 8 2 0 0 1 7\n", - " 6 3 2 1 7 4 6 3 1 3 9 1 7 6 8 4 3 1 4 0 5 3 6 9 6 1 7 5 4 4 7 2 8 2 2 5 7\n", - " 9 5 4 8 8 4 9 0 8 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7\n", - " 8 9 0 9 5 5 6 5 0 9 8 9 8 4 1 7 7 3 5 1 0 0 2 2 7 8 2 0 1 2 6 3 3 7 3 3 4\n", - " 6 6 6 4 9 1 5 0 9 5 2 8 2 0 0 1 7 6 3 2 1 7 4 6 3 1 3 9 1 7 6 8 4 3 1 4 0\n", - " 5 3 6 9 6 1 7 5 4 4 7 2 8 2 2 5 7 9 5 4 8 8 4 9 0 8 9 8 0 1 2 3 4 5 6 7 8\n", - " 9 0 1 2 3 4 5 6 9 0 1 2 3 4 5 6 7 8 9 0 9 5 5 6 5 0 9 8 9 8 4 1 7 7 3 5 1\n", - " 0 0 2 2 7 8 2 0 1 2 6 3 3 7 3 3 4 6 6 6 4 9 1 5 0 9 5 2 8 0 1 7 6 3 2 1 7\n", - " 4 6 3 1 3 9 1 7 6 8 4 3 1 4 0 5 3 6 9 6 1 7 5 4 4 7 2 2 5 7 9 5 4 4 9 0 8\n", - " 9 8 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 9 5 5 6\n", - " 5 0 9 8 9 8 4 1 7 7 3 5 1 0 0 2 2 7 8 2 0 1 2 6 3 3 7 3 3 4 6 6 6 4 9 1 5\n", - " 0 9 5 2 8 2 0 0 1 7 6 3 2 1 7 4 6 3 1 3 9 1 7 6 8 4 3 1 4 0 5 3 6 9 6 1 7\n", - " 5 4 4 7 2 8 2 2 5 7 9 5 4 8 8 4 9 0 8 9 8]\n", - "------Test------\n" - ] - } - ], + "outputs": [], "source": [ "import numpy as np\n", "from sklearn.datasets import load_digits\n", @@ -167,7 +99,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -247,175 +179,9 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "__________________________________________________________________________________\n", - "init\t\ttime\tinertia\thomo\tcompl\tv-meas\tARI\tAMI\tsilhouette\n", - "------Test------\n", - "estimator[-1].labels_ [2 8 8 3 9 3 1 0 3 3 2 6 4 3 9 5 1 0 8 3 2 6 8 3 6 5 1 6 8 3 2 3 5 5 1 5 2\n", - " 3 8 3 8 9 6 0 0 3 5 6 2 2 8 6 0 8 6 2 6 8 1 3 3 0 3 5 9 1 1 1 9 8 6 5 2 3\n", - " 3 6 5 6 2 2 6 0 1 3 5 6 0 8 1 3 6 5 3 8 0 8 8 9 3 8 9 2 5 5 1 3 1 6 0 5 9\n", - " 9 0 8 8 8 8 5 0 3 8 9 8 8 9 3 2 8 3 8 2 6 5 5 9 5 1 0 8 3 2 6 8 3 9 5 1 0\n", - " 8 3 2 6 8 3 9 5 1 0 8 3 2 3 5 5 1 5 2 3 8 3 8 9 6 0 0 3 5 6 2 2 5 5 0 8 5\n", - " 2 6 8 1 3 3 0 3 3 9 1 1 1 9 3 6 5 2 3 5 8 8 8 2 2 6 0 1 3 8 6 0 3 6 3 3 6\n", - " 0 1 8 9 0 6 9 2 5 0 1 3 1 6 0 5 9 9 0 5 8 5 8 5 5 6 8 8 9 3 2 8 3 8 2 8 5\n", - " 3 9 3 1 7 3 3 2 6 5 3 9 5 1 0 8 0 2 8 5 3 9 3 1 7 8 3 2 3 3 3 1 3 2 3 8 3\n", - " 8 9 8 0 0 3 3 8 2 2 5 8 0 3 5 2 6 5 1 5 3 7 3 3 9 1 1 1 9 0 8 5 2 0 3 5 3\n", - " 5 2 2 8 0 1 3 5 6 0 9 1 3 8 3 0 8 0 1 8 9 5 8 9 2 3 3 1 0 1 8 0 5 9 9 0 5\n", - " 3 5 5 3 0 6 5 9 3 3 9 6 2 8 0 3 2 6 4 3 9 3 1 7 6 3 2 6 4 3 9 5 1 7 8 3 2\n", - " 6 5 3 9 8 1 7 3 3 2 3 3 5 1 3 2 3 3 3 3 9 6 7 7 3 6 6 2 2 4 5 7 3 5 2 4 3\n", - " 1 3 3 7 3 3 9 1 1 1 9 3 6 3 2 3 3 4 8 5 2 2 6 7 1 3 5 6 0 6 1 3 6 3 3 6 6\n", - " 1 3 9 3 6 9 2 5 3 1 3 8 6 7 5 6 9 7 5 3 5 8 5 0 3 0 6 8 8 9 3 2 3 3 3 2 4\n", - " 4 3 9 3 1 0 8 3 2 4 8 3 0 3 1 0 8 3 2 4 4 3 9 3 1 0 8 3 2 8 3 3 1 3 2 3 6\n", - " 3 8 9 4 0 0 3 3 4 2 2 4 4 0 1 4 2 4 4 1 3 3 0 3 3 9 1 1 1 9 3 4 3 2 3 3 4\n", - " 8 5 2 2 4 0 1 4 4 4 0 9 1 3 4 3 3 4 0 1 8 9 3 8 9 2 3 3 1 3 1 4 0 3 9 9 0\n", - " 4 8 5 4 0 0 3 3 9 6 8 9 3 2 6 3 6 2 8 5 3 9 0 1 0 3 7 2 8 5 3 9 5 1 0 8 6\n", - " 2 8 5 3 6 5 1 7 3 6 2 6 9 5 1 5 2 6 8 6 3 9 8 7 6 3 5 8 2 2 3 8 0 8 8 2 8\n", - " 3 1 3 3 0 3 3 9 1 1 1 9 6 8 1 2 6 0 8 3 8 2 2 8 0 1 3 5 8 7 9 1 3 8 3 6 8\n", - " 0 1 8 9 3 8 0 2 3 3 1 6 1 8 0 5 9 7 0 8 8 8 5 5 0 7 5 9 3 8 0 6 2 8 6 8 2\n", - " 8 5 3 9 5 1 0 1 3 2 8 5 3 9 5 2 0 6 6 2 8 5 3 9 5 1 0 8 3 2 3 5 0 1 5 2 3\n", - " 3 3 3 9 8 0 0 3 5 8 2 2 8 5 0 6 5 2 4 5 1 3 3 0 3 3 9 1 1 1 9 3 8 8 2 3 5\n", - " 5 8 5 2 2 8 0 1 3 0 8 0 9 1 3 8 3 3 8 0 1 8 9 3 8 9 2 5 3 1 3 1 8 0 5 9 9\n", - " 0 5 6 0 5 5 0 3 5 9 6 3 9 3 2 8 3 8 4 5 3 9 3 1 0 3 3 2 4 5 3 9 3 1 0 3 3\n", - " 2 4 5 3 9 3 1 0 3 3 2 3 3 3 1 3 2 3 3 3 8 9 4 0 0 3 3 4 5 0 3 4 2 4 4 1 3\n", - " 3 0 3 3 6 1 1 1 9 3 4 3 2 3 3 4 3 4 2 2 4 0 1 3 5 4 9 1 3 4 3 3 4 0 1 3 7\n", - " 3 4 9 2 5 3 1 3 1 4 7 3 9 7 0 5 3 4 5 3 0 3 3 7 7 3 2 3 3 3 2 8 5 3 7 5 1\n", - " 0 0 3 2 8 4 3 7 5 1 0 8 3 2 8 4 3 9 3 1 0 5 3 2 3 5 5 1 0 2 3 5 3 8 7 8 0\n", - " 0 3 3 8 2 2 0 8 4 2 8 4 1 3 3 0 3 3 9 1 1 1 0 3 8 6 2 3 5 4 3 4 2 2 8 0 1\n", - " 3 4 8 0 9 1 3 8 0 3 8 0 1 3 9 3 8 9 2 5 3 1 3 1 8 0 3 9 9 0 5 8 4 4 5 0 3\n", - " 9 9 3 3 9 3 2 5 3 5 2 6 5 3 9 3 1 0 5 3 2 6 4 3 9 3 1 0 8 3 2 8 5 3 9 5 1\n", - " 0 5 3 2 3 3 5 1 5 2 3 5 3 5 9 8 0 0 5 1 8 2 2 5 5 0 5 5 2 8 5 1 3 3 0 3 3\n", - " 9 1 1 1 9 3 8 5 2 3 3 5 5 3 2 2 8 0 1 5 5 8 0 9 1 3 8 3 3 8 0 1 8 9 3 8 9\n", - " 2 5 5 1 3 1 8 0 5 9 9 0 5 5 5 5 5 0 3 5 9 8 8 9 3 2 8 3 8 2 6 4 3 9 3 1 5\n", - " 8 3 2 8 4 3 9 5 1 0 5 3 2 6 3 3 9 3 1 0 8 3 2 3 5 3 1 5 2 3 8 3 8 9 8 0 0\n", - " 3 3 8 2 2 4 4 0 8 4 2 6 4 1 3 3 0 3 3 9 1 1 1 9 3 8 3 2 3 1 5 8 3 2 2 6 0\n", - " 1 3 4 8 0 9 1 3 8 3 3 8 0 1 8 9 3 8 9 2 8 3 1 3 1 8 0 8 9 9 0 4 8 4 4 3 0\n", - " 3 5 9 8 8 9 3 2 8 2 6 5 3 9 3 1 0 3 3 2 6 5 3 9 3 1 0 3 3 2 6 5 3 9 3 1 0\n", - " 3 3 2 3 3 3 1 3 2 3 3 3 3 9 6 0 0 3 3 6 2 2 5 5 7 6 5 2 6 5 1 3 3 0 3 3 9\n", - " 1 1 1 9 3 6 3 2 3 3 5 3 5 2 2 6 0 1 3 5 6 0 9 1 3 6 3 3 6 0 1 3 9 3 6 9 2\n", - " 3 3 1 3 1 6 0 3 9 9 0 5 6 5 5 3 0 3 3 9 6 8 9 3 2 6 3 8 2 8 4 3 9 5 6 5 8\n", - " 6 2 8 4 3 9 5 1 6 2 8 4 3 9 5 8 0 8 7 9 6 5 5 1 8 2 6 8 5 8 9 8 0 5 5 5 8\n", - " 2 2 4 5 5 8 4 2 8 5 1 8 0 5 0 8 9 1 1 1 8 6 8 5 2 3 8 4 8 2 8 0 1 3 5 8 5\n", - " 8 1 3 8 3 0 8 5 1 8 9 3 8 9 2 5 3 8 3 8 8 0 8 9 9 0 4 3 5 5 3 8 5 9 5 2 8\n", - " 0 0 2 8 5 3 9 3 1 0 3 3 2 8 8 8 9 3 1 0 5 3 2 8 5 5 9 9 1 0 8 3 2 3 3 6 1\n", - " 3 2 3 3 3 5 7 8 0 0 0 3 8 2 2 5 5 0 8 5 2 8 5 1 8 0 0 3 0 9 1 1 1 9 3 8 3\n", - " 2 3 3 5 8 5 2 2 8 0 1 0 8 8 0 9 1 3 8 3 3 8 0 1 8 9 8 8 9 2 3 3 1 3 1 8 0\n", - " 3 9 9 0 5 8 5 5 3 0 3 3 9 8 8 9 3 2 8 3 3]\n", - "------Test------\n", - "k-means++\t0.157s\t69485\t0.613\t0.660\t0.636\t0.482\t0.632\t0.134\n", - "------Test------\n", - "estimator[-1].labels_ [8 5 5 7 6 7 4 0 7 7 8 0 1 7 6 9 4 0 5 7 8 0 5 0 6 5 4 0 5 7 8 7 9 9 4 9 8\n", - " 7 5 7 5 6 0 0 0 7 5 0 8 8 5 0 0 5 0 8 0 0 4 7 7 0 7 9 6 4 4 4 6 5 0 9 8 7\n", - " 5 0 5 0 8 8 0 0 4 7 9 0 0 5 4 7 0 9 7 5 0 5 5 6 7 5 6 8 5 9 4 7 4 0 0 5 6\n", - " 6 0 5 5 0 5 9 0 7 5 6 5 5 6 7 8 5 7 5 8 0 9 9 6 9 4 0 5 7 8 0 5 9 6 9 4 5\n", - " 5 7 8 0 5 0 6 9 4 5 5 7 8 7 9 9 4 9 8 7 5 7 5 6 0 0 0 7 9 0 8 8 5 5 0 5 5\n", - " 8 0 5 4 7 7 5 7 7 6 4 4 4 6 7 0 9 8 7 9 5 5 5 8 8 0 5 4 7 5 0 5 7 0 7 7 0\n", - " 0 4 5 6 0 0 6 8 9 0 4 7 4 0 5 5 6 6 5 9 5 9 5 9 9 6 5 5 6 7 8 5 7 5 8 5 9\n", - " 7 6 7 4 2 7 0 8 0 9 7 6 5 4 0 5 0 8 5 9 7 6 7 4 2 5 7 8 7 7 7 4 7 8 7 5 7\n", - " 5 6 5 0 0 7 7 5 8 8 9 5 0 7 5 8 0 9 4 9 7 2 7 7 6 4 4 4 6 0 5 5 8 0 7 9 7\n", - " 9 8 8 5 0 4 7 5 5 0 6 4 7 5 9 0 5 5 4 5 6 9 5 6 8 7 7 4 0 4 5 5 9 6 6 0 9\n", - " 7 9 9 7 0 0 9 6 7 7 6 0 8 5 0 7 8 0 1 7 6 5 4 2 0 7 8 5 1 7 6 5 4 2 5 7 8\n", - " 0 9 7 6 5 4 2 0 7 8 7 7 5 4 7 8 7 7 7 5 6 0 2 2 7 0 5 8 8 1 9 2 7 9 8 1 7\n", - " 4 7 7 2 7 7 6 4 4 4 6 7 0 0 8 7 5 1 0 9 8 8 5 2 4 7 9 5 0 6 4 7 0 7 7 0 0\n", - " 4 7 6 9 5 6 8 9 7 4 7 5 0 2 5 6 6 2 9 7 9 0 5 0 7 0 6 5 5 6 0 8 7 7 7 8 1\n", - " 1 7 6 7 4 5 0 7 8 1 5 7 6 7 4 0 5 7 8 1 1 7 6 7 4 0 5 7 8 5 7 7 4 7 8 7 0\n", - " 7 5 6 1 0 0 7 7 1 8 8 3 1 0 4 1 8 1 1 4 7 7 0 7 7 6 4 4 4 6 7 1 7 8 7 7 1\n", - " 4 9 8 8 1 0 4 1 1 1 0 6 4 7 1 7 7 1 0 4 5 6 7 5 6 8 7 7 4 7 4 1 0 7 6 6 5\n", - " 1 0 9 1 0 0 7 7 6 0 0 6 7 8 0 7 0 8 5 9 7 6 0 4 0 7 2 8 5 5 7 6 5 4 0 5 0\n", - " 8 5 7 7 6 5 4 2 7 0 8 0 6 5 4 5 8 0 5 0 5 6 0 2 0 7 5 0 8 8 7 5 0 5 5 8 5\n", - " 5 4 7 7 0 7 7 6 4 4 4 6 0 5 5 8 0 0 5 7 5 8 8 0 0 4 7 9 5 2 6 4 7 5 7 0 5\n", - " 0 4 5 6 7 5 0 8 7 7 4 0 4 5 0 5 6 2 0 5 5 5 5 5 0 2 9 6 7 5 0 2 8 5 0 5 8\n", - " 5 9 7 6 9 4 0 4 7 8 5 9 7 6 9 8 5 0 7 8 5 9 7 6 9 4 0 5 7 8 7 5 5 4 5 8 7\n", - " 7 7 7 6 5 5 0 7 5 5 8 8 5 9 5 0 9 8 1 9 4 7 7 0 0 0 6 4 4 4 6 7 5 5 8 7 9\n", - " 9 5 9 8 8 5 0 4 7 5 5 0 6 4 7 5 7 7 5 5 4 5 6 7 5 6 8 5 7 4 7 4 0 5 9 6 6\n", - " 0 9 0 0 5 5 5 7 9 6 0 7 6 7 8 5 7 5 1 9 7 6 7 4 0 7 7 8 1 9 7 6 7 4 5 7 7\n", - " 8 1 9 7 6 7 4 0 7 7 8 7 7 7 4 7 8 7 7 7 5 6 1 0 0 7 7 1 9 0 7 1 8 1 1 4 7\n", - " 7 0 7 7 6 4 4 4 6 7 1 7 8 7 7 1 7 1 8 8 1 0 4 7 9 1 6 4 7 1 7 7 1 0 4 7 2\n", - " 7 1 6 8 9 7 4 7 4 1 2 7 6 2 0 1 7 1 9 7 0 7 7 2 2 7 8 7 7 7 8 5 9 7 2 5 4\n", - " 0 0 7 8 5 5 7 2 5 4 0 5 7 8 5 1 7 6 7 4 0 9 7 8 7 5 5 4 5 8 7 9 7 5 2 5 0\n", - " 0 7 7 5 8 8 0 5 1 8 5 1 4 3 7 5 7 7 6 4 4 4 0 7 5 0 8 7 9 1 7 1 8 8 5 0 1\n", - " 7 1 5 0 6 4 7 5 0 7 5 0 4 5 6 7 5 6 8 5 7 4 7 4 5 0 7 6 6 5 9 5 1 1 5 0 7\n", - " 5 6 5 7 6 7 8 9 7 9 8 5 9 7 6 7 4 0 7 7 8 0 1 7 6 7 4 0 5 7 8 5 9 7 6 9 4\n", - " 0 5 7 8 7 7 9 4 9 8 7 9 7 5 6 5 0 0 0 4 5 8 8 9 5 0 5 9 8 5 9 4 7 7 0 7 7\n", - " 6 4 4 4 6 7 5 5 8 7 7 9 9 7 8 8 5 0 4 9 9 5 5 6 4 7 5 7 7 5 5 4 5 6 7 5 6\n", - " 8 9 9 4 7 4 3 0 5 6 6 0 9 3 9 9 9 0 7 9 6 5 5 6 7 8 5 7 5 8 0 1 9 6 7 4 9\n", - " 5 7 8 5 1 7 6 9 4 0 5 7 8 0 5 7 6 5 4 0 5 7 8 7 9 5 4 5 8 7 5 7 5 6 5 0 0\n", - " 7 7 5 8 8 1 1 0 5 1 8 0 1 4 7 7 0 7 7 6 4 4 4 6 7 5 7 8 7 4 9 5 7 8 8 0 0\n", - " 4 7 1 5 5 6 4 7 5 7 7 5 0 4 5 6 7 5 6 8 5 7 4 7 4 5 5 5 6 6 0 1 5 1 1 4 0\n", - " 7 7 6 5 5 6 7 8 5 8 0 9 7 6 7 4 0 7 7 8 0 9 7 6 7 4 0 7 7 8 0 9 7 6 7 4 0\n", - " 7 7 8 7 7 7 4 7 8 7 7 7 7 6 0 0 0 7 7 0 8 8 9 9 2 0 9 8 0 9 4 7 7 0 7 7 6\n", - " 4 4 4 6 7 0 7 8 7 7 9 0 9 8 8 0 0 4 7 9 0 0 6 4 7 0 7 7 0 0 4 0 6 7 0 6 8\n", - " 7 7 4 7 4 0 0 7 6 6 0 9 0 9 9 7 0 7 7 6 0 0 6 7 8 0 7 0 8 5 1 7 6 5 4 9 5\n", - " 0 8 5 1 0 6 5 4 0 8 5 1 7 6 5 4 5 5 2 6 0 5 9 4 5 8 0 0 5 5 6 5 0 9 5 9 5\n", - " 4 8 1 9 9 5 1 8 5 9 4 5 5 9 5 5 6 4 4 4 5 0 5 5 8 7 5 1 0 8 5 5 4 7 9 5 9\n", - " 5 4 7 5 5 0 5 9 4 5 6 7 5 6 8 5 7 4 7 5 5 0 5 6 6 5 1 7 5 9 7 5 5 6 5 8 5\n", - " 0 0 8 5 9 7 6 7 4 0 7 7 8 5 5 5 6 7 4 0 9 7 8 5 5 9 6 6 4 0 5 7 8 7 5 0 4\n", - " 5 8 7 7 7 9 2 5 0 0 0 0 5 8 8 9 9 0 5 9 8 5 9 4 5 0 5 7 0 6 4 4 4 6 7 5 7\n", - " 8 7 7 9 5 9 8 8 5 6 4 0 5 5 6 6 4 7 5 7 7 5 0 4 5 6 5 5 6 8 7 7 4 7 4 5 5\n", - " 7 6 6 0 9 5 9 5 7 5 7 7 6 5 5 6 7 8 5 7 7]\n", - "------Test------\n", - "random \t0.074s\t69952\t0.545\t0.616\t0.578\t0.415\t0.574\t0.117\n", - "------Test------\n", - "estimator[-1].labels_ [1 2 2 7 0 8 0 5 2 8 1 9 6 7 0 4 0 5 2 8 1 9 2 7 9 4 0 9 2 8 1 8 4 3 0 4 1\n", - " 8 2 8 2 0 9 5 5 7 4 9 1 1 2 2 5 2 9 1 9 2 0 7 7 5 7 7 0 0 0 0 0 2 9 4 1 8\n", - " 4 2 2 9 1 1 9 5 0 7 3 2 5 4 0 7 9 7 8 2 5 2 2 0 7 2 0 1 4 3 0 8 2 9 5 4 0\n", - " 0 5 2 2 2 2 4 5 8 4 2 2 2 0 7 1 2 8 2 1 9 3 7 9 3 0 5 2 8 1 9 3 7 0 3 0 5\n", - " 2 8 1 9 2 7 0 4 0 5 2 8 1 8 4 3 0 4 1 8 2 8 2 0 9 5 5 7 3 9 1 1 3 3 5 2 3\n", - " 1 9 2 0 7 7 5 7 7 0 0 0 0 0 8 9 4 1 8 3 2 2 2 1 1 9 5 0 7 2 9 5 7 9 7 8 9\n", - " 5 0 2 0 7 9 0 1 4 5 0 8 0 9 5 4 0 0 5 3 2 3 2 3 3 9 2 2 0 8 1 2 8 2 1 2 3\n", - " 7 0 8 0 5 8 4 1 2 3 7 0 4 0 5 2 5 1 2 3 7 0 4 0 5 2 8 1 8 4 4 0 8 1 8 2 8\n", - " 2 0 2 5 5 7 4 2 1 1 3 2 5 8 3 1 9 3 0 7 7 9 7 7 0 0 0 0 0 5 2 4 1 5 4 3 8\n", - " 3 1 1 2 5 0 7 7 2 5 0 0 7 2 7 5 2 5 0 2 0 7 2 5 1 8 7 0 5 0 2 5 4 0 0 5 3\n", - " 8 3 3 8 5 9 3 0 8 8 0 9 1 2 5 7 1 9 6 7 0 4 0 9 2 8 1 2 6 7 0 4 0 9 2 8 1\n", - " 9 3 8 0 4 0 9 8 8 1 8 4 4 0 8 1 8 8 8 2 0 9 9 5 7 4 2 1 1 6 3 9 8 3 1 6 7\n", - " 0 7 8 9 8 8 0 0 0 0 0 8 9 4 1 8 4 6 2 3 1 1 2 9 0 7 3 2 5 9 0 7 9 7 8 9 4\n", - " 0 8 0 7 2 0 1 4 7 0 8 2 9 9 4 9 0 9 3 8 3 2 4 5 8 4 9 2 2 0 8 1 8 8 8 1 6\n", - " 6 8 0 4 0 5 2 8 1 6 2 8 5 8 0 5 2 8 1 6 6 8 0 4 0 5 2 8 1 2 4 8 0 8 1 8 2\n", - " 8 2 0 6 5 5 8 4 6 1 1 6 6 5 0 6 1 6 6 0 8 8 5 8 8 0 0 0 0 0 8 6 4 1 8 8 6\n", - " 2 3 1 1 6 5 0 6 6 6 5 0 0 8 6 8 8 6 5 0 2 0 8 2 0 1 8 8 0 8 0 6 5 4 0 0 5\n", - " 6 2 3 6 4 5 8 4 0 9 2 5 8 1 2 8 2 1 2 3 7 0 4 0 5 8 9 1 2 7 8 0 4 0 5 2 9\n", - " 1 2 7 7 9 4 0 9 8 9 1 9 0 4 0 4 1 9 2 9 8 9 2 9 9 8 4 2 1 1 7 7 5 2 2 1 2\n", - " 8 0 7 7 5 7 7 9 0 0 0 0 9 2 4 1 9 4 7 8 2 1 1 2 5 0 7 3 2 9 0 0 7 2 7 9 2\n", - " 5 0 2 0 7 2 5 1 4 7 0 9 0 2 5 4 0 9 5 2 2 2 7 4 5 9 4 0 8 2 5 9 1 8 9 2 1\n", - " 2 3 7 0 4 0 5 2 8 1 2 3 7 0 4 1 5 9 8 1 2 3 7 0 4 0 5 2 8 1 8 4 4 0 4 1 8\n", - " 8 8 8 0 2 5 5 7 4 2 1 1 2 3 5 8 3 1 6 3 0 7 7 5 7 7 0 0 0 0 0 8 2 4 1 8 4\n", - " 3 2 3 1 1 2 5 0 7 2 2 5 0 0 7 2 7 8 2 5 0 2 0 7 2 0 1 4 7 0 8 0 2 5 4 0 0\n", - " 5 3 2 5 7 4 5 8 4 0 8 8 0 8 1 2 8 2 6 3 8 0 4 0 5 8 8 1 6 3 7 0 8 0 5 8 8\n", - " 1 6 3 7 9 8 0 5 7 8 1 8 8 8 0 8 1 8 8 8 2 9 6 5 5 7 8 6 3 5 8 6 1 6 6 0 7\n", - " 7 5 8 8 9 0 0 0 9 8 6 8 1 8 8 6 8 6 1 1 6 5 0 8 3 6 0 0 8 6 8 8 6 5 0 8 9\n", - " 7 6 9 1 4 7 0 8 0 6 5 8 0 9 5 6 8 6 3 8 5 8 7 9 9 8 1 8 8 8 1 2 3 7 9 4 0\n", - " 5 5 7 1 2 2 8 9 4 0 5 2 8 1 2 6 7 9 4 0 5 3 8 1 8 4 4 0 4 1 8 3 8 2 9 2 5\n", - " 5 7 4 2 1 1 5 2 6 1 2 6 0 7 7 5 7 7 9 0 0 0 5 8 2 4 1 4 4 6 7 6 1 1 2 5 6\n", - " 7 6 2 5 9 0 7 2 5 8 2 5 0 2 9 7 2 0 1 4 7 0 8 0 2 5 4 0 9 5 3 2 6 6 4 5 8\n", - " 4 0 8 7 0 8 1 3 8 3 1 2 3 7 0 4 0 5 7 8 1 9 6 7 0 4 0 5 2 8 1 2 3 7 0 3 0\n", - " 5 2 8 1 8 4 4 0 4 1 8 4 8 4 0 2 5 5 4 4 2 1 1 3 7 5 4 3 1 2 3 0 7 7 5 7 7\n", - " 0 0 0 0 0 8 2 4 1 8 4 3 4 7 1 1 2 5 0 7 7 2 5 0 0 7 2 7 8 2 5 0 2 0 7 2 0\n", - " 1 3 3 0 8 0 4 5 4 0 0 5 3 3 3 3 3 5 8 3 0 2 2 0 8 1 2 8 2 1 9 6 7 0 8 0 3\n", - " 2 8 1 2 6 7 0 4 0 5 2 8 1 9 2 7 0 4 6 5 2 8 1 8 4 4 0 4 1 8 2 8 2 0 2 5 5\n", - " 8 4 2 1 1 6 6 5 2 6 1 9 6 0 7 7 5 8 8 0 0 0 0 0 8 2 4 1 8 0 3 2 8 1 1 9 5\n", - " 0 7 6 2 5 0 6 7 2 7 8 2 5 0 2 0 8 2 0 1 4 7 0 8 0 2 5 4 0 0 5 6 2 6 6 8 5\n", - " 8 4 0 2 2 0 8 1 2 1 9 3 7 0 4 0 5 8 8 1 9 3 7 0 8 0 5 8 8 1 9 3 7 0 8 0 5\n", - " 8 8 1 8 8 4 0 8 1 8 8 8 8 0 9 5 5 7 8 9 1 1 3 3 9 9 3 1 9 3 0 7 7 5 7 7 0\n", - " 0 0 0 0 8 9 8 1 7 4 3 8 3 1 1 9 5 0 7 3 9 5 0 0 7 9 7 8 9 5 0 8 0 8 9 0 1\n", - " 8 7 0 8 0 9 5 8 0 0 5 3 8 7 3 4 5 8 4 0 9 2 0 8 1 9 8 2 1 2 6 7 0 4 0 3 2\n", - " 9 1 2 6 7 0 4 0 9 1 2 6 7 0 4 0 5 4 9 0 9 4 3 0 4 1 9 2 4 2 0 2 5 3 7 3 2\n", - " 0 1 6 3 3 2 6 1 2 3 0 2 5 3 5 2 5 0 0 0 2 9 2 4 0 8 2 6 2 1 2 5 0 7 3 2 3\n", - " 2 0 7 2 7 5 2 3 0 2 0 7 2 0 1 4 7 0 8 0 2 5 4 0 5 5 6 8 4 3 7 4 4 0 4 1 2\n", - " 5 5 1 2 3 7 0 4 0 5 7 8 1 2 2 7 0 4 0 5 3 8 1 2 3 3 0 0 0 5 2 8 1 8 4 4 0\n", - " 4 1 8 8 8 3 9 2 5 5 5 4 2 1 1 3 3 5 2 3 1 2 3 0 2 2 5 8 2 9 0 0 0 0 8 2 4\n", - " 1 8 0 3 2 3 1 1 2 5 0 7 2 2 5 0 0 7 2 7 8 2 5 0 2 0 4 2 0 1 8 7 0 8 0 2 5\n", - " 8 0 0 5 3 2 3 3 8 5 8 8 0 2 2 0 8 1 2 8 8]\n", - "------Test------\n", - "PCA-based\t0.030s\t72686\t0.636\t0.658\t0.647\t0.521\t0.643\t0.138\n", - "__________________________________________________________________________________\n" - ] - } - ], + "outputs": [], "source": [ "from sklearn.cluster import KMeans\n", "from sklearn.decomposition import PCA\n", @@ -452,20 +218,9 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "\n", From ba0df386a4e25b5e957283fd796fac316cddd107 Mon Sep 17 00:00:00 2001 From: Chunrui Huang Date: Sat, 20 Feb 2021 22:33:20 -0800 Subject: [PATCH 03/16] v-measure for single user on above cutoff bins --- .../v-measurel_cutoff_bins_single_user.ipynb | 271 ++++++++++++++++++ 1 file changed, 271 insertions(+) create mode 100644 tour_model_eval/v-measurel_cutoff_bins_single_user.ipynb diff --git a/tour_model_eval/v-measurel_cutoff_bins_single_user.ipynb b/tour_model_eval/v-measurel_cutoff_bins_single_user.ipynb new file mode 100644 index 0000000..d4b5552 --- /dev/null +++ b/tour_model_eval/v-measurel_cutoff_bins_single_user.ipynb @@ -0,0 +1,271 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "introductory-sunglasses", + "metadata": {}, + "outputs": [], + "source": [ + "import logging\n", + "\n", + "# Our imports\n", + "import emission.core.get_database as edb\n", + "import emission.analysis.modelling.tour_model.cluster_pipeline as pipeline\n", + "import emission.analysis.modelling.tour_model.similarity as similarity\n", + "import emission.analysis.modelling.tour_model.featurization as featurization\n", + "import emission.analysis.modelling.tour_model.representatives as representatives\n", + "import emission.storage.decorations.analysis_timeseries_queries as esda\n", + "import pandas as pd\n", + "from numpy import *\n", + "# import confirmed_trips_eval_bins_clusters as evaluation\n", + "from sklearn import metrics" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "under-sample", + "metadata": {}, + "outputs": [], + "source": [ + "logger = logging.getLogger()\n", + "logger.setLevel(logging.DEBUG)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "genetic-drinking", + "metadata": {}, + "outputs": [], + "source": [ + "participant_uuid_obj = list(edb.get_profile_db().find({\"install_group\": \"participant\"}, {\"user_id\": 1, \"_id\": 0}))\n", + "all_users = [u[\"user_id\"] for u in participant_uuid_obj]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "rubber-montgomery", + "metadata": {}, + "outputs": [], + "source": [ + "radius = 300" + ] + }, + { + "cell_type": "markdown", + "id": "thorough-nomination", + "metadata": {}, + "source": [ + "## Choose one user for experiment" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "revolutionary-sussex", + "metadata": {}, + "outputs": [], + "source": [ + "user = all_users[4]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "crude-compatibility", + "metadata": {}, + "outputs": [], + "source": [ + "#read the data from the database. We choose key='confirmed_trip' to get confirmed trips here\n", + "trips = pipeline.read_data(uuid=user,key=esda.CONFIRMED_TRIP_KEY)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "right-graham", + "metadata": {}, + "outputs": [], + "source": [ + "# select trips that have user_input to analyze\n", + "non_empty_trips = [t for t in trips if t[\"data\"][\"user_input\"] != {}]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "infrared-accordance", + "metadata": {}, + "outputs": [], + "source": [ + "len(non_empty_trips), non_empty_trips" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "generic-glasgow", + "metadata": {}, + "outputs": [], + "source": [ + "bin_trips, bins = pipeline.remove_noise(non_empty_trips, radius)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "thick-commissioner", + "metadata": {}, + "outputs": [], + "source": [ + "logging.debug('The list of bins is %s' % bins)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "macro-round", + "metadata": {}, + "outputs": [], + "source": [ + "# show all user labels in all bins\n", + "for bin in bins:\n", + " bin_user_input = (non_empty_trips[i].data[\"user_input\"] for i in bin)\n", + " bin_df = pd.DataFrame(data = bin_user_input)\n", + " print(bin_df)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "tired-athens", + "metadata": {}, + "outputs": [], + "source": [ + "# turn all user_input into list without binning\n", + "bin_trips_user_input_ls = pd.DataFrame(data=[bin_trips[i][\"data\"][\"user_input\"] for i in range(len(bin_trips))]).values.tolist()\n", + "bin_trips_user_input_ls" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "veterinary-courage", + "metadata": {}, + "outputs": [], + "source": [ + "for i in bin_trips_user_input_ls:\n", + " if i[2] == \"same_mode\":\n", + " print(i)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "coastal-fiction", + "metadata": {}, + "outputs": [], + "source": [ + "# drop duplicate user_input\n", + "no_dup_df=pd.DataFrame(data=[bin_trips[i][\"data\"][\"user_input\"] for i in range(len(bin_trips))]).drop_duplicates()\n", + "no_dup_df" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "stainless-ancient", + "metadata": {}, + "outputs": [], + "source": [ + "# turn non-duplicate user_input into list\n", + "no_dup_list = no_dup_df.values.tolist()\n", + "no_dup_list" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "narrative-reducing", + "metadata": {}, + "outputs": [], + "source": [ + "# collect labels_true based on user_input\n", + "labels_true =[]\n", + "for trip in bin_trips_user_input_ls:\n", + " if trip in no_dup_list:\n", + " labels_true.append(no_dup_list.index(trip))\n", + "labels_true" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "framed-sector", + "metadata": {}, + "outputs": [], + "source": [ + "# collect labels_pred based on bins\n", + "labels_pred = []\n", + "for i in range(len(bins)):\n", + " for trip in bins[i]:\n", + " labels_pred.append(i)\n", + "labels_pred" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "unlimited-waste", + "metadata": {}, + "outputs": [], + "source": [ + "metrics.homogeneity_score(labels_true, labels_pred)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "grateful-finance", + "metadata": {}, + "outputs": [], + "source": [ + "metrics.completeness_score(labels_true, labels_pred)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "removable-rating", + "metadata": {}, + "outputs": [], + "source": [ + "metrics.v_measure_score(labels_true, labels_pred)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 4a3c8a551b95d2da4549b4fcebb6244cea901e0e Mon Sep 17 00:00:00 2001 From: Chunrui Huang Date: Mon, 22 Feb 2021 09:18:03 -0800 Subject: [PATCH 04/16] modified v-measurel_cutoff_bins_single_user, add one file for clusters for a single user --- .../v-measurel_cutoff_bins_single_user.ipynb | 401 +++++++++++-- ...measurel_cutoff_clusters_single_user.ipynb | 564 ++++++++++++++++++ 2 files changed, 930 insertions(+), 35 deletions(-) create mode 100644 tour_model_eval/v-measurel_cutoff_clusters_single_user.ipynb diff --git a/tour_model_eval/v-measurel_cutoff_bins_single_user.ipynb b/tour_model_eval/v-measurel_cutoff_bins_single_user.ipynb index d4b5552..6a55dd8 100644 --- a/tour_model_eval/v-measurel_cutoff_bins_single_user.ipynb +++ b/tour_model_eval/v-measurel_cutoff_bins_single_user.ipynb @@ -3,7 +3,7 @@ { "cell_type": "code", "execution_count": null, - "id": "introductory-sunglasses", + "id": "severe-married", "metadata": {}, "outputs": [], "source": [ @@ -18,14 +18,15 @@ "import emission.storage.decorations.analysis_timeseries_queries as esda\n", "import pandas as pd\n", "from numpy import *\n", - "# import confirmed_trips_eval_bins_clusters as evaluation\n", - "from sklearn import metrics" + "import confirmed_trips_eval_bins_clusters as evaluation\n", + "from sklearn import metrics\n", + "from pandas.testing import assert_frame_equal" ] }, { "cell_type": "code", "execution_count": null, - "id": "under-sample", + "id": "knowing-price", "metadata": {}, "outputs": [], "source": [ @@ -36,7 +37,7 @@ { "cell_type": "code", "execution_count": null, - "id": "genetic-drinking", + "id": "graphic-determination", "metadata": {}, "outputs": [], "source": [ @@ -47,7 +48,7 @@ { "cell_type": "code", "execution_count": null, - "id": "rubber-montgomery", + "id": "breathing-description", "metadata": {}, "outputs": [], "source": [ @@ -65,28 +66,28 @@ { "cell_type": "code", "execution_count": null, - "id": "revolutionary-sussex", + "id": "gorgeous-retailer", "metadata": {}, "outputs": [], "source": [ - "user = all_users[4]" + "user = all_users[0]" ] }, { "cell_type": "code", "execution_count": null, - "id": "crude-compatibility", + "id": "homeless-father", "metadata": {}, "outputs": [], "source": [ - "#read the data from the database. We choose key='confirmed_trip' to get confirmed trips here\n", + "#read the data from the database. We choose key=esda.CONFIRMED_TRIP_KEY to get confirmed trips here\n", "trips = pipeline.read_data(uuid=user,key=esda.CONFIRMED_TRIP_KEY)" ] }, { "cell_type": "code", "execution_count": null, - "id": "right-graham", + "id": "arranged-cleaning", "metadata": {}, "outputs": [], "source": [ @@ -97,7 +98,7 @@ { "cell_type": "code", "execution_count": null, - "id": "infrared-accordance", + "id": "super-spencer", "metadata": {}, "outputs": [], "source": [ @@ -107,7 +108,7 @@ { "cell_type": "code", "execution_count": null, - "id": "generic-glasgow", + "id": "higher-advocate", "metadata": {}, "outputs": [], "source": [ @@ -117,7 +118,7 @@ { "cell_type": "code", "execution_count": null, - "id": "thick-commissioner", + "id": "beautiful-parcel", "metadata": {}, "outputs": [], "source": [ @@ -127,8 +128,10 @@ { "cell_type": "code", "execution_count": null, - "id": "macro-round", - "metadata": {}, + "id": "comic-norfolk", + "metadata": { + "scrolled": true + }, "outputs": [], "source": [ "# show all user labels in all bins\n", @@ -138,47 +141,58 @@ " print(bin_df)" ] }, + { + "cell_type": "markdown", + "id": "expensive-forestry", + "metadata": {}, + "source": [ + "### Original output" + ] + }, { "cell_type": "code", "execution_count": null, - "id": "tired-athens", + "id": "corporate-situation", "metadata": {}, "outputs": [], "source": [ - "# turn all user_input into list without binning\n", - "bin_trips_user_input_ls = pd.DataFrame(data=[bin_trips[i][\"data\"][\"user_input\"] for i in range(len(bin_trips))]).values.tolist()\n", - "bin_trips_user_input_ls" + "bin_trips_df = pd.DataFrame(data=[i[\"data\"][\"user_input\"] for i in bin_trips])\n", + "bin_trips_df" ] }, { "cell_type": "code", "execution_count": null, - "id": "veterinary-courage", + "id": "historic-russian", "metadata": {}, "outputs": [], "source": [ - "for i in bin_trips_user_input_ls:\n", - " if i[2] == \"same_mode\":\n", - " print(i)" + "# turn all user_input into list without binning\n", + "bin_trips_user_input_ls = bin_trips_df.values.tolist()\n", + "bin_trips_user_input_ls" ] }, { "cell_type": "code", "execution_count": null, - "id": "coastal-fiction", - "metadata": {}, + "id": "jewish-bristol", + "metadata": { + "scrolled": true + }, "outputs": [], "source": [ "# drop duplicate user_input\n", - "no_dup_df=pd.DataFrame(data=[bin_trips[i][\"data\"][\"user_input\"] for i in range(len(bin_trips))]).drop_duplicates()\n", + "no_dup_df=bin_trips_df.drop_duplicates()\n", "no_dup_df" ] }, { "cell_type": "code", "execution_count": null, - "id": "stainless-ancient", - "metadata": {}, + "id": "wooden-postage", + "metadata": { + "scrolled": true + }, "outputs": [], "source": [ "# turn non-duplicate user_input into list\n", @@ -189,7 +203,7 @@ { "cell_type": "code", "execution_count": null, - "id": "narrative-reducing", + "id": "wicked-serial", "metadata": {}, "outputs": [], "source": [ @@ -204,7 +218,7 @@ { "cell_type": "code", "execution_count": null, - "id": "framed-sector", + "id": "surgical-stadium", "metadata": {}, "outputs": [], "source": [ @@ -216,10 +230,55 @@ "labels_pred" ] }, + { + "cell_type": "markdown", + "id": "first-campbell", + "metadata": {}, + "source": [ + "Note: the trips order in labels_true and labels_pred should be the same. Using timestamp to compare the trips in bin_trips and those in bins" + ] + }, { "cell_type": "code", "execution_count": null, - "id": "unlimited-waste", + "id": "dental-universal", + "metadata": {}, + "outputs": [], + "source": [ + "bin_trips_ts = pd.DataFrame(data=[i[\"data\"][\"start_ts\"]for i in bin_trips])\n", + "len(bin_trips_ts)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "dynamic-prize", + "metadata": {}, + "outputs": [], + "source": [ + "bin_ls =[]\n", + "for bin in bins:\n", + " for index in bin:\n", + " bin_ls.append(index)\n", + "bins_ts = pd.DataFrame(data=[non_empty_trips[i][\"data\"][\"start_ts\"]for i in bin_ls])\n", + "len(bins_ts)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "republican-rabbit", + "metadata": {}, + "outputs": [], + "source": [ + "# compare two data frames, return nothing if two data frames are the same\n", + "assert_frame_equal(bins_ts,bin_trips_ts)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "concerned-congo", "metadata": {}, "outputs": [], "source": [ @@ -229,7 +288,7 @@ { "cell_type": "code", "execution_count": null, - "id": "grateful-finance", + "id": "alleged-alabama", "metadata": {}, "outputs": [], "source": [ @@ -239,12 +298,284 @@ { "cell_type": "code", "execution_count": null, - "id": "removable-rating", - "metadata": {}, + "id": "material-genetics", + "metadata": { + "scrolled": true + }, "outputs": [], "source": [ "metrics.v_measure_score(labels_true, labels_pred)" ] + }, + { + "cell_type": "markdown", + "id": "aware-friday", + "metadata": {}, + "source": [ + "### After changing language" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "native-sight", + "metadata": {}, + "outputs": [], + "source": [ + "span_eng_dict = {'revisado_bike':'test ride with bike','placas_de carro':'car plates','aseguranza':'insurance',\n", + " 'iglesia':'church','curso':'course','mi_hija recién aliviada':'my daughter just had a new baby',\n", + " 'servicio_comunitario':'community service','pago_de aseguranza':'insurance payment',\n", + " 'grupo_comunitario':'community group','caminata_comunitaria':'community walk'}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "threaded-focus", + "metadata": {}, + "outputs": [], + "source": [ + "# use dict to replace the values in Spanish in the bin(this step just for showing the trips in each bin)\n", + "for bin in bins:\n", + " bin_user_input = (non_empty_trips[i].data[\"user_input\"] for i in bin)\n", + " bin_df = pd.DataFrame(data = bin_user_input)\n", + " sp2en_bin_df = bin_df.replace(span_eng_dict)\n", + " print(sp2en_bin_df)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "imported-reasoning", + "metadata": {}, + "outputs": [], + "source": [ + "# turn all user_input into list without binning\n", + "bin_trips_user_input_sp2en_ls = pd.DataFrame(data=[i[\"data\"][\"user_input\"] for i in bin_trips]).replace(span_eng_dict).values.tolist()\n", + "bin_trips_user_input_sp2en_ls" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "athletic-reasoning", + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "# drop duplicate user_input\n", + "no_dup_sp2en_df=pd.DataFrame(data=[i[\"data\"][\"user_input\"] for i in bin_trips]).replace(span_eng_dict).drop_duplicates()\n", + "no_dup_sp2en_df" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "false-fields", + "metadata": {}, + "outputs": [], + "source": [ + "# turn non-duplicate user_input into list\n", + "no_dup_sp2en_list = no_dup_sp2en_df.values.tolist()\n", + "no_dup_sp2en_list" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "formal-belgium", + "metadata": {}, + "outputs": [], + "source": [ + "# collect labels_true based on user_input\n", + "labels_true_sp2en =[]\n", + "for trip in bin_trips_user_input_sp2en_ls:\n", + " if trip in no_dup_sp2en_list:\n", + " labels_true_sp2en.append(no_dup_sp2en_list.index(trip))\n", + "labels_true_sp2en" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "indirect-lafayette", + "metadata": {}, + "outputs": [], + "source": [ + "# collect labels_pred based on bins\n", + "labels_pred = []\n", + "for i in range(len(bins)):\n", + " for trip in bins[i]:\n", + " labels_pred.append(i)\n", + "labels_pred" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cooked-mineral", + "metadata": {}, + "outputs": [], + "source": [ + "metrics.homogeneity_score(labels_true_sp2en, labels_pred)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "caring-calcium", + "metadata": {}, + "outputs": [], + "source": [ + "metrics.completeness_score(labels_true_sp2en, labels_pred)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "sunset-frequency", + "metadata": {}, + "outputs": [], + "source": [ + "metrics.v_measure_score(labels_true_sp2en, labels_pred)" + ] + }, + { + "cell_type": "markdown", + "id": "included-alberta", + "metadata": {}, + "source": [ + "### After converting purposes and mode" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "outer-hammer", + "metadata": {}, + "outputs": [], + "source": [ + "map_pur_dict = {'course':'school','work_- lunch break':'lunch_break','on_the way home':'home',\n", + " 'insurance_payment':'insurance'}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "developing-socket", + "metadata": {}, + "outputs": [], + "source": [ + "pd.set_option('display.max_rows', 200)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "partial-prerequisite", + "metadata": {}, + "outputs": [], + "source": [ + "# convert purpose\n", + "bin_trips_user_input_sp2en = pd.DataFrame(data=[bin_trips[i][\"data\"][\"user_input\"] for i in range(len(bin_trips))]).replace(span_eng_dict)\n", + "bin_trips_cvt_pur_df = bin_trips_user_input_sp2en.replace(map_pur_dict)\n", + "# convert mode\n", + "bin_trips_cvt_pur_mo_df = bin_trips_cvt_pur_df\n", + "for i in range(len(bin_trips_cvt_pur_mo_df)):\n", + " if bin_trips_cvt_pur_mo_df.iloc[i][\"replaced_mode\"] == \"same_mode\":\n", + " print(bin_trips_cvt_pur_mo_df.iloc[i]) # to see which row will be converted\n", + " bin_trips_cvt_pur_mo_df.iloc[i][\"replaced_mode\"] = bin_trips_cvt_pur_mo_df.iloc[i]['mode_confirm']\n", + "print(bin_trips_cvt_pur_mo_df)\n", + "bin_trips_cvt_pur_mode_ls = bin_trips_cvt_pur_mo_df.values.tolist()\n", + "bin_trips_cvt_pur_mode_ls" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "classical-berkeley", + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "# drop duplicate user_input\n", + "no_dup_cvt_pur_mode_df = bin_trips_cvt_pur_mo_df.drop_duplicates()\n", + "no_dup_cvt_pur_mode_df" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "opening-equity", + "metadata": {}, + "outputs": [], + "source": [ + "# turn non-duplicate user_input into list\n", + "no_dup_cvt_pur_mo_ls = no_dup_cvt_pur_mode_df.values.tolist()\n", + "no_dup_cvt_pur_mo_ls" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "occasional-evanescence", + "metadata": {}, + "outputs": [], + "source": [ + "# collect labels_true based on user_input\n", + "labels_true_cvt =[]\n", + "for trip in bin_trips_cvt_pur_mode_ls:\n", + " if trip in no_dup_cvt_pur_mo_ls:\n", + " labels_true_cvt.append(no_dup_cvt_pur_mo_ls.index(trip))\n", + "labels_true_cvt" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fancy-barbados", + "metadata": {}, + "outputs": [], + "source": [ + "# collect labels_pred based on bins\n", + "labels_pred = []\n", + "for i in range(len(bins)):\n", + " for trip in bins[i]:\n", + " labels_pred.append(i)\n", + "labels_pred" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "placed-carry", + "metadata": {}, + "outputs": [], + "source": [ + "metrics.homogeneity_score(labels_true_cvt, labels_pred)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "worse-shift", + "metadata": {}, + "outputs": [], + "source": [ + "metrics.completeness_score(labels_true_cvt, labels_pred)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "immediate-series", + "metadata": {}, + "outputs": [], + "source": [ + "metrics.v_measure_score(labels_true_cvt, labels_pred)" + ] } ], "metadata": { diff --git a/tour_model_eval/v-measurel_cutoff_clusters_single_user.ipynb b/tour_model_eval/v-measurel_cutoff_clusters_single_user.ipynb new file mode 100644 index 0000000..c99060e --- /dev/null +++ b/tour_model_eval/v-measurel_cutoff_clusters_single_user.ipynb @@ -0,0 +1,564 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "worst-baseball", + "metadata": {}, + "outputs": [], + "source": [ + "import logging\n", + "\n", + "# Our imports\n", + "import emission.core.get_database as edb\n", + "import emission.analysis.modelling.tour_model.cluster_pipeline as pipeline\n", + "import emission.analysis.modelling.tour_model.similarity as similarity\n", + "import emission.analysis.modelling.tour_model.featurization as featurization\n", + "import emission.analysis.modelling.tour_model.representatives as representatives\n", + "import emission.storage.decorations.analysis_timeseries_queries as esda\n", + "import pandas as pd\n", + "from numpy import *\n", + "import confirmed_trips_eval_bins_clusters as evaluation\n", + "from sklearn import metrics" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "behavioral-generation", + "metadata": {}, + "outputs": [], + "source": [ + "logger = logging.getLogger()\n", + "logger.setLevel(logging.DEBUG)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "powered-import", + "metadata": {}, + "outputs": [], + "source": [ + "participant_uuid_obj = list(edb.get_profile_db().find({\"install_group\": \"participant\"}, {\"user_id\": 1, \"_id\": 0}))\n", + "all_users = [u[\"user_id\"] for u in participant_uuid_obj]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "living-connection", + "metadata": {}, + "outputs": [], + "source": [ + "radius = 300" + ] + }, + { + "cell_type": "markdown", + "id": "thorough-nomination", + "metadata": {}, + "source": [ + "## Choose one user for experiment" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "necessary-letter", + "metadata": {}, + "outputs": [], + "source": [ + "user = all_users[10]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "exclusive-think", + "metadata": {}, + "outputs": [], + "source": [ + "#read the data from the database. We choose key=esda.CONFIRMED_TRIP_KEY to get confirmed trips here\n", + "trips = pipeline.read_data(uuid=user,key=esda.CONFIRMED_TRIP_KEY)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "funded-canadian", + "metadata": {}, + "outputs": [], + "source": [ + "# select trips that have user_input to analyze\n", + "non_empty_trips = [t for t in trips if t[\"data\"][\"user_input\"] != {}]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "iraqi-account", + "metadata": {}, + "outputs": [], + "source": [ + "len(non_empty_trips), non_empty_trips" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "owned-advocate", + "metadata": {}, + "outputs": [], + "source": [ + "bin_trips, bins = pipeline.remove_noise(non_empty_trips, radius)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "healthy-wildlife", + "metadata": {}, + "outputs": [], + "source": [ + "logging.debug('The list of bins is %s' % bins)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "promotional-batch", + "metadata": {}, + "outputs": [], + "source": [ + "# clusters,labels,cluster_trips, points = pipeline.cluster(bin_trips, len(bins))\n", + "# clustering the data only based on sil score (min_cluster = 0) instead of bins number (len(bins))\n", + "feat = featurization.featurization(bin_trips)\n", + "min = 0\n", + "max = int(math.ceil(1.5 * len(bins)))\n", + "feat.cluster(min_clusters=min, max_clusters=max)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "attempted-afghanistan", + "metadata": {}, + "outputs": [], + "source": [ + "logging.debug('number of clusters: %d' % feat.clusters)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fatty-manner", + "metadata": {}, + "outputs": [], + "source": [ + "logging.debug('labels list is: %s' % feat.labels)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "internal-mobility", + "metadata": {}, + "outputs": [], + "source": [ + "cluster_trips = feat.data\n", + "cluster_trips" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "alone-rochester", + "metadata": {}, + "outputs": [], + "source": [ + "cluster_user_input_df = pd.DataFrame(data=[i[\"data\"][\"user_input\"] for i in cluster_trips])\n", + "cluster_user_input_df" + ] + }, + { + "cell_type": "markdown", + "id": "sixth-living", + "metadata": {}, + "source": [ + "### Original output" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "amber-westminster", + "metadata": {}, + "outputs": [], + "source": [ + "# turn cluster_trips to list without any changes\n", + "cluster_user_input_ls = cluster_user_input_df.values.tolist()\n", + "cluster_user_input_ls" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "informative-donor", + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "# drop duplicate user_input\n", + "no_dup_df=cluster_user_input_df.drop_duplicates()\n", + "no_dup_df" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "computational-punishment", + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "# turn non-duplicate user_input into list\n", + "no_dup_list = no_dup_df.values.tolist()\n", + "no_dup_list" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "electric-contamination", + "metadata": {}, + "outputs": [], + "source": [ + "# collect labels_true based on user_input\n", + "labels_true =[]\n", + "for trip in cluster_user_input_ls:\n", + " if trip in no_dup_list:\n", + " labels_true.append(no_dup_list.index(trip))\n", + "labels_true" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "hindu-scholarship", + "metadata": {}, + "outputs": [], + "source": [ + "labels_pred = feat.labels" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ecological-wales", + "metadata": {}, + "outputs": [], + "source": [ + "metrics.homogeneity_score(labels_true, labels_pred)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "metric-budget", + "metadata": {}, + "outputs": [], + "source": [ + "metrics.completeness_score(labels_true, labels_pred)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "responsible-newport", + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "metrics.v_measure_score(labels_true, labels_pred)" + ] + }, + { + "cell_type": "markdown", + "id": "level-semiconductor", + "metadata": {}, + "source": [ + "### After changing language" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "distinct-airport", + "metadata": {}, + "outputs": [], + "source": [ + "span_eng_dict = {'revisado_bike':'test ride with bike','placas_de carro':'car plates','aseguranza':'insurance',\n", + " 'iglesia':'church','curso':'course','mi_hija recién aliviada':'my daughter just had a new baby',\n", + " 'servicio_comunitario':'community service','pago_de aseguranza':'insurance payment',\n", + " 'grupo_comunitario':'community group','caminata_comunitaria':'community walk'}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "enabling-equity", + "metadata": {}, + "outputs": [], + "source": [ + "# change language and turn data frame to list\n", + "cluster_sp2en_ls = cluster_user_input_df.replace(span_eng_dict).values.tolist()\n", + "cluster_sp2en_ls" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "preliminary-spider", + "metadata": {}, + "outputs": [], + "source": [ + "# drop duplicate user_input\n", + "no_dup_sp2en_df=cluster_user_input_df.replace(span_eng_dict).drop_duplicates()\n", + "no_dup_sp2en_df" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "saved-consensus", + "metadata": {}, + "outputs": [], + "source": [ + "# turn non-duplicate user_input into list\n", + "no_dup_sp2en_list = no_dup_sp2en_df.values.tolist()\n", + "no_dup_sp2en_list" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "available-coaching", + "metadata": {}, + "outputs": [], + "source": [ + "# collect labels_true based on user_input\n", + "labels_true_sp2en =[]\n", + "for trip in cluster_sp2en_ls:\n", + " if trip in no_dup_sp2en_list:\n", + " labels_true_sp2en.append(no_dup_sp2en_list.index(trip))\n", + "labels_true_sp2en" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "average-gauge", + "metadata": {}, + "outputs": [], + "source": [ + "labels_pred = labels_pred = feat.labels\n", + "labels_pred" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fiscal-camping", + "metadata": {}, + "outputs": [], + "source": [ + "metrics.homogeneity_score(labels_true_sp2en, labels_pred)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "color-repeat", + "metadata": {}, + "outputs": [], + "source": [ + "metrics.completeness_score(labels_true_sp2en, labels_pred)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "whole-wrong", + "metadata": {}, + "outputs": [], + "source": [ + "metrics.v_measure_score(labels_true_sp2en, labels_pred)" + ] + }, + { + "cell_type": "markdown", + "id": "dangerous-creek", + "metadata": {}, + "source": [ + "### After converting purposes and mode" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "certain-italy", + "metadata": {}, + "outputs": [], + "source": [ + "map_pur_dict = {'course':'school','work_- lunch break':'lunch_break','on_the way home':'home',\n", + " 'insurance_payment':'insurance'}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "swiss-initial", + "metadata": {}, + "outputs": [], + "source": [ + "pd.set_option('display.max_rows', 200)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "naughty-vegetarian", + "metadata": {}, + "outputs": [], + "source": [ + "# convert purpose\n", + "cluster_sp2en_df = cluster_user_input_df.replace(span_eng_dict)\n", + "cluster_cvt_pur_df = cluster_sp2en_df.replace(map_pur_dict)\n", + "# convert mode\n", + "cluster_cvt_pur_mo_df = cluster_cvt_pur_df\n", + "for i in range(len(cluster_cvt_pur_mo_df)):\n", + " if cluster_cvt_pur_mo_df.iloc[i][\"replaced_mode\"] == \"same_mode\":\n", + " print(cluster_cvt_pur_mo_df.iloc[i]) # to see which row will be converted\n", + " cluster_cvt_pur_mo_df.iloc[i][\"replaced_mode\"] = cluster_cvt_pur_mo_df.iloc[i]['mode_confirm']\n", + "print(cluster_cvt_pur_mo_df)\n", + "cluster_cvt_pur_mo_ls = cluster_cvt_pur_mo_df.values.tolist()\n", + "cluster_cvt_pur_mo_ls" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "approximate-lightweight", + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "# drop duplicate user_input\n", + "no_dup_cvt_pur_mode_df = cluster_cvt_pur_mo_df.drop_duplicates()\n", + "no_dup_cvt_pur_mode_df" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "active-westminster", + "metadata": {}, + "outputs": [], + "source": [ + "# turn non-duplicate user_input into list\n", + "no_dup_cvt_pur_mo_ls = no_dup_cvt_pur_mode_df.values.tolist()\n", + "no_dup_cvt_pur_mo_ls" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "documented-arlington", + "metadata": {}, + "outputs": [], + "source": [ + "# collect labels_true based on user_input\n", + "labels_true_cvt =[]\n", + "for trip in cluster_cvt_pur_mo_ls:\n", + " if trip in no_dup_cvt_pur_mo_ls:\n", + " labels_true_cvt.append(no_dup_cvt_pur_mo_ls.index(trip))\n", + "labels_true_cvt" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "noted-worst", + "metadata": {}, + "outputs": [], + "source": [ + "labels_pred = labels_pred = feat.labels\n", + "labels_pred" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "thousand-palestine", + "metadata": {}, + "outputs": [], + "source": [ + "metrics.homogeneity_score(labels_true_cvt, labels_pred)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "demanding-immigration", + "metadata": {}, + "outputs": [], + "source": [ + "metrics.completeness_score(labels_true_cvt, labels_pred)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "racial-theory", + "metadata": {}, + "outputs": [], + "source": [ + "metrics.v_measure_score(labels_true_cvt, labels_pred)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "precise-woman", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 0951484174399ca7c31988a9f667461332f33e45 Mon Sep 17 00:00:00 2001 From: Chunrui Huang Date: Mon, 22 Feb 2021 23:50:18 -0800 Subject: [PATCH 05/16] modified evaluation code, put all bins and bins above cutoff evaluation in one notebook, evaluated clusters above cutoff, showed process of single user on all bins, bins above cutoff, and clusters above cutoff --- .../confirmed_trips_eval_bins_clusters.py | 205 ++++++ .../v-measurel_all_bins_single_user.ipynb | 630 ++++++++++++++++++ .../v-measurel_bins_all_user.ipynb | 314 +++++++++ ...urel_clusters_above_cutoff_all_users.ipynb | 195 ++++++ ...measurel_cutoff_clusters_single_user.ipynb | 85 ++- 5 files changed, 1410 insertions(+), 19 deletions(-) create mode 100644 tour_model_eval/v-measurel_all_bins_single_user.ipynb create mode 100644 tour_model_eval/v-measurel_bins_all_user.ipynb create mode 100644 tour_model_eval/v-measurel_clusters_above_cutoff_all_users.ipynb diff --git a/tour_model_eval/confirmed_trips_eval_bins_clusters.py b/tour_model_eval/confirmed_trips_eval_bins_clusters.py index 9f58337..e57e4a7 100644 --- a/tour_model_eval/confirmed_trips_eval_bins_clusters.py +++ b/tour_model_eval/confirmed_trips_eval_bins_clusters.py @@ -9,6 +9,8 @@ import emission.storage.decorations.analysis_timeseries_queries as esda import pandas as pd from numpy import * +from sklearn import metrics +from pandas.testing import assert_frame_equal # Spanish words to English span_eng_dict = {'revisado_bike':'test ride with bike','placas_de carro':'car plates','aseguranza':'insurance', @@ -71,3 +73,206 @@ def precision_bin_all_users(all_users,radius,sp2en=None,cvt_purpose=None): all_bins_preci = precision_bins(all_bins_preci, sim.bins, non_empty_trips, sp2en, cvt_purpose) all_users_preci.append(round(mean(all_bins_preci), 2)) return all_users_preci + + +# v_measure_bins takes 5 parameters +# - sp2en=True: change Spanish to English +# - cvt_pur_mo=True: convert purposes and replaced mode +# - cutoff=True: choose to analyze bins above cutoff +# - cutoff=None: analyze all bins +# Note: for sp2en and cvt_pur_mo, set either one to be True as needed. cvt_pur_mo will change language first +def v_measure_bins(all_users,radius,sp2en=None,cvt_pur_mo=None,cutoff=None): + homo_score = [] + comp_score = [] + v_score = [] + for i in range(len(all_users)): + user = all_users[i] + trips = pipeline.read_data(uuid=user, key=esda.CONFIRMED_TRIP_KEY) + non_empty_trips = [t for t in trips if t["data"]["user_input"] != {}] + valid_trips = [t for t in non_empty_trips if 'mode_confirm' in t["data"]["user_input"] and + 'purpose_confirm' in t["data"]["user_input"] and 'replaced_mode' in t["data"]["user_input"]] + sim = similarity.similarity(valid_trips, radius) + filter_trips = sim.data + + # filter out users that haven't enough trips (at least 10) to analyze + if len(filter_trips) < 10: + homo_score.append(NaN) + comp_score.append(NaN) + v_score.append(NaN) + continue + sim.bin_data() + if cutoff is None: + trip_index_ls = [] + bins = sim.bins + for bin in bins: + for index in bin: + trip_index_ls.append(index) + bin_trips = [filter_trips[num] for num in trip_index_ls] + + elif cutoff: + sim.delete_bins() + bin_trips = sim.newdata + bins = sim.bins + + if len(bin_trips) < 10: + homo_score.append(NaN) + comp_score.append(NaN) + v_score.append(NaN) + continue + bin_trips_df = pd.DataFrame(data=[trip["data"]["user_input"] for trip in bin_trips]) + + if sp2en: + bin_trips_df = bin_trips_df.replace(span_eng_dict) + elif cvt_pur_mo: + bin_trips_df = bin_trips_df.replace(span_eng_dict) + bin_trips_df = bin_trips_df.replace(map_pur_dict) + for a in range(len(bin_trips_df)): + if bin_trips_df.iloc[a]["replaced_mode"] == "same_mode": + # to see which row will be converted + logging.debug("The following rows will be changed: %s", bin_trips_df.iloc[a]) + bin_trips_df.iloc[a]["replaced_mode"] = bin_trips_df.iloc[a]['mode_confirm'] + + # turn all user_input into list without binning + bin_trips_user_input_ls = bin_trips_df.values.tolist() + # drop duplicate user_input + no_dup_df = bin_trips_df.drop_duplicates() + # turn non-duplicate user_input into list + no_dup_list = no_dup_df.values.tolist() + + # collect labels_true based on user_input + labels_true = [] + for trip in bin_trips_user_input_ls: + if trip in no_dup_list: + labels_true.append(no_dup_list.index(trip)) + + # collect labels_pred based on bins + labels_pred = [] + for b in range(len(bins)): + for trip in bins[b]: + labels_pred.append(b) + + # compare the trips order in bins and those in valid_trips using timestamp + bin_trips_ts = pd.DataFrame(data=[trip["data"]["start_ts"] for trip in bin_trips]) + bin_ls = [] + for bin in bins: + for index in bin: + bin_ls.append(index) + bins_ts = pd.DataFrame(data=[filter_trips[i]["data"]["start_ts"] for i in bin_ls]) + # compare two data frames, return nothing if two data frames are the same + assert_frame_equal(bins_ts, bin_trips_ts) + homo = metrics.homogeneity_score(labels_true, labels_pred) + homo_score.append(float('%.3f' % homo)) + comp = metrics.completeness_score(labels_true, labels_pred) + comp_score.append(float('%.3f' % comp)) + v = metrics.v_measure_score(labels_true, labels_pred) + v_score.append(float('%.3f' % v)) + + return homo_score, comp_score, v_score + + +# - sp2en=True: change Spanish to English +# - cvt_pur_mo=True: convert purposes and replaced mode +# - cutoff=True: choose to analyze bins above cutoff +# - cutoff=None: analyze all bins +# Note: for sp2en and cvt_pur_mo, set either one to be True as needed. cvt_pur_mo will change language first +def v_measure_clusters(all_users,radius,sp2en=None,cvt_pur_mo=None): + homo_score = [] + comp_score = [] + v_score = [] + for i in range(len(all_users)): + user = all_users[i] + trips = pipeline.read_data(uuid=user, key=esda.CONFIRMED_TRIP_KEY) + non_empty_trips = [t for t in trips if t["data"]["user_input"] != {}] + valid_trips = [t for t in non_empty_trips if 'mode_confirm' in t["data"]["user_input"] and + 'purpose_confirm' in t["data"]["user_input"] and 'replaced_mode' in t["data"]["user_input"]] + sim = similarity.similarity(valid_trips, radius) + filter_trips = sim.data + # filter out users that haven't enough trips (at least 10) to analyze + if len(filter_trips) < 10: + homo_score.append(NaN) + comp_score.append(NaN) + v_score.append(NaN) + continue + sim.bin_data() + sim.delete_bins() + bin_trips = sim.newdata + bins = sim.bins + + if len(bin_trips) < 10: + homo_score.append(NaN) + comp_score.append(NaN) + v_score.append(NaN) + continue + + # clustering the data only based on sil score (min_cluster = 0) instead of bins number (len(bins)) + feat = featurization.featurization(bin_trips) + min = 0 + max = int(math.ceil(1.5 * len(bins))) + feat.cluster(min_clusters=min, max_clusters=max) + cluster_trips = feat.data + cluster_user_input_df = pd.DataFrame(data=[i["data"]["user_input"] for i in cluster_trips]) + if sp2en: + # change language + cluster_user_input_df = cluster_user_input_df.replace(span_eng_dict) + cluster_user_input_ls = cluster_user_input_df.values.tolist() + elif cvt_pur_mo: + # change language first + cluster_user_input_df = cluster_user_input_df.replace(span_eng_dict) + # convert purpose + cluster_user_input_df = cluster_user_input_df.replace(map_pur_dict) + # convert mode + for a in range(len(cluster_user_input_df)): + if cluster_user_input_df.iloc[a]["replaced_mode"] == "same_mode": + cluster_user_input_df.iloc[a]["replaced_mode"] = cluster_user_input_df.iloc[a]['mode_confirm'] + # turn cluster_trips to list without any changes + cluster_user_input_ls = cluster_user_input_df.values.tolist() + # drop duplicate user_input + no_dup_df = cluster_user_input_df.drop_duplicates() + # turn non-duplicate user_input into list + no_dup_list = no_dup_df.values.tolist() + # collect labels_true based on user_input + labels_true = [] + for trip in cluster_user_input_ls: + if trip in no_dup_list: + labels_true.append(no_dup_list.index(trip)) + labels_pred = feat.labels + + # compare the points in cluster_trips and those in feat.points, return nothing if two data frames are the same + cluster_ps = [] + for trip in cluster_trips: + cluster_ps.append([trip["data"]["start_loc"]["coordinates"][0], + trip["data"]["start_loc"]["coordinates"][1], + trip["data"]["end_loc"]["coordinates"][0], + trip["data"]["end_loc"]["coordinates"][1]]) + cluster_ps_df = pd.DataFrame(data=cluster_ps) + label_ps_df = pd.DataFrame(data=feat.points) + assert_frame_equal(cluster_ps_df, label_ps_df) + + homo = metrics.homogeneity_score(labels_true, labels_pred) + homo_score.append(float('%.3f' % homo)) + comp = metrics.completeness_score(labels_true, labels_pred) + comp_score.append(float('%.3f' % comp)) + v = metrics.v_measure_score(labels_true, labels_pred) + v_score.append(float('%.3f' % v)) + + return homo_score, comp_score, v_score + + + + + + + + + + + + + + + + + + + + diff --git a/tour_model_eval/v-measurel_all_bins_single_user.ipynb b/tour_model_eval/v-measurel_all_bins_single_user.ipynb new file mode 100644 index 0000000..4eb2013 --- /dev/null +++ b/tour_model_eval/v-measurel_all_bins_single_user.ipynb @@ -0,0 +1,630 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "modified-diary", + "metadata": {}, + "outputs": [], + "source": [ + "import logging\n", + "\n", + "# Our imports\n", + "import emission.core.get_database as edb\n", + "import emission.analysis.modelling.tour_model.cluster_pipeline as pipeline\n", + "import emission.analysis.modelling.tour_model.similarity as similarity\n", + "import emission.analysis.modelling.tour_model.featurization as featurization\n", + "import emission.analysis.modelling.tour_model.representatives as representatives\n", + "import emission.storage.decorations.analysis_timeseries_queries as esda\n", + "import pandas as pd\n", + "from numpy import *\n", + "import confirmed_trips_eval_bins_clusters as evaluation\n", + "from sklearn import metrics\n", + "from pandas.testing import assert_frame_equal" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "together-twenty", + "metadata": {}, + "outputs": [], + "source": [ + "logger = logging.getLogger()\n", + "logger.setLevel(logging.DEBUG)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "sorted-lloyd", + "metadata": {}, + "outputs": [], + "source": [ + "participant_uuid_obj = list(edb.get_profile_db().find({\"install_group\": \"participant\"}, {\"user_id\": 1, \"_id\": 0}))\n", + "all_users = [u[\"user_id\"] for u in participant_uuid_obj]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "missing-psychology", + "metadata": {}, + "outputs": [], + "source": [ + "radius = 300" + ] + }, + { + "cell_type": "markdown", + "id": "thorough-nomination", + "metadata": {}, + "source": [ + "## Choose one user for experiment" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "august-valley", + "metadata": {}, + "outputs": [], + "source": [ + "user = all_users[6]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "diverse-running", + "metadata": {}, + "outputs": [], + "source": [ + "#read the data from the database. We choose key=esda.CONFIRMED_TRIP_KEY to get confirmed trips here\n", + "trips = pipeline.read_data(uuid=user,key=esda.CONFIRMED_TRIP_KEY)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "crude-postage", + "metadata": {}, + "outputs": [], + "source": [ + "# select trips that have user_input to analyze\n", + "non_empty_trips = [t for t in trips if t[\"data\"][\"user_input\"] != {}]\n", + "len(non_empty_trips)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "copyrighted-delta", + "metadata": {}, + "outputs": [], + "source": [ + "# filter out trips that are not fully labeled(contain NaN in user_input)\n", + "valid_trips = [t for t in non_empty_trips if 'mode_confirm' in t[\"data\"][\"user_input\"] and \n", + " 'purpose_confirm'in t[\"data\"][\"user_input\"] and 'replaced_mode' in t[\"data\"][\"user_input\"]]\n", + "len(valid_trips),valid_trips" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "competent-australia", + "metadata": {}, + "outputs": [], + "source": [ + "sim = similarity.similarity(valid_trips, radius)\n", + "sim.data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "standing-serial", + "metadata": {}, + "outputs": [], + "source": [ + "sim.bin_data()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "annoying-antique", + "metadata": {}, + "outputs": [], + "source": [ + "filter_trips = sim.data\n", + "trip_index_ls = []\n", + "bins = sim.bins\n", + "for bin in bins:\n", + " for index in bin:\n", + " trip_index_ls.append(index)\n", + "bin_trips = [filter_trips[num]for num in trip_index_ls]\n", + "\n", + "print(len(bin_trips),len(bins))\n", + "bin_trips" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "latest-contemporary", + "metadata": {}, + "outputs": [], + "source": [ + "logging.debug('The list of bins is %s' % bins)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "thrown-hello", + "metadata": {}, + "outputs": [], + "source": [ + "# show all user labels in all bins\n", + "for bin in bins:\n", + " bin_user_input = (filter_trips[i].data[\"user_input\"] for i in bin)\n", + " bin_df = pd.DataFrame(data = bin_user_input)\n", + " print(bin_df)" + ] + }, + { + "cell_type": "markdown", + "id": "strange-inventory", + "metadata": {}, + "source": [ + "### Original output" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "streaming-taiwan", + "metadata": {}, + "outputs": [], + "source": [ + "bin_trips_df = pd.DataFrame(data=[trip[\"data\"][\"user_input\"] for trip in bin_trips])\n", + "bin_trips_df" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "destroyed-filter", + "metadata": {}, + "outputs": [], + "source": [ + "# turn all user_input into list without binning\n", + "bin_trips_user_input_ls = bin_trips_df.values.tolist()\n", + "bin_trips_user_input_ls" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "mature-italy", + "metadata": {}, + "outputs": [], + "source": [ + "# drop duplicate user_input\n", + "no_dup_df=bin_trips_df.drop_duplicates()\n", + "no_dup_df,len(no_dup_df)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "illegal-collect", + "metadata": {}, + "outputs": [], + "source": [ + "# turn non-duplicate user_input into list\n", + "no_dup_list = no_dup_df.values.tolist()\n", + "no_dup_list" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "sapphire-hughes", + "metadata": {}, + "outputs": [], + "source": [ + "pd.set_option('display.max_rows', 300)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fuzzy-marathon", + "metadata": {}, + "outputs": [], + "source": [ + "# collect labels_true based on user_input\n", + "labels_true =[]\n", + "for trip in bin_trips_user_input_ls:\n", + " if trip in no_dup_list:\n", + " labels_true.append(no_dup_list.index(trip))\n", + "labels_true" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "considerable-restoration", + "metadata": {}, + "outputs": [], + "source": [ + "# collect labels_pred based on bins\n", + "labels_pred = []\n", + "for i in range(len(bins)):\n", + " for trip in bins[i]:\n", + " labels_pred.append(i)\n", + "labels_pred" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "domestic-august", + "metadata": {}, + "outputs": [], + "source": [ + "bin_trips_ts = pd.DataFrame(data=[trip[\"data\"][\"start_ts\"]for trip in bin_trips])\n", + "bin_input = pd.DataFrame(data=[trip[\"data\"][\"user_input\"]for trip in bin_trips])\n", + "len(bin_trips_ts)\n", + "bin_input" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "married-catholic", + "metadata": {}, + "outputs": [], + "source": [ + "bins_ts = pd.DataFrame(data=[filter_trips[num][\"data\"][\"start_ts\"]for num in trip_index_ls])\n", + "bins_input = pd.DataFrame(data=[filter_trips[num][\"data\"][\"user_input\"]for num in trip_index_ls])\n", + "len(trip_index_ls)\n", + "bins_input" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "requested-organic", + "metadata": {}, + "outputs": [], + "source": [ + "# compare two data frames, return nothing if two data frames are the same\n", + "assert_frame_equal(bins_ts,bin_trips_ts)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "economic-nitrogen", + "metadata": {}, + "outputs": [], + "source": [ + "metrics.homogeneity_score(labels_true, labels_pred)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "postal-trademark", + "metadata": {}, + "outputs": [], + "source": [ + "metrics.completeness_score(labels_true, labels_pred)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "southern-evidence", + "metadata": {}, + "outputs": [], + "source": [ + "metrics.v_measure_score(labels_true, labels_pred)" + ] + }, + { + "cell_type": "markdown", + "id": "domestic-regression", + "metadata": {}, + "source": [ + "### After changing language" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "amazing-jersey", + "metadata": {}, + "outputs": [], + "source": [ + "span_eng_dict = {'revisado_bike':'test ride with bike','placas_de carro':'car plates','aseguranza':'insurance',\n", + " 'iglesia':'church','curso':'course','mi_hija recién aliviada':'my daughter just had a new baby',\n", + " 'servicio_comunitario':'community service','pago_de aseguranza':'insurance payment',\n", + " 'grupo_comunitario':'community group','caminata_comunitaria':'community walk'}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "impressive-philadelphia", + "metadata": {}, + "outputs": [], + "source": [ + "# use dict to replace the values in Spanish in the bin(this step just for showing the trips in each bin)\n", + "for bin in bins:\n", + " bin_user_input = (valid_trips[i].data[\"user_input\"] for i in bin)\n", + " bin_df = pd.DataFrame(data = bin_user_input)\n", + " sp2en_bin_df = bin_df.replace(span_eng_dict)\n", + " print(sp2en_bin_df)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "hybrid-eugene", + "metadata": {}, + "outputs": [], + "source": [ + "# turn all user_input into list without binning\n", + "bin_trips_sp2en_df = bin_trips_df.replace(span_eng_dict)\n", + "bin_trips_sp2en_ls = bin_trips_sp2en_df.values.tolist()\n", + "bin_trips_sp2en_ls" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "viral-intermediate", + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "# drop duplicate user_input\n", + "no_dup_sp2en_df=bin_trips_sp2en_df.drop_duplicates()\n", + "no_dup_sp2en_df" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "conceptual-branch", + "metadata": {}, + "outputs": [], + "source": [ + "# turn non-duplicate user_input into list\n", + "no_dup_sp2en_list = no_dup_sp2en_df.values.tolist()\n", + "no_dup_sp2en_list" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "wanted-management", + "metadata": {}, + "outputs": [], + "source": [ + "# collect labels_true based on user_input\n", + "labels_true_sp2en =[]\n", + "for trip in bin_trips_sp2en_ls:\n", + " if trip in no_dup_sp2en_list:\n", + " labels_true_sp2en.append(no_dup_sp2en_list.index(trip))\n", + "labels_true_sp2en" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "otherwise-vault", + "metadata": {}, + "outputs": [], + "source": [ + "# collect labels_pred based on bins\n", + "labels_pred = []\n", + "for i in range(len(bins)):\n", + " for trip in bins[i]:\n", + " labels_pred.append(i)\n", + "labels_pred" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "adolescent-style", + "metadata": {}, + "outputs": [], + "source": [ + "metrics.homogeneity_score(labels_true_sp2en, labels_pred)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "signal-backing", + "metadata": {}, + "outputs": [], + "source": [ + "metrics.completeness_score(labels_true_sp2en, labels_pred)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "upper-contribution", + "metadata": {}, + "outputs": [], + "source": [ + "metrics.v_measure_score(labels_true_sp2en, labels_pred)" + ] + }, + { + "cell_type": "markdown", + "id": "bearing-communications", + "metadata": {}, + "source": [ + "### After converting purposes and mode" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "completed-testing", + "metadata": {}, + "outputs": [], + "source": [ + "map_pur_dict = {'course':'school','work_- lunch break':'lunch_break','on_the way home':'home',\n", + " 'insurance_payment':'insurance'}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "quality-board", + "metadata": {}, + "outputs": [], + "source": [ + "pd.set_option('display.max_rows', 200)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "falling-arbor", + "metadata": {}, + "outputs": [], + "source": [ + "# convert purpose\n", + "bin_trips_cvt_pur_df = bin_trips_sp2en_df.replace(map_pur_dict)\n", + "# convert mode\n", + "bin_trips_cvt_pur_mo_df = bin_trips_cvt_pur_df\n", + "for i in range(len(bin_trips_cvt_pur_mo_df)):\n", + " if bin_trips_cvt_pur_mo_df.iloc[i][\"replaced_mode\"] == \"same_mode\":\n", + " print(bin_trips_cvt_pur_mo_df.iloc[i]) # to see which row will be converted\n", + " bin_trips_cvt_pur_mo_df.iloc[i][\"replaced_mode\"] = bin_trips_cvt_pur_mo_df.iloc[i]['mode_confirm']\n", + "print(bin_trips_cvt_pur_mo_df)\n", + "bin_trips_cvt_pur_mode_ls = bin_trips_cvt_pur_mo_df.values.tolist()\n", + "bin_trips_cvt_pur_mode_ls" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "electrical-liechtenstein", + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "# drop duplicate user_input\n", + "no_dup_cvt_pur_mode_df = bin_trips_cvt_pur_mo_df.drop_duplicates()\n", + "no_dup_cvt_pur_mode_df" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cleared-valley", + "metadata": {}, + "outputs": [], + "source": [ + "# turn non-duplicate user_input into list\n", + "no_dup_cvt_pur_mo_ls = no_dup_cvt_pur_mode_df.values.tolist()\n", + "no_dup_cvt_pur_mo_ls" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "printable-fusion", + "metadata": {}, + "outputs": [], + "source": [ + "# collect labels_true based on user_input\n", + "labels_true_cvt =[]\n", + "for trip in bin_trips_cvt_pur_mode_ls:\n", + " if trip in no_dup_cvt_pur_mo_ls:\n", + " labels_true_cvt.append(no_dup_cvt_pur_mo_ls.index(trip))\n", + "labels_true_cvt" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "hundred-zealand", + "metadata": {}, + "outputs": [], + "source": [ + "# collect labels_pred based on bins\n", + "labels_pred = []\n", + "for i in range(len(bins)):\n", + " for trip in bins[i]:\n", + " labels_pred.append(i)\n", + "labels_pred" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "false-lithuania", + "metadata": {}, + "outputs": [], + "source": [ + "metrics.homogeneity_score(labels_true_cvt, labels_pred)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "documentary-power", + "metadata": {}, + "outputs": [], + "source": [ + "metrics.completeness_score(labels_true_cvt, labels_pred)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "elect-animation", + "metadata": {}, + "outputs": [], + "source": [ + "metrics.v_measure_score(labels_true_cvt, labels_pred)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/tour_model_eval/v-measurel_bins_all_user.ipynb b/tour_model_eval/v-measurel_bins_all_user.ipynb new file mode 100644 index 0000000..12a2d49 --- /dev/null +++ b/tour_model_eval/v-measurel_bins_all_user.ipynb @@ -0,0 +1,314 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "computational-national", + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "import logging\n", + "\n", + "# Our imports\n", + "import emission.core.get_database as edb\n", + "import emission.analysis.modelling.tour_model.cluster_pipeline as pipeline\n", + "import emission.analysis.modelling.tour_model.similarity as similarity\n", + "import emission.analysis.modelling.tour_model.featurization as featurization\n", + "import emission.analysis.modelling.tour_model.representatives as representatives\n", + "import emission.storage.decorations.analysis_timeseries_queries as esda\n", + "import pandas as pd\n", + "from numpy import *\n", + "import confirmed_trips_eval_bins_clusters as evaluation\n", + "from sklearn import metrics\n", + "from pandas.testing import assert_frame_equal" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "preceding-yugoslavia", + "metadata": {}, + "outputs": [], + "source": [ + "participant_uuid_obj = list(edb.get_profile_db().find({\"install_group\": \"participant\"}, {\"user_id\": 1, \"_id\": 0}))\n", + "all_users = [u[\"user_id\"] for u in participant_uuid_obj]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "perceived-impossible", + "metadata": {}, + "outputs": [], + "source": [ + "radius = 300" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "smooth-variety", + "metadata": {}, + "outputs": [], + "source": [ + "pd.set_option('max_colwidth',100)\n", + "pd.set_option('display.max_rows', None)" + ] + }, + { + "cell_type": "markdown", + "id": "medical-biodiversity", + "metadata": {}, + "source": [ + "## Bins above cutoff" + ] + }, + { + "cell_type": "markdown", + "id": "corporate-heather", + "metadata": {}, + "source": [ + "### Original user input" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "chief-fundamentals", + "metadata": {}, + "outputs": [], + "source": [ + "homo_score_ori, comp_score_ori, v_score_ori = evaluation.v_measure_bins(all_users,radius,cutoff=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "educated-philippines", + "metadata": {}, + "outputs": [], + "source": [ + "mean_v_ori=round(mean([x for x in v_score_ori if str(x) != 'nan']),3)" + ] + }, + { + "cell_type": "markdown", + "id": "welcome-homeless", + "metadata": {}, + "source": [ + "### After changing language" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "preceding-money", + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "homo_score_sp2en, comp_score_sp2en, v_score_sp2en = evaluation.v_measure_bins(all_users,radius,sp2en=True,cutoff=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "laden-plate", + "metadata": {}, + "outputs": [], + "source": [ + "mean_v_sp2en=round(mean([x for x in v_score_sp2en if str(x) != 'nan']),3)" + ] + }, + { + "cell_type": "markdown", + "id": "sticky-denver", + "metadata": {}, + "source": [ + "### After converting purposes and replaced mode" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "agreed-moment", + "metadata": {}, + "outputs": [], + "source": [ + "homo_score_cvt, comp_score_cvt, v_score_cvt = evaluation.v_measure_bins(all_users,radius,cvt_pur_mo=True,cutoff=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "handmade-dairy", + "metadata": {}, + "outputs": [], + "source": [ + "mean_v_cvt=round(mean([x for x in v_score_cvt if str(x) != 'nan']),3)" + ] + }, + { + "cell_type": "markdown", + "id": "funky-potato", + "metadata": {}, + "source": [ + "### DataFrame" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "technological-reservation", + "metadata": {}, + "outputs": [], + "source": [ + "cutoff_df = pd.DataFrame(data={'homogeneity_score':[homo_score_ori,homo_score_sp2en,homo_score_cvt],\n", + " 'completeness_score':[comp_score_ori,comp_score_sp2en,comp_score_cvt],\n", + " 'v_measure_score':[v_score_ori,v_score_sp2en,v_score_cvt],\n", + " 'mean v_measure_score':[mean_v_ori,mean_v_sp2en,mean_v_cvt]},\n", + " index = ['original user input','after translation','after converting purposes and replaced mode'])\n", + "cutoff_df" + ] + }, + { + "cell_type": "markdown", + "id": "strange-badge", + "metadata": {}, + "source": [ + "## All bins" + ] + }, + { + "cell_type": "markdown", + "id": "rural-virtue", + "metadata": {}, + "source": [ + "### Original user input" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "listed-entrance", + "metadata": {}, + "outputs": [], + "source": [ + "ab_homo_score_ori, ab_comp_score_ori, ab_v_score_ori = evaluation.v_measure_bins(all_users,radius)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "known-calculation", + "metadata": {}, + "outputs": [], + "source": [ + "ab_mean_v_ori=round(mean([x for x in ab_v_score_ori if str(x) != 'nan']),3)" + ] + }, + { + "cell_type": "markdown", + "id": "broadband-expression", + "metadata": {}, + "source": [ + "### After changing language" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "alone-authorization", + "metadata": {}, + "outputs": [], + "source": [ + "ab_homo_score_sp2en, ab_comp_score_sp2en, ab_v_score_sp2en = evaluation.v_measure_bins(all_users,radius,sp2en=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "viral-rebel", + "metadata": {}, + "outputs": [], + "source": [ + "ab_mean_v_sp2en=round(mean([x for x in ab_v_score_sp2en if str(x) != 'nan']),3)" + ] + }, + { + "cell_type": "markdown", + "id": "infectious-armstrong", + "metadata": {}, + "source": [ + "### After converting purposes and replaced mode" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "supreme-plain", + "metadata": {}, + "outputs": [], + "source": [ + "ab_homo_score_cvt, ab_comp_score_cvt, ab_v_score_cvt = evaluation.v_measure_bins(all_users,radius,cvt_pur_mo=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "corresponding-blind", + "metadata": {}, + "outputs": [], + "source": [ + "ab_mean_v_cvt=round(mean([x for x in ab_v_score_cvt if str(x) != 'nan']),3)" + ] + }, + { + "cell_type": "markdown", + "id": "aquatic-password", + "metadata": {}, + "source": [ + "### DataFrame" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "instant-broadcast", + "metadata": {}, + "outputs": [], + "source": [ + "all_df = pd.DataFrame(data={'homogeneity_score':[ab_homo_score_ori,ab_homo_score_sp2en,ab_homo_score_cvt],\n", + " 'completeness_score':[ab_comp_score_ori,ab_comp_score_sp2en,ab_comp_score_cvt],\n", + " 'v_measure_score':[ab_v_score_ori,ab_v_score_sp2en,ab_v_score_cvt],\n", + " 'mean v_measure_score':[ab_mean_v_ori,ab_mean_v_sp2en,ab_mean_v_cvt]},\n", + " index = ['original user input','after translation','after converting purposes and replaced mode'])\n", + "all_df" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/tour_model_eval/v-measurel_clusters_above_cutoff_all_users.ipynb b/tour_model_eval/v-measurel_clusters_above_cutoff_all_users.ipynb new file mode 100644 index 0000000..f653b5a --- /dev/null +++ b/tour_model_eval/v-measurel_clusters_above_cutoff_all_users.ipynb @@ -0,0 +1,195 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "important-humanity", + "metadata": {}, + "outputs": [], + "source": [ + "import logging\n", + "\n", + "# Our imports\n", + "import emission.core.get_database as edb\n", + "import emission.analysis.modelling.tour_model.cluster_pipeline as pipeline\n", + "import emission.analysis.modelling.tour_model.similarity as similarity\n", + "import emission.analysis.modelling.tour_model.featurization as featurization\n", + "import emission.analysis.modelling.tour_model.representatives as representatives\n", + "import emission.storage.decorations.analysis_timeseries_queries as esda\n", + "import pandas as pd\n", + "from numpy import *\n", + "import confirmed_trips_eval_bins_clusters as evaluation\n", + "from sklearn import metrics\n", + "from pandas.testing import assert_frame_equal" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "physical-improvement", + "metadata": {}, + "outputs": [], + "source": [ + "participant_uuid_obj = list(edb.get_profile_db().find({\"install_group\": \"participant\"}, {\"user_id\": 1, \"_id\": 0}))\n", + "all_users = [u[\"user_id\"] for u in participant_uuid_obj]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "figured-buddy", + "metadata": {}, + "outputs": [], + "source": [ + "radius = 300" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "equal-release", + "metadata": {}, + "outputs": [], + "source": [ + "pd.set_option('max_colwidth',100)\n", + "pd.set_option('display.max_rows', None)" + ] + }, + { + "cell_type": "markdown", + "id": "standard-savannah", + "metadata": {}, + "source": [ + "## Evaluate clusters above cutoff based on silhouette_score" + ] + }, + { + "cell_type": "markdown", + "id": "formed-guitar", + "metadata": {}, + "source": [ + "### Original user input" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "official-victor", + "metadata": {}, + "outputs": [], + "source": [ + "homo_score_ori, comp_score_ori, v_score_ori = evaluation.v_measure_clusters(all_users,radius)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "loved-isolation", + "metadata": {}, + "outputs": [], + "source": [ + "mean_v_ori=round(mean([x for x in v_score_ori if str(x) != 'nan']),3)" + ] + }, + { + "cell_type": "markdown", + "id": "demanding-rendering", + "metadata": {}, + "source": [ + "### After changing language" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "satisfied-enough", + "metadata": {}, + "outputs": [], + "source": [ + "homo_score_sp2en, comp_score_sp2en, v_score_sp2en = evaluation.v_measure_clusters(all_users,radius,sp2en=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "hundred-pasta", + "metadata": {}, + "outputs": [], + "source": [ + "mean_v_sp2en=round(mean([x for x in v_score_sp2en if str(x) != 'nan']),3)" + ] + }, + { + "cell_type": "markdown", + "id": "hungarian-wallpaper", + "metadata": {}, + "source": [ + "### After converting purposes and replaced mode" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "particular-scope", + "metadata": {}, + "outputs": [], + "source": [ + "homo_score_cvt, comp_score_cvt, v_score_cvt = evaluation.v_measure_clusters(all_users,radius,cvt_pur_mo=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "neither-shooting", + "metadata": {}, + "outputs": [], + "source": [ + "mean_v_cvt=round(mean([x for x in v_score_cvt if str(x) != 'nan']),3)" + ] + }, + { + "cell_type": "markdown", + "id": "continuing-absorption", + "metadata": {}, + "source": [ + "### DataFrame" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "retained-citizenship", + "metadata": {}, + "outputs": [], + "source": [ + "df = pd.DataFrame(data={'homogeneity_score':[homo_score_ori,homo_score_sp2en,homo_score_cvt],\n", + " 'completeness_score':[comp_score_ori,comp_score_sp2en,comp_score_cvt],\n", + " 'v_measure_score':[v_score_ori,v_score_sp2en,v_score_cvt],\n", + " 'mean v_measure_score':[mean_v_ori,mean_v_sp2en,mean_v_cvt]},\n", + " index = ['original user input','after translation','after converting purposes and replaced mode'])\n", + "df" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/tour_model_eval/v-measurel_cutoff_clusters_single_user.ipynb b/tour_model_eval/v-measurel_cutoff_clusters_single_user.ipynb index c99060e..e6fe2e0 100644 --- a/tour_model_eval/v-measurel_cutoff_clusters_single_user.ipynb +++ b/tour_model_eval/v-measurel_cutoff_clusters_single_user.ipynb @@ -19,7 +19,8 @@ "import pandas as pd\n", "from numpy import *\n", "import confirmed_trips_eval_bins_clusters as evaluation\n", - "from sklearn import metrics" + "from sklearn import metrics\n", + "from pandas.testing import assert_frame_equal" ] }, { @@ -69,7 +70,7 @@ "metadata": {}, "outputs": [], "source": [ - "user = all_users[10]" + "user = all_users[6]" ] }, { @@ -91,17 +92,21 @@ "outputs": [], "source": [ "# select trips that have user_input to analyze\n", - "non_empty_trips = [t for t in trips if t[\"data\"][\"user_input\"] != {}]" + "non_empty_trips = [t for t in trips if t[\"data\"][\"user_input\"] != {}]\n", + "len(non_empty_trips)" ] }, { "cell_type": "code", "execution_count": null, - "id": "iraqi-account", + "id": "fabulous-definition", "metadata": {}, "outputs": [], "source": [ - "len(non_empty_trips), non_empty_trips" + "# filter out trips that are not fully labeled(contain NaN in user_input)\n", + "valid_trips = [t for t in non_empty_trips if 'mode_confirm' in t[\"data\"][\"user_input\"] and \n", + " 'purpose_confirm'in t[\"data\"][\"user_input\"] and 'replaced_mode' in t[\"data\"][\"user_input\"]]\n", + "len(valid_trips)" ] }, { @@ -111,7 +116,7 @@ "metadata": {}, "outputs": [], "source": [ - "bin_trips, bins = pipeline.remove_noise(non_empty_trips, radius)" + "bin_trips, bins = pipeline.remove_noise(valid_trips, radius)" ] }, { @@ -127,11 +132,10 @@ { "cell_type": "code", "execution_count": null, - "id": "promotional-batch", + "id": "valid-morocco", "metadata": {}, "outputs": [], "source": [ - "# clusters,labels,cluster_trips, points = pipeline.cluster(bin_trips, len(bins))\n", "# clustering the data only based on sil score (min_cluster = 0) instead of bins number (len(bins))\n", "feat = featurization.featurization(bin_trips)\n", "min = 0\n", @@ -142,7 +146,7 @@ { "cell_type": "code", "execution_count": null, - "id": "attempted-afghanistan", + "id": "bridal-breakfast", "metadata": {}, "outputs": [], "source": [ @@ -152,7 +156,7 @@ { "cell_type": "code", "execution_count": null, - "id": "fatty-manner", + "id": "following-heating", "metadata": {}, "outputs": [], "source": [ @@ -162,8 +166,10 @@ { "cell_type": "code", "execution_count": null, - "id": "internal-mobility", - "metadata": {}, + "id": "beginning-crowd", + "metadata": { + "scrolled": true + }, "outputs": [], "source": [ "cluster_trips = feat.data\n", @@ -173,8 +179,10 @@ { "cell_type": "code", "execution_count": null, - "id": "alone-rochester", - "metadata": {}, + "id": "incorporated-strengthening", + "metadata": { + "scrolled": true + }, "outputs": [], "source": [ "cluster_user_input_df = pd.DataFrame(data=[i[\"data\"][\"user_input\"] for i in cluster_trips])\n", @@ -212,7 +220,7 @@ "source": [ "# drop duplicate user_input\n", "no_dup_df=cluster_user_input_df.drop_duplicates()\n", - "no_dup_df" + "no_dup_df,len(no_dup_df)" ] }, { @@ -254,6 +262,45 @@ "labels_pred = feat.labels" ] }, + { + "cell_type": "code", + "execution_count": null, + "id": "fallen-tulsa", + "metadata": {}, + "outputs": [], + "source": [ + "cluster_ps=[]\n", + "for trip in cluster_trips:\n", + " cluster_ps.append([trip[\"data\"][\"start_loc\"][\"coordinates\"][0],\n", + " trip[\"data\"][\"start_loc\"][\"coordinates\"][1],\n", + " trip[\"data\"][\"end_loc\"][\"coordinates\"][0],\n", + " trip[\"data\"][\"end_loc\"][\"coordinates\"][1]])\n", + "cluster_ps_df = pd.DataFrame(data=cluster_ps)\n", + "cluster_ps_df" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "dangerous-discussion", + "metadata": {}, + "outputs": [], + "source": [ + "label_ps_df = pd.DataFrame(data=feat.points)\n", + "label_ps_df" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "progressive-profit", + "metadata": {}, + "outputs": [], + "source": [ + "# compare two data frames, return nothing if two data frames are the same\n", + "assert_frame_equal(cluster_ps_df,label_ps_df)" + ] + }, { "cell_type": "code", "execution_count": null, @@ -315,7 +362,8 @@ "outputs": [], "source": [ "# change language and turn data frame to list\n", - "cluster_sp2en_ls = cluster_user_input_df.replace(span_eng_dict).values.tolist()\n", + "cluster_sp2en_df = cluster_user_input_df.replace(span_eng_dict)\n", + "cluster_sp2en_ls = cluster_sp2en_df.values.tolist()\n", "cluster_sp2en_ls" ] }, @@ -327,7 +375,7 @@ "outputs": [], "source": [ "# drop duplicate user_input\n", - "no_dup_sp2en_df=cluster_user_input_df.replace(span_eng_dict).drop_duplicates()\n", + "no_dup_sp2en_df=cluster_sp2en_df.drop_duplicates()\n", "no_dup_sp2en_df" ] }, @@ -436,7 +484,6 @@ "outputs": [], "source": [ "# convert purpose\n", - "cluster_sp2en_df = cluster_user_input_df.replace(span_eng_dict)\n", "cluster_cvt_pur_df = cluster_sp2en_df.replace(map_pur_dict)\n", "# convert mode\n", "cluster_cvt_pur_mo_df = cluster_cvt_pur_df\n", @@ -534,7 +581,7 @@ { "cell_type": "code", "execution_count": null, - "id": "precise-woman", + "id": "common-manhattan", "metadata": {}, "outputs": [], "source": [] From 4b99639aba91bce46face2c94616bf4cd61b763a Mon Sep 17 00:00:00 2001 From: Chunrui Huang Date: Tue, 23 Feb 2021 15:03:42 -0800 Subject: [PATCH 06/16] delete example codes from sklearn, clean up files --- .../confirmed_trips_eval_bins_clusters.py | 52 ---- .../plot_document_clustering.ipynb | 285 ----------------- tour_model_eval/plot_kmeans_digits.ipynb | 286 ------------------ .../v-measurel_cutoff_bins_single_user.ipynb | 154 ++++++---- 4 files changed, 89 insertions(+), 688 deletions(-) delete mode 100644 tour_model_eval/plot_document_clustering.ipynb delete mode 100644 tour_model_eval/plot_kmeans_digits.ipynb diff --git a/tour_model_eval/confirmed_trips_eval_bins_clusters.py b/tour_model_eval/confirmed_trips_eval_bins_clusters.py index e57e4a7..1bcc370 100644 --- a/tour_model_eval/confirmed_trips_eval_bins_clusters.py +++ b/tour_model_eval/confirmed_trips_eval_bins_clusters.py @@ -22,58 +22,6 @@ map_pur_dict = {'course':'school','work_- lunch break':'lunch_break','on_the way home':'home', 'insurance_payment':'insurance'} -# precision_bins takes five parameters -# - all_bins_preci: the list that collects precision of each bin, should pass in an empty list -# - sp2en=None means no need to translate language -# sp2en='True' will use span_eng_dict to change Spanish to English -# -# - cvt_purpose=None means no need to convert purposes -# cvt_purpose='True' will use map_pur_dict to convert purposes -# using this parameter should also set sp2en='True' -def precision_bins (all_bins_preci,bins,non_empty_trips,sp2en=None,cvt_purpose=None): - for bin in bins: - bin_user_input = (non_empty_trips[i].data["user_input"] for i in bin if - non_empty_trips[i].data["user_input"] != {}) - bin_df = pd.DataFrame(data=bin_user_input) - if sp2en == 'True': - bin_df = bin_df.replace(span_eng_dict) - if cvt_purpose == 'True': - bin_df = bin_df.replace(map_pur_dict) - duplic_trips = bin_df[bin_df.duplicated(keep=False)] - - # for bin that doesn't have duplicate trips, assign 0 as precision - if duplic_trips.empty and len(bin_df) > 1: - all_bins_preci.append(0) - # for bin only has one trip, assign 1.0 as precision - elif len(bin_df) == 1: - all_bins_preci.append(1.0) - else: - duplic = duplic_trips.groupby(duplic_trips.columns.tolist()).apply(lambda x: tuple(x.index)).tolist() - max_duplic = max(duplic, key=lambda i: len(i)) - precision = round(len(max_duplic) / len(bin), 2) - all_bins_preci.append(precision) - return all_bins_preci - - -# precision_all_users takes four parameters -# - all_users: pass in all participants' data -# - sp2en: default None, no need to change language -# - cvt_purpose: default None, no need to convert purpose -def precision_bin_all_users(all_users,radius,sp2en=None,cvt_purpose=None): - all_users_preci = [] - for i in range(len(all_users)): - user = all_users[i] - trips = pipeline.read_data(uuid=user, key=esda.CONFIRMED_TRIP_KEY) - all_bins_preci = [] - non_empty_trips = [t for t in trips if t["data"]["user_input"] != {}] - if non_empty_trips != {}: - sim = similarity.similarity(non_empty_trips, radius) - if sim.data: - sim.bin_data() - all_bins_preci = precision_bins(all_bins_preci, sim.bins, non_empty_trips, sp2en, cvt_purpose) - all_users_preci.append(round(mean(all_bins_preci), 2)) - return all_users_preci - # v_measure_bins takes 5 parameters # - sp2en=True: change Spanish to English diff --git a/tour_model_eval/plot_document_clustering.ipynb b/tour_model_eval/plot_document_clustering.ipynb deleted file mode 100644 index 828ce5a..0000000 --- a/tour_model_eval/plot_document_clustering.ipynb +++ /dev/null @@ -1,285 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "# Clustering text documents using k-means\n", - "\n", - "This is an example showing how the scikit-learn can be used to cluster\n", - "documents by topics using a bag-of-words approach. This example uses\n", - "a scipy.sparse matrix to store the features instead of standard numpy arrays.\n", - "\n", - "Two feature extraction methods can be used in this example:\n", - "\n", - " - TfidfVectorizer uses a in-memory vocabulary (a python dict) to map the most\n", - " frequent words to features indices and hence compute a word occurrence\n", - " frequency (sparse) matrix. The word frequencies are then reweighted using\n", - " the Inverse Document Frequency (IDF) vector collected feature-wise over\n", - " the corpus.\n", - "\n", - " - HashingVectorizer hashes word occurrences to a fixed dimensional space,\n", - " possibly with collisions. The word count vectors are then normalized to\n", - " each have l2-norm equal to one (projected to the euclidean unit-ball) which\n", - " seems to be important for k-means to work in high dimensional space.\n", - "\n", - " HashingVectorizer does not provide IDF weighting as this is a stateless\n", - " model (the fit method does nothing). When IDF weighting is needed it can\n", - " be added by pipelining its output to a TfidfTransformer instance.\n", - "\n", - "Two algorithms are demoed: ordinary k-means and its more scalable cousin\n", - "minibatch k-means.\n", - "\n", - "Additionally, latent semantic analysis can also be used to reduce\n", - "dimensionality and discover latent patterns in the data.\n", - "\n", - "It can be noted that k-means (and minibatch k-means) are very sensitive to\n", - "feature scaling and that in this case the IDF weighting helps improve the\n", - "quality of the clustering by quite a lot as measured against the \"ground truth\"\n", - "provided by the class label assignments of the 20 newsgroups dataset.\n", - "\n", - "This improvement is not visible in the Silhouette Coefficient which is small\n", - "for both as this measure seem to suffer from the phenomenon called\n", - "\"Concentration of Measure\" or \"Curse of Dimensionality\" for high dimensional\n", - "datasets such as text data. Other measures such as V-measure and Adjusted Rand\n", - "Index are information theoretic based evaluation scores: as they are only based\n", - "on cluster assignments rather than distances, hence not affected by the curse\n", - "of dimensionality.\n", - "\n", - "Note: as k-means is optimizing a non-convex objective function, it will likely\n", - "end up in a local optimum. Several runs with independent random init might be\n", - "necessary to get a good convergence.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Author: Peter Prettenhofer \n", - "# Lars Buitinck\n", - "# License: BSD 3 clause\n", - "from sklearn.datasets import fetch_20newsgroups\n", - "from sklearn.decomposition import TruncatedSVD\n", - "from sklearn.feature_extraction.text import TfidfVectorizer\n", - "from sklearn.feature_extraction.text import HashingVectorizer\n", - "from sklearn.feature_extraction.text import TfidfTransformer\n", - "from sklearn.pipeline import make_pipeline\n", - "from sklearn.preprocessing import Normalizer\n", - "from sklearn import metrics\n", - "\n", - "from sklearn.cluster import KMeans, MiniBatchKMeans\n", - "\n", - "import logging\n", - "from optparse import OptionParser\n", - "import sys\n", - "from time import time\n", - "\n", - "import numpy as np\n", - "\n", - "\n", - "# Display progress logs on stdout\n", - "logging.basicConfig(level=logging.INFO,\n", - " format='%(asctime)s %(levelname)s %(message)s')\n", - "\n", - "# parse commandline arguments\n", - "op = OptionParser()\n", - "op.add_option(\"--lsa\",\n", - " dest=\"n_components\", type=\"int\",\n", - " help=\"Preprocess documents with latent semantic analysis.\")\n", - "op.add_option(\"--no-minibatch\",\n", - " action=\"store_false\", dest=\"minibatch\", default=True,\n", - " help=\"Use ordinary k-means algorithm (in batch mode).\")\n", - "op.add_option(\"--no-idf\",\n", - " action=\"store_false\", dest=\"use_idf\", default=True,\n", - " help=\"Disable Inverse Document Frequency feature weighting.\")\n", - "op.add_option(\"--use-hashing\",\n", - " action=\"store_true\", default=False,\n", - " help=\"Use a hashing feature vectorizer\")\n", - "op.add_option(\"--n-features\", type=int, default=10000,\n", - " help=\"Maximum number of features (dimensions)\"\n", - " \" to extract from text.\")\n", - "op.add_option(\"--verbose\",\n", - " action=\"store_true\", dest=\"verbose\", default=False,\n", - " help=\"Print progress reports inside k-means algorithm.\")\n", - "\n", - "print(__doc__)\n", - "op.print_help()\n", - "\n", - "\n", - "def is_interactive():\n", - " return not hasattr(sys.modules['__main__'], '__file__')\n", - "\n", - "\n", - "# work-around for Jupyter notebook and IPython console\n", - "argv = [] if is_interactive() else sys.argv[1:]\n", - "(opts, args) = op.parse_args(argv)\n", - "if len(args) > 0:\n", - " op.error(\"this script takes no arguments.\")\n", - " sys.exit(1)\n", - "\n", - "\n", - "# #############################################################################\n", - "# Load some categories from the training set\n", - "categories = [\n", - " 'alt.atheism',\n", - " 'talk.religion.misc',\n", - " 'comp.graphics',\n", - " 'sci.space',\n", - "]\n", - "# Uncomment the following to do the analysis on all the categories\n", - "# categories = None\n", - "\n", - "print(\"Loading 20 newsgroups dataset for categories:\")\n", - "print(categories)\n", - "\n", - "dataset = fetch_20newsgroups(subset='all', categories=categories,\n", - " shuffle=True, random_state=42)\n", - "\n", - "print(\"%d documents\" % len(dataset.data))\n", - "print(\"%d categories\" % len(dataset.target_names))\n", - "print()\n", - "\n", - "labels = dataset.target\n", - "true_k = np.unique(labels).shape[0]\n", - "\n", - "print(\"Extracting features from the training dataset \"\n", - " \"using a sparse vectorizer\")\n", - "t0 = time()\n", - "if opts.use_hashing:\n", - " if opts.use_idf:\n", - " # Perform an IDF normalization on the output of HashingVectorizer\n", - " hasher = HashingVectorizer(n_features=opts.n_features,\n", - " stop_words='english', alternate_sign=False,\n", - " norm=None)\n", - " vectorizer = make_pipeline(hasher, TfidfTransformer())\n", - " else:\n", - " vectorizer = HashingVectorizer(n_features=opts.n_features,\n", - " stop_words='english',\n", - " alternate_sign=False, norm='l2')\n", - "else:\n", - " vectorizer = TfidfVectorizer(max_df=0.5, max_features=opts.n_features,\n", - " min_df=2, stop_words='english',\n", - " use_idf=opts.use_idf)\n", - "X = vectorizer.fit_transform(dataset.data)\n", - "\n", - "print(\"done in %fs\" % (time() - t0))\n", - "print(\"n_samples: %d, n_features: %d\" % X.shape)\n", - "print()\n", - "\n", - "if opts.n_components:\n", - " print(\"Performing dimensionality reduction using LSA\")\n", - " t0 = time()\n", - " # Vectorizer results are normalized, which makes KMeans behave as\n", - " # spherical k-means for better results. Since LSA/SVD results are\n", - " # not normalized, we have to redo the normalization.\n", - " svd = TruncatedSVD(opts.n_components)\n", - " normalizer = Normalizer(copy=False)\n", - " lsa = make_pipeline(svd, normalizer)\n", - "\n", - " X = lsa.fit_transform(X)\n", - "\n", - " print(\"done in %fs\" % (time() - t0))\n", - "\n", - " explained_variance = svd.explained_variance_ratio_.sum()\n", - " print(\"Explained variance of the SVD step: {}%\".format(\n", - " int(explained_variance * 100)))\n", - "\n", - " print()\n", - "\n", - "\n", - "# #############################################################################\n", - "# Do the actual clustering\n", - "\n", - "if opts.minibatch:\n", - " km = MiniBatchKMeans(n_clusters=true_k, init='k-means++', n_init=1,\n", - " init_size=1000, batch_size=1000, verbose=opts.verbose)\n", - "else:\n", - " km = KMeans(n_clusters=true_k, init='k-means++', max_iter=100, n_init=1,\n", - " verbose=opts.verbose)\n", - "\n", - "print(\"Clustering sparse data with %s\" % km)\n", - "t0 = time()\n", - "km.fit(X)\n", - "print(\"done in %0.3fs\" % (time() - t0))\n", - "print()\n", - "\n", - "# Test what labels are\n", - "np.set_printoptions(threshold=np.inf)\n", - "print(\"----------Test---------------\")\n", - "print('labels is %s' % labels)\n", - "print('The type of labels is %s' % type(labels))\n", - "print('the shape of labels is n_samples %s' % labels.shape)\n", - "print('km.labels_ is %s' % km.labels_)\n", - "print('The type of km.labels_ is %s' % type(km.labels_))\n", - "print('the shape of km.labels_ is n_samples %s' % km.labels_.shape)\n", - "print('true_k is %s'% true_k)\n", - "print('np.unique(labels) is %s' % np.unique(labels))\n", - "print('np.unique(labels).shape is %s' % np.unique(labels).shape)\n", - "print(\"----------Test---------------\")\n", - "print()\n", - "\n", - "\n", - "\n", - "print(\"Homogeneity: %0.3f\" % metrics.homogeneity_score(labels, km.labels_))\n", - "print(\"Completeness: %0.3f\" % metrics.completeness_score(labels, km.labels_))\n", - "print(\"V-measure: %0.3f\" % metrics.v_measure_score(labels, km.labels_))\n", - "print(\"Adjusted Rand-Index: %.3f\"\n", - " % metrics.adjusted_rand_score(labels, km.labels_))\n", - "print(\"Silhouette Coefficient: %0.3f\"\n", - " % metrics.silhouette_score(X, km.labels_, sample_size=1000))\n", - "\n", - "print()\n", - "\n", - "\n", - "if not opts.use_hashing:\n", - " print(\"Top terms per cluster:\")\n", - "\n", - " if opts.n_components:\n", - " original_space_centroids = svd.inverse_transform(km.cluster_centers_)\n", - " order_centroids = original_space_centroids.argsort()[:, ::-1]\n", - " else:\n", - " order_centroids = km.cluster_centers_.argsort()[:, ::-1]\n", - "\n", - " terms = vectorizer.get_feature_names()\n", - " for i in range(true_k):\n", - " print(\"Cluster %d:\" % i, end='')\n", - " for ind in order_centroids[i, :10]:\n", - " print(' %s' % terms[ind], end='')\n", - " print()" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.9" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/tour_model_eval/plot_kmeans_digits.ipynb b/tour_model_eval/plot_kmeans_digits.ipynb deleted file mode 100644 index e88eb15..0000000 --- a/tour_model_eval/plot_kmeans_digits.ipynb +++ /dev/null @@ -1,286 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "# A demo of K-Means clustering on the handwritten digits data\n", - "\n", - "In this example we compare the various initialization strategies for K-means in\n", - "terms of runtime and quality of the results.\n", - "\n", - "As the ground truth is known here, we also apply different cluster quality\n", - "metrics to judge the goodness of fit of the cluster labels to the ground truth.\n", - "\n", - "Cluster quality metrics evaluated (see `clustering_evaluation` for\n", - "definitions and discussions of the metrics):\n", - "\n", - "=========== ========================================================\n", - "Shorthand full name\n", - "=========== ========================================================\n", - "homo homogeneity score\n", - "compl completeness score\n", - "v-meas V measure\n", - "ARI adjusted Rand index\n", - "AMI adjusted mutual information\n", - "silhouette silhouette coefficient\n", - "=========== ========================================================\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(__doc__)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Load the dataset\n", - "\n", - "We will start by loading the `digits` dataset. This dataset contains\n", - "handwritten digits from 0 to 9. In the context of clustering, one would like\n", - "to group images such that the handwritten digits on the image are the same.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np\n", - "from sklearn.datasets import load_digits\n", - "\n", - "data, labels = load_digits(return_X_y=True)\n", - "(n_samples, n_features), n_digits = data.shape, np.unique(labels).size\n", - "\n", - "print(\n", - " f\"# digits: {n_digits}; # samples: {n_samples}; # features {n_features}\"\n", - ")\n", - "\n", - "print('------Test------')\n", - "np.set_printoptions(threshold=np.inf)\n", - "print('data.shape is ',data.shape)\n", - "print(\"labels is %s\" % labels)\n", - "print('------Test------')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Define our evaluation benchmark\n", - "\n", - "We will first our evaluation benchmark. During this benchmark, we intend to\n", - "compare different initialization methods for KMeans. Our benchmark will:\n", - "\n", - "* create a pipeline which will scale the data using a\n", - " :class:`~sklearn.preprocessing.StandardScaler`;\n", - "* train and time the pipeline fitting;\n", - "* measure the performance of the clustering obtained via different metrics.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from time import time\n", - "from sklearn import metrics\n", - "from sklearn.pipeline import make_pipeline\n", - "from sklearn.preprocessing import StandardScaler\n", - "\n", - "\n", - "def bench_k_means(kmeans, name, data, labels):\n", - " \"\"\"Benchmark to evaluate the KMeans initialization methods.\n", - "\n", - " Parameters\n", - " ----------\n", - " kmeans : KMeans instance\n", - " A :class:`~sklearn.cluster.KMeans` instance with the initialization\n", - " already set.\n", - " name : str\n", - " Name given to the strategy. It will be used to show the results in a\n", - " table.\n", - " data : ndarray of shape (n_samples, n_features)\n", - " The data to cluster.\n", - " labels : ndarray of shape (n_samples,)\n", - " The labels used to compute the clustering metrics which requires some\n", - " supervision.\n", - " \"\"\"\n", - " t0 = time()\n", - " estimator = make_pipeline(StandardScaler(), kmeans).fit(data)\n", - " fit_time = time() - t0\n", - " results = [name, fit_time, estimator[-1].inertia_]\n", - "\n", - " # Define the metrics which require only the true labels and estimator\n", - " # labels\n", - " clustering_metrics = [\n", - " metrics.homogeneity_score,\n", - " metrics.completeness_score,\n", - " metrics.v_measure_score,\n", - " metrics.adjusted_rand_score,\n", - " metrics.adjusted_mutual_info_score,\n", - " ]\n", - " results += [m(labels, estimator[-1].labels_) for m in clustering_metrics]\n", - " \n", - " print('------Test------')\n", - " print('estimator[-1].labels_', estimator[-1].labels_)\n", - " print('------Test------')\n", - "\n", - " # The silhouette score requires the full dataset\n", - " results += [\n", - " metrics.silhouette_score(data, estimator[-1].labels_,\n", - " metric=\"euclidean\", sample_size=300,)\n", - " ]\n", - "\n", - " # Show the results\n", - " formatter_result = (\"{:9s}\\t{:.3f}s\\t{:.0f}\\t{:.3f}\\t{:.3f}\"\n", - " \"\\t{:.3f}\\t{:.3f}\\t{:.3f}\\t{:.3f}\")\n", - " print(formatter_result.format(*results))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Run the benchmark\n", - "\n", - "We will compare three approaches:\n", - "\n", - "* an initialization using `kmeans++`. This method is stochastic and we will\n", - " run the initialization 4 times;\n", - "* a random initialization. This method is stochastic as well and we will run\n", - " the initialization 4 times;\n", - "* an initialization based on a :class:`~sklearn.decomposition.PCA`\n", - " projection. Indeed, we will use the components of the\n", - " :class:`~sklearn.decomposition.PCA` to initialize KMeans. This method is\n", - " deterministic and a single initialization suffice.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from sklearn.cluster import KMeans\n", - "from sklearn.decomposition import PCA\n", - "\n", - "print(82 * '_')\n", - "print('init\\t\\ttime\\tinertia\\thomo\\tcompl\\tv-meas\\tARI\\tAMI\\tsilhouette')\n", - "\n", - "kmeans = KMeans(init=\"k-means++\", n_clusters=n_digits, n_init=4,\n", - " random_state=0)\n", - "bench_k_means(kmeans=kmeans, name=\"k-means++\", data=data, labels=labels)\n", - "\n", - "kmeans = KMeans(init=\"random\", n_clusters=n_digits, n_init=4, random_state=0)\n", - "bench_k_means(kmeans=kmeans, name=\"random\", data=data, labels=labels)\n", - "\n", - "pca = PCA(n_components=n_digits).fit(data)\n", - "kmeans = KMeans(init=pca.components_, n_clusters=n_digits, n_init=1)\n", - "bench_k_means(kmeans=kmeans, name=\"PCA-based\", data=data, labels=labels)\n", - "\n", - "print(82 * '_')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Visualize the results on PCA-reduced data\n", - "\n", - ":class:`~sklearn.decomposition.PCA` allows to project the data from the\n", - "original 64-dimensional space into a lower dimensional space. Subsequently,\n", - "we can use :class:`~sklearn.decomposition.PCA` to project into a\n", - "2-dimensional space and plot the data and the clusters in this new space.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import matplotlib.pyplot as plt\n", - "\n", - "reduced_data = PCA(n_components=2).fit_transform(data)\n", - "kmeans = KMeans(init=\"k-means++\", n_clusters=n_digits, n_init=4)\n", - "kmeans.fit(reduced_data)\n", - "\n", - "# Step size of the mesh. Decrease to increase the quality of the VQ.\n", - "h = .02 # point in the mesh [x_min, x_max]x[y_min, y_max].\n", - "\n", - "# Plot the decision boundary. For that, we will assign a color to each\n", - "x_min, x_max = reduced_data[:, 0].min() - 1, reduced_data[:, 0].max() + 1\n", - "y_min, y_max = reduced_data[:, 1].min() - 1, reduced_data[:, 1].max() + 1\n", - "xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))\n", - "\n", - "# Obtain labels for each point in mesh. Use last trained model.\n", - "Z = kmeans.predict(np.c_[xx.ravel(), yy.ravel()])\n", - "\n", - "# Put the result into a color plot\n", - "Z = Z.reshape(xx.shape)\n", - "plt.figure(1)\n", - "plt.clf()\n", - "plt.imshow(Z, interpolation=\"nearest\",\n", - " extent=(xx.min(), xx.max(), yy.min(), yy.max()),\n", - " cmap=plt.cm.Paired, aspect=\"auto\", origin=\"lower\")\n", - "\n", - "plt.plot(reduced_data[:, 0], reduced_data[:, 1], 'k.', markersize=2)\n", - "# Plot the centroids as a white X\n", - "centroids = kmeans.cluster_centers_\n", - "plt.scatter(centroids[:, 0], centroids[:, 1], marker=\"x\", s=169, linewidths=3,\n", - " color=\"w\", zorder=10)\n", - "plt.title(\"K-means clustering on the digits dataset (PCA-reduced data)\\n\"\n", - " \"Centroids are marked with white cross\")\n", - "plt.xlim(x_min, x_max)\n", - "plt.ylim(y_min, y_max)\n", - "plt.xticks(())\n", - "plt.yticks(())\n", - "plt.show()" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.9" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/tour_model_eval/v-measurel_cutoff_bins_single_user.ipynb b/tour_model_eval/v-measurel_cutoff_bins_single_user.ipynb index 6a55dd8..fb50a58 100644 --- a/tour_model_eval/v-measurel_cutoff_bins_single_user.ipynb +++ b/tour_model_eval/v-measurel_cutoff_bins_single_user.ipynb @@ -3,7 +3,7 @@ { "cell_type": "code", "execution_count": null, - "id": "severe-married", + "id": "outer-institute", "metadata": {}, "outputs": [], "source": [ @@ -26,7 +26,7 @@ { "cell_type": "code", "execution_count": null, - "id": "knowing-price", + "id": "precious-chassis", "metadata": {}, "outputs": [], "source": [ @@ -37,7 +37,7 @@ { "cell_type": "code", "execution_count": null, - "id": "graphic-determination", + "id": "demonstrated-presentation", "metadata": {}, "outputs": [], "source": [ @@ -48,7 +48,7 @@ { "cell_type": "code", "execution_count": null, - "id": "breathing-description", + "id": "according-salem", "metadata": {}, "outputs": [], "source": [ @@ -66,17 +66,17 @@ { "cell_type": "code", "execution_count": null, - "id": "gorgeous-retailer", + "id": "dynamic-wallace", "metadata": {}, "outputs": [], "source": [ - "user = all_users[0]" + "user = all_users[6]" ] }, { "cell_type": "code", "execution_count": null, - "id": "homeless-father", + "id": "proved-vintage", "metadata": {}, "outputs": [], "source": [ @@ -87,7 +87,7 @@ { "cell_type": "code", "execution_count": null, - "id": "arranged-cleaning", + "id": "postal-lecture", "metadata": {}, "outputs": [], "source": [ @@ -98,27 +98,45 @@ { "cell_type": "code", "execution_count": null, - "id": "super-spencer", + "id": "governmental-chamber", "metadata": {}, "outputs": [], "source": [ - "len(non_empty_trips), non_empty_trips" + "len(non_empty_trips),non_empty_trips" ] }, { "cell_type": "code", "execution_count": null, - "id": "higher-advocate", + "id": "complicated-movie", "metadata": {}, "outputs": [], "source": [ - "bin_trips, bins = pipeline.remove_noise(non_empty_trips, radius)" + "# filter out trips that are not fully labeled(contain NaN in user_input)\n", + "valid_trips = [t for t in non_empty_trips if 'mode_confirm' in t[\"data\"][\"user_input\"] and \n", + " 'purpose_confirm'in t[\"data\"][\"user_input\"] and 'replaced_mode' in t[\"data\"][\"user_input\"]]\n", + "len(valid_trips),valid_trips" ] }, { "cell_type": "code", "execution_count": null, - "id": "beautiful-parcel", + "id": "waiting-courage", + "metadata": {}, + "outputs": [], + "source": [ + "sim = similarity.similarity(valid_trips, radius)\n", + "filter_trips = sim.data\n", + "sim.bin_data()\n", + "sim.delete_bins()\n", + "bin_trips = sim.newdata\n", + "bins = sim.bins" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "organized-multiple", "metadata": {}, "outputs": [], "source": [ @@ -128,7 +146,7 @@ { "cell_type": "code", "execution_count": null, - "id": "comic-norfolk", + "id": "packed-redhead", "metadata": { "scrolled": true }, @@ -136,14 +154,14 @@ "source": [ "# show all user labels in all bins\n", "for bin in bins:\n", - " bin_user_input = (non_empty_trips[i].data[\"user_input\"] for i in bin)\n", + " bin_user_input = (filter_trips[i].data[\"user_input\"] for i in bin)\n", " bin_df = pd.DataFrame(data = bin_user_input)\n", " print(bin_df)" ] }, { "cell_type": "markdown", - "id": "expensive-forestry", + "id": "egyptian-sessions", "metadata": {}, "source": [ "### Original output" @@ -152,7 +170,7 @@ { "cell_type": "code", "execution_count": null, - "id": "corporate-situation", + "id": "proved-slave", "metadata": {}, "outputs": [], "source": [ @@ -163,8 +181,10 @@ { "cell_type": "code", "execution_count": null, - "id": "historic-russian", - "metadata": {}, + "id": "small-tattoo", + "metadata": { + "scrolled": false + }, "outputs": [], "source": [ "# turn all user_input into list without binning\n", @@ -175,7 +195,7 @@ { "cell_type": "code", "execution_count": null, - "id": "jewish-bristol", + "id": "greek-management", "metadata": { "scrolled": true }, @@ -183,13 +203,13 @@ "source": [ "# drop duplicate user_input\n", "no_dup_df=bin_trips_df.drop_duplicates()\n", - "no_dup_df" + "no_dup_df,len(no_dup_df)" ] }, { "cell_type": "code", "execution_count": null, - "id": "wooden-postage", + "id": "discrete-secretary", "metadata": { "scrolled": true }, @@ -203,7 +223,7 @@ { "cell_type": "code", "execution_count": null, - "id": "wicked-serial", + "id": "economic-madison", "metadata": {}, "outputs": [], "source": [ @@ -218,7 +238,7 @@ { "cell_type": "code", "execution_count": null, - "id": "surgical-stadium", + "id": "plain-lotus", "metadata": {}, "outputs": [], "source": [ @@ -232,7 +252,7 @@ }, { "cell_type": "markdown", - "id": "first-campbell", + "id": "saved-coral", "metadata": {}, "source": [ "Note: the trips order in labels_true and labels_pred should be the same. Using timestamp to compare the trips in bin_trips and those in bins" @@ -241,18 +261,20 @@ { "cell_type": "code", "execution_count": null, - "id": "dental-universal", + "id": "prescribed-former", "metadata": {}, "outputs": [], "source": [ - "bin_trips_ts = pd.DataFrame(data=[i[\"data\"][\"start_ts\"]for i in bin_trips])\n", - "len(bin_trips_ts)" + "bin_trips_ts = pd.DataFrame(data=[trip[\"data\"][\"start_ts\"]for trip in bin_trips])\n", + "bin_input = pd.DataFrame(data=[trip[\"data\"][\"user_input\"]for trip in bin_trips])\n", + "len(bin_trips_ts)\n", + "bin_input" ] }, { "cell_type": "code", "execution_count": null, - "id": "dynamic-prize", + "id": "supposed-style", "metadata": {}, "outputs": [], "source": [ @@ -260,14 +282,16 @@ "for bin in bins:\n", " for index in bin:\n", " bin_ls.append(index)\n", - "bins_ts = pd.DataFrame(data=[non_empty_trips[i][\"data\"][\"start_ts\"]for i in bin_ls])\n", - "len(bins_ts)" + "bins_ts = pd.DataFrame(data=[filter_trips[i][\"data\"][\"start_ts\"]for i in bin_ls])\n", + "bins_input = pd.DataFrame(data=[filter_trips[num][\"data\"][\"user_input\"]for num in bin_ls])\n", + "len(bins_ts)\n", + "bins_input" ] }, { "cell_type": "code", "execution_count": null, - "id": "republican-rabbit", + "id": "functioning-triangle", "metadata": {}, "outputs": [], "source": [ @@ -278,7 +302,7 @@ { "cell_type": "code", "execution_count": null, - "id": "concerned-congo", + "id": "distinguished-chapter", "metadata": {}, "outputs": [], "source": [ @@ -288,7 +312,7 @@ { "cell_type": "code", "execution_count": null, - "id": "alleged-alabama", + "id": "public-anime", "metadata": {}, "outputs": [], "source": [ @@ -298,7 +322,7 @@ { "cell_type": "code", "execution_count": null, - "id": "material-genetics", + "id": "single-watson", "metadata": { "scrolled": true }, @@ -309,7 +333,7 @@ }, { "cell_type": "markdown", - "id": "aware-friday", + "id": "chief-finish", "metadata": {}, "source": [ "### After changing language" @@ -318,7 +342,7 @@ { "cell_type": "code", "execution_count": null, - "id": "native-sight", + "id": "noticed-operations", "metadata": {}, "outputs": [], "source": [ @@ -331,13 +355,13 @@ { "cell_type": "code", "execution_count": null, - "id": "threaded-focus", + "id": "worse-print", "metadata": {}, "outputs": [], "source": [ "# use dict to replace the values in Spanish in the bin(this step just for showing the trips in each bin)\n", "for bin in bins:\n", - " bin_user_input = (non_empty_trips[i].data[\"user_input\"] for i in bin)\n", + " bin_user_input = (filter_trips[i].data[\"user_input\"] for i in bin)\n", " bin_df = pd.DataFrame(data = bin_user_input)\n", " sp2en_bin_df = bin_df.replace(span_eng_dict)\n", " print(sp2en_bin_df)" @@ -346,33 +370,34 @@ { "cell_type": "code", "execution_count": null, - "id": "imported-reasoning", + "id": "tutorial-graphic", "metadata": {}, "outputs": [], "source": [ "# turn all user_input into list without binning\n", - "bin_trips_user_input_sp2en_ls = pd.DataFrame(data=[i[\"data\"][\"user_input\"] for i in bin_trips]).replace(span_eng_dict).values.tolist()\n", - "bin_trips_user_input_sp2en_ls" + "bin_trips_sp2en_df = bin_trips_df.replace(span_eng_dict)\n", + "bin_trips_sp2en_ls = bin_trips_sp2en_df.values.tolist()\n", + "bin_trips_sp2en_ls" ] }, { "cell_type": "code", "execution_count": null, - "id": "athletic-reasoning", + "id": "verbal-makeup", "metadata": { - "scrolled": true + "scrolled": false }, "outputs": [], "source": [ "# drop duplicate user_input\n", - "no_dup_sp2en_df=pd.DataFrame(data=[i[\"data\"][\"user_input\"] for i in bin_trips]).replace(span_eng_dict).drop_duplicates()\n", + "no_dup_sp2en_df=bin_trips_sp2en_df.drop_duplicates()\n", "no_dup_sp2en_df" ] }, { "cell_type": "code", "execution_count": null, - "id": "false-fields", + "id": "forced-relaxation", "metadata": {}, "outputs": [], "source": [ @@ -384,13 +409,13 @@ { "cell_type": "code", "execution_count": null, - "id": "formal-belgium", + "id": "invisible-assist", "metadata": {}, "outputs": [], "source": [ "# collect labels_true based on user_input\n", "labels_true_sp2en =[]\n", - "for trip in bin_trips_user_input_sp2en_ls:\n", + "for trip in bin_trips_sp2en_ls:\n", " if trip in no_dup_sp2en_list:\n", " labels_true_sp2en.append(no_dup_sp2en_list.index(trip))\n", "labels_true_sp2en" @@ -399,7 +424,7 @@ { "cell_type": "code", "execution_count": null, - "id": "indirect-lafayette", + "id": "operating-myrtle", "metadata": {}, "outputs": [], "source": [ @@ -414,7 +439,7 @@ { "cell_type": "code", "execution_count": null, - "id": "cooked-mineral", + "id": "dietary-clone", "metadata": {}, "outputs": [], "source": [ @@ -424,7 +449,7 @@ { "cell_type": "code", "execution_count": null, - "id": "caring-calcium", + "id": "breathing-garbage", "metadata": {}, "outputs": [], "source": [ @@ -434,7 +459,7 @@ { "cell_type": "code", "execution_count": null, - "id": "sunset-frequency", + "id": "fabulous-thanksgiving", "metadata": {}, "outputs": [], "source": [ @@ -443,7 +468,7 @@ }, { "cell_type": "markdown", - "id": "included-alberta", + "id": "comparable-student", "metadata": {}, "source": [ "### After converting purposes and mode" @@ -452,7 +477,7 @@ { "cell_type": "code", "execution_count": null, - "id": "outer-hammer", + "id": "average-contrary", "metadata": {}, "outputs": [], "source": [ @@ -463,7 +488,7 @@ { "cell_type": "code", "execution_count": null, - "id": "developing-socket", + "id": "collect-eating", "metadata": {}, "outputs": [], "source": [ @@ -473,13 +498,12 @@ { "cell_type": "code", "execution_count": null, - "id": "partial-prerequisite", + "id": "valued-requirement", "metadata": {}, "outputs": [], "source": [ "# convert purpose\n", - "bin_trips_user_input_sp2en = pd.DataFrame(data=[bin_trips[i][\"data\"][\"user_input\"] for i in range(len(bin_trips))]).replace(span_eng_dict)\n", - "bin_trips_cvt_pur_df = bin_trips_user_input_sp2en.replace(map_pur_dict)\n", + "bin_trips_cvt_pur_df = bin_trips_sp2en_df.replace(map_pur_dict)\n", "# convert mode\n", "bin_trips_cvt_pur_mo_df = bin_trips_cvt_pur_df\n", "for i in range(len(bin_trips_cvt_pur_mo_df)):\n", @@ -494,7 +518,7 @@ { "cell_type": "code", "execution_count": null, - "id": "classical-berkeley", + "id": "intimate-microphone", "metadata": { "scrolled": true }, @@ -508,7 +532,7 @@ { "cell_type": "code", "execution_count": null, - "id": "opening-equity", + "id": "naked-turkish", "metadata": {}, "outputs": [], "source": [ @@ -520,7 +544,7 @@ { "cell_type": "code", "execution_count": null, - "id": "occasional-evanescence", + "id": "governing-treat", "metadata": {}, "outputs": [], "source": [ @@ -535,7 +559,7 @@ { "cell_type": "code", "execution_count": null, - "id": "fancy-barbados", + "id": "outstanding-credit", "metadata": {}, "outputs": [], "source": [ @@ -550,7 +574,7 @@ { "cell_type": "code", "execution_count": null, - "id": "placed-carry", + "id": "bearing-generator", "metadata": {}, "outputs": [], "source": [ @@ -560,7 +584,7 @@ { "cell_type": "code", "execution_count": null, - "id": "worse-shift", + "id": "periodic-barrier", "metadata": {}, "outputs": [], "source": [ @@ -570,7 +594,7 @@ { "cell_type": "code", "execution_count": null, - "id": "immediate-series", + "id": "sixth-nowhere", "metadata": {}, "outputs": [], "source": [ From ed7ac2c9e047018a567824d2e899a84319289861 Mon Sep 17 00:00:00 2001 From: Chunrui Huang Date: Tue, 23 Feb 2021 17:25:04 -0800 Subject: [PATCH 07/16] clean up evaluation code --- .../confirmed_trips_eval_bins_clusters.py | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/tour_model_eval/confirmed_trips_eval_bins_clusters.py b/tour_model_eval/confirmed_trips_eval_bins_clusters.py index 1bcc370..4f9652d 100644 --- a/tour_model_eval/confirmed_trips_eval_bins_clusters.py +++ b/tour_model_eval/confirmed_trips_eval_bins_clusters.py @@ -23,6 +23,16 @@ 'insurance_payment':'insurance'} +def filter_data(user,radius): + trips = pipeline.read_data(uuid=user, key=esda.CONFIRMED_TRIP_KEY) + non_empty_trips = [t for t in trips if t["data"]["user_input"] != {}] + valid_trips = [t for t in non_empty_trips if 'mode_confirm' in t["data"]["user_input"] and + 'purpose_confirm' in t["data"]["user_input"] and 'replaced_mode' in t["data"]["user_input"]] + sim = similarity.similarity(valid_trips, radius) + filter_trips = sim.data + return filter_trips,sim + + # v_measure_bins takes 5 parameters # - sp2en=True: change Spanish to English # - cvt_pur_mo=True: convert purposes and replaced mode @@ -35,12 +45,7 @@ def v_measure_bins(all_users,radius,sp2en=None,cvt_pur_mo=None,cutoff=None): v_score = [] for i in range(len(all_users)): user = all_users[i] - trips = pipeline.read_data(uuid=user, key=esda.CONFIRMED_TRIP_KEY) - non_empty_trips = [t for t in trips if t["data"]["user_input"] != {}] - valid_trips = [t for t in non_empty_trips if 'mode_confirm' in t["data"]["user_input"] and - 'purpose_confirm' in t["data"]["user_input"] and 'replaced_mode' in t["data"]["user_input"]] - sim = similarity.similarity(valid_trips, radius) - filter_trips = sim.data + filter_trips,sim = filter_data(user,radius) # filter out users that haven't enough trips (at least 10) to analyze if len(filter_trips) < 10: @@ -129,12 +134,8 @@ def v_measure_clusters(all_users,radius,sp2en=None,cvt_pur_mo=None): v_score = [] for i in range(len(all_users)): user = all_users[i] - trips = pipeline.read_data(uuid=user, key=esda.CONFIRMED_TRIP_KEY) - non_empty_trips = [t for t in trips if t["data"]["user_input"] != {}] - valid_trips = [t for t in non_empty_trips if 'mode_confirm' in t["data"]["user_input"] and - 'purpose_confirm' in t["data"]["user_input"] and 'replaced_mode' in t["data"]["user_input"]] - sim = similarity.similarity(valid_trips, radius) - filter_trips = sim.data + filter_trips,sim = filter_data(user,radius) + # filter out users that haven't enough trips (at least 10) to analyze if len(filter_trips) < 10: homo_score.append(NaN) From 5aa469f2df7545c113b39add1ab82731146fd56a Mon Sep 17 00:00:00 2001 From: Chunrui Huang Date: Tue, 23 Feb 2021 23:19:21 -0800 Subject: [PATCH 08/16] change radius, add query times notebook --- tour_model_eval/query_times_all_users.ipynb | 265 ++++++++++++++++++ .../v-measurel_all_bins_single_user.ipynb | 100 +++---- .../v-measurel_bins_all_user.ipynb | 58 ++-- ...urel_clusters_above_cutoff_all_users.ipynb | 34 +-- .../v-measurel_cutoff_bins_single_user.ipynb | 98 +++---- ...measurel_cutoff_clusters_single_user.ipynb | 28 +- 6 files changed, 420 insertions(+), 163 deletions(-) create mode 100644 tour_model_eval/query_times_all_users.ipynb diff --git a/tour_model_eval/query_times_all_users.ipynb b/tour_model_eval/query_times_all_users.ipynb new file mode 100644 index 0000000..8877cfe --- /dev/null +++ b/tour_model_eval/query_times_all_users.ipynb @@ -0,0 +1,265 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "expanded-implement", + "metadata": {}, + "outputs": [], + "source": [ + "import logging\n", + "\n", + "# Our imports\n", + "import emission.core.get_database as edb\n", + "import emission.analysis.modelling.tour_model.cluster_pipeline as pipeline\n", + "import emission.analysis.modelling.tour_model.similarity as similarity\n", + "import emission.analysis.modelling.tour_model.featurization as featurization\n", + "import emission.analysis.modelling.tour_model.representatives as representatives\n", + "import emission.storage.decorations.analysis_timeseries_queries as esda\n", + "import pandas as pd\n", + "from numpy import *\n", + "import confirmed_trips_eval_bins_clusters as evaluation\n", + "from sklearn import metrics\n", + "from pandas.testing import assert_frame_equal" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "functional-birthday", + "metadata": {}, + "outputs": [], + "source": [ + "# logger = logging.getLogger()\n", + "# logger.setLevel(logging.DEBUG)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "turned-watch", + "metadata": {}, + "outputs": [], + "source": [ + "participant_uuid_obj = list(edb.get_profile_db().find({\"install_group\": \"participant\"}, {\"user_id\": 1, \"_id\": 0}))\n", + "all_users = [u[\"user_id\"] for u in participant_uuid_obj]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "encouraging-killer", + "metadata": {}, + "outputs": [], + "source": [ + "radius = 100" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "tender-volleyball", + "metadata": {}, + "outputs": [], + "source": [ + "query_day = []" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "perfect-promotion", + "metadata": {}, + "outputs": [], + "source": [ + "query_month = []" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ordered-juvenile", + "metadata": {}, + "outputs": [], + "source": [ + "def match_day(trip,bin):\n", + " if bin:\n", + " t = filter_trips[bin[0]]\n", + " if trip['data']['start_local_dt']['year']==t['data']['start_local_dt']['year']and trip['data']['start_local_dt']['month']==t['data']['start_local_dt']['month']and trip['data']['start_local_dt']['day']==t['data']['start_local_dt']['day']:\n", + " return True\n", + " return False" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "raising-brisbane", + "metadata": {}, + "outputs": [], + "source": [ + "def match_month(trip,bin):\n", + " if bin:\n", + " t = filter_trips[bin[0]]\n", + " if trip['data']['start_local_dt']['year']==t['data']['start_local_dt']['year']and trip['data']['start_local_dt']['month']==t['data']['start_local_dt']['month']:\n", + " return True\n", + " return False" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "comic-apache", + "metadata": {}, + "outputs": [], + "source": [ + "for i in range(len(all_users)):\n", + " user = all_users[i]\n", + " filter_trips,sim = evaluation.filter_data(user,radius)\n", + " logging.debug(\"len(filter_trips)is %s \"% len(filter_trips))\n", + "\n", + " # filter out users that don't have valid labeled trips\n", + " if len(filter_trips) == 0:\n", + " query_day.append(NaN)\n", + " query_month.append(NaN)\n", + " continue\n", + " \n", + " sim.bin_data()\n", + " sim.delete_bins()\n", + " # bins below cutoff\n", + " bl_bins = sim.below_cutoff\n", + " \n", + " # a list of trip indices from bl_bins\n", + " bl_trip_ls = []\n", + " for bin in bl_bins:\n", + " for index in bin:\n", + " bl_trip_ls.append(index)\n", + "\n", + " # collect all the trips that below cutoff\n", + " bl_trips = [filter_trips[num]for num in bl_trip_ls]\n", + " \n", + " \n", + " # collect query times in a day\n", + " bin_day = []\n", + " for trip_index in bl_trip_ls:\n", + " added = False\n", + " trip = filter_trips[trip_index]\n", + " for bin in bin_day:\n", + " if match_day(trip,bin):\n", + " bin.append(trip_index)\n", + " added = True\n", + " if not added:\n", + " bin_day.append([trip_index])\n", + " query_day_ls = []\n", + " for bin in bin_day:\n", + " query_day_ls.append(len(bin))\n", + "\n", + " # average query times for a day\n", + " query_day.append(math.ceil(mean(query_day_ls)))\n", + " \n", + " \n", + " # collect query times in a month\n", + " bin_month = []\n", + " for trip_index in bl_trip_ls:\n", + " added = False\n", + " trip = filter_trips[trip_index]\n", + " for bin in bin_month:\n", + " if match_month(trip,bin):\n", + " bin.append(trip_index)\n", + " added = True\n", + " if not added:\n", + " bin_month.append([trip_index])\n", + " query_month_ls = []\n", + " for bin in bin_month:\n", + " query_month_ls.append(len(bin))\n", + "\n", + " # average query times for a month\n", + " query_month.append(math.ceil(mean(query_month_ls)))\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "alternative-dialogue", + "metadata": {}, + "outputs": [], + "source": [ + "query_day" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "tracked-pattern", + "metadata": {}, + "outputs": [], + "source": [ + "query_month" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "instant-somerset", + "metadata": {}, + "outputs": [], + "source": [ + "mean_day = math.ceil(mean([x for x in query_day if str(x) != 'nan']))\n", + "mean_day" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "documented-municipality", + "metadata": {}, + "outputs": [], + "source": [ + "mean_month = math.ceil(mean([x for x in query_month if str(x) != 'nan']))\n", + "mean_month" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "burning-elephant", + "metadata": {}, + "outputs": [], + "source": [ + "df = pd.DataFrame(data = {'query times in a day':query_day,'query times in a month':query_month})\n", + "df.loc['mean'] = [mean_day,mean_month]\n", + "df" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "incoming-gibson", + "metadata": {}, + "outputs": [], + "source": [ + "df.plot(kind = 'bar')" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/tour_model_eval/v-measurel_all_bins_single_user.ipynb b/tour_model_eval/v-measurel_all_bins_single_user.ipynb index 4eb2013..cf2aa3a 100644 --- a/tour_model_eval/v-measurel_all_bins_single_user.ipynb +++ b/tour_model_eval/v-measurel_all_bins_single_user.ipynb @@ -3,7 +3,7 @@ { "cell_type": "code", "execution_count": null, - "id": "modified-diary", + "id": "republican-pleasure", "metadata": {}, "outputs": [], "source": [ @@ -26,7 +26,7 @@ { "cell_type": "code", "execution_count": null, - "id": "together-twenty", + "id": "decent-passion", "metadata": {}, "outputs": [], "source": [ @@ -37,7 +37,7 @@ { "cell_type": "code", "execution_count": null, - "id": "sorted-lloyd", + "id": "preliminary-example", "metadata": {}, "outputs": [], "source": [ @@ -48,11 +48,11 @@ { "cell_type": "code", "execution_count": null, - "id": "missing-psychology", + "id": "executive-heather", "metadata": {}, "outputs": [], "source": [ - "radius = 300" + "radius = 100" ] }, { @@ -66,7 +66,7 @@ { "cell_type": "code", "execution_count": null, - "id": "august-valley", + "id": "genuine-shipping", "metadata": {}, "outputs": [], "source": [ @@ -76,7 +76,7 @@ { "cell_type": "code", "execution_count": null, - "id": "diverse-running", + "id": "sorted-juvenile", "metadata": {}, "outputs": [], "source": [ @@ -87,7 +87,7 @@ { "cell_type": "code", "execution_count": null, - "id": "crude-postage", + "id": "primary-friendly", "metadata": {}, "outputs": [], "source": [ @@ -99,7 +99,7 @@ { "cell_type": "code", "execution_count": null, - "id": "copyrighted-delta", + "id": "medical-spider", "metadata": {}, "outputs": [], "source": [ @@ -112,7 +112,7 @@ { "cell_type": "code", "execution_count": null, - "id": "competent-australia", + "id": "latest-reconstruction", "metadata": {}, "outputs": [], "source": [ @@ -123,7 +123,7 @@ { "cell_type": "code", "execution_count": null, - "id": "standing-serial", + "id": "stone-omega", "metadata": {}, "outputs": [], "source": [ @@ -133,7 +133,7 @@ { "cell_type": "code", "execution_count": null, - "id": "annoying-antique", + "id": "individual-insert", "metadata": {}, "outputs": [], "source": [ @@ -152,7 +152,7 @@ { "cell_type": "code", "execution_count": null, - "id": "latest-contemporary", + "id": "continued-borough", "metadata": {}, "outputs": [], "source": [ @@ -162,7 +162,7 @@ { "cell_type": "code", "execution_count": null, - "id": "thrown-hello", + "id": "outside-fairy", "metadata": {}, "outputs": [], "source": [ @@ -175,7 +175,7 @@ }, { "cell_type": "markdown", - "id": "strange-inventory", + "id": "extraordinary-penalty", "metadata": {}, "source": [ "### Original output" @@ -184,7 +184,7 @@ { "cell_type": "code", "execution_count": null, - "id": "streaming-taiwan", + "id": "advised-wiring", "metadata": {}, "outputs": [], "source": [ @@ -195,7 +195,7 @@ { "cell_type": "code", "execution_count": null, - "id": "destroyed-filter", + "id": "careful-sally", "metadata": {}, "outputs": [], "source": [ @@ -207,7 +207,7 @@ { "cell_type": "code", "execution_count": null, - "id": "mature-italy", + "id": "elect-hardwood", "metadata": {}, "outputs": [], "source": [ @@ -219,7 +219,7 @@ { "cell_type": "code", "execution_count": null, - "id": "illegal-collect", + "id": "dynamic-grace", "metadata": {}, "outputs": [], "source": [ @@ -231,7 +231,7 @@ { "cell_type": "code", "execution_count": null, - "id": "sapphire-hughes", + "id": "romance-chrome", "metadata": {}, "outputs": [], "source": [ @@ -241,7 +241,7 @@ { "cell_type": "code", "execution_count": null, - "id": "fuzzy-marathon", + "id": "further-moscow", "metadata": {}, "outputs": [], "source": [ @@ -256,7 +256,7 @@ { "cell_type": "code", "execution_count": null, - "id": "considerable-restoration", + "id": "welsh-trustee", "metadata": {}, "outputs": [], "source": [ @@ -271,7 +271,7 @@ { "cell_type": "code", "execution_count": null, - "id": "domestic-august", + "id": "minimal-fever", "metadata": {}, "outputs": [], "source": [ @@ -284,7 +284,7 @@ { "cell_type": "code", "execution_count": null, - "id": "married-catholic", + "id": "corporate-missile", "metadata": {}, "outputs": [], "source": [ @@ -297,7 +297,7 @@ { "cell_type": "code", "execution_count": null, - "id": "requested-organic", + "id": "radio-meter", "metadata": {}, "outputs": [], "source": [ @@ -308,7 +308,7 @@ { "cell_type": "code", "execution_count": null, - "id": "economic-nitrogen", + "id": "fancy-mount", "metadata": {}, "outputs": [], "source": [ @@ -318,7 +318,7 @@ { "cell_type": "code", "execution_count": null, - "id": "postal-trademark", + "id": "brown-traveler", "metadata": {}, "outputs": [], "source": [ @@ -328,7 +328,7 @@ { "cell_type": "code", "execution_count": null, - "id": "southern-evidence", + "id": "chemical-rider", "metadata": {}, "outputs": [], "source": [ @@ -337,7 +337,7 @@ }, { "cell_type": "markdown", - "id": "domestic-regression", + "id": "excessive-spell", "metadata": {}, "source": [ "### After changing language" @@ -346,7 +346,7 @@ { "cell_type": "code", "execution_count": null, - "id": "amazing-jersey", + "id": "christian-legislature", "metadata": {}, "outputs": [], "source": [ @@ -359,7 +359,7 @@ { "cell_type": "code", "execution_count": null, - "id": "impressive-philadelphia", + "id": "ready-delay", "metadata": {}, "outputs": [], "source": [ @@ -374,7 +374,7 @@ { "cell_type": "code", "execution_count": null, - "id": "hybrid-eugene", + "id": "blind-router", "metadata": {}, "outputs": [], "source": [ @@ -387,7 +387,7 @@ { "cell_type": "code", "execution_count": null, - "id": "viral-intermediate", + "id": "suited-institution", "metadata": { "scrolled": true }, @@ -401,7 +401,7 @@ { "cell_type": "code", "execution_count": null, - "id": "conceptual-branch", + "id": "incomplete-confusion", "metadata": {}, "outputs": [], "source": [ @@ -413,7 +413,7 @@ { "cell_type": "code", "execution_count": null, - "id": "wanted-management", + "id": "ahead-hawaiian", "metadata": {}, "outputs": [], "source": [ @@ -428,7 +428,7 @@ { "cell_type": "code", "execution_count": null, - "id": "otherwise-vault", + "id": "collectible-australia", "metadata": {}, "outputs": [], "source": [ @@ -443,7 +443,7 @@ { "cell_type": "code", "execution_count": null, - "id": "adolescent-style", + "id": "changed-pollution", "metadata": {}, "outputs": [], "source": [ @@ -453,7 +453,7 @@ { "cell_type": "code", "execution_count": null, - "id": "signal-backing", + "id": "judicial-printer", "metadata": {}, "outputs": [], "source": [ @@ -463,7 +463,7 @@ { "cell_type": "code", "execution_count": null, - "id": "upper-contribution", + "id": "female-confidentiality", "metadata": {}, "outputs": [], "source": [ @@ -472,7 +472,7 @@ }, { "cell_type": "markdown", - "id": "bearing-communications", + "id": "foster-reading", "metadata": {}, "source": [ "### After converting purposes and mode" @@ -481,7 +481,7 @@ { "cell_type": "code", "execution_count": null, - "id": "completed-testing", + "id": "opposite-aurora", "metadata": {}, "outputs": [], "source": [ @@ -492,7 +492,7 @@ { "cell_type": "code", "execution_count": null, - "id": "quality-board", + "id": "western-commissioner", "metadata": {}, "outputs": [], "source": [ @@ -502,7 +502,7 @@ { "cell_type": "code", "execution_count": null, - "id": "falling-arbor", + "id": "vocal-saudi", "metadata": {}, "outputs": [], "source": [ @@ -522,7 +522,7 @@ { "cell_type": "code", "execution_count": null, - "id": "electrical-liechtenstein", + "id": "recreational-label", "metadata": { "scrolled": true }, @@ -536,7 +536,7 @@ { "cell_type": "code", "execution_count": null, - "id": "cleared-valley", + "id": "adequate-notice", "metadata": {}, "outputs": [], "source": [ @@ -548,7 +548,7 @@ { "cell_type": "code", "execution_count": null, - "id": "printable-fusion", + "id": "stuck-survivor", "metadata": {}, "outputs": [], "source": [ @@ -563,7 +563,7 @@ { "cell_type": "code", "execution_count": null, - "id": "hundred-zealand", + "id": "floppy-flight", "metadata": {}, "outputs": [], "source": [ @@ -578,7 +578,7 @@ { "cell_type": "code", "execution_count": null, - "id": "false-lithuania", + "id": "broken-demand", "metadata": {}, "outputs": [], "source": [ @@ -588,7 +588,7 @@ { "cell_type": "code", "execution_count": null, - "id": "documentary-power", + "id": "nasty-potato", "metadata": {}, "outputs": [], "source": [ @@ -598,7 +598,7 @@ { "cell_type": "code", "execution_count": null, - "id": "elect-animation", + "id": "regular-glance", "metadata": {}, "outputs": [], "source": [ diff --git a/tour_model_eval/v-measurel_bins_all_user.ipynb b/tour_model_eval/v-measurel_bins_all_user.ipynb index 12a2d49..a4af2bd 100644 --- a/tour_model_eval/v-measurel_bins_all_user.ipynb +++ b/tour_model_eval/v-measurel_bins_all_user.ipynb @@ -3,7 +3,7 @@ { "cell_type": "code", "execution_count": null, - "id": "computational-national", + "id": "hungry-polish", "metadata": { "scrolled": true }, @@ -28,7 +28,7 @@ { "cell_type": "code", "execution_count": null, - "id": "preceding-yugoslavia", + "id": "coupled-transportation", "metadata": {}, "outputs": [], "source": [ @@ -39,17 +39,17 @@ { "cell_type": "code", "execution_count": null, - "id": "perceived-impossible", + "id": "interstate-queue", "metadata": {}, "outputs": [], "source": [ - "radius = 300" + "radius = 100" ] }, { "cell_type": "code", "execution_count": null, - "id": "smooth-variety", + "id": "norwegian-victoria", "metadata": {}, "outputs": [], "source": [ @@ -59,7 +59,7 @@ }, { "cell_type": "markdown", - "id": "medical-biodiversity", + "id": "loved-estonia", "metadata": {}, "source": [ "## Bins above cutoff" @@ -67,7 +67,7 @@ }, { "cell_type": "markdown", - "id": "corporate-heather", + "id": "laughing-macintosh", "metadata": {}, "source": [ "### Original user input" @@ -76,7 +76,7 @@ { "cell_type": "code", "execution_count": null, - "id": "chief-fundamentals", + "id": "amber-photograph", "metadata": {}, "outputs": [], "source": [ @@ -86,7 +86,7 @@ { "cell_type": "code", "execution_count": null, - "id": "educated-philippines", + "id": "collected-throat", "metadata": {}, "outputs": [], "source": [ @@ -95,7 +95,7 @@ }, { "cell_type": "markdown", - "id": "welcome-homeless", + "id": "headed-dating", "metadata": {}, "source": [ "### After changing language" @@ -104,7 +104,7 @@ { "cell_type": "code", "execution_count": null, - "id": "preceding-money", + "id": "blank-arnold", "metadata": { "scrolled": true }, @@ -116,7 +116,7 @@ { "cell_type": "code", "execution_count": null, - "id": "laden-plate", + "id": "maritime-twins", "metadata": {}, "outputs": [], "source": [ @@ -125,7 +125,7 @@ }, { "cell_type": "markdown", - "id": "sticky-denver", + "id": "consistent-kuwait", "metadata": {}, "source": [ "### After converting purposes and replaced mode" @@ -134,7 +134,7 @@ { "cell_type": "code", "execution_count": null, - "id": "agreed-moment", + "id": "confused-sensitivity", "metadata": {}, "outputs": [], "source": [ @@ -144,7 +144,7 @@ { "cell_type": "code", "execution_count": null, - "id": "handmade-dairy", + "id": "advance-passing", "metadata": {}, "outputs": [], "source": [ @@ -153,7 +153,7 @@ }, { "cell_type": "markdown", - "id": "funky-potato", + "id": "bronze-operations", "metadata": {}, "source": [ "### DataFrame" @@ -162,7 +162,7 @@ { "cell_type": "code", "execution_count": null, - "id": "technological-reservation", + "id": "pacific-reflection", "metadata": {}, "outputs": [], "source": [ @@ -176,7 +176,7 @@ }, { "cell_type": "markdown", - "id": "strange-badge", + "id": "documented-vacation", "metadata": {}, "source": [ "## All bins" @@ -184,7 +184,7 @@ }, { "cell_type": "markdown", - "id": "rural-virtue", + "id": "selected-compiler", "metadata": {}, "source": [ "### Original user input" @@ -193,7 +193,7 @@ { "cell_type": "code", "execution_count": null, - "id": "listed-entrance", + "id": "tight-contract", "metadata": {}, "outputs": [], "source": [ @@ -203,7 +203,7 @@ { "cell_type": "code", "execution_count": null, - "id": "known-calculation", + "id": "regular-shadow", "metadata": {}, "outputs": [], "source": [ @@ -212,7 +212,7 @@ }, { "cell_type": "markdown", - "id": "broadband-expression", + "id": "brutal-trinidad", "metadata": {}, "source": [ "### After changing language" @@ -221,7 +221,7 @@ { "cell_type": "code", "execution_count": null, - "id": "alone-authorization", + "id": "decent-machinery", "metadata": {}, "outputs": [], "source": [ @@ -231,7 +231,7 @@ { "cell_type": "code", "execution_count": null, - "id": "viral-rebel", + "id": "lasting-synthetic", "metadata": {}, "outputs": [], "source": [ @@ -240,7 +240,7 @@ }, { "cell_type": "markdown", - "id": "infectious-armstrong", + "id": "sexual-opportunity", "metadata": {}, "source": [ "### After converting purposes and replaced mode" @@ -249,7 +249,7 @@ { "cell_type": "code", "execution_count": null, - "id": "supreme-plain", + "id": "periodic-freedom", "metadata": {}, "outputs": [], "source": [ @@ -259,7 +259,7 @@ { "cell_type": "code", "execution_count": null, - "id": "corresponding-blind", + "id": "stylish-thailand", "metadata": {}, "outputs": [], "source": [ @@ -268,7 +268,7 @@ }, { "cell_type": "markdown", - "id": "aquatic-password", + "id": "floppy-theory", "metadata": {}, "source": [ "### DataFrame" @@ -277,7 +277,7 @@ { "cell_type": "code", "execution_count": null, - "id": "instant-broadcast", + "id": "british-working", "metadata": {}, "outputs": [], "source": [ diff --git a/tour_model_eval/v-measurel_clusters_above_cutoff_all_users.ipynb b/tour_model_eval/v-measurel_clusters_above_cutoff_all_users.ipynb index f653b5a..67a0f56 100644 --- a/tour_model_eval/v-measurel_clusters_above_cutoff_all_users.ipynb +++ b/tour_model_eval/v-measurel_clusters_above_cutoff_all_users.ipynb @@ -3,7 +3,7 @@ { "cell_type": "code", "execution_count": null, - "id": "important-humanity", + "id": "adverse-recipient", "metadata": {}, "outputs": [], "source": [ @@ -26,7 +26,7 @@ { "cell_type": "code", "execution_count": null, - "id": "physical-improvement", + "id": "pleased-fence", "metadata": {}, "outputs": [], "source": [ @@ -37,17 +37,17 @@ { "cell_type": "code", "execution_count": null, - "id": "figured-buddy", + "id": "global-leave", "metadata": {}, "outputs": [], "source": [ - "radius = 300" + "radius = 100" ] }, { "cell_type": "code", "execution_count": null, - "id": "equal-release", + "id": "hundred-surge", "metadata": {}, "outputs": [], "source": [ @@ -57,7 +57,7 @@ }, { "cell_type": "markdown", - "id": "standard-savannah", + "id": "funky-darkness", "metadata": {}, "source": [ "## Evaluate clusters above cutoff based on silhouette_score" @@ -65,7 +65,7 @@ }, { "cell_type": "markdown", - "id": "formed-guitar", + "id": "critical-prime", "metadata": {}, "source": [ "### Original user input" @@ -74,7 +74,7 @@ { "cell_type": "code", "execution_count": null, - "id": "official-victor", + "id": "copyrighted-vehicle", "metadata": {}, "outputs": [], "source": [ @@ -84,7 +84,7 @@ { "cell_type": "code", "execution_count": null, - "id": "loved-isolation", + "id": "stainless-exposure", "metadata": {}, "outputs": [], "source": [ @@ -93,7 +93,7 @@ }, { "cell_type": "markdown", - "id": "demanding-rendering", + "id": "returning-skiing", "metadata": {}, "source": [ "### After changing language" @@ -102,7 +102,7 @@ { "cell_type": "code", "execution_count": null, - "id": "satisfied-enough", + "id": "authorized-complement", "metadata": {}, "outputs": [], "source": [ @@ -112,7 +112,7 @@ { "cell_type": "code", "execution_count": null, - "id": "hundred-pasta", + "id": "hispanic-drunk", "metadata": {}, "outputs": [], "source": [ @@ -121,7 +121,7 @@ }, { "cell_type": "markdown", - "id": "hungarian-wallpaper", + "id": "united-grade", "metadata": {}, "source": [ "### After converting purposes and replaced mode" @@ -130,7 +130,7 @@ { "cell_type": "code", "execution_count": null, - "id": "particular-scope", + "id": "outer-usage", "metadata": {}, "outputs": [], "source": [ @@ -140,7 +140,7 @@ { "cell_type": "code", "execution_count": null, - "id": "neither-shooting", + "id": "positive-grass", "metadata": {}, "outputs": [], "source": [ @@ -149,7 +149,7 @@ }, { "cell_type": "markdown", - "id": "continuing-absorption", + "id": "assured-oriental", "metadata": {}, "source": [ "### DataFrame" @@ -158,7 +158,7 @@ { "cell_type": "code", "execution_count": null, - "id": "retained-citizenship", + "id": "authentic-compression", "metadata": {}, "outputs": [], "source": [ diff --git a/tour_model_eval/v-measurel_cutoff_bins_single_user.ipynb b/tour_model_eval/v-measurel_cutoff_bins_single_user.ipynb index fb50a58..271ef9f 100644 --- a/tour_model_eval/v-measurel_cutoff_bins_single_user.ipynb +++ b/tour_model_eval/v-measurel_cutoff_bins_single_user.ipynb @@ -3,7 +3,7 @@ { "cell_type": "code", "execution_count": null, - "id": "outer-institute", + "id": "primary-friendship", "metadata": {}, "outputs": [], "source": [ @@ -26,7 +26,7 @@ { "cell_type": "code", "execution_count": null, - "id": "precious-chassis", + "id": "composed-sewing", "metadata": {}, "outputs": [], "source": [ @@ -37,7 +37,7 @@ { "cell_type": "code", "execution_count": null, - "id": "demonstrated-presentation", + "id": "diagnostic-stand", "metadata": {}, "outputs": [], "source": [ @@ -48,11 +48,11 @@ { "cell_type": "code", "execution_count": null, - "id": "according-salem", + "id": "unexpected-mineral", "metadata": {}, "outputs": [], "source": [ - "radius = 300" + "radius = 100" ] }, { @@ -66,7 +66,7 @@ { "cell_type": "code", "execution_count": null, - "id": "dynamic-wallace", + "id": "stock-facing", "metadata": {}, "outputs": [], "source": [ @@ -76,7 +76,7 @@ { "cell_type": "code", "execution_count": null, - "id": "proved-vintage", + "id": "genetic-liberty", "metadata": {}, "outputs": [], "source": [ @@ -87,7 +87,7 @@ { "cell_type": "code", "execution_count": null, - "id": "postal-lecture", + "id": "patient-spirit", "metadata": {}, "outputs": [], "source": [ @@ -98,7 +98,7 @@ { "cell_type": "code", "execution_count": null, - "id": "governmental-chamber", + "id": "obvious-imaging", "metadata": {}, "outputs": [], "source": [ @@ -108,7 +108,7 @@ { "cell_type": "code", "execution_count": null, - "id": "complicated-movie", + "id": "sufficient-baseball", "metadata": {}, "outputs": [], "source": [ @@ -121,7 +121,7 @@ { "cell_type": "code", "execution_count": null, - "id": "waiting-courage", + "id": "inclusive-theory", "metadata": {}, "outputs": [], "source": [ @@ -136,7 +136,7 @@ { "cell_type": "code", "execution_count": null, - "id": "organized-multiple", + "id": "sticky-indianapolis", "metadata": {}, "outputs": [], "source": [ @@ -146,7 +146,7 @@ { "cell_type": "code", "execution_count": null, - "id": "packed-redhead", + "id": "recreational-diesel", "metadata": { "scrolled": true }, @@ -161,7 +161,7 @@ }, { "cell_type": "markdown", - "id": "egyptian-sessions", + "id": "complete-feeling", "metadata": {}, "source": [ "### Original output" @@ -170,7 +170,7 @@ { "cell_type": "code", "execution_count": null, - "id": "proved-slave", + "id": "innocent-circumstances", "metadata": {}, "outputs": [], "source": [ @@ -181,7 +181,7 @@ { "cell_type": "code", "execution_count": null, - "id": "small-tattoo", + "id": "lightweight-connectivity", "metadata": { "scrolled": false }, @@ -195,7 +195,7 @@ { "cell_type": "code", "execution_count": null, - "id": "greek-management", + "id": "ceramic-sense", "metadata": { "scrolled": true }, @@ -209,7 +209,7 @@ { "cell_type": "code", "execution_count": null, - "id": "discrete-secretary", + "id": "intensive-rings", "metadata": { "scrolled": true }, @@ -223,7 +223,7 @@ { "cell_type": "code", "execution_count": null, - "id": "economic-madison", + "id": "little-cuisine", "metadata": {}, "outputs": [], "source": [ @@ -238,7 +238,7 @@ { "cell_type": "code", "execution_count": null, - "id": "plain-lotus", + "id": "absent-emerald", "metadata": {}, "outputs": [], "source": [ @@ -252,7 +252,7 @@ }, { "cell_type": "markdown", - "id": "saved-coral", + "id": "agricultural-welcome", "metadata": {}, "source": [ "Note: the trips order in labels_true and labels_pred should be the same. Using timestamp to compare the trips in bin_trips and those in bins" @@ -261,7 +261,7 @@ { "cell_type": "code", "execution_count": null, - "id": "prescribed-former", + "id": "appropriate-convert", "metadata": {}, "outputs": [], "source": [ @@ -274,7 +274,7 @@ { "cell_type": "code", "execution_count": null, - "id": "supposed-style", + "id": "billion-yield", "metadata": {}, "outputs": [], "source": [ @@ -291,7 +291,7 @@ { "cell_type": "code", "execution_count": null, - "id": "functioning-triangle", + "id": "subjective-victim", "metadata": {}, "outputs": [], "source": [ @@ -302,7 +302,7 @@ { "cell_type": "code", "execution_count": null, - "id": "distinguished-chapter", + "id": "numeric-worth", "metadata": {}, "outputs": [], "source": [ @@ -312,7 +312,7 @@ { "cell_type": "code", "execution_count": null, - "id": "public-anime", + "id": "tired-citation", "metadata": {}, "outputs": [], "source": [ @@ -322,7 +322,7 @@ { "cell_type": "code", "execution_count": null, - "id": "single-watson", + "id": "romance-investment", "metadata": { "scrolled": true }, @@ -333,7 +333,7 @@ }, { "cell_type": "markdown", - "id": "chief-finish", + "id": "increasing-baghdad", "metadata": {}, "source": [ "### After changing language" @@ -342,7 +342,7 @@ { "cell_type": "code", "execution_count": null, - "id": "noticed-operations", + "id": "hidden-source", "metadata": {}, "outputs": [], "source": [ @@ -355,7 +355,7 @@ { "cell_type": "code", "execution_count": null, - "id": "worse-print", + "id": "reduced-hebrew", "metadata": {}, "outputs": [], "source": [ @@ -370,7 +370,7 @@ { "cell_type": "code", "execution_count": null, - "id": "tutorial-graphic", + "id": "minor-reason", "metadata": {}, "outputs": [], "source": [ @@ -383,7 +383,7 @@ { "cell_type": "code", "execution_count": null, - "id": "verbal-makeup", + "id": "acknowledged-spanish", "metadata": { "scrolled": false }, @@ -397,7 +397,7 @@ { "cell_type": "code", "execution_count": null, - "id": "forced-relaxation", + "id": "competent-audience", "metadata": {}, "outputs": [], "source": [ @@ -409,7 +409,7 @@ { "cell_type": "code", "execution_count": null, - "id": "invisible-assist", + "id": "egyptian-request", "metadata": {}, "outputs": [], "source": [ @@ -424,7 +424,7 @@ { "cell_type": "code", "execution_count": null, - "id": "operating-myrtle", + "id": "communist-tomorrow", "metadata": {}, "outputs": [], "source": [ @@ -439,7 +439,7 @@ { "cell_type": "code", "execution_count": null, - "id": "dietary-clone", + "id": "beneficial-freeze", "metadata": {}, "outputs": [], "source": [ @@ -449,7 +449,7 @@ { "cell_type": "code", "execution_count": null, - "id": "breathing-garbage", + "id": "corrected-processing", "metadata": {}, "outputs": [], "source": [ @@ -459,7 +459,7 @@ { "cell_type": "code", "execution_count": null, - "id": "fabulous-thanksgiving", + "id": "overall-terrace", "metadata": {}, "outputs": [], "source": [ @@ -468,7 +468,7 @@ }, { "cell_type": "markdown", - "id": "comparable-student", + "id": "collectible-heater", "metadata": {}, "source": [ "### After converting purposes and mode" @@ -477,7 +477,7 @@ { "cell_type": "code", "execution_count": null, - "id": "average-contrary", + "id": "pacific-newport", "metadata": {}, "outputs": [], "source": [ @@ -488,7 +488,7 @@ { "cell_type": "code", "execution_count": null, - "id": "collect-eating", + "id": "unique-russia", "metadata": {}, "outputs": [], "source": [ @@ -498,7 +498,7 @@ { "cell_type": "code", "execution_count": null, - "id": "valued-requirement", + "id": "alone-external", "metadata": {}, "outputs": [], "source": [ @@ -518,7 +518,7 @@ { "cell_type": "code", "execution_count": null, - "id": "intimate-microphone", + "id": "parallel-position", "metadata": { "scrolled": true }, @@ -532,7 +532,7 @@ { "cell_type": "code", "execution_count": null, - "id": "naked-turkish", + "id": "weighted-arbitration", "metadata": {}, "outputs": [], "source": [ @@ -544,7 +544,7 @@ { "cell_type": "code", "execution_count": null, - "id": "governing-treat", + "id": "severe-stable", "metadata": {}, "outputs": [], "source": [ @@ -559,7 +559,7 @@ { "cell_type": "code", "execution_count": null, - "id": "outstanding-credit", + "id": "natural-commitment", "metadata": {}, "outputs": [], "source": [ @@ -574,7 +574,7 @@ { "cell_type": "code", "execution_count": null, - "id": "bearing-generator", + "id": "million-authentication", "metadata": {}, "outputs": [], "source": [ @@ -584,7 +584,7 @@ { "cell_type": "code", "execution_count": null, - "id": "periodic-barrier", + "id": "downtown-nelson", "metadata": {}, "outputs": [], "source": [ @@ -594,7 +594,7 @@ { "cell_type": "code", "execution_count": null, - "id": "sixth-nowhere", + "id": "understanding-equity", "metadata": {}, "outputs": [], "source": [ diff --git a/tour_model_eval/v-measurel_cutoff_clusters_single_user.ipynb b/tour_model_eval/v-measurel_cutoff_clusters_single_user.ipynb index e6fe2e0..c1c1ea9 100644 --- a/tour_model_eval/v-measurel_cutoff_clusters_single_user.ipynb +++ b/tour_model_eval/v-measurel_cutoff_clusters_single_user.ipynb @@ -52,7 +52,7 @@ "metadata": {}, "outputs": [], "source": [ - "radius = 300" + "radius = 100" ] }, { @@ -99,7 +99,7 @@ { "cell_type": "code", "execution_count": null, - "id": "fabulous-definition", + "id": "excited-closure", "metadata": {}, "outputs": [], "source": [ @@ -132,7 +132,7 @@ { "cell_type": "code", "execution_count": null, - "id": "valid-morocco", + "id": "pleased-generic", "metadata": {}, "outputs": [], "source": [ @@ -146,7 +146,7 @@ { "cell_type": "code", "execution_count": null, - "id": "bridal-breakfast", + "id": "north-instruction", "metadata": {}, "outputs": [], "source": [ @@ -156,7 +156,7 @@ { "cell_type": "code", "execution_count": null, - "id": "following-heating", + "id": "boring-nerve", "metadata": {}, "outputs": [], "source": [ @@ -166,7 +166,7 @@ { "cell_type": "code", "execution_count": null, - "id": "beginning-crowd", + "id": "neither-toilet", "metadata": { "scrolled": true }, @@ -179,7 +179,7 @@ { "cell_type": "code", "execution_count": null, - "id": "incorporated-strengthening", + "id": "artificial-serum", "metadata": { "scrolled": true }, @@ -265,7 +265,7 @@ { "cell_type": "code", "execution_count": null, - "id": "fallen-tulsa", + "id": "least-bristol", "metadata": {}, "outputs": [], "source": [ @@ -282,7 +282,7 @@ { "cell_type": "code", "execution_count": null, - "id": "dangerous-discussion", + "id": "remarkable-alliance", "metadata": {}, "outputs": [], "source": [ @@ -293,7 +293,7 @@ { "cell_type": "code", "execution_count": null, - "id": "progressive-profit", + "id": "sticky-teaching", "metadata": {}, "outputs": [], "source": [ @@ -577,14 +577,6 @@ "source": [ "metrics.v_measure_score(labels_true_cvt, labels_pred)" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "common-manhattan", - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { From 84d640463826a99f78d085323c8dfe071590e7a2 Mon Sep 17 00:00:00 2001 From: Chunrui Huang Date: Fri, 26 Feb 2021 10:08:09 -0800 Subject: [PATCH 09/16] plot all data for all valid users --- tour_model_eval/query_times_all_users.ipynb | 914 ++++++++++++++++-- .../v-measurel_bins_all_user.ipynb | 242 ++++- ...urel_clusters_above_cutoff_all_users.ipynb | 127 ++- 3 files changed, 1170 insertions(+), 113 deletions(-) diff --git a/tour_model_eval/query_times_all_users.ipynb b/tour_model_eval/query_times_all_users.ipynb index 8877cfe..20164ba 100644 --- a/tour_model_eval/query_times_all_users.ipynb +++ b/tour_model_eval/query_times_all_users.ipynb @@ -2,10 +2,21 @@ "cells": [ { "cell_type": "code", - "execution_count": null, - "id": "expanded-implement", - "metadata": {}, - "outputs": [], + "execution_count": 1, + "id": "pending-avatar", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "storage not configured, falling back to sample, default configuration\n", + "Connecting to database URL localhost\n" + ] + } + ], "source": [ "import logging\n", "\n", @@ -20,24 +31,15 @@ "from numpy import *\n", "import confirmed_trips_eval_bins_clusters as evaluation\n", "from sklearn import metrics\n", - "from pandas.testing import assert_frame_equal" + "from pandas.testing import assert_frame_equal\n", + "import matplotlib.pyplot as plt\n", + "from matplotlib.ticker import MaxNLocator" ] }, { "cell_type": "code", - "execution_count": null, - "id": "functional-birthday", - "metadata": {}, - "outputs": [], - "source": [ - "# logger = logging.getLogger()\n", - "# logger.setLevel(logging.DEBUG)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "turned-watch", + "execution_count": 2, + "id": "handmade-burning", "metadata": {}, "outputs": [], "source": [ @@ -47,8 +49,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "encouraging-killer", + "execution_count": 3, + "id": "outstanding-representation", "metadata": {}, "outputs": [], "source": [ @@ -57,8 +59,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "tender-volleyball", + "execution_count": 4, + "id": "needed-backing", "metadata": {}, "outputs": [], "source": [ @@ -67,8 +69,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "perfect-promotion", + "execution_count": 5, + "id": "pacific-ranking", "metadata": {}, "outputs": [], "source": [ @@ -77,8 +79,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "ordered-juvenile", + "execution_count": 6, + "id": "minute-anniversary", "metadata": {}, "outputs": [], "source": [ @@ -92,8 +94,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "raising-brisbane", + "execution_count": 7, + "id": "chief-renewal", "metadata": {}, "outputs": [], "source": [ @@ -107,8 +109,23 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "comic-apache", + "execution_count": 8, + "id": "iraqi-festival", + "metadata": {}, + "outputs": [], + "source": [ + "def plot_day(query_day_ls): \n", + " query_day_ls_df = pd.DataFrame(data = query_day_ls)\n", + " query_day_df=query_day_ls_df.value_counts(sort = False).rename_axis('query times').to_frame('frequecy').reset_index()\n", + " query_day_df.set_index(['query times'], inplace=True)\n", + " query_day=query_day_df.plot(kind = 'bar',title='query times in a day')\n", + " query_day.yaxis.set_major_locator(MaxNLocator(integer=True))" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "stopped-tractor", "metadata": {}, "outputs": [], "source": [ @@ -125,22 +142,43 @@ " \n", " sim.bin_data()\n", " sim.delete_bins()\n", + " bins = sim.bins\n", + " \n", + " # collect query trips indices above cutoff\n", + " ab_trip_ls = []\n", + " for bin in bins:\n", + " early_trip = filter_trips[bin[0]]\n", + " trip_index = 0\n", + " for i in range(1,len(bin)):\n", + " compare_trip = filter_trips[bin[i]]\n", + " if early_trip['data']['start_local_dt']['year']>compare_trip['data']['start_local_dt']['year']:\n", + " early_trip = compare_trip\n", + " trip_index = i\n", + " elif early_trip['data']['start_local_dt']['year']==compare_trip['data']['start_local_dt']['year'] and early_trip['data']['start_local_dt']['month']>compare_trip['data']['start_local_dt']['month']:\n", + " early_trip = compare_trip\n", + " trip_index = i\n", + " elif early_trip['data']['start_local_dt']['year']==compare_trip['data']['start_local_dt']['year'] and early_trip['data']['start_local_dt']['month']==compare_trip['data']['start_local_dt']['month'] and early_trip['data']['start_local_dt']['day']>compare_trip['data']['start_local_dt']['day']:\n", + " early_trip = compare_trip\n", + " trip_index = i\n", + " ab_trip_ls.append(bin[trip_index])\n", + "\n", + "\n", + " \n", " # bins below cutoff\n", " bl_bins = sim.below_cutoff\n", " \n", - " # a list of trip indices from bl_bins\n", + " # collect query trips indices below cutoff\n", " bl_trip_ls = []\n", " for bin in bl_bins:\n", " for index in bin:\n", " bl_trip_ls.append(index)\n", - "\n", - " # collect all the trips that below cutoff\n", - " bl_trips = [filter_trips[num]for num in bl_trip_ls]\n", - " \n", + " \n", + " # whole list of query trips indices\n", + " query_trips_ls=ab_trip_ls+bl_trip_ls \n", " \n", " # collect query times in a day\n", " bin_day = []\n", - " for trip_index in bl_trip_ls:\n", + " for trip_index in query_trips_ls:\n", " added = False\n", " trip = filter_trips[trip_index]\n", " for bin in bin_day:\n", @@ -153,13 +191,13 @@ " for bin in bin_day:\n", " query_day_ls.append(len(bin))\n", "\n", - " # average query times for a day\n", - " query_day.append(math.ceil(mean(query_day_ls)))\n", + " # collect query times in a day for every user\n", + " query_day.append(query_day_ls)\n", " \n", " \n", " # collect query times in a month\n", " bin_month = []\n", - " for trip_index in bl_trip_ls:\n", + " for trip_index in query_trips_ls:\n", " added = False\n", " trip = filter_trips[trip_index]\n", " for bin in bin_month:\n", @@ -172,72 +210,810 @@ " for bin in bin_month:\n", " query_month_ls.append(len(bin))\n", "\n", - " # average query times for a month\n", - " query_month.append(math.ceil(mean(query_month_ls)))\n" + " # collect query times in a month for every user\n", + " query_month.append(query_month_ls)\n" ] }, { "cell_type": "code", - "execution_count": null, - "id": "alternative-dialogue", + "execution_count": 10, + "id": "victorian-rating", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "[[5,\n", + " 6,\n", + " 6,\n", + " 9,\n", + " 8,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 4,\n", + " 1,\n", + " 1,\n", + " 2,\n", + " 2,\n", + " 1,\n", + " 3,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 1,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 3,\n", + " 2,\n", + " 1,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 3,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 1,\n", + " 1,\n", + " 5,\n", + " 4,\n", + " 3,\n", + " 2,\n", + " 4,\n", + " 2,\n", + " 4,\n", + " 2,\n", + " 3,\n", + " 1],\n", + " nan,\n", + " [2,\n", + " 4,\n", + " 3,\n", + " 4,\n", + " 2,\n", + " 4,\n", + " 7,\n", + " 2,\n", + " 5,\n", + " 6,\n", + " 3,\n", + " 3,\n", + " 9,\n", + " 1,\n", + " 2,\n", + " 7,\n", + " 2,\n", + " 5,\n", + " 2,\n", + " 6,\n", + " 1,\n", + " 1,\n", + " 2,\n", + " 1,\n", + " 1,\n", + " 6,\n", + " 2,\n", + " 3,\n", + " 6,\n", + " 2,\n", + " 1,\n", + " 2,\n", + " 5,\n", + " 1,\n", + " 3,\n", + " 3,\n", + " 9,\n", + " 4,\n", + " 6,\n", + " 4,\n", + " 5,\n", + " 2,\n", + " 3,\n", + " 4,\n", + " 1,\n", + " 1,\n", + " 3,\n", + " 1,\n", + " 1],\n", + " [3,\n", + " 2,\n", + " 1,\n", + " 1,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 1,\n", + " 4,\n", + " 2,\n", + " 4,\n", + " 2,\n", + " 2,\n", + " 4,\n", + " 1,\n", + " 1,\n", + " 2,\n", + " 2,\n", + " 4,\n", + " 2,\n", + " 2,\n", + " 3,\n", + " 2,\n", + " 1,\n", + " 2,\n", + " 4,\n", + " 4,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 2,\n", + " 1,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 1,\n", + " 1,\n", + " 2,\n", + " 1,\n", + " 1,\n", + " 2,\n", + " 3,\n", + " 2],\n", + " [2, 1, 2, 2],\n", + " [2,\n", + " 3,\n", + " 3,\n", + " 1,\n", + " 3,\n", + " 3,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 3,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 3,\n", + " 2,\n", + " 1,\n", + " 3,\n", + " 1,\n", + " 5,\n", + " 2,\n", + " 1,\n", + " 2,\n", + " 2,\n", + " 3,\n", + " 2,\n", + " 1,\n", + " 5,\n", + " 3,\n", + " 4,\n", + " 1,\n", + " 2,\n", + " 2,\n", + " 5,\n", + " 2,\n", + " 4,\n", + " 2,\n", + " 2,\n", + " 3,\n", + " 1,\n", + " 3,\n", + " 2,\n", + " 1,\n", + " 1,\n", + " 1],\n", + " [2, 3, 3, 1, 2, 2, 4, 2, 2, 4, 2, 2, 2, 1, 2, 1, 1, 2, 2, 3, 1, 3, 2, 1],\n", + " [3,\n", + " 8,\n", + " 8,\n", + " 9,\n", + " 1,\n", + " 7,\n", + " 2,\n", + " 8,\n", + " 12,\n", + " 8,\n", + " 11,\n", + " 4,\n", + " 6,\n", + " 9,\n", + " 4,\n", + " 6,\n", + " 4,\n", + " 5,\n", + " 4,\n", + " 5,\n", + " 5,\n", + " 8,\n", + " 11,\n", + " 4,\n", + " 9,\n", + " 9,\n", + " 6,\n", + " 3,\n", + " 1,\n", + " 3,\n", + " 1,\n", + " 12,\n", + " 4,\n", + " 2,\n", + " 9,\n", + " 6,\n", + " 3,\n", + " 15,\n", + " 1,\n", + " 2,\n", + " 4,\n", + " 6,\n", + " 3,\n", + " 6,\n", + " 1,\n", + " 2,\n", + " 1,\n", + " 3,\n", + " 4,\n", + " 2,\n", + " 4,\n", + " 5,\n", + " 2,\n", + " 1,\n", + " 1],\n", + " [2,\n", + " 1,\n", + " 5,\n", + " 2,\n", + " 2,\n", + " 4,\n", + " 2,\n", + " 5,\n", + " 3,\n", + " 5,\n", + " 8,\n", + " 6,\n", + " 5,\n", + " 7,\n", + " 1,\n", + " 2,\n", + " 4,\n", + " 2,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 4,\n", + " 3,\n", + " 4,\n", + " 4,\n", + " 8,\n", + " 5,\n", + " 8,\n", + " 3,\n", + " 2,\n", + " 4,\n", + " 2,\n", + " 4,\n", + " 3,\n", + " 3,\n", + " 6,\n", + " 4,\n", + " 8,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 4,\n", + " 16,\n", + " 5,\n", + " 5,\n", + " 4,\n", + " 5],\n", + " [10,\n", + " 4,\n", + " 3,\n", + " 14,\n", + " 3,\n", + " 1,\n", + " 8,\n", + " 5,\n", + " 2,\n", + " 5,\n", + " 5,\n", + " 4,\n", + " 3,\n", + " 4,\n", + " 4,\n", + " 4,\n", + " 1,\n", + " 4,\n", + " 8,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 3,\n", + " 5,\n", + " 2,\n", + " 7,\n", + " 6,\n", + " 2,\n", + " 4,\n", + " 4,\n", + " 4,\n", + " 1,\n", + " 2,\n", + " 1],\n", + " [3, 2, 3, 1, 2, 1, 6],\n", + " nan,\n", + " [10,\n", + " 5,\n", + " 8,\n", + " 6,\n", + " 3,\n", + " 5,\n", + " 4,\n", + " 9,\n", + " 7,\n", + " 6,\n", + " 7,\n", + " 2,\n", + " 6,\n", + " 5,\n", + " 7,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 4,\n", + " 10,\n", + " 7,\n", + " 2,\n", + " 4,\n", + " 4,\n", + " 8,\n", + " 10,\n", + " 7,\n", + " 6,\n", + " 7,\n", + " 9,\n", + " 6,\n", + " 3,\n", + " 5,\n", + " 7,\n", + " 3,\n", + " 5,\n", + " 6,\n", + " 13,\n", + " 4,\n", + " 5,\n", + " 6,\n", + " 6,\n", + " 8,\n", + " 7,\n", + " 4,\n", + " 4,\n", + " 5,\n", + " 2,\n", + " 6,\n", + " 3,\n", + " 8,\n", + " 15,\n", + " 10,\n", + " 7,\n", + " 4,\n", + " 6,\n", + " 5,\n", + " 3,\n", + " 5,\n", + " 7,\n", + " 5,\n", + " 8,\n", + " 2,\n", + " 10,\n", + " 5,\n", + " 8,\n", + " 4,\n", + " 4,\n", + " 4,\n", + " 1,\n", + " 2,\n", + " 2,\n", + " 5,\n", + " 4,\n", + " 9,\n", + " 5,\n", + " 5,\n", + " 11,\n", + " 4,\n", + " 5,\n", + " 3,\n", + " 5,\n", + " 4,\n", + " 5,\n", + " 8,\n", + " 3,\n", + " 1]]" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "query_day" ] }, { "cell_type": "code", - "execution_count": null, - "id": "tracked-pattern", + "execution_count": 11, + "id": "victorian-venue", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "[[26, 61, 18, 7, 12],\n", + " nan,\n", + " [36, 52, 75],\n", + " [42, 28, 25],\n", + " [2, 3, 2],\n", + " [14, 38, 50],\n", + " [18, 7, 24, 1],\n", + " [131, 148, 4],\n", + " [71, 91, 28, 8],\n", + " [48, 50, 47],\n", + " [16, 2],\n", + " nan,\n", + " [153, 182, 152]]" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "query_month" ] }, { - "cell_type": "code", - "execution_count": null, - "id": "instant-somerset", + "cell_type": "markdown", + "id": "seven-istanbul", "metadata": {}, - "outputs": [], "source": [ - "mean_day = math.ceil(mean([x for x in query_day if str(x) != 'nan']))\n", - "mean_day" + "### Plot query times in a day" ] }, { - "cell_type": "code", - "execution_count": null, - "id": "documented-municipality", + "cell_type": "markdown", + "id": "supreme-search", "metadata": {}, - "outputs": [], "source": [ - "mean_month = math.ceil(mean([x for x in query_month if str(x) != 'nan']))\n", - "mean_month" + "Note: frequecy represents the number of days have specific query times. Each graph represents query times for a user" ] }, { "cell_type": "code", - "execution_count": null, - "id": "burning-elephant", + "execution_count": 12, + "id": "corresponding-graphics", + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "data": { + "image/png": "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OrW8A9zMCtXU1MSuu+7KyJEjfZ9IF0QEa9eupampif32269T7/HTCM2sUO+//z5DhgxxeHeRJIYMGdKlv1wc4GZWOId393R1vznAzWybM3PmTA4++GDOOOOMWpfSo9wGXoWRl95V+DpXX3V84es0q6Wif0868zvygx/8gPnz53+iLXnjxo307bttRZ7PwM1sm3L++eezatUqTjzxRAYNGkRDQwNTpkzhzDPPpLm5mZNPPpmJEycyceJEHnoo+9KitWvXMmXKFMaNG8d5553HvvvuyxtvvMHq1asZPfrjb6a75ppruOKKKwB44YUXmDp1KhMmTOCoo45i5cqVAKxZs4Zp06YxZswYxowZw+LFi/ne977HjBkzNq/nsssuY+bMmVV/1m3rcGRm271Zs2axYMECFi5cyHXXXccdd9zBgw8+yIABAzj99NO55JJLOPLII3nppZc47rjjWLFiBVdeeSVHHnkk06dP56677mL27NkVt9PQ0MCsWbMYNWoUjz76KBdccAH3338/F110Eccccwy33347mzZtYsOGDQwbNoyTTjqJiy++mJaWFm655RYee+yxqj+rA9zMtmknnngiAwYMAOC+++5j+fLlm+etX7+et99+m0WLFnHbbdljno4//nh23333Dte5YcMGFi9ezCmnnLJ52gcffADA/fffz49+lH1ndJ8+fRg0aBCDBg1iyJAhPPXUU6xZs4Zx48YxZMiQqj+bA9zMtmkDBw7cPNzS0sLDDz+8OdBLtdUDpG/fvrS0tGweb+3i19LSwuDBg1myZMkW72nPueeey0033cRrr73G2Wef3ZWP0C63gZvZdmPKlClcd911m8dbA/joo49m7ty5AMyfP59169YBsMcee/D666+zdu1aPvjgA+68804AdtttN/bbbz/mzZsHZDfhLF26FIBjjz2W66+/HoBNmzaxfn329O1p06axYMECHn/8cY47rpjHRjnAzWy7MXPmTBobGzn88MM55JBDmDVrFgCXX345ixYtYvz48dxzzz2MGDECgH79+jF9+nSOOOIITjjhBEq/z2Du3LnMmTOHMWPGcOihh/Lzn/8cgBkzZrBw4UIOO+wwJkyYwLPPPgvAjjvuyOc//3lOPfVU+vTpU8jnqfidmEXa1p4H7m6EZltasWIFBx98cK3LqMrIkSNpbGxk6NChha2zpaWF8ePHM2/ePEaNGtXucm3tP0lPRMQWXx7vM3Azsx62fPlyDjjgAI499tgOw7urfBHTzKzM6tWrC13fIYccwqpVqwpdJ/gM3MwsWQ5wMyvc1ry2ti3p6n5zgJtZofr378/atWsd4l3U+jzw/v37d/o9bgM3s0INHz6cpqYmmpuba11Kclq/kaezHOBmVqh+/fp1+htlrDpuQjEzS5QD3MwsURUDXNKNkl6XtKxk2lhJj0haIqlR0qSeLdPMzMp15gz8JmBq2bR/AK6MiLHA9HzczMy2oooBHhGLgDfLJwO75cODgFcKrsvMzCrobi+UbwN3S7qG7CDwe8WVZGZmndHdi5h/AlwSEfsAlwBz2ltQUkPeTt7ofqFmZsXpboB/HbgtH54HtHsRMyJmR0R9RNTX1dV1c3NmZlauuwH+CnBMPvwF4LliyjEzs86q2AYu6WZgMjBUUhNwOfBNYIakvsD7QENPFmlmZluqGOARcVo7syYUXIuZmXWB78Q0M0uUA9zMLFEOcDOzRDnAzcwS5QA3M0uUA9zMLFEOcDOzRDnAzcwS5QA3M0uUA9zMLFEOcDOzRDnAzcwS5QA3M0uUA9zMLFEOcDOzRDnAzcwS5QA3M0uUA9zMLFEOcDOzRDnAzcwS5QA3M0uUA9zMLFEVA1zSjZJel7SsZNoVkn4jaUn++nLPlmlmZuU6cwZ+EzC1jenXRsTY/PXfxZZlZmaVVAzwiFgEvLkVajEzsy6opg38QklP500suxdWkZmZdUp3A/x6YH9gLPAq8I/tLSipQVKjpMbm5uZubs7MzMp1K8AjYk1EbIqIFuBfgUkdLDs7Iuojor6urq67dZqZWZluBbikvUpGpwHL2lvWzMx6Rt9KC0i6GZgMDJXUBFwOTJY0FghgNXBeD9ZoZmZtqBjgEXFaG5Pn9EAtZmbWBb4T08wsUQ5wM7NEOcDNzBLlADczS5QD3MwsURV7odTCyEvvKnydq686vvB1mpnVks/AzcwS5QA3M0uUA9zMLFEOcDOzRDnAzcwS5QA3M0uUA9zMLFEOcDOzRDnAzcwS5QA3M0uUA9zMLFEOcDOzRDnAzcwS5QA3M0uUA9zMLFEOcDOzRFUMcEk3Snpd0rKSaVdLWinpaUm3Sxrcs2WamVm5zpyB3wRMLZt2LzA6Ig4Hfg38ZcF1mZlZBRUDPCIWAW+WTbsnIjbmo48Aw3ugNjMz60ARbeBnA/MLWI+ZmXVBVQEu6TJgIzC3g2UaJDVKamxubq5mc2ZmVqLbAS7p68AJwBkREe0tFxGzI6I+Iurr6uq6uzkzMyvTtztvkjQV+A5wTES8W2xJZmbWGZ3pRngz8DDwGUlNks4BrgN2Be6VtETSrB6u08zMylQ8A4+I09qYPKcHajEzsy7wnZhmZolygJuZJcoBbmaWKAe4mVmiHOBmZolygJuZJcoBbmaWKAe4mVmiHOBmZolygJuZJcoBbmaWKAe4mVmiHOBmZolygJuZJcoBbmaWKAe4mVmiHOBmZolygJuZJcoBbmaWKAe4mVmiHOBmZolygJuZJaqqAJd0saRlkp6V9O2iijIzs8q6HeCSRgPfBCYBY4ATJI0qqjAzM+tYNWfgBwOPRMS7EbER+AUwrZiyzMyskmoCfBlwtKQhknYGvgzsU0xZZmZWSd/uvjEiVkj6PnAvsAFYCmwsX05SA9AAMGLEiO5uzszMylR1ETMi5kTE+Ig4GngTeK6NZWZHRH1E1NfV1VWzOTMzK9HtM3AASZ+OiNcljQBOAj5bTFlmZlZJVQEO/FTSEOAj4E8jYl0BNZmZWSdUFeARcVRRhZiZWdf4Tkwzs0Q5wM3MEuUANzNLlAPczCxRDnAzs0Q5wM3MEuUANzNLlAPczCxRDnAzs0Q5wM3MEuUANzNLlAPczCxRDnAzs0Q5wM3MEuUANzNLlAPczCxRDnAzs0Q5wM3MEuUANzNLlAPczCxRDnAzs0Q5wM3MEuUANzNLVFUBLmmwpFslrZS0QtJniyrMzMw61rfK988AFkTE1yTtCOxcQE1mZtYJ3Q5wSbsBRwNnAUTEh8CHxZRlZmaVVNOE8jtAM/BDSU9JukHSwPKFJDVIapTU2NzcXMXmzMysVDUB3hcYD1wfEeOAd4BLyxeKiNkRUR8R9XV1dVVszszMSlUT4E1AU0Q8mo/fShboZma2FXQ7wCPiNeBlSZ/JJx0LLC+kKjMzq6jaXijfAubmPVBWAd+oviQzM+uMqgI8IpYA9QXVYmZmXeA7Mc3MEuUANzNLlAPczCxRDnAzs0Q5wM3MElVtN0JLwMhL7yp8nauvOr7wdZpZ1/gM3MwsUQ5wM7NEOcDNzBLlADczS5QD3MwsUQ5wM7NEOcDNzBLlADczS5QD3MwsUb4T03oN3zFq1jU+AzczS5QD3MwsUQ5wM7NEOcDNzBLlADczS5QD3MwsUd0OcEn9JT0maamkZyVdWWRhZmbWsWr6gX8AfCEiNkjqBzwoaX5EPFJQbWZm1oFuB3hEBLAhH+2Xv6KIoszMrLKq2sAl9ZG0BHgduDciHm1jmQZJjZIam5ubq9mcmZmVqCrAI2JTRIwFhgOTJI1uY5nZEVEfEfV1dXXVbM7MzEoU0gslIt4CHgCmFrE+MzOrrJpeKHWSBufDA4AvAiuLKszMzDpWTS+UvYB/k9SH7EDwk4i4s5iyzMyskmp6oTwNjCuwFjMz6wLfiWlmligHuJlZohzgZmaJcoCbmSXKAW5mlih/qbFZF6Xy5cup1Gnd5zNwM7NEOcDNzBLlADczS5QD3MwsUQ5wM7NEOcDNzBLlADczS5QD3MwsUQ5wM7NE+U5MM6upou8Y3Z7uavUZuJlZohzgZmaJcoCbmSXKAW5mligHuJlZohzgZmaJqirAJU2V9CtJz0u6tKiizMyssm4HuKQ+wD8DXwIOAU6TdEhRhZmZWceqOQOfBDwfEasi4kPgFuCrxZRlZmaVKCK690bpa8DUiDg3H/9j4IiIuLBsuQagIR/9DPCr7pfbpqHAGwWvsye4zuKkUCO4zqJtz3XuGxF15ROruZVebUzb4mgQEbOB2VVsp+MipMaIqO+p9RfFdRYnhRrBdRbNdW6pmiaUJmCfkvHhwCvVlWNmZp1VTYA/DoyStJ+kHYE/BP6rmLLMzKySbjehRMRGSRcCdwN9gBsj4tnCKuu8HmueKZjrLE4KNYLrLJrrLNPti5hmZlZbvhPTzCxRDnAzs0Q5wM3MEuWvVOsBkg4C9gYejYgNJdOnRsSC2lX2SZImARERj+ePQZgKrIyI/65xaR2S9KOIOLPWdXRE0pFkdysvi4h7al1PK0lHACsiYr2kAcClwHhgOfD3EfHbmhaYK+nZ9kpE3CfpdOD3gBXA7Ij4qKYF5iTtD0wj61K9EXgOuHlr7cdt5iKmpG9ExA97QR0XAX9K9oM2Frg4In6ez3syIsbXsr5Wki4ne45NX+Be4AjgAeCLwN0R8Xe1q+5jksq7pgr4PHA/QEScuNWLaoOkxyJiUj78TbKfgduBKcAdEXFVLetrJelZYEzei2w28C5wK3BsPv2kmhaYkzSX7GdzZ+AtYBfgNrI6FRFfr2F5wObf9a8AvwC+DCwB1pEF+gUR8UCPFxER28QLeKnWNeR1PAPskg+PBBrJQhzgqVrXV1ZnH7JfkPXAbvn0AcDTta6vpM4ngR8Dk4Fj8n9fzYePqXV9JXU+VTL8OFCXDw8Enql1fSW1rSjdt2XzltS6vpJans7/7QusAfrk4+otP5+tv0P58M7AA/nwiK31u55UE4qkp9ubBeyxNWvpQJ/Im00iYrWkycCtkval7ccP1MrGiNgEvCvphYhYDxAR70lqqXFtpeqBi4HLgD+PiCWS3ouIX9S4rnI7SNqd7LqSIqIZICLekbSxtqV9wrKSv1aXSqqPiEZJBwK9olkit0PejDKQLBwHAW8COwH9allYmb7AJrK6dgWIiJckbZUakwpwspA+juzPlFICFm/9ctr0mqSxEbEEICI2SDoBuBE4rLalfcKHknaOiHeBCa0TJQ0Cek2AR0QLcK2kefm/a+idP7eDgCfIfhZD0p4R8ZqkXehdB+5zgRmS/orsgUsPS3oZeDmf11vMAVaS/ZV4GTBP0irgd8mefNob3AA8LukR4Gjg+wCS6sgONj0uqTZwSXOAH0bEg23M+4+IOL0GZZXXMZzs7Pa1NuZ9LiIeqkFZW5C0U0R80Mb0ocBeEfFMDcqqSNLxwOci4ru1rqUzJO0M7BERL9a6llKSdgV+h+xg2BQRa2pc0hYkDQOIiFckDSa7PvNSRDxW28o+JulQ4GCyi9Urt/r2UwpwMzP7mPuBm5klygFuZpYoB7hZCUmDJV1QMj5M0q21rMmsPW4Dt+2CpD55t8lKy40E7oyI0T1elFmVfAZuvY6kyyT9StJ9km6W9Gf59Ack1efDQyWtzof7SLpa0uOSnpZ0Xj59sqSFkv4DeEbS30i6uGQ7f5ffTVfqKmB/SUvydY6UtCxf/ixJP5N0h6QXJV0o6f9IekrSI5I+lS+3v6QFkp6Q9Mv80QpIOkXSMklLJS3q2b1o24Pe2J/WtmOSJpA9A2Mc2c/nk2T9qztyDvDbiJgoaSfgIUmtzx+ZBIyOiBfzs+vbyPpB75BvZ1LZui7Nlx+b1zOybP7ovLb+wPPAdyJinKRrgTOBfyJ7oP/5EfFc/uyRHwBfAKYDx0XEb/JucWZVcYBbb3MUcHt+g1Fbz0JpyxTgcElfy8cHAaOAD4HHWvtg53fGrpU0juymsKciYm0X61sYEW8Db0v6LXBHPv2ZvIZdyB66NE/afP/OTvm/DwE3SfoJ2YHErCoOcOuN2rsws5GPm/36l0wX8K2IuLt04fwxBu+UreMG4CxgT7K7Y7uq9OanlpLxFrLfpx2At1rP4EtFxPn5GfnxwJL8jt2uHkDMNnMbuPU2i4Bpkgbkdwt+pWTeaj6+7f9rJdPvBv6k9fkTkg6UNLCd9d9O9tjcifn7yr1N/kyL7sifKfOipFPyWiRpTD68f0Q8GhHTyW5j36e72zEDB7j1MhHxJPCfZI/m/Cnwy5LZ15AF9WJgaMn0G8ieZ/1kfsHxX2jnr8uI+BBYCPykrV4p+RnxQ/nFxqu7+THOAM6RtBR4FvhqPv1qSc/kNS4ClnZz/WaAuxFaLyfpCmBDRFxT0Pp2ILswekpEPFfEOs1qxWfgtt1Q9q1DzwP/4/C2bYHPwM3MEuUzcDOzRDnAzcwS5QA3M0uUA9zMLFEOcDOzRDnAzcwS9b9I1n9DL4xbgwAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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c9myZQtnnXUW48ePZ/z48dx7b/alRU1NTUyePJkxY8Zw4YUXcvjhh/P888+zceNGjjvujW+mmz17NpdffjkATz75JFOnTmXcuHGcfPLJPPbYYwBs3ryZ6dOnM3r0aEaPHs3y5cv58pe/zJw5c3a1c+mllzJ37tyK3+vetTkys7e8efPmsXjxYpYuXcpVV13Frbfeyj333MOAAQP4+Mc/zhe+8AVOOukknnrqKaZMmcK6deu44oorOOmkk5g1axa333478+fP73A5DQ0NzJs3j5EjR3L//fdz8cUXs2TJEi655BJOPfVUbr75Znbu3Mn27dsZNmwYZ555JjNmzKC5uZkbbriBBx54oOL36gA3s73a6aefzoABAwC46667WLt27a5pW7duZdu2bSxbtoybbsq+jnXatGkcfPDB7ba5fft2li9fztlnn71r3KuvvgrAkiVL+OEPs++M7tOnD4MGDWLQoEEMGTKEhx56iM2bNzNmzBiGDBlS8XtzgJvZXu2AAw7YNdzc3Mx99923K9BLtXYGSN++fWlubt71vOUUv+bmZgYPHszq1as7XccFF1zAtddey6ZNm/jsZz/blbfQJveBm9lbxuTJk7nqqqt2PW8J4FNOOYUFCxYAsGjRIl544QUADjnkEJ577jmampp49dVXue222wAYOHAgI0aMYOHChUB2Ec7DDz8MwKRJk/jud78LwM6dO9m6dSsA06dPZ/HixTz44INMmTKlkPfjADezt4y5c+eyYsUK3vOe9zBq1CjmzZsHwGWXXcayZcsYO3Ysd955J7W1tQD069ePWbNmMWHCBE477TSOPvroXW0tWLCAa665htGjR3Psscdyyy23ADBnzhyWLl3K8ccfz7hx43j00UcB2HfffXnf+97HOeecQ58+fQp5Pz36nZj19fXRmfuBp3J6Xip1mvWkdevWccwxx1S7jIq0fHfB0KFDC2uzubmZsWPHsnDhQkaOHNnmfK2tP0krI6K+fF7vgZuZ7WFr167lyCOPZNKkSe2Gd1f5IKaZWZmNGzcW2t6oUaNYv359oW2C98DNzJLlADezwvXksbW9SVfXmwPczArVv39/mpqaHOJd1HI/8P79+3f6Ne4DN7NCDR8+nMbGRrZs2VLtUpLT8o08neUAN7NC9evXr9PfKGOV6bALRdL3JD0naU3JuLdJ+rmkx/Of7d84wMzM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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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aEX1UdvuK6le2fevfTP/XrbWy9Qp+xJODR8+vPXsN6m56medKrQj275yTofL3HTTTVq2bNkb+nsPHDigfv142ivS0tV/H71dMfmQsqIuz4uI1yPiNEnDJJ1u+01fIxQRN0fEhIiYMHhwm3dBltWll16qLVu2aMaMGaqqqlJdXZ2mTp2qCy+8UDt27NB5552niRMnauLEiXr00ewLMxobGzV16lTV1tbqkksu0YgRI7Rz505t27ZNY8b8cRPMnTtX1113nSTpmWee0fTp0zV+/HidccYZevLJJyVJ27dv18yZMzV27FiNHTtWK1eu1Be/+EXNmzevpZ2rr75a8+fP776NAuCQ0KnrqCPiZUkPSZpekmpKaMGCBRoyZIiWL1+uK6+8UvX19Vq6dKluv/12XXHFFbryyiu1atUq3XXXXZozZ44k6frrr9f73vc+rV27VjNmzNCzzz7b4Xrq6ur0jW98Q/X19Zo7d64uu+wySdLll1+us846S+vXr9eaNWs0evRozZ49W7fddpskqampSYsXL6ZbBsCbdPiZ3/ZgSa9FxMu2+0v6gLLvnzukzZgxQ/3795ckPfDAA9q0aVPLvN27d2vPnj1asWKF7r47+2q/c845R0cdddRbtrl3716tXLlSs2bNapm2f/9+SdKDDz6o7343+57Rvn37qqqqSlVVVaqurtbatWu1fft21dbWqrq6ukvfJ4BDXzGds++WdFveT91H0h0RcU9pyyq9ww8/vGW4qalJjz32WEtwF2rrqot+/fqpqampZbz58rmmpiYNHDhQ69atK7qOOXPmaOHChXrxxRd18cUXd+YtAOglirnq4/GIqI2IUyNiTET8S3cU1p2mTp2qG2+8sWW8OWjPPPNMLVq0SJK0bNky7dq1S5J09NFH66WXXlJjY6P279+ve+7J9ltHHnmkRo4cqSVLlkjKblhZv369JGnKlCn61re+JUl6/fXXtXv3bknSzJkzde+992rVqlWaNm1aN7xbAIcanvWh7LK91atX69RTT9WoUaO0YMECSdK1116rFStWaNy4cbr//vtbrmapqKjQNddco0mTJuncc8/VSSed1NLWokWLdMstt2js2LEaPXq0li5dKkmaN2+eli9frlNOOUXjx4/Xxo0bJUmHHXaY3v/+9+v8889X3759u/mdAzgUlOQ7EydMmBCtn0e9efNmnXzyyV2+ru7U/JztQYMGdVmbTU1NGjdunJYsWaITTjihzWV6wrZD53B5Xtc6FC7Ps10fERPamscRdRlt2rRJxx9/vKZMmdJuSAMAd3p0wrZt27q0vVGjRmnLli1d2iaAnocjagBIXLcGdSn6w3s6thmAbgvqyspKNTY2Ejyd0Pw86srKynKXAqCMuq2PetiwYWpoaNCOHTu6a5U9QvM3vADovbotqCsqKviWEgA4CJxMBIDEEdQAkDiCGgASR1ADQOIIagBIHEENAIkjqAEgcQQ1ACSOoAaAxBHUAJA4ghoAEkdQA0DiCGoASBxBDQCJI6gBIHEENQAkjqAGgMQR1ACQOIIaABJHUANA4ghqAEgcQQ0AiSOoASBxBDUAJI6gBoDEEdQAkDiCGgASR1ADQOIIagBIHEENAIkjqAEgcQQ1ACSOoAaAxBHUAJA4ghoAEkdQA0DiCGoASBxBDQCJI6gBIHEENQAkjqAGgMQR1ACQOIIaABJHUANA4ghqAEgcQQ0AiSOoASBxBDUAJI6gBoDEEdQAkDiCGgAS12FQ2z7W9nLbm21vtH1FdxQGAMj0K2KZA5L+LiLW2D5CUr3t/4mITSWuDQCgIo6oI+KFiFiTD++RtFnS0FIXBgDIdKqP2naNpFpJv2hjXp3t1bZX79ixo2uqAwAUH9S2B0i6S9LnImJ36/kRcXNETIiICYMHD+7KGgGgVysqqG1XKAvpRRFxd2lLAgAUKuaqD0u6RdLmiPjP0pcEAChUzBH1n0v6lKSzba/LXx8qcV0AgFyHl+dFxCOS3A21AADawJ2JAJA4ghoAEkdQA0DiCGoASBxBDQCJI6gBIHEENQAkjqAGgMQR1ACQOIIaABJHUANA4ghqAEgcQQ0AiSOoASBxBDUAJI6gBoDEEdQAkDiCGgASR1ADQOIIagBIHEENAIkjqAEgcQQ1ACSOoAaAxBHUAJA4ghoAEkdQA0DiCGoASBxBDQCJI6gBIHEENQAkjqAGgMQR1ACQOIIaABJHUANA4ghqAEgcQQ0AiSOoASBxBDUAJI6gBoDEEdQAkDiCGgASR1ADQOIIagBIHEENAIkjqAEgcQQ1ACSOoAaAxBHUAJA4ghoAEkdQA0DiCGoASBxBDQCJI6gBIHEENQAkjqAGgMQR1ACQOIIaABJHUANA4ghqAEhch0Ft+1bbL9ne0B0FAQDeqJgj6oWSppe4DgBAOzoM6ohYIem33VALAKAN/bqqIdt1kuokafjw4V3VbMnUXPWzcpfQo2z7yjnlLgHosbrsZGJE3BwREyJiwuDBg7uqWQDo9bjqAwASR1ADQOKKuTzvB5Iek/Qe2w22Z5e+LABAsw5PJkbEJ7qjEABA2+j6AIDEEdQAkDiCGgASR1ADQOIIagBIHEENAIkjqAEgcQQ1ACSOoAaAxBHUAJA4ghoAEkdQA0DiCGoASBxBDQCJI6gBIHEENQAkjqAGgMQR1ACQOIIaABJHUANA4ghqAEgcQQ0AiSOoASBxBDUAJI6gBoDEEdQAkDiCGgASR1ADQOIIagBIHEENAIkjqAEgcQQ1ACSOoAaAxBHUAJA4ghoAEkdQA0DiCGoASBxBDQCJI6gBIHEENQAkjqAGgMQR1ACQOIIaABJHUANA4ghqAEgcQQ0AiSOoASBxBDUAJI6gBoDEEdQAkDiCGgASR1ADQOIIagBIHEENAIkjqAEgcQQ1ACSOoAaAxBHUAJA4ghoAEkdQA0Diigpq29NtP2X7adtXlbooAMAfdRjUtvtK+qakD0oaJekTtkeVujAAQKaYI+rTJT0dEVsi4lVJiyV9pLRlAQCa9StimaGSnisYb5A0qfVCtusk1eWje20/9fbLg6RBknaWu4iO+KvlrgBlwu9n1xnR3oxigtptTIs3TYi4WdLNnSgKRbC9OiImlLsOoC38fnaPYro+GiQdWzA+TNLzpSkHANBaMUG9StIJtkfaPkzSX0r6SWnLAgA067DrIyIO2P6MpPsk9ZV0a0RsLHllaEZ3ElLG72c3cMSbupsBAAnhzkQASBxBDQCJI6gBIHEENYCi2D7J9hTbA1pNn16umnoLgvoQYfvT5a4BvZftyyUtlfRZSRtsFz5G4t/KU1XvwVUfhwjbz0bE8HLXgd7J9hOS3hsRe23XSLpT0vciYp7ttRFRW9YCe7hibiFHN7H9eHuzJB3dnbUArfSNiL2SFBHbbE+WdKftEWr7MRPoQgR1Wo6WNE3SrlbTLWll95cDtHjR9mkRsU6S8iPrcyXdKumU8pbW8xHUablH0oDmP4ZCth/q/nKAFhdKOlA4ISIOSLrQ9rfLU1LvQR81ACSOqz4AIHEENQAkjqBGr2R7oO3LCsaH2L6znDUB7aGPGj2K7b4R8XoRy9VIuicixpS8KOBt4ogaZWP7attP2X7A9g9s/30+/SHbE/LhQba35cN9bd9ge5Xtx21fkk+fbHu57dslPWH7S7avKFjPv+Z31hX6iqTjbK/L26yxvSFf/iLbP7b9U9tbbX/G9t/aXmv757bfmS93nO17bdfbftj2Sfn0WbY32F5ve0VptyJ6Ay7PQ1nYHq/s24Jqlf0erpFU38GPzZb0u4iYaPsdkh61fX8+73RJYyJia360fLekebb75Os5vVVbV+XLn5bXU9Nq/pi8tkpJT0v6fETU2v6askvVvq7sofmXRsSvbU+SdJOksyVdI2laRPzG9sAiNwnQLoIa5XKGpB9FxO8lyXYxX+82VdKptj+Wj1dJOkHSq5J+GRFbpZY75xpt1yq7iWhtRDR2sr7lEbFH0h7bv5P003z6E3kNAyT9maQldsuNee/I/31U0kLbdyjbYQBvC0GNcmrvBMkB/bFbrrJguiV9NiLuK1w4v535lVZtfEfSRZKOUXb3XGftLxhuKhhvUvZ300fSy81H5IUi4tL8CPscSevyO/o6u6MAWtBHjXJZIWmm7f62j5D04YJ52ySNz4c/VjD9Pkl/Y7tCkmyfaPvwdtr/kaTpkibmP9faHklHHGzxEbFb0lbbs/JabHtsPnxcRPwiIq6RtFPSsQe7HkAiqFEmEbFG0g8lrZN0l6SHC2bPVRbIKyUNKpj+HUmbJK3JT/x9W+18KoyIVyUtl3RHW1eB5Ee4j+Yn/W44yLdxgaTZttdL2iip+dGfN9h+Iq9xhaT1B9k+IInL85AI29dJ2hsRc7uovT7KTlDOiohfd0WbQLlwRI0ex/YoZVdq/C8hjZ6AI2oASBxH1ACQOIIaABJHUANA4ghqAEgcQQ0AiSOoASBx/w+0fWgfrPx15wAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXAAAAETCAYAAAAveV3LAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAZSklEQVR4nO3de5RV5Z3m8e8jYPAKBioaRCzGO6gIFJKk45UESbSxaaMdV4waMaXJJBpnOolpJ16mu9dyIjMGYic2owSTEO3gJSZm4S1iE0WNxS0iaFRkTHmBEk3wisH6zR97A8djXU7V2VWnXnk+a9Vin7137f07u4rnvPXuy6uIwMzM0rNDrQswM7PucYCbmSXKAW5mligHuJlZohzgZmaJcoCbmSXKAW5Jk/RPkq6rcQ0LJJ1Vg/0eK6m5t/drfYd8HbilQtKxwM8iYnita+kLfDzMLXCrGUn9a12DWcoc4PY+ksZKWirpNUn/IekmSf+SLztb0gNl64ek/fPpD0maIek5SeskXStpp3zZsZKaJX1b0kvAjyWtlPS3JdsaIOllSUeU7WMXYAEwTNLr+dcwSZdL+lm+Tn1ey5ck/UnSq5LOlzRB0h8k/VnSNWXbPUfS6nzduyTtm8+XpKslrZf0l/z7D23neN0v6dzS45Mfg1clPSvpMx0c64slPZMf61WSpnWw7k6S5ubbXQVMqGRb+c/kFUmHlaz7EUlvSaprb3/W9znA7T0k7Qj8Evgp8GFgPnBKFzbxv4ADgSOA/YG9gUtLlu+Vb3dfoBH4CXBGyfLPAi9GxPLSjUbEG8BngBciYtf864V2apgIHAD8A/B94BLgU8Bo4DRJx+Tv9e+AfwL+HqgDfgfcmG9jMnB0/l4G59vaUOExmAg8CQwFvgdcL0ntrPsMcBQwCLgC+Jmkj7az7mXAfvnXCUB5v3ub24qITcBNvPc4nw7cGxEtFb4n64siwl/+2vpFFlovkJ8fyectBv4lnz4beKDse4IsrAW8AexXsuzjwLP59LHAO8DAkuXDgNeA3fPXNwPfaqe2Y4HmsnmXk/UDA9TntexdsnwD8A8lr28BvpFPLwCmlyzbAXiT7MPleOCPwMeAHTo5ZvcD55Ycn6dLlu2c17RXhcd/OXByO8vWAFNKXjeWH4/2tkX2ofKnLe8FaAJOq/Xvm7+q+3IL3MoNA56P/H957v9V+L11ZIG1JO+u+DNwZz5/i5aIeHvLi8ha0Q8Cp0gaTNbKnlfNGwDWlUy/1cbrXfPpfYGZJbW+QvYhtHdE3AdcA/wbsE7SbEm7V7j/l7ZMRMSb+eSuba0o6UxJy0tqOJSs5d6WYWQhvMV7fi4dbSsiHiH7cD1G0sFkH7i/qvD9WB/lALdyLwJ7l/3JP6Jk+g2ykAZA0l4ly14mC8jRETE4/xoUEaXh1dZlTzeQ/Xl/KvBQRDzfTm1FXzL1J+C8kloHR8ROEbEYICJmRcR4sq6XA4FvFrnzvL/9/wJfA4ZExGBgJdmHSFteBPYpeb3151LhtrYc5y8CN5d+kFqaHOBW7iFgM3CBpP6S/h44smT5CmC0pCMkDSTrwgAgIlrJQuRqSR8BkLS3pBM62ecvgXHAhWR94u1ZBwyRNKiL76k91wLfkTQaQNIgSafm0xMkTZQ0gOxD623g3YL2u8UuZB9KLfk+v0TWam7PL/J695A0HPh6F7f1U2AaWYh3dJwtEQ5we4+IeIfspN7ZwKtkJ+9uLVn+R+B/AvcCTwEPlG3i28DTwMOSNubrHdTJPt8i65seWbqvNtZ7guwk45q8m2BYV95bG9u7jeyk6015rSvJunAAdif7MHqVrKtiAzCjmv21sf9VwP8m+9BcBxxG1p3UnivyWp4F7iYL5Iq3FRHNwFKyoP9dUe/Dasc38linJM0lO1n2P3pwH5cCB0bEGZ2ubN0maQ7ZlTw99rO03uMbKazmJH0YmE7WN2s9RFI92V9XY2tbiRXFXShWU5K+THYycUFELKp1PR9Ukv6ZrIvoqoh4ttb1WDHchWJmlii3wM3MEuUANzNLVK+exBw6dGjU19f35i7NzJK3ZMmSlyPifQ8e69UAr6+vp6mpqTd3aWaWPEltPs7CXShmZolygJuZJcoBbmaWKN+JaWaF+utf/0pzczNvv+2HHXbVwIEDGT58OAMGDKhofQe4mRWqubmZ3Xbbjfr6etofiMjKRQQbNmygubmZkSNHVvQ9nXahSJqTjwu4smTeEZIezh8e3yTpyI62YWbbj7fffpshQ4Y4vLtIEkOGDOnSXy6V9IHPBaaUzfsecEVEHEE23uH3Kt6jmX3gOby7p6vHrdMAzx8w9Er5bLLnJUM2gGp7g8uamfW6WbNmccghh/CFL3yh1qX0qO72gX8DuEvSDLIPgU+0t6KkRrLBVxkxYkR7q1k31F/8m1qXwNorT6x1CdbHFf17Wsnv3A9/+EMWLFjwnr7kzZs307//B+u0X3cvI/wKcFFE7ANcBFzf3ooRMTsiGiKioa7ufXeCmpkV6vzzz2fNmjVMnTqVQYMG0djYyOTJkznzzDNpaWnhlFNOYcKECUyYMIEHH8wGLdqwYQOTJ09m7NixnHfeeey77768/PLLrF27lkMP3TYy3YwZM7j88ssBeOaZZ5gyZQrjx4/nqKOO4oknngBg3bp1TJs2jTFjxjBmzBgWL17Md7/7XWbOnLl1O5dccgmzZs2q+r12N8DPYtvQV/N575iJZmY1c+211zJs2DAWLlzIRRddxJIlS7j99tv5+c9/zoUXXshFF13Eo48+yi233MK5554LwBVXXMEnP/lJli1bxtSpU3nuuec63U9jYyM/+MEPWLJkCTNmzOCrX/0qABdccAHHHHMMK1asYOnSpYwePZrp06dzww03ANDa2spNN91USPdOd/+eeAE4BrgfOJ5sbEQzsz5n6tSp7LTTTgDce++9rFq1auuyjRs38tprr7Fo0SJuvTVrk5544onsscceHW7z9ddfZ/HixZx66qlb523atAmA++67j5/8JBszul+/fgwaNIhBgwYxZMgQli1bxrp16xg7dixDhgyp+r11GuCSbgSOBYZKagYuA74MzJTUn2y07saqKzEz6wG77LLL1unW1lYeeuihrYFeqq0rQPr3709ra+vW11su8WttbWXw4MEsX7684jrOPfdc5s6dy0svvcQ555zTlbfQrkquQjk9Ij4aEQMiYnhEXB8RD0TE+IgYExETI2JJIdWYmfWgyZMnc80112x9vSWAjz76aObNmwfAggULePXVVwHYc889Wb9+PRs2bGDTpk3ccccdAOy+++6MHDmS+fPnA9lNOCtWrABg0qRJ/OhHPwLg3XffZePGjQBMmzaNO++8k0cffZQTTjihkPfjZ6GY2XZj1qxZNDU1cfjhhzNq1CiuvfZaAC677DIWLVrEuHHjuPvuu7deMTdgwAAuvfRSJk6cyEknncTBBx+8dVvz5s3j+uuvZ8yYMYwePZrbb78dgJkzZ7Jw4UIOO+wwxo8fz+OPPw7AjjvuyHHHHcdpp51Gv379Cnk/vTomZkNDQ/h54MXxZYTWF61evZpDDjmk1mVUZcvYBUOHDi1sm62trYwbN4758+dzwAEHtLteW8dP0pKIaChf1y1wM7MetmrVKvbff38mTZrUYXh31QfrqnYzswKsXbu20O2NGjWKNWvWFLpNcAvczCxZDnAzK1xvnlv7IOnqcXOAm1mhBg4cyIYNGxziXbTleeADBw6s+HvcB25mhRo+fDjNzc20tLTUupTkbBmRp1IOcDMr1IABAyoeUcaq4y4UM7NEOcDNzBLlADczS5QD3MwsUQ5wM7NEdRrgkuZIWi9pZdn8r0t6UtLjkjwqvZlZL6ukBT4XmFI6Q9JxwMnA4RExGphRfGlmZtaRSgZ0WAS8Ujb7K8CVEbEpX2d9D9RmZmYd6G4f+IHAUZIekfSfkia0t6KkRklNkpp8Z5aZWXG6G+D9gT2AjwHfBH6htgaUAyJidkQ0RERDXV1dN3dnZmbluhvgzcCtkfk90AoUN3SFmZl1qrsB/kvgeABJBwI7Ai8XVZSZmXWu04dZSboROBYYKqkZuAyYA8zJLy18Bzgr/OxIM7Ne1WmAR8Tp7Sw6o+BazMysC3wnpplZohzgZmaJcoCbmSXKAW5mligHuJlZohzgZmaJcoCbmSXKAW5mligHuJlZohzgZmaJcoCbmSXKAW5mligHuJlZohzgZmaJ6jTAJc2RtD5/9nf5sn+UFJI8Go+ZWS+rpAU+F5hSPlPSPsCngecKrsnMzCrQaYBHxCLglTYWXQ18C/BIPGZmNdCtPnBJU4HnI2JFBes2SmqS1NTS0tKd3ZmZWRu6HOCSdgYuAS6tZP2ImB0RDRHRUFdX19XdmZlZO7rTAt8PGAmskLQWGA4slbRXkYWZmVnHOh3UuFxEPAZ8ZMvrPMQbIuLlAusyM7NOVHIZ4Y3AQ8BBkpolTe/5sszMrDOdtsAj4vROltcXVo2ZmVXMd2KamSXKAW5mligHuJlZohzgZmaJcoCbmSXKAW5mligHuJlZohzgZmaJcoCbmSXKAW5mligHuJlZohzgZmaJcoCbmSXKAW5mlqhKngc+R9J6SStL5l0l6QlJf5B0m6TBPVummZmVq6QFPheYUjbvHuDQiDgc+CPwnYLrMjOzTnQa4BGxCHilbN7dEbE5f/kw2biYZmbWi4roAz8HWNDeQkmNkpokNbW0tBSwOzMzgyoDXNIlwGZgXnvrRMTsiGiIiIa6urpqdmdmZiW6PCr9FpLOAk4CJkVEFFeSmZlVolsBLmkK8G3gmIh4s9iSzMysEpVcRngj8BBwkKRmSdOBa4DdgHskLZd0bQ/XaWZmZTptgUfE6W3Mvr4HajEzsy7wnZhmZolygJuZJcoBbmaWKAe4mVmiHOBmZolygJuZJarbd2Ka9SX1F/+m1iWw9soTa12CbWfcAjczS5QD3MwsUQ5wM7NEOcDNzBLlADczS5QD3MwsUQ5wM7NEVfI88DmS1ktaWTLvw5LukfRU/u8ePVummZmVq6QFPheYUjbvYuC3EXEA8Nv8tZmZ9aJOAzwiFgGvlM0+Gbghn74B+LuC6zIzs05091b6PSPiRYCIeFHSR9pbUVIj0AgwYsSIbu5uG98ybWaW6fGTmBExOyIaIqKhrq6up3dnZrbd6G6Ar5P0UYD83/XFlWRmZpXoboD/Cjgrnz4LuL2YcszMrFKVXEZ4I/AQcJCkZknTgSuBT0t6Cvh0/trMzHpRpycxI+L0dhZNKrgWMzPrAt+JaWaWKAe4mVmiHOBmZolygJuZJcoBbmaWKAe4mVmiHOBmZolygJuZJcoBbmaWKAe4mVmiHOBmZolygJuZJcoBbmaWKAe4mVmiqgpwSRdJelzSSkk3ShpYVGFmZtaxbge4pL2BC4CGiDgU6Ad8vqjCzMysY9V2ofQHdpLUH9gZeKH6kszMrBLdDvCIeB6YATwHvAj8JSLuLl9PUqOkJklNLS0t3a/UzMzeo5oulD2Ak4GRwDBgF0lnlK8XEbMjoiEiGurq6rpfqZmZvUc1XSifAp6NiJaI+CtwK/CJYsoyM7POVBPgzwEfk7SzJJENcry6mLLMzKwz1fSBPwLcDCwFHsu3NbuguszMrBP9q/nmiLgMuKygWszMrAt8J6aZWaIc4GZmiXKAm5klygFuZpYoB7iZWaIc4GZmiXKAm5klygFuZpYoB7iZWaIc4GZmiXKAm5klygFuZpYoB7iZWaIc4GZmiaoqwCUNlnSzpCckrZb08aIKMzOzjlX1PHBgJnBnRHxO0o5kI9ObmVkv6HaAS9odOBo4GyAi3gHeKaYsMzPrTDVdKP8FaAF+LGmZpOsk7VK+kqRGSU2SmlpaWqrYnZmZlaomwPsD44AfRcRY4A3g4vKVImJ2RDRERENdXV0VuzMzs1LVBHgz0JwPbgzZAMfjqi/JzMwqUc2o9C8Bf5J0UD5rErCqkKrMzKxT1V6F8nVgXn4FyhrgS9WXZGZmlagqwCNiOdBQUC1mZtYFvhPTzCxRDnAzs0Q5wM3MEuUANzNLlAPczCxRDnAzs0Q5wM3MEuUANzNLlAPczCxRDnAzs0Q5wM3MEuUANzNLlAPczCxRDnAzs0RVHeCS+uVjYt5RREFmZlaZIlrgFwKrC9iOmZl1QVUBLmk4cCJwXTHlmJlZpaptgX8f+BbQ2t4KkholNUlqamlpqXJ3Zma2RbcDXNJJwPqIWNLRehExOyIaIqKhrq6uu7szM7My1bTA/waYKmktcBNwvKSfFVKVmZl1qtsBHhHfiYjhEVEPfB64LyLOKKwyMzPrkK8DNzNLVP8iNhIR9wP3F7EtMzOrjFvgZmaJcoCbmSXKAW5mligHuJlZohzgZmaJcoCbmSWqkMsIzcz6ovqLf1PrElh75Yk9tm23wM3MEuUANzNLlAPczCxRDnAzs0Q5wM3MEuUANzNLlAPczCxR1Qypto+khZJWS3pc0oVFFmZmZh2r5kaezcB/j4ilknYDlki6JyJWFVSbmZl1oJoh1V6MiKX59GvAamDvogozM7OOFXIrvaR6YCzwSBvLGoFGgBEjRhSxOzPrwAf99nHbpuqTmJJ2BW4BvhERG8uXR8TsiGiIiIa6urpqd2dmZrmqAlzSALLwnhcRtxZTkpmZVaKaq1AEXA+sjoj/U1xJZmZWiWpa4H8DfBE4XtLy/OuzBdVlZmad6PZJzIh4AFCBtZiZWRf4Tkwzs0Q5wM3MEuUANzNLlAPczCxRDnAzs0Q5wM3MEuUANzNLlAPczCxRDnAzs0Q5wM3MEuUANzNLlAPczCxRDnAzs0Q5wM3MElXtiDxTJD0p6WlJFxdVlJmZda6aEXn6Af8GfAYYBZwuaVRRhZmZWceqaYEfCTwdEWsi4h3gJuDkYsoyM7POKCK6943S54ApEXFu/vqLwMSI+FrZeo1AY/7yIODJ7pdbiKHAyzWuoa/wsdjGx2IbH4tt+sqx2Dci6spndntINdoeTu19nwYRMRuYXcV+CiWpKSIaal1HX+BjsY2PxTY+Ftv09WNRTRdKM7BPyevhwAvVlWNmZpWqJsAfBQ6QNFLSjsDngV8VU5aZmXWmmlHpN0v6GnAX0A+YExGPF1ZZz+kz3Tl9gI/FNj4W2/hYbNOnj0W3T2KamVlt+U5MM7NEOcDNzBLlADczS5QDfDsi6WBJkyTtWjZ/Sq1qqhVJR0qakE+PkvTfJH221nX1BZJ+Uusa+gJJn8x/LybXupb2bNcnMSV9KSJ+XOs6eoOkC4D/CqwGjgAujIjb82VLI2JcLevrTZIuI3uGT3/gHmAicD/wKeCuiPjX2lXXuySVX/or4DjgPoCImNrrRdWIpN9HxJH59JfJ/r/cBkwGfh0RV9ayvrZs7wH+XESMqHUdvUHSY8DHI+J1SfXAzcBPI2KmpGURMbamBfai/FgcAXwIeAkYHhEbJe0EPBIRh9e0wF4kaSmwCriO7E5qATeS3ddBRPxn7arrXaX/DyQ9Cnw2Ilok7QI8HBGH1bbC96vmVvokSPpDe4uAPXuzlhrrFxGvA0TEWknHAjdL2pe2H4vwQbY5It4F3pT0TERsBIiItyS11ri23tYAXAhcAnwzIpZLemt7Cu4SO0jag6xrWRHRAhARb0jaXNvS2vaBD3CykD4BeLVsvoDFvV9Ozbwk6YiIWA6Qt8RPAuYAfa5l0cPekbRzRLwJjN8yU9IgYLsK8IhoBa6WND//dx3bRy60ZRCwhCwbQtJeEfFSfs6oTzZytocf1B3ArluCq5Sk+3u/nJo5E3hPKyIiNgNnSvr32pRUM0dHxCbYGmBbDADOqk1JtRURzcCpkk4ENta6nlqIiPp2FrUC03qxlIpt133gZmYp82WEZmaJcoCbmSXKAW5WQtJgSV8teT1M0s21rMmsPe4Dt+2CpH75pYOdrVcP3BERh/Z4UWZVcgvc+hxJl0h6UtK9km6U9I/5/PslNeTTQyWtzaf7SbpK0qOS/iDpvHz+sZIWSvo58Jikf5Z0Ycl+/jW/Q7XUlcB+kpbn26yXtDJf/2xJv5T0a0nPSvpafqv1MkkPS/pwvt5+ku6UtETS7yQdnM8/VdJKSSskLerZo2jbg+3hMkJLiKTxZHcBjiX7/VxKdm1uR6YDf4mICZI+BDwo6e582ZHAoRHxbN66vhWYKWmHfD9Hlm3r4nz9I/J66suWH5rXNhB4Gvh2RIyVdDXZpZrfJxsE4PyIeErSROCHwPHApcAJEfG8pMEVHhKzdjnAra85Crgtv8mmrWd1tGUycLikz+WvBwEHAO8Av4+IZ2HrHagbJI0lu8FrWURs6GJ9CyPiNeA1SX8Bfp3PfyyvYVfgE8B8aeu9Hx/K/30QmCvpF2QfJGZVcYBbX9TeiZnNbOv2G1gyX8DXI+Ku0pXzxwW8UbaN64Czgb3I7kLtqk0l060lr1vJ/j/tAPx5Swu+VEScn7fITwSW53fGdvUDxGwr94FbX7MImCZpJ0m7AX9bsmwt2259/1zJ/LuAr0gaACDpwPwBRG25DZgCTMi/r9xrwG7dLT5/rsqzkk7Na5GkMfn0fhHxSERcCrwM7NPd/ZiBA9z6mIhYCvwHsBy4BfhdyeIZZEG9GBhaMv86sifqLc1POP477fx1GRHvAAuBX7R1VUreIn4wP9l4VTffxheA6ZJWAI8DJ+fzr5L0WF7jImBFN7dvBvgyQuvjJF0OvB4RMwra3g5kJ0ZPjYinitimWa24BW7bDUmjyK4c+a3D2z4I3AI3M0uUW+BmZolygJuZJcoBbmaWKAe4mVmiHOBmZolygJuZJer/AzTmm5Mtr4PuAAAAAElFTkSuQmCC\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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dtqJt73tbRNdylNqEH3g7wa+PNLMJPPoPXyVWbNmjbSY1hOzj7t4oksY1eKTDpnoErQWBv1vaiy//09/+tNccsklT+pLfvzxx5k8ecM67dfXZYRJjqf3+K0RH0JbVfOram5VzZ0x40/uBJWkgTr66KO58847Oeyww5g2bRrz5s3jwAMP5Mgjj2TZsmW84Q1vYJ999mGfffbh2mt7Dy1avnw5Bx54IHPmzOF973sf2267Lffffz+LFy9m113/+GS6k08+mY997GMA3HHHHRx88MHsvffevOxlL+P2228HYOnSpRx++OHsscce7LHHHlx33XV89KMf5ZRTTlnVzvHHH8+pp57a97aO++MoyTuBQ4EDyu+klbSeOP3007n00ku58sorOe200/jmN7/JNddcw8Ybb8xb3/pWPvShD7Hffvtx9913c9BBB7Fo0SI+/vGPs99++3HCCSdw8cUXM3/+/FHXM2/ePE4//XR22GEHrr/+et7//vdzxRVXcMwxx/CKV7yCCy+8kCeeeIKHH36Yrbfemte//vUce+yxrFixgnPPPZcf/OAHfW/ruAI8ycH0nn34iqr6Xd9VSNJT5LDDDmPjjTcG4PLLL+e2225bNe/BBx/koYce4uqrr+aCC3qPYz3kkEPYcsst19jmww8/zHXXXccRRxyxatqjjz4KwBVXXMEXvtB7ZvSkSZOYNm0a06ZNY/r06dx0000sXbqUOXPmMH369L63bdQAT3IOsD+wVZIlwIn0rjp5JvDt7qzp96vq6L6rkaQB22STTVYNr1ixgu9973urAn2o1V0BMnnyZFasWLFqfOUlfitWrGCLLbZg4cKFY67jve99L2eddRb33nsv7373u9dmE0Y0lqtQ3lJVz6+qKVU1s6rOrKrtq+oFVbVn9zK8Ja33DjzwQE477bRV4ysD+OUvfzlnn907lXfJJZfwwAMPAPDc5z6X++67j+XLl/Poo49y0UUXAbD55puz3Xbbcd555wG9m3BuvvlmAA444AA+85nPAPDEE0/w4IMPAnD44Ydz6aWX8sMf/pCDDjpoINvjd6FIeto49dRTWbBgAbvvvjs777wzp59+OgAnnngiV199NXvttReXXXbZqivmpkyZwgknnMC+++7LoYceyo477riqrbPPPpszzzyTPfbYg1122YWvf/3rAJxyyilceeWV7Lbbbuy9997c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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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2wpQd96d7Xrc8kvGVrkTs/b/Pbakkr/Tyy+/nBkzZnxovHfdunX07Ll57X5rdYs6IpaSXR3j92QXMF1Idgmn5stNjYj6iKivqSn7LUgzs6o588wzWbZsGePGjaNfv340NDQwevRoTjnlFFatWsXxxx/PyJEjGTlyJA8+mF0EZ/Xq1YwePZrhw4dzxhlnsPPOO/PKK6+wfPly9tnngyuaTZo0iYsuugiAZ555hjFjxnDAAQdwyCGH8MQTTwCwcuVKxo8fz7Bhwxg2bBgPPfQQ3//+95k8efKG9Zx//vlMmTKlw8+1op2JEXFVRIyIiEPJruD8VIcrm5l1wBVXXMGgQYO47777OPfcc5k7dy633347119/PRMnTuTcc89l9uzZ3HzzzUyYMAGAiy++mM985jPMnz+fcePGsWLFilbrNDQ08LOf/Yy5c+cyadIkzjrrLADOOeccDjvsMBYuXMi8efMYOnQop59+Otdeey0A69ev58Ybb6zKsExFnw8kfTwiXpZUS3bliE93uLKZWRWNGzeOPn36AHDPPfewZMmSDfPWrFnD2rVrmTVrFrfckl2uc+zYsWy//fYbXefrr7/OQw89xAknnLDhvnfeeQeAe++9l1/9Krt2cI8ePejXrx/9+vVjwIABzJ8/n5UrVzJ8+HAGDBjQ4edW6UDOzfkY9XvA2RHxaocrm5lV0TbbbLNhev369Tz88MMbgrtUuaMuevbsyfr16zfcbjp8bv369fTv358FCxZU3MeECRO45ppreOmllzjttNPa8hRaVOnQxyERMSQihkXEf1WlsplZQUaPHs1ll1224XZT0B566KFMmzYNgBkzZvDqq9k25w477MDLL7/M6tWreeedd7jjjjsA2G677dhll12YPn06kH1hZeHChQCMGjWKn//85wC8//77rFmzBoDx48dz1113MXv2bI4++uiqPB+f68PMNjtTpkxhzpw57LfffgwZMoQrrrgCgAsvvJBZs2YxYsQIZs6cueEItV69enHBBRdw0EEHcdxxx7HXXnttWNe0adO46qqrGDZsGEOHDuX2228HYPLkydx3333su+++HHDAATz++OMAbLnllhxxxBGceOKJ9OjRoyrPp5BrJtbX14fPR108H55nXWnp0qXsvffeXd1GhzSdO3/gwIFVW+f69esZMWIE06dPZ/fdy383sNxrJ2luRNSX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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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aYmkmWQXX2X48OGtrVZRambfV3Qb22+YVoJKzNJXiv+nQh353/re977HsmXLDhhL3rdvH717H1wf+3X7YYQRsTgiaiOitrr6Xd8ENTMrqauvvpqtW7dywQUXUFVVxcyZM5k8eTKXXnop9fX1XHTRRYwfP57x48fzyCPZRYsaGhqYPHkyY8aM4aqrruL444/n5ZdfZvv27Zx22h+vTDdv3jyuu+46AJ577jmmTp3KuHHjOPvss3nmmWcA2LVrF9OnT2f06NGMHj2a1atX861vfYv58+fvb+faa69lwYIFRT/Xrr4c7ZJ0bL73fSzwUtGVmJmVwKJFi1i+fDkrV65k4cKF3HPPPTz88MP069ePSy65hK9+9aucddZZ7NixgylTprBlyxauv/56zjrrLObMmcN9993H4sWL2+1n5syZLFq0iJEjR/LYY4/xpS99iRUrVnDNNddw7rnncvfdd/POO++wd+9ehg4dyoUXXsisWbNobGzk9ttv5/HHHy/6uXY1wH8GfAG4If/506IrMTPrBhdccAH9+vUD4MEHH2Tz5s37l+3evZs9e/awatUq7roruxzrtGnTOPLItg+s27t3L6tXr2bGjBn757355psArFixgh/9KLtmdK9evaiqqqKqqorBgwezfv16du3axZgxYxg8eHDRz63dAJd0GzARGCKpDphLFtx3SLoC2AHMaL0FM7Oe079///3TjY2NPProo/sDvVBLR4D07t2bxsbG/febDvFrbGxk0KBBbNiwocN1XHnlldxyyy3s3LmTyy+/vDNPoVUdOQrlMxFxbET0iYhhEXFzRDRExKSIGJn/bH6UiplZxZk8eTILFy7cf78pgM855xyWLFkCwLJly3jllVcAOProo3nppZdoaGjgzTff5N577wVg4MCBjBgxgqVLlwLZl3A2btwIwKRJk/j+978PwDvvvMPu3bsBmD59OsuXL+eJJ55gypQpJXk+PheKmb1nLFiwgDVr1vDBD36QUaNGsWjRIgDmzp3LqlWrGDt2LA888MD+I+b69OnDnDlzmDBhAueffz4nn3zy/raWLFnCzTffzOjRozn11FP56U+zkeT58+ezcuVKTj/9dMaNG8fTTz8NwKGHHspHPvIRLr74Ynr16lWS51PWa2LW1tZGCucD92GEZl23ZcsWTjnllJ4uoyhN1y4YMmRIydpsbGxk7NixLF26lJEjR7a6XkvbT9LaiKhtvq73wM3MutnmzZs58cQTmTRpUpvh3VkH11HtZmYlsH379pK2N2rUKLZu3VrSNsF74GZmyXKAm1nJlfOztYNJZ7ebA9zMSqpv3740NDQ4xDup6Xzgffv27fBjPAZuZiU1bNgw6urqqK+v7+lSktN0RZ6OcoCbWUn16dOnw1eUseJ4CMXMLFEOcDOzRDnAzcwS5QA3M0uUA9zMLFEOcDOzRPkwQmuTz8xoVrm8B25mligHuJlZohzgZmaJcoCbmSXKAW5mligHuJlZohzgZmaJcoCbmSXKAW5mligHuJlZohzgZmaJcoCbmSXKAW5mligHuJlZohzgZmaJcoCbmSWqqACX9FVJT0vaJOk2SX1LVZiZmbWtywEu6TjgGqA2Ik4DegGfLlVhZmbWtmKHUHoD/ST1Bg4HXii+JDMz64guB3hE/BaYB+wAXgT+EBEPNF9P0kxJayStqa+v73qlZmZ2gGKGUI4EPgmMAIYC/SV9rvl6EbE4Imojora6urrrlZqZ2QGKGUI5D9gWEfUR8TZwF/BnpSnLzMzaU0yA7wA+JOlwSQImAVtKU5aZmbWnmDHwx4A7gXXAU3lbi0tUl5mZtaN3MQ+OiLnA3BLVYmZmneBvYpqZJcoBbmaWKAe4mVmiHOBmZolygJuZJcoBbmaWKAe4mVmiHOBmZolygJuZJcoBbmaWKAe4mVmiHOBmZolygJuZJcoBbmaWKAe4mVmiHOBmZolygJuZJcoBbmaWKAe4mVmiHOBmZolygJuZJcoBbmaWKAe4mVmiHOBmZolygJuZJcoBbmaWKAe4mVmiHOBmZolygJuZJcoBbmaWKAe4mVmiHOBmZokqKsAlDZJ0p6RnJG2R9KelKszMzNrWu8jHzweWR8SnJB0KHF6CmszMrAO6HOCSBgLnAJcBRMRbwFulKcvMzNpTzBDKnwD1wA8lrZd0k6T+JarLzMzaUUyA9wbGAt+PiDHAq8Ds5itJmilpjaQ19fX1RXRnZmaFignwOqAuIh7L799JFugHiIjFEVEbEbXV1dVFdGdmZoW6HOARsRN4XtIH8lmTgM0lqcrMzNpV7FEoXwGW5EegbAW+WHxJZmbWEUUFeERsAGpLVIuZmXWCv4lpZpYoB7iZWaIc4GZmiXKAm5klygFuZpYoB7iZWaIc4GZmiXKAm5klygFuZpYoB7iZWaIc4GZmiXKAm5klygFuZpYoB7iZWaIc4GZmiXKAm5klygFuZpYoB7iZWaIc4GZmiXKAm5klygFuZpYoB7iZWaIc4GZmiXKAm5klygFuZpYoB7iZWaIc4GZmiXKAm5klygFuZpYoB7iZWaIc4GZmiXKAm5klygFuZpaoogNcUi9J6yXdW4qCzMysY0qxBz4L2FKCdszMrBOKCnBJw4BpwE2lKcfMzDqqd5GP/y7wdWBAaytImgnMBBg+fHibjdXMvq/IcmD7DdOKbqMSeFv8kbeFWcu6vAcu6XzgpYhY29Z6EbE4Imojora6urqr3ZmZWTPFDKF8GLhA0nbgduCjkm4tSVVmZtauLgd4RPxtRAyLiBrg08CKiPhcySozM7M2+ThwM7NEFfshJgAR8RDwUCnaMjOzjvEeuJlZohzgZmaJcoCbmSXKAW5mligHuJlZohzgZmaJcoCbmSXKAW5mligHuJlZohzgZmaJcoCbmSXKAW5mligHuJlZohzgZmaJcoCbmSXKAW5mligHuJlZohzgZmaJcoCbmSXKAW5mligHuJlZohzgZmaJcoCbmSXKAW5mligHuJlZohzgZmaJcoCbmSXKAW5mligHuJlZohzgZmaJcoCbmSXKAW5mlqguB7ik90taKWmLpKclzSplYWZm1rbeRTx2H/A/ImKdpAHAWkk/j4jNJarNzMza0OU98Ih4MSLW5dN7gC3AcaUqzMzM2laSMXBJNcAY4LFStGdmZu0rZggFAElHAD8G/iYidrewfCYwE2D48OHFdmdmFaBm9n1FPX77DdNKVMl7W1F74JL6kIX3koi4q6V1ImJxRNRGRG11dXUx3ZmZWYFijkIRcDOwJSL+b+lKMjOzjihmD/zDwOeBj0rakN8+XqK6zMysHV0eA4+IhwGVsBYzM+sEfxPTzCxRDnAzs0Q5wM3MEuUANzNLlAPczCxRDnAzs0Q5wM3MEuUANzNLlAPczCxRDnAzs0Q5wM3MEuUANzNLlAPczCxRDnAzs0Q5wM3MElX0NTHN3isq4TqQxdZQqjoqQaVsi578u/AeuJlZohzgZmaJcoCbmSXKAW5mligHuJlZohzgZmaJcoCbmSXKAW5mligHuJlZohzgZmaJcoCbmSXKAW5mligHuJlZohzgZmaJcoCbmSXKAW5mligHuJlZoooKcElTJf1K0rOSZpeqKDMza1+XA1xSL+CfgI8Bo4DPSBpVqsLMzKxtxeyBnwk8GxFbI+It4Hbgk6Upy8zM2qOI6NoDpU8BUyPiyvz+54EJEfHlZuvNBGbmdz8A/Krr5QIwBHi5yDaKVQk1QGXUUQk1QGXUUQk1QGXUUQk1QGXUUYoajo+I6uYzi7kqvVqY965Xg4hYDCwuop8DO5XWRERtqdpLtYZKqaMSaqiUOiqhhkqpoxJqqJQ6urOGYoZQ6oD3F9wfBrxQXDlmZtZRxQT4E8BISSMkHQp8GvhZacoyM7P2dHkIJSL2SfoycD/QC/hBRDxdsspaV7LhmCJUQg1QGXVUQg1QGXVUQg1QGXVUQg1QGXV0Ww1d/hDTzMx6lr+JaWaWKAe4mVmiHOBmZolygHeApJMlTZJ0RLP5U8tYw5mSxufToyT9d0kfL1f/bdT1ox7u/6x8W0wuc78TJA3Mp/tJul7SPZK+LamqTDVcI+n97a/Z7XUcKulSSefl9y+RtFDSX0vq09P1HcyS/RBT0hcj4odl6Oca4K+BLcAZwKyI+Gm+bF1EjC1DDXPJzjnTG/g5MAF4CDgPuD8i/rG7a8jraH6YqICPACsAIuKCMtTweEScmU//Fdnv5m5gMnBPRNzQ3TXkfT8NjM6PxloMvAbcCUzK519Yhhr+ALwKPAfcBiyNiPru7reFOpaQ/W0eDvweOAK4i2xbKCK+UO6aKomk90XES93SeEQkeQN2lKmfp4Aj8ukaYA1ZiAOsL2MNvcj+QXYDA/P5/YAny7jN1wG3AhOBc/OfL+bT55aphvUF008A1fl0f+CpMm6LLYXbpdmyDeXaFmTvoicDNwP1wHLgC8CAMm6LJ/OfvYFdQK/8vsr891kF3AA8AzTkty35vEFlquGoZrfBwHbgSOCoUvdXzFfpu52kJ1tbBBxdpjJ6RcRegIjYLmkicKek42n5dALdYV9EvAO8Jum5iNid1/O6pMYy1QBQC8wCrgW+FhEbJL0eEf+vjDUcIulIsuBS5HucEfGqpH1lrGNTwbvAjZJqI2KNpJOAt8tUQ0REI/AA8EA+XPEx4DPAPOBd587oJofkX+brT7aTUQX8DjgMKOcQyh1k7wYnRsROAEnHkL2gLQX+vAw1vAz8V7N5x5Ht/ATwJ6XsrKIDnCykpwCvNJsvYHWZatgp6YyI2AAQEXslnQ/8ADi9TDW8JenwiHgNGNc0Mx9rLVuA52Fxo6Sl+c9dlP9vqApYS/Y3EJKOiYid+ecT5XpBBbgSmC/p78j+aR+V9DzwfL6sHA54vhHxNtm3oX8mqV+ZaoBs7/8ZsneJ1wJLJW0FPkR2ltJyqYmIbxfOyIP825IuL1MNXycb2vxaRDwFIGlbRIzojs4qegxc0s3ADyPi4RaW/XtEXFKGGoaR7QHvbGHZhyPikTLUcFhEvNnC/CHAsU1/KOUmaRrw4Yj4Zk/036yWw4GjI2JbmfsdQLZX1Ruoi4hdZez7pIj4dbn6a4ukoQAR8YKkQWQhtiMiHi9jDQ8ADwL/2vR7kHQ0cBnw5xFxXpnqGAbcSPZiPhfYGBEl3fPe31clB7iZWUflQ2uzya5L8L589i6ydyU3RETzd/LdXc8nyN6R1ETEMd3ShwPczA525TpqrYV++wEnRMSm7qjBAW5mBz1JOyJi+MFWQ6V/iGlm1iGVcNRauWtwgJvZwaISjloraw0OcDM7WNxL9qW7Dc0XSHroYKzBY+BmZonyyazMzBLlADczS5QD3KyApEGSvlRwf6ikO3uyJrPWeAzc3hMk9cpPCNbeejXAvRFxWrcXZVYk74FbxZF0raRfSXpQ0m2S/mc+/yFJtfn0EEnb8+lekr4j6QlJT0q6Kp8/UdJKSf8OPCXp7yXNKujnH/PzvRe6AThB0oa8zRpJm/L1L5P0k/zCDdskfTm/mMR6Sf8p6ah8vRMkLZe0VtIvJZ2cz58haZOkjZJWde9WtPcCH0ZoFUXSOODTwBiyv891ZGcfbMsVwB8iYrykw4BH8hMbAZwJnBYR2/K967vIziJ4SN7Pmc3amp2vf0ZeT02z5afltfUFngW+ERFjJN0IXAp8F1gMXB0Rv5E0Afge8FFgDjAlIn6bn/DJrCgOcKs0ZwN356fObekqQC2ZDHxQ0qfy+1XASOAt4PGmMxTm53NvkDSG7AsX6yOioZP1rYyIPcCe/Io49+Tzn8prOAL4M7JTqjY95rD85yPALZLuIHshMSuKA9wqUWsfzOzjj8N+fQvmC/hKRNxfuHJ+8Y1Xm7VxE9npRY8hO6d7ZxWe1rex4H4j2f/TIcDvm/bgC0XE1fke+TRgQ36e+c6+gJjt5zFwqzSrgOnKLhQ8APhEwbLt/PGCFp8qmH8/8N/yK9Ig6SRJ/Vtp/25gKjA+f1xze4ABXS0+v1rSNkkz8lokaXQ+fUJEPBYRc8guAtHjFyS2tDnAraJExDrgP4ANwI+BXxYsnkcW1KuBIQXzbwI2A+vyDxz/mVbeXUbEW8BK4I6WjkrJ94gfyT9s/E4Xn8ZngSskbQSeJjs/NcB3JD2V17gK2NjF9s0AH0ZoFU7SdcDeiJhXovYOIftgdEZE/KYUbZr1FO+B23uGpFFkR478wuFtBwPvgZuZJcp74GZmiXKAm5klygFuZpYoB7iZWaIc4GZmiXKAm5kl6v8DNcQiX8EvWq8AAAAASUVORK5CYII=\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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09zczJFHHsnYsWMZO3YsDzyQ3bRo+fLljBs3jjFjxnDaaaexxRZb8MYbb7BkyRJ22unTO9NdcsklXHjhhQC88MILjB8/nt133529996bZ555BoClS5dy+OGHM3r0aEaPHs2DDz7Ij370IyZPnrymnfPOO48pU6bUvK196+3IzD73pk2bxh133MHs2bOZOnUqt956K/fffz+DBg3iO9/5Dueccw577bUXL730EgcffDCLFi3ioosuYq+99uL888/n9ttvZ/r06R3WaWxsZNq0aYwaNYq5c+dyxhlncO+993LWWWex7777ctNNN7Fq1Sreffddhg8fzhFHHMHZZ59NS0sL1157LQ8//HDN2+oAN7M+7dBDD2XQoEEA3HPPPSxcuHDNsrfffpt33nmHOXPmcOON2e1YJ0yYwEYbbdRum++++y4PPvggRx111Jp5H330EQD33nsvV12V3TO6X79+DB48mMGDBzN06FAee+wxli5dypgxYxg6dGjN2+YAN7M+bb311lsz3dLSwkMPPbQm0Eu1dgZI//79aWlpWfN89Sl+LS0tDBkyhAULFlTcj1NPPZUZM2bw+uuvc/LJJ3dmE9rkY+Bm9rkxbtw4pk6duub56gDeZ599mDlzJgCzZs1ixYoVAGyyySYsW7aM5cuX89FHH3HbbbcBsOGGG7Llllty/fXXA9mXcB5//HEADjzwQC6//HIAVq1axdtvvw3A4Ycfzh133MEjjzzCwQcfXMj2OMDN7HNjypQpzJs3j1122YUddtiBadOmAXDBBRcwZ84cdtttN+666y5GjhwJwIABAzj//PPZc889OeSQQ9huu+3WtDVz5kyuuOIKRo8ezY477sgtt9wCwOTJk5k9ezY777wzu+++O08//TQAa6+9Nvvvvz9HH300/fr1K2R7uvWemA0NDeHrgafFpxFaZy1atIjtt9++p7tRk9X3Lhg2bFhhbba0tLDbbrtx/fXXM2rUqDbXa23/SXo0IhrK1/UI3Mysiy1cuJCtt96aAw88sN3w7qwOP8SUdCVwCLAsInYqmf894ExgJXB7RJxbWK/MzHrQkiVLCm1vhx12YPHixYW2CZWNwGcA40tnSNofOAzYJSJ2BC4pvGdmZtauDgM8IuYAb5bN/jtgUkR8lK+zrAv6ZmaJ6s7P1vqSzu63ao+BbwPsLWmupN9JGtvWipIaJc2TNK+5ubnKcmaWioEDB7J8+XKHeCetvh74wIEDK35NtV/k6Q9sBHwZGAtcJ+lL0cpPLCKmA9MhOwulynpmlogRI0bQ1NSEB2ydt/qOPJWqNsCbgBvzwH5YUgswDPBPzOxzbsCAARXfUcZqU+0hlJuBAwAkbQOsDbxRVKfMzKxjlZxGeA2wHzBMUhNwAXAlcKWkp4CPgRNaO3xiZmZdp8MAj4hj2lh0XMF9MTOzTvA3Mc3MEuUANzNLlAPczCxRDnAzs0Q5wM3MEuUANzNLlAPczCxRDnAzs0Q5wM3MEuUANzNLlAPczCxRDnAzs0Q5wM3MEuUANzNLlAPczCxRHQa4pCslLctv3lC+7PuSQtKwrumemZm1pZIR+AxgfPlMSZsDXwFeKrhPZmZWgQ4DPCLmAG+2suhS4FzAt1IzM+sBVR0Dl3Qo8EpEPF5wf8zMrEId3hOznKR1gfOAcRWu3wg0AowcObKz5awd9RNv7/Rrlkya0AU9MbOeUM0IfCtgS+BxSUuAEcB8SZu2tnJETI+IhohoqKurq76nZmb2GZ0egUfEk8DGq5/nId4QEW8U2C8zM+tAJacRXgM8BGwrqUnSKV3fLTMz60iHI/CIOKaD5fWF9cbMzCrmb2KamSXKAW5mligHuJlZohzgZmaJcoCbmSXKAW5mligHuJlZohzgZmaJcoCbmSXKAW5mligHuJlZohzgZmaJcoCbmSXKAW5mligHuJlZoiq5ocOVkpZJeqpk3sWSnpH0hKSbJA3p2m6amVm5SkbgM4DxZfPuBnaKiF2APwI/LLhfZmbWgQ4DPCLmAG+WzbsrIlbmT/9AdmNjMzPrRkUcAz8ZmFVAO2Zm1gk1Bbik84CVwMx21mmUNE/SvObm5lrKmZlZiaoDXNIJwCHAsRERba0XEdMjoiEiGurq6qotZ2ZmZTq8K31rJI0HfgDsGxHvF9slMzOrRCWnEV4DPARsK6lJ0inAVGAD4G5JCyRN6+J+mplZmQ5H4BFxTCuzr+iCvpiZWSf4m5hmZolygJuZJcoBbmaWKAe4mVmiHOBmZolygJuZJcoBbmaWKAe4mVmiHOBmZolygJuZJcoBbmaWKAe4mVmiHOBmZolygJuZJcoBbmaWKAe4mVmiKrkjz5WSlkl6qmTeFyTdLem5/N+NurabZmZWrpIR+AxgfNm8icBvI2IU8Nv8uZmZdaMOAzwi5gBvls0+DPhlPv1L4BsF98vMzDpQ1V3pgU0i4jWAiHhN0sZtrSipEWgEGDlyZJXl0lI/8fZOv2bJpAld0JN0dNc+88/G+pIu/xAzIqZHRENENNTV1XV1OTOzz41qA3yppC8C5P8uK65LZmZWiWoD/DfACfn0CcAtxXTHzMwqVclphNcADwHbSmqSdAowCfiKpOeAr+TPzcysG3X4IWZEHNPGogML7ouZmXWCv4lpZpYoB7iZWaIc4GZmiXKAm5klygFuZpYoB7iZWaIc4GZmiXKAm5klygFuZpYoB7iZWaIc4GZmiXKAm5klygFuZpYoB7iZWaIc4GZmiaopwCWdI+lpSU9JukbSwKI6ZmZm7as6wCVtBpwFNETETkA/4NtFdczMzNpX6yGU/sAgSf2BdYFXa++SmZlVouoAj4hXgEuAl4DXgLci4q6iOmZmZu2r5RDKRsBhwJbAcGA9Sce1sl6jpHmS5jU3N1ffUzMz+4xaDqEcBLwYEc0R8QlwI/DX5StFxPSIaIiIhrq6uhrKmZlZqVoC/CXgy5LWlSSyu9QvKqZbZmbWkVqOgc8FbgDmA0/mbU0vqF9mZtaB/rW8OCIuAC4oqC9mZtYJ/iammVmiHOBmZolygJuZJcoBbmaWKAe4mVmiHOBmZolygJuZJaqm88DNrHX1E2/v9GuWTJrQBT2xvswjcDOzRDnAzcwS5QA3M0uUA9zMLFEOcDOzRDnAzcwS5QA3M0uUA9zMLFE1BbikIZJukPSMpEWS/qqojpmZWftq/SbmZOCOiPimpLWBdQvok5mZVaDqAJe0IbAPcCJARHwMfFxMt8zMrCO1jMC/BDQDv5A0GngUODsi3itdSVIj0AgwcuTIGsrVztenMLO+pJZj4P2B3YDLI2IM8B4wsXyliJgeEQ0R0VBXV1dDOTMzK1VLgDcBTRExN39+A1mgm5lZN6g6wCPideBlSdvmsw4EFhbSKzMz61CtZ6F8D5iZn4GyGDip9i6ZmVklagrwiFgANBTUFzMz6wR/E9PMLFEOcDOzRDnAzcwS5QA3M0uUA9zMLFEOcDOzRNV6HriZ9XG+hlDv5RG4mVmiHOBmZolygJuZJcoBbmaWKAe4mVmiHOBmZolygJuZJcoBbmaWqJoDXFI/SY9Juq2IDpmZWWWKGIGfDSwqoB0zM+uEmgJc0ghgAvDzYrpjZmaVqnUE/lPgXKClrRUkNUqaJ2lec3NzjeXMzGy1qgNc0iHAsoh4tL31ImJ6RDRERENdXV215czMrEwtI/C/AQ6VtAS4FjhA0tWF9MrMzDpUdYBHxA8jYkRE1APfBu6NiOMK65mZmbXL54GbmSWqkBs6RMR9wH1FtGVmZpXxCNzMLFEOcDOzRDnAzcwS5QA3M0uUA9zMLFEOcDOzRDnAzcwSVch54GbW/eon3t7p1yyZNKELemI9xSNwM7NEOcDNzBLlADczS5QD3MwsUQ5wM7NEOcDNzBLlADczS1Qt98TcXNJsSYskPS3p7CI7ZmZm7avlizwrgf8TEfMlbQA8KunuiFhYUN/MzKwdtdwT87WImJ9PvwMsAjYrqmNmZta+Qo6BS6oHxgBzi2jPzMw6VvO1UCStD/wa+IeIeLuV5Y1AI8DIkSNbbcPXdDAz67yaRuCSBpCF98yIuLG1dSJiekQ0RERDXV1dLeXMzKxELWehCLgCWBQRPymuS2ZmVolaRuB/A3wXOEDSgvzxtYL6ZWZmHaj6GHhE3A+owL6YmVkn+JuYZmaJcoCbmSXKAW5mligHuJlZohzgZmaJcoCbmSXKAW5mlqiar4ViZlaE7romUnfU6a5t8QjczCxRDnAzs0Q5wM3MEuUANzNLlAPczCxRDnAzs0Q5wM3MEuUANzNLVK33xBwv6VlJz0uaWFSnzMysY7XcE7Mf8F/AV4EdgGMk7VBUx8zMrH21jMD3AJ6PiMUR8TFwLXBYMd0yM7OOKCKqe6H0TWB8RJyaP/8usGdEnFm2XiPQmD/dFni2k6WGAW9U1cneV6cvbUtfq9OXtqWv1elL21JtnS0ioq58Zi0Xs2rthsZ/8W4QEdOB6VUXkeZFREO1r+9NdfrStvS1On1pW/panb60LUXXqeUQShOwecnzEcCrtXXHzMwqVUuAPwKMkrSlpLWBbwO/KaZbZmbWkaoPoUTESklnAncC/YArI+Lpwnr2qaoPv/TCOn1pW/panb60LX2tTl/alkLrVP0hppmZ9Sx/E9PMLFEOcDOzRDnAzcwS9bkMcEnbSTpQ0vpl88cXXGcPSWPz6R0k/aOkrxVZo426V3VDjb3y7RlXYJt7Stownx4k6SJJt0r6D0mDC6xzlqTNO16z5jprSzpe0kH58+9Imirp7yUNKLDOVpK+L2mypB9LOr3I/WW9VzIfYko6KSJ+UUA7ZwF/DywCdgXOjohb8mXzI2K3WmvkbV1Adp2Y/sDdwJ7AfcBBwJ0R8W8F1Sk/dVPA/sC9ABFxaEF1Ho6IPfLpvyXbhzcB44BbI2JSATWeBkbnZzhNB94HbgAOzOcfUWuNvM5bwHvAC8A1wPUR0VxE22V1ZpL9/NcF/gysD9xItj2KiBMKqHEW8HXgd8DXgAXACuBw4IyIuK/WGtaLRUQSD+Clgtp5Elg/n64H5pGFOMBjBfb3SbLTK9cF3gY2zOcPAp4osM584GpgP2Df/N/X8ul9C6zzWMn0I0BdPr0e8GRBNRaVblfZsgVFbgvZX5/jgCuAZuAO4ARggwLrPJH/2x9YCvTLn6uo34HVv2f59LrAffn0yCJ/n/M2BwOTgGeA5fljUT5vSJG12qg/q8C2NgUuJ7sg31DgwnxfXgd8scA648v23xXAE8D/ApvU2n6vOoQi6Yk2Hk8CmxRUpl9EvAsQEUvIAu+rkn5C65cHqNbKiFgVEe8DL0TE23nND4CWAus0AI8C5wFvRTbi+iAifhcRvyuwzlqSNpI0lGz02AwQEe8BKwuq8ZSkk/LpxyU1AEjaBvikoBoAEREtEXFXRJwCDAcuA8YDiwuss1b+JbcNyMJ19WGNdYDCDqHw6fc51slrEREvFVwDsnBbAewXEUMjYijZX3srgOuLKCBptzYeu5P9xVyUGcBC4GVgNvABMAH4PTCtwDr/XjL9Y7LB1dfJBkH/XXPrXf2u2cl3q6VkP6Qtyh71wKsF1bgX2LVsXn/gKmBVgdsyF1g3n16r7F14flF1StodQfafaCoF/bVS1v4SsnB7Mf9303z++hQ0Os73zQyyQxtzyUJ7MdnhgdEFbkubI1NgUIF1zsn7/yfgLOC3wM/IRnoXFFTjbLIR3XSykfFJ+fw6YE7BvwPPVrOskzVW5f9HZ7fy+KArfgfK/78U9fuctzW/rXaLqFPLxay6wm1khzcWlC+QdF9BNY6nbMQYESuB4yXV/o74qX0i4qO8/dIR9wCyP9ULFRFNwFGSJpAdsim6/fo2FrWQHW8tosZbwImSNgC+RPbG2hQRS4tov8S32unDB0UViYhLJf0qn341/3D5IOBnEfFwQTUmS7oH2B74SUQ8k89vBvYpokaJP0k6F/jl6p+JpE2AE8lGskVYBJwWEc+VL5BUVA347Akc5R/69yuwzsaS/pHsr/sNJSny9KaAk0iS+RDTzHqWpI2AiWTX/d84n72U7BpIkyJiRQE1vkn2mcpfXHZa0jci4uZaa+Rt/TPwn5EfTi2ZvzXZtnyzoDoXlM26LCKaJW2a1z++pvYd4GZWq6LOEuvpGqnVcYCbWc0kvRQRI1OvkVqd3nYM3Mx6KUlPtLWIgs4S644afamOA9zMKrUJcDDZaYOlBDyYUI0+U8cBbmaV6o6zxLqjRp+p42PgZmaJ6lXfxDQzs8o5wM3MEuUANyshaYikM0qeD5d0Q0/2yawtPgZunwuS+kXEqgrWqwdui4idurxTZjXyCNx6HUnnSXpW0j2SrpH0/Xz+fSVXKBwmaUk+3U/SxZIeya9eeVo+fz9JsyX9L/CkpH+RdHZJnX/Lr6ddahKwlaQFeZv1kp7K1z9R0s35TSZelHSmsptaPCbpD5K+kK+3laQ7JD0q6feStsvnHyXpKUmPS5rTtXvRPg98GqH1KvllQ78NjCH7/ZxPdrnc9pxCdindsZLWAR6QdFe+bA9gp4h4MR9d3whMlrRWXmePsrYm5uvvmvenvmz5TnnfBgLPAz+IiDGSLiW7UNpPya4MeHpEPCdpT7JL1R4AnA8cHBGvSBpS4S4xa5MD3HqbvYGbIruOemt3HGrNOGCX/EJIkF2WdhTwMfBwRLwI2fXfJS2XNIbsCxaPRcTyTvZvdkS8A7yT39nn1nz+k3kf1gf+GrheWnN5+XXyfx8AZki6juyNxKwmDnDrjdr6YGYlnx72G1gyX8D3IuLO0pUl7Ud267RSPye7/OmmwJVV9O2jkumWkuctZP+f1gL+vHoEXyoiTs9H5BOABZJ2reINxGwNHwO33mYOcLiymxpvQHb3ktWWALvn06WX+7wT+DvlNwqWtI2k9dpo/yayO++MzV9X7h3yu9pUI7I7L70o6ai8L5I0Op/eKiLmRsT5wBtAl99Y2fo2B7j1KhExH/gV2c15f012i6vVLiEL6geBYSXzf052e6z5+QeO/00bf11GxMdkd3e5rrWzUvIR8QP5h40XV7kZxwKnSHoceJrs+tkAF0t6Mu/jHODxKts3A3waofVyki4E3o2ISwpqby2yD0aPau2uL2Yp8QjcPjck7UB25shvHd7WF3gEbmaWKI/AzcwS5QA3M0uUA9zMLFEOcDOzRDnAzcwS5QA3M0vU/wektoKM3vPE/wAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "for i in range (len(query_day)):\n", + " if query_day[i] is not NaN:\n", + " plot_day(query_day[i])" + ] + }, + { + "cell_type": "markdown", + "id": "worst-musical", + "metadata": {}, + "source": [ + "### Plot query times in a month" + ] + }, + { + "cell_type": "markdown", + "id": "adverse-bruce", "metadata": {}, - "outputs": [], "source": [ - "df = pd.DataFrame(data = {'query times in a day':query_day,'query times in a month':query_month})\n", - "df.loc['mean'] = [mean_day,mean_month]\n", - "df" + "Note: not all users have data on the same number of months. Each graph represents query times for a user in a month." ] }, { "cell_type": "code", - "execution_count": null, - "id": "incoming-gibson", + "execution_count": 13, + "id": "removed-sheffield", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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DiaJiooK/+VjlrCyBzjg8C4Tn3eztHWKAO/Ktm7dyk9+8pO9y+vXr+eiiy4qY0Vmloqyj4E3VjXt0aLur3bGJ4u6v0Lt3r2b7t27t9ivIcCvvvpqAIYMGcKDDz5Y6vLMSqrY/487m3LlSmO+Age++93vcuSRR3LGGWdw+eWX84Mf5D6Y5bTTTtv75OjmzZtpeBuA3bt3M3XqVE444QSOO+447rzzTgAWLlzI+PHj+fSnP82xxx7Lt771LW699da9x/nGN77Bj370o/cde9q0aaxdu5bq6mqmTp1KbW0to0blPnVr1qxZTJo0iYkTJzJ8+HBuu+02fvjDHzJmzBhOPvlk3njjDQDWrl3LOeecw/HHH88pp5zCSy+9BMDcuXMZNWoUo0eP5tRTTy3dCTSzsuh0V+AdbdmyZcyZM4fly5eza9cuxo4dy/HHH7/fbe666y769evHkiVL2LFjB+PGjeOss84CYPHixaxatYrhw4dTW1vLhRdeyLXXXsuePXuYM2cOixcvft++ZsyYwapVq1ixYgUAtbW171u/atUqli9fzvbt2xkxYgS33HILy5cv5ytf+Qp333031113HVOmTOGOO+5g5MiRLFq0iKuvvpqnnnqKm266iSeeeIKhQ4eydevW4p00M+sUunyA//a3v+WCCy7gQx/KfRD7eeed1+I2Tz75JCtXrtw71PGnP/2JNWvW0KtXL0488cS9t+VVVVVRUVHB8uXL2bhxI2PGjKGioqJV9Y0fP56+ffvSt29f+vXrx8SJEwE49thjWblyJW+99RbPPPMMF1988d5tduzYAcC4ceO44ooruOSSS7jwwgtbdVwz6/y6fIBD83dj9OjRgz179gC873a7iODHP/4xZ5/9/g9jX7hwIQcddND72q666ipmzZrF66+/zhe/+MVW1/aBD3xg73y3bt32Lnfr1o1du3axZ88e+vfvv/cKPt8dd9zBokWLePTRR6murmbFihWt/gViZp1Xlx8DP/XUU3nooYd499132bZtG7/85S/3rquqqmLZsmUA73th8eyzz+b2229n586dALz88su8/fbbTe7/ggsu4PHHH2fJkiX7BD5A37592bZtW5vrP/jggxk+fDhz584Fcr9cnnvuOSA3Nn7SSSdx0003ceihh7Ju3bo2H8fMOp8ufwU+duxYLr30Uqqrqzn88MM55ZRT9q67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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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JHr16tWo/3wc4Ga2D4d322js6+4ANzPLs2XLFn784x/vmV+7di3nnXdeG1ZUvwN6DLxs2iNtXUKLqpr5mbYuwTqAYv8etdXP7a5du+jcuXOD/WoC/MorrwSgb9++3H///S1dXpP4CNzM2p3vfve7HHPMMZx22mlcdNFF3HRT7mZJY8eO3XM196ZNm6j5aI5du3YxdepUTjzxRI4//njuuOMOABYtWsS4ceP4/Oc/z7Bhw/jmN7/Jrbfeumc/119/PT/84Q/32ve0adN47bXXKC8vZ+rUqVRVVTF0aO5OeHPnzuXss89m4sSJDBw4kNtuu42bb76ZESNGcPLJJ/POO+8A8NprrzFhwgROOOEETjnlFF5++WUAFixYwNChQxk+fDhjxoxp9ut0QB+Bm1l6li9fzvz581mxYgU7d+5k5MiRnHDCCftdZ86cOXTv3p2lS5eyY8cORo8ezemnnw7AkiVLqKysZODAgVRVVXHOOedw9dVXs3v3bubPn8+SJUv22tbMmTOprKxk5cqVAFRVVe21vLKykhUrVrB9+3YGDRrEjTfeyIoVK/jKV77CXXfdxTXXXMOUKVO4/fbbGTx4MIsXL+bKK6/kqaeeYsaMGTz++OP069ePLVu2NPu1coCbWbvym9/8hkmTJvHhD38YgDPPPLPBdZ544glWrVq1Z6jjj3/8I2vWrOHggw9m1KhRe07LKysro1evXqxYsYL169czYsQIevXq1aj6xo0bR0lJCSUlJXTv3p2JEycCMGzYMFatWsW2bdt49tlnOf/88/ess2PHDgBGjx7NJZdcwgUXXMA555zTqP3WxQFuZu1OfWdjHHTQQezevRtgr9PtIoIf/ehHnHHGGXv1X7RoEYceeuhebZdffjlz587l7bff5tJLL210bR/60If2THfq1GnPfKdOndi5cye7d++mR48ee47g891+++0sXryYRx55hPLyclauXNnoPyD5PAZuZu3KmDFjeOCBB3j//ffZunUrv/rVr/YsKysrY/ny5QB7vbF4xhlnMGvWLD744AMAXnnlFd577706tz9p0iQee+wxli5duk/gA5SUlLB169Ym13/YYYcxcOBAFixYAOT+uDz//PNAbmz8pJNOYsaMGfTu3Zs333yzyfuBRgS4pM6SVkh6OJvvKWmhpDXZ8+HNqsTMDBg5ciQXXngh5eXlnHvuuZxy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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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R6P/YnK4m1nRHOytoynH3eFuZlaE9957jzvvvHPn/Jo1azjnnHNasaJd85i7tTmVEx5v7RKa1cqbv9zaJRSl3L+H1nre27dvp3379g32qw33yy67DIBevXoxffr05i6vyXzmbmZtxk033cRhhx3GySefzAUXXMCtt+a+JGvEiBE773LfsGEDtR9nsn37dsaPH88xxxzDUUcdxT333APArFmzOPHEE/na177GkUceyY9//GNuv/32nfu55ppr+MUvfvGxfU+YMIE33niDwYMHM378eFauXMnAgblvR5w0aRJnnnkmo0ePpm/fvtxxxx3cdtttDBkyhOOOO4533nkHgDfeeINTTz2Vo48+muOPP55XX30VgGnTpjFw4EAGDRrECSecUJZj5TN3M2sT5s+fz9SpU1mwYAHbtm1j6NChHH300btc595776Vr167MnTuXLVu2MHz4cE455RQA5syZw+LFi+nbty8rV67k7LPP5oorrmDHjh1MnTqVOXPmfGxbN998M4sXL2bhwoUArFy58mPLFy9ezIIFC9i8eTP9+vXjlltuYcGCBXzve9/j/vvv58orr2TcuHHcfffd9O/fn9mzZ3PZZZfx3HPPccMNN/DUU0/Ru3dv3nvvvbIcL4e7mbUJv//97znrrLPYZ599ADj99NMbXOfpp59m0aJFO4dP3n//fZYvX85ee+3FsGHDdl5aWFlZSY8ePViwYAHr1q1jyJAh9OjRo1H1nXjiiXTp0oUuXbrQtWtXRo8eDcCRRx7JokWL+OCDD3jxxRc599xzd66zZcsWAIYPH85FF13Eeeedx9lnn92o/dbH4W5mbUZ9V4106NCBHTt2AHzsksGI4Je//CWjRo36WP9Zs2ax7777fqzt0ksvZdKkSbz99ttcfPHFja5t77333jndrl27nfPt2rVj27Zt7Nixg27duu0888939913M3v2bB5//HEGDx7MwoULG/3iUpfH3M2sTTjhhBN45JFH+Oijj9i0aRO//e1vdy6rrKxk/vz5AB97k3PUqFHcddddbN26FYDXX3+dDz/8sOD2zzrrLJ588knmzp37iRcDgC5durBp06Ym17/ffvvRt29fpk2bBuReeF5++WUgNxZ/7LHHcsMNN9CzZ09Wr17d5P3U8pm7mbUJQ4cO5fzzz2fw4MEccsghHH/88TuXXXXVVZx33nk88MAD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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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UVZW1qS/fBzgZrYXh3dpNPW4O8DNzPJs2bKFn/zkJ3um165dy8UXX1zCihrmMXCrpWLKvFKX0KiqaeeVuoR2pdi/E6X699u1axcdO3ZstF1NgF977bUA9O3blzlz5rR0ec3iHriZtTnf//73OeaYYzjzzDO54ooruOOO3JcljR49es/V3Js2baLm1hy7du1i8uTJnHzyyZx44oncd999ACxYsIAxY8Zw5ZVXcsIJJ/Cd73yHO++8c89+br75Zu66665a+54yZQqrV69m6NChTJ48maqqKgYPzn0T3vTp07nwwgsZN24cAwYM4O677+ZHP/oRw4YN47TTTuOtt94CYPXq1ZxzzjmcdNJJnH766bz88ssAzJ49m8GDBzNkyBBGjRq138fJPXAza1OWLl3KrFmzqKysZOfOnQwfPpyTTjppn+s88MAD9OjRg8WLF7N9+3ZGjhzJWWedBcCiRYtYsWIFAwYMoKqqivHjx3P99deze/duZs2axaJFi2pta9q0aaxYsYJly5YBUFVVVWv5ihUrqKysZNu2bQwcOJDbb7+dyspKvv71r/Pggw9yww03MGnSJO69914GDRrEwoULufbaa3nmmWe49dZbefLJJ+nXrx9btmzZ72PlADezNuW3v/0tF110EYcccggA559/fqPrPPXUUyxfvnzPUMc777zDqlWr6NKlC6eccsqe0/IqKiooKyujsrKSDRs2MGzYMMrKyppU35gxY+jevTvdu3enR48ejBs3DoATTjiB5cuX89577/Hcc89xySWX7Fln+/btAIwcOZKrr76aSy+9lPHjxzdpv/VxgJtZm9PQ2RidOnVi9+7dALVOt4sIfvzjH3P22WfXar9gwQIOPfTQWvMmTpzI9OnTWb9+PV/+8pebXNtBBx2053mHDh32THfo0IGdO3eye/duevbsuacHn+/ee+9l4cKFzJs3j6FDh7Js2bImv4Hk8xi4mbUpo0aN4pFHHuHDDz9k69at/PrXv96zrKKigqVLlwLU+mDx7LPP5p577mHHjh0AvPLKK7z//vv1bv+iiy7iiSeeYPHixXsFPkD37t3ZunVrs+s/7LDDGDBgALNnzwZyby6///3vgdzY+Kmnnsqtt95K7969WbNmTbP3A+6Bm1kbM3z4cC677DKGDh3K0Ucfzemnn75n2Y033sill17KQw89xBlnnLFn/sSJ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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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2vz56DbUbmaHiJ07d1JWVubw7mCSKCsra9FfPi0ZA58QEZURMTafnwEsiogRwKJ83swOAw7vztHS496WNzEvJfumFfLnyW3YlpnZIWHbtm18//vf3ze/YcMGLr/88k6sqGnFjoEH8LSkAO6JiDnAsRGxESAiNtZ/Q0tDkqaRfTs5xx13XGNdzA5QMePxzi6hXVXP/uvOLqFopf5ZdNZr37t3L927d2+2X32A33DDDQAMHjyYhx9+uL3La5Viz8DHRcQYsm8zuVHSucXuICLmRMTYiBhbXn7AnaBmZgf4+te/zoknnsj555/PNddcw7e+lX1Z0vjx4/fdzb1lyxbqP5pj7969TJ8+nTPOOIPTTjuNe+65B4DFixczYcIEPvrRj3Lqqafyla98hTvvvHPffm699Va+853v7LfvGTNmsG7dOiorK5k+fTrV1dWMHJl9E97cuXOZPHkykyZNYtiwYdx11118+9vfZvTo0Zx99tm89dZbAKxbt46LLrqI008/nXPOOYdXXnkFgAULFjBy5EhGjRrFuecWHaNNKuoMPP9mcSJis6RHyL5DcZOkQfnZ9yBgc5urMbMub8WKFcyfP5+VK1eyZ88exowZw+mnn37Qde6991769evHsmXL2LVrF+PGjeOCCy4AYOnSpVRVVTFs2DCqq6uZMmUKN910E3V1dcyfP5+lS5fut63Zs2dTVVXFqlWrAKiurt5veVVVFStXrmTnzp0MHz6cO+64g5UrV/K5z32O++67j5tvvplp06Zx9913M2LECJYsWcINN9zAs88+y6xZs3jqqacYMmQI27Zta/OxajbAJR0JdIuI7fn0BWTfmbgQmArMzp8fa3M1Ztbl/fKXv+Syyy7jve99LwCXXHJJs+s8/fTTrF69et9Qx+9//3vWrl1Lr169OPPMM/ddlldRUUFZWRkrV65k06ZNjB49mrKyshbVN2HCBPr27Uvfvn3p168fkyZNAuDUU09l9erV7Nixg+eff54rrrhi3zq7du0CYNy4cVx77bVceeWVTJkypUX7bUwxZ+DHAo/k7472AP4lIp6UtAx4SNJ1wBvAFQfZhplZ0Zq6GqNHjx7U1dUB7He5XUTw3e9+lwsvvHC//osXL+bII4/cr+36669n7ty5vPnmm3z6059ucW3vec979k1369Zt33y3bt3Ys2cPdXV19O/ff98ZfKG7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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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ftzU680sLVu3bqWiosLh3cEkUVFR0aq/fIoZA58LTCzoaDxwFjAiIo6mzLfhNLPO5fDuHK3d7y0GeHYDos0Fi78KXB8R27I2G1rVq5nZPurtt9/mF7/4xe75devWce6553ZiRU1r6xj4EcBJkn5I7kkm0yJiSWMNJU0l93RyBg0a1FiTfU7VjAc7u4T9Su31n+/sEqwE5f596Kyfh507d9K1a9cW2+0K8CuuuAKA/v37c88997R3eW3S1tMIuwGHknui93Tg39TEsX9EzImI6oiorqzc60pQM7O9/PCHP2TYsGGceuqpTJkyhRtvzI3Sjhs3bvfV3Bs3bmTXrTl27tzJ9OnTOe644xgxYgS33norAAsXLmT8+PF88Ytf5JhjjuF73/seN9100+5+rrnmGn72s5/t0feMGTNYs2YNo0aNYvr06dTW1jJ8eO5JeHPnzuXss89m0qRJDB48mJtvvpmf/OQnjB49mhNPPJHNm3ODFWvWrGHixIkce+yxnHTSSbz00ksALFiwgOHDhzNy5EhOPvnkkvdTW4/A64B7syebL5bUQO5J2/UlV2RmB7Rly5Yxf/58li9fzo4dOxgzZgzHHntss6+57bbb6NOnD0uWLGHbtm2MHTuW0047DYDFixdTU1PD4MGDqa2tZfLkyVx55ZU0NDQwf/58Fi9evMe2rr/+empqalixYgUAtbW1e6yvqalh+fLlbN26lSFDhnDDDTewfPlyvvnNb3LHHXdw1VVXMXXqVGbPns3QoUNZtGgRV1xxBU888QSzZs3ikUceYcCAAbz99tsl76u2Bvj9wCnAQklHAD3IPbHczKwkv//97znnnHM46KCDADjzzDNbfM2jjz7KypUrdw91vPPOO6xevZoePXpw/PHH7z4tr6qqioqKCpYvX8769esZPXo0FRUVrapv/Pjx9O7dm969e9OnTx8mTZoEwDHHHMPKlSt59913efrppznvvPN2v2bbtm0AjB07lksuuYTzzz+fyZMnt6rfxrQY4JLuBsYB/STVAdcCtwO3Z6cWfgBcHH4yhJmVSVNnY3Tr1o2GhgaAPU63iwh+/vOfc/rpp+/RfuHChRx88MF7LLv88suZO3cub775Jpdeemmra/vQhz60e7pLly6757t06cKOHTtoaGigb9++u4/g882ePZtFixbx4IMPMmrUKFasWNHqN5B8xZyF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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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zaxoDvbW0Zzj7nA3MyvCu+++yy9/+cst80uXLuXUU09txYq2zmPutsOpnPhga5fQomqu+ufWLqEo5f49tNbz3rRpE23btm20X124n3feeQB069aNe+65p6XLazafuZvZDuPKK6/kkEMO4dhjj2XcuHFcc03uS7KGDx++5S73VatWUfdxJps2bWLChAkcddRRHHnkkdx0000AzJo1ixEjRvDlL3+ZI444gh/+8Idcf/31W/Zz2WWX8fOf//wT+544cSKLFy+mqqqKCRMmUFNTQ9++uW9HnD59OqeccgqjRo2iV69e3HDDDfzsZz+jf//+fP7zn2fNmjUALF68mBNOOIGBAwcydOhQXnnlFQBmzpxJ37596devH8OGDSvLsfKZu5ntEObNm8eMGTOYP38+GzduZMCAAQwcOHCr69x888106tSJOXPmsH79eoYMGcJxxx0HwOzZs6murqZXr17U1NQwZswYLrzwQjZv3syMGTOYPXv2J7Z11VVXUV1dzYIFCwCoqan5xPLq6mrmz5/PunXr6N27N1dffTXz58/ne9/7HrfeeisXXXQR48ePZ8qUKfTp04dnn32W8847jyeffJLJkyfzyCOP0L17d959992yHC+Hu5ntEP74xz8yevRodt99dwBOOumkRtd59NFHWbhw4Zbhk/fee49Fixax6667Mnjw4C2XFlZWVtKlSxfmz5/P8uXL6d+/P126dGlSfSNGjKBjx4507NiRTp06MWrUKACOOOIIFi5cyAcffMAzzzzDaaedtmWd9evXAzBkyBDOOussTj/9dMaMGdOk/TbE4W5mO4yGrhrZZZdd2Lx5M8AnLhmMCH7xi19w/PHHf6L/rFmz2GOPPT7Rdu655zJ9+nTefvttzj777CbXtttuu22ZbtOmzZb5Nm3asHHjRjZv3kznzp23nPnnmzJlCs8++ywPPvggVVVVLFiwoMkvLvU1OuYuaZqkFZKq89rukrQge9RIWpC1V0r6OG/ZlJKqMzPLDBs2jPvuu4+PP/6YtWvX8tvf/nbLssrKSubNmwfwiTc5jz/+eG688UY2bNgAwGuvvcaHH35YcPujR4/m4YcfZs6cOZ96MQDo2LEja9eubXb9e+65J7169WLmzJlA7oXn+eefB3Jj8UcffTSTJ0+ma9euLFmypNn7qVPMmft04Abg1rqGiDijblrStcB7ef0X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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], "source": [ - "df.plot(kind = 'bar')" + "for i in range (len(query_month)):\n", + " if query_month[i] is not NaN:\n", + " query_month_df = pd.DataFrame(data = {'query times':query_month[i]})\n", + " query_month_df.plot(xlabel='month index',kind = 'bar',title='query times in a month')" ] } ], diff --git a/tour_model_eval/v-measurel_bins_all_user.ipynb b/tour_model_eval/v-measurel_bins_all_user.ipynb index a4af2bd..c74fe3c 100644 --- a/tour_model_eval/v-measurel_bins_all_user.ipynb +++ b/tour_model_eval/v-measurel_bins_all_user.ipynb @@ -3,7 +3,7 @@ { "cell_type": "code", "execution_count": null, - "id": "hungry-polish", + "id": "spoken-acrobat", "metadata": { "scrolled": true }, @@ -28,7 +28,7 @@ { "cell_type": "code", "execution_count": null, - "id": "coupled-transportation", + "id": "solid-decimal", "metadata": {}, "outputs": [], "source": [ @@ -39,7 +39,7 @@ { "cell_type": "code", "execution_count": null, - "id": "interstate-queue", + "id": "acute-departure", "metadata": {}, "outputs": [], "source": [ @@ -49,7 +49,7 @@ { "cell_type": "code", "execution_count": null, - "id": "norwegian-victoria", + "id": "practical-flour", "metadata": {}, "outputs": [], "source": [ @@ -59,7 +59,7 @@ }, { "cell_type": "markdown", - "id": "loved-estonia", + "id": "indirect-retrieval", "metadata": {}, "source": [ "## Bins above cutoff" @@ -67,7 +67,7 @@ }, { "cell_type": "markdown", - "id": "laughing-macintosh", + "id": "deadly-microwave", "metadata": {}, "source": [ "### Original user input" @@ -76,7 +76,7 @@ { "cell_type": "code", "execution_count": null, - "id": "amber-photograph", + "id": "strange-dining", "metadata": {}, "outputs": [], "source": [ @@ -86,7 +86,7 @@ { "cell_type": "code", "execution_count": null, - "id": "collected-throat", + "id": "black-mobility", "metadata": {}, "outputs": [], "source": [ @@ -95,7 +95,7 @@ }, { "cell_type": "markdown", - "id": "headed-dating", + "id": "composite-possibility", "metadata": {}, "source": [ "### After changing language" @@ -104,7 +104,7 @@ { "cell_type": "code", "execution_count": null, - "id": "blank-arnold", + "id": "wanted-mustang", "metadata": { "scrolled": true }, @@ -116,7 +116,7 @@ { "cell_type": "code", "execution_count": null, - "id": "maritime-twins", + "id": "productive-palestine", "metadata": {}, "outputs": [], "source": [ @@ -125,7 +125,7 @@ }, { "cell_type": "markdown", - "id": "consistent-kuwait", + "id": "heard-florist", "metadata": {}, "source": [ "### After converting purposes and replaced mode" @@ -134,7 +134,7 @@ { "cell_type": "code", "execution_count": null, - "id": "confused-sensitivity", + "id": "smaller-creek", "metadata": {}, "outputs": [], "source": [ @@ -144,7 +144,7 @@ { "cell_type": "code", "execution_count": null, - "id": "advance-passing", + "id": "square-importance", "metadata": {}, "outputs": [], "source": [ @@ -153,7 +153,7 @@ }, { "cell_type": "markdown", - "id": "bronze-operations", + "id": "approximate-groove", "metadata": {}, "source": [ "### DataFrame" @@ -162,7 +162,7 @@ { "cell_type": "code", "execution_count": null, - "id": "pacific-reflection", + "id": "studied-saint", "metadata": {}, "outputs": [], "source": [ @@ -176,7 +176,100 @@ }, { "cell_type": "markdown", - "id": "documented-vacation", + "id": "wrapped-rebate", + "metadata": {}, + "source": [ + "#### homogeneity_score" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "suburban-insertion", + "metadata": {}, + "outputs": [], + "source": [ + "homo_df = pd.DataFrame(data={'original user input':homo_score_ori,'after translation':homo_score_sp2en,\n", + " 'after converting purposes and replaced mode':homo_score_cvt}, \n", + " index=['user1','user2','user3','user4','user5','user6','user7','user8',\n", + " 'user9','user10','user11','user12','user13'])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "everyday-conditioning", + "metadata": {}, + "outputs": [], + "source": [ + "homo_df.plot(kind = 'bar',title='homogeneity_score',yticks=(0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1))" + ] + }, + { + "cell_type": "markdown", + "id": "engaged-injury", + "metadata": {}, + "source": [ + "#### completeness_score" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "mighty-consolidation", + "metadata": {}, + "outputs": [], + "source": [ + "comp_df = pd.DataFrame(data={'original user input':comp_score_ori,'after translation':comp_score_sp2en,\n", + " 'after converting purposes and replaced mode':comp_score_cvt},\n", + " index=['user1','user2','user3','user4','user5','user6','user7','user8',\n", + " 'user9','user10','user11','user12','user13'])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "christian-revelation", + "metadata": {}, + "outputs": [], + "source": [ + "comp_df.plot(kind = 'bar',title='completeness_score',yticks=(0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1))" + ] + }, + { + "cell_type": "markdown", + "id": "lovely-particle", + "metadata": {}, + "source": [ + "#### v_measure_score" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "documented-perfume", + "metadata": {}, + "outputs": [], + "source": [ + "v_df = pd.DataFrame(data={'original user input':v_score_ori,'after translation':v_score_sp2en,\n", + " 'after converting purposes and replaced mode':v_score_cvt},\n", + " index=['user1','user2','user3','user4','user5','user6','user7','user8',\n", + " 'user9','user10','user11','user12','user13'])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "published-kruger", + "metadata": {}, + "outputs": [], + "source": [ + "v_df.plot(kind = 'bar',title='v_measure_score',yticks=(0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1))" + ] + }, + { + "cell_type": "markdown", + "id": "large-cement", "metadata": {}, "source": [ "## All bins" @@ -184,7 +277,7 @@ }, { "cell_type": "markdown", - "id": "selected-compiler", + "id": "wrapped-channels", "metadata": {}, "source": [ "### Original user input" @@ -193,7 +286,7 @@ { "cell_type": "code", "execution_count": null, - "id": "tight-contract", + "id": "assigned-pearl", "metadata": {}, "outputs": [], "source": [ @@ -203,7 +296,7 @@ { "cell_type": "code", "execution_count": null, - "id": "regular-shadow", + "id": "rotary-macro", "metadata": {}, "outputs": [], "source": [ @@ -212,7 +305,7 @@ }, { "cell_type": "markdown", - "id": "brutal-trinidad", + "id": "communist-harvard", "metadata": {}, "source": [ "### After changing language" @@ -221,7 +314,7 @@ { "cell_type": "code", "execution_count": null, - "id": "decent-machinery", + "id": "median-speed", "metadata": {}, "outputs": [], "source": [ @@ -231,7 +324,7 @@ { "cell_type": "code", "execution_count": null, - "id": "lasting-synthetic", + "id": "present-installation", "metadata": {}, "outputs": [], "source": [ @@ -240,7 +333,7 @@ }, { "cell_type": "markdown", - "id": "sexual-opportunity", + "id": "armed-former", "metadata": {}, "source": [ "### After converting purposes and replaced mode" @@ -249,7 +342,7 @@ { "cell_type": "code", "execution_count": null, - "id": "periodic-freedom", + "id": "august-maintenance", "metadata": {}, "outputs": [], "source": [ @@ -259,7 +352,7 @@ { "cell_type": "code", "execution_count": null, - "id": "stylish-thailand", + "id": "shaped-strip", "metadata": {}, "outputs": [], "source": [ @@ -268,7 +361,7 @@ }, { "cell_type": "markdown", - "id": "floppy-theory", + "id": "gentle-plenty", "metadata": {}, "source": [ "### DataFrame" @@ -277,7 +370,7 @@ { "cell_type": "code", "execution_count": null, - "id": "british-working", + "id": "architectural-perspective", "metadata": {}, "outputs": [], "source": [ @@ -288,6 +381,99 @@ " index = ['original user input','after translation','after converting purposes and replaced mode'])\n", "all_df" ] + }, + { + "cell_type": "markdown", + "id": "periodic-password", + "metadata": {}, + "source": [ + "#### homogeneity_score" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "theoretical-oliver", + "metadata": {}, + "outputs": [], + "source": [ + "ab_homo_df=pd.DataFrame(data={'original user input':ab_homo_score_ori,'after translation':ab_homo_score_sp2en,\n", + " 'after converting purposes and replaced mode':ab_homo_score_cvt},\n", + " index=['user1','user2','user3','user4','user5','user6','user7','user8',\n", + " 'user9','user10','user11','user12','user13'])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "seasonal-coalition", + "metadata": {}, + "outputs": [], + "source": [ + "ab_homo_df.plot(kind = 'bar',title='homogeneity_score',yticks=(0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1))" + ] + }, + { + "cell_type": "markdown", + "id": "outdoor-pavilion", + "metadata": {}, + "source": [ + "#### completeness_score" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "activated-schedule", + "metadata": {}, + "outputs": [], + "source": [ + "ab_comp_df = pd.DataFrame(data={'original user input':ab_comp_score_ori,'after translation':ab_comp_score_sp2en,\n", + " 'after converting purposes and replaced mode':ab_comp_score_cvt},\n", + " index=['user1','user2','user3','user4','user5','user6','user7','user8',\n", + " 'user9','user10','user11','user12','user13'])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "graphic-revision", + "metadata": {}, + "outputs": [], + "source": [ + "ab_comp_df.plot(kind = 'bar',title='completeness_score',yticks=(0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1))" + ] + }, + { + "cell_type": "markdown", + "id": "golden-philadelphia", + "metadata": {}, + "source": [ + "#### v_measure_score" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "relevant-nebraska", + "metadata": {}, + "outputs": [], + "source": [ + "ab_v_df = pd.DataFrame(data={'original user input':ab_v_score_ori,'after translation':ab_v_score_sp2en,\n", + " 'after converting purposes and replaced mode':ab_v_score_cvt},\n", + " index=['user1','user2','user3','user4','user5','user6','user7','user8',\n", + " 'user9','user10','user11','user12','user13'])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "assisted-franchise", + "metadata": {}, + "outputs": [], + "source": [ + "ab_v_df.plot(kind = 'bar',title='v_measure_score',yticks=(0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1))" + ] } ], "metadata": { diff --git a/tour_model_eval/v-measurel_clusters_above_cutoff_all_users.ipynb b/tour_model_eval/v-measurel_clusters_above_cutoff_all_users.ipynb index 67a0f56..f44bfdc 100644 --- a/tour_model_eval/v-measurel_clusters_above_cutoff_all_users.ipynb +++ b/tour_model_eval/v-measurel_clusters_above_cutoff_all_users.ipynb @@ -3,7 +3,7 @@ { "cell_type": "code", "execution_count": null, - "id": "adverse-recipient", + "id": "secondary-armor", "metadata": {}, "outputs": [], "source": [ @@ -26,7 +26,7 @@ { "cell_type": "code", "execution_count": null, - "id": "pleased-fence", + "id": "smooth-reviewer", "metadata": {}, "outputs": [], "source": [ @@ -37,7 +37,7 @@ { "cell_type": "code", "execution_count": null, - "id": "global-leave", + "id": "accessible-jaguar", "metadata": {}, "outputs": [], "source": [ @@ -47,7 +47,7 @@ { "cell_type": "code", "execution_count": null, - "id": "hundred-surge", + "id": "endangered-device", "metadata": {}, "outputs": [], "source": [ @@ -57,7 +57,7 @@ }, { "cell_type": "markdown", - "id": "funky-darkness", + "id": "prescription-disease", "metadata": {}, "source": [ "## Evaluate clusters above cutoff based on silhouette_score" @@ -65,7 +65,7 @@ }, { "cell_type": "markdown", - "id": "critical-prime", + "id": "fatal-castle", "metadata": {}, "source": [ "### Original user input" @@ -74,7 +74,7 @@ { "cell_type": "code", "execution_count": null, - "id": "copyrighted-vehicle", + "id": "federal-convertible", "metadata": {}, "outputs": [], "source": [ @@ -84,7 +84,7 @@ { "cell_type": "code", "execution_count": null, - "id": "stainless-exposure", + "id": "polyphonic-astronomy", "metadata": {}, "outputs": [], "source": [ @@ -93,7 +93,7 @@ }, { "cell_type": "markdown", - "id": "returning-skiing", + "id": "later-share", "metadata": {}, "source": [ "### After changing language" @@ -102,7 +102,7 @@ { "cell_type": "code", "execution_count": null, - "id": "authorized-complement", + "id": "lesbian-realtor", "metadata": {}, "outputs": [], "source": [ @@ -112,7 +112,7 @@ { "cell_type": "code", "execution_count": null, - "id": "hispanic-drunk", + "id": "defensive-numbers", "metadata": {}, "outputs": [], "source": [ @@ -121,7 +121,7 @@ }, { "cell_type": "markdown", - "id": "united-grade", + "id": "amended-girlfriend", "metadata": {}, "source": [ "### After converting purposes and replaced mode" @@ -130,7 +130,7 @@ { "cell_type": "code", "execution_count": null, - "id": "outer-usage", + "id": "synthetic-debate", "metadata": {}, "outputs": [], "source": [ @@ -140,7 +140,7 @@ { "cell_type": "code", "execution_count": null, - "id": "positive-grass", + "id": "finite-ireland", "metadata": {}, "outputs": [], "source": [ @@ -149,7 +149,7 @@ }, { "cell_type": "markdown", - "id": "assured-oriental", + "id": "inclusive-champagne", "metadata": {}, "source": [ "### DataFrame" @@ -158,7 +158,7 @@ { "cell_type": "code", "execution_count": null, - "id": "authentic-compression", + "id": "protective-appraisal", "metadata": {}, "outputs": [], "source": [ @@ -169,6 +169,101 @@ " index = ['original user input','after translation','after converting purposes and replaced mode'])\n", "df" ] + }, + { + "cell_type": "markdown", + "id": "intended-campaign", + "metadata": {}, + "source": [ + "#### homogeneity_score" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "robust-matthew", + "metadata": {}, + "outputs": [], + "source": [ + "homo_df = pd.DataFrame(data={'original user input':homo_score_ori,'after translation':homo_score_sp2en,\n", + " 'after converting purposes and replaced mode':homo_score_cvt}, \n", + " index=['user1','user2','user3','user4','user5','user6','user7','user8',\n", + " 'user9','user10','user11','user12','user13'])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "surrounded-karma", + "metadata": {}, + "outputs": [], + "source": [ + "homo_df.plot(kind = 'bar',title='homogeneity_score',yticks=(0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1))" + ] + }, + { + "cell_type": "markdown", + "id": "furnished-valve", + "metadata": {}, + "source": [ + "#### completeness_score" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "regulation-storage", + "metadata": {}, + "outputs": [], + "source": [ + "comp_df = pd.DataFrame(data={'original user input':comp_score_ori,'after translation':comp_score_sp2en,\n", + " 'after converting purposes and replaced mode':comp_score_cvt},\n", + " index=['user1','user2','user3','user4','user5','user6','user7','user8',\n", + " 'user9','user10','user11','user12','user13'])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "liked-palestine", + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "comp_df.plot(kind = 'bar',title='completeness_score',yticks=(0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1))" + ] + }, + { + "cell_type": "markdown", + "id": "gorgeous-denver", + "metadata": {}, + "source": [ + "#### v_measure_score" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "quiet-capital", + "metadata": {}, + "outputs": [], + "source": [ + "v_df = pd.DataFrame(data={'original user input':v_score_ori,'after translation':v_score_sp2en,\n", + " 'after converting purposes and replaced mode':v_score_cvt},\n", + " index=['user1','user2','user3','user4','user5','user6','user7','user8',\n", + " 'user9','user10','user11','user12','user13'])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "behavioral-embassy", + "metadata": {}, + "outputs": [], + "source": [ + "v_df.plot(kind = 'bar',title='v_measure_score',yticks=(0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1))" + ] } ], "metadata": { From 11f018beca808057d4bf40d124919d0b48af3fe5 Mon Sep 17 00:00:00 2001 From: Chunrui Huang Date: Tue, 9 Mar 2021 04:15:27 -0800 Subject: [PATCH 10/16] modified evaluation code, got subplots for query times --- .../confirmed_trips_eval_bins_clusters.py | 51 +- tour_model_eval/query_times_all_users.ipynb | 1018 ++++------------- .../v-measurel_all_bins_single_user.ipynb | 108 +- .../v-measurel_bins_all_user.ipynb | 120 +- ...urel_clusters_above_cutoff_all_users.ipynb | 69 +- .../v-measurel_cutoff_bins_single_user.ipynb | 6 +- ...measurel_cutoff_clusters_single_user.ipynb | 10 +- 7 files changed, 413 insertions(+), 969 deletions(-) diff --git a/tour_model_eval/confirmed_trips_eval_bins_clusters.py b/tour_model_eval/confirmed_trips_eval_bins_clusters.py index 4f9652d..a538910 100644 --- a/tour_model_eval/confirmed_trips_eval_bins_clusters.py +++ b/tour_model_eval/confirmed_trips_eval_bins_clusters.py @@ -22,15 +22,31 @@ map_pur_dict = {'course':'school','work_- lunch break':'lunch_break','on_the way home':'home', 'insurance_payment':'insurance'} +def get_user_ls(all_users): + user_ls = [] + for i in range(len(all_users)): + curr_user = 'user' + str(i + 1) + user_ls.append(curr_user) + return user_ls + def filter_data(user,radius): trips = pipeline.read_data(uuid=user, key=esda.CONFIRMED_TRIP_KEY) non_empty_trips = [t for t in trips if t["data"]["user_input"] != {}] - valid_trips = [t for t in non_empty_trips if 'mode_confirm' in t["data"]["user_input"] and - 'purpose_confirm' in t["data"]["user_input"] and 'replaced_mode' in t["data"]["user_input"]] + non_empty_trips_df = pd.DataFrame(t["data"]["user_input"] for t in non_empty_trips) + valid_trips_df = non_empty_trips_df.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False) + valid_trips_idx_ls = valid_trips_df.index.tolist() + valid_trips = [non_empty_trips[i]for i in valid_trips_idx_ls] + sim = similarity.similarity(valid_trips, radius) filter_trips = sim.data - return filter_trips,sim + return filter_trips,sim,trips + +def valid_user(filter_trips,trips): + valid = False + if len(filter_trips) >= 10 and len(filter_trips) / len(trips) >= 0.5: + valid = True + return valid # v_measure_bins takes 5 parameters @@ -45,10 +61,11 @@ def v_measure_bins(all_users,radius,sp2en=None,cvt_pur_mo=None,cutoff=None): v_score = [] for i in range(len(all_users)): user = all_users[i] - filter_trips,sim = filter_data(user,radius) + filter_trips,sim,trips = filter_data(user,radius) - # filter out users that haven't enough trips (at least 10) to analyze - if len(filter_trips) < 10: + # filter out users that haven't enough trips (at least 10 valid trips + # and 50% of total trips are valid) to analyze + if not valid_user(filter_trips,trips): homo_score.append(NaN) comp_score.append(NaN) v_score.append(NaN) @@ -67,11 +84,6 @@ def v_measure_bins(all_users,radius,sp2en=None,cvt_pur_mo=None,cutoff=None): bin_trips = sim.newdata bins = sim.bins - if len(bin_trips) < 10: - homo_score.append(NaN) - comp_score.append(NaN) - v_score.append(NaN) - continue bin_trips_df = pd.DataFrame(data=[trip["data"]["user_input"] for trip in bin_trips]) if sp2en: @@ -111,7 +123,7 @@ def v_measure_bins(all_users,radius,sp2en=None,cvt_pur_mo=None,cutoff=None): for index in bin: bin_ls.append(index) bins_ts = pd.DataFrame(data=[filter_trips[i]["data"]["start_ts"] for i in bin_ls]) - # compare two data frames, return nothing if two data frames are the same + # compare two data frames, the program will continue to score calculation if two data frames are the same assert_frame_equal(bins_ts, bin_trips_ts) homo = metrics.homogeneity_score(labels_true, labels_pred) homo_score.append(float('%.3f' % homo)) @@ -134,10 +146,10 @@ def v_measure_clusters(all_users,radius,sp2en=None,cvt_pur_mo=None): v_score = [] for i in range(len(all_users)): user = all_users[i] - filter_trips,sim = filter_data(user,radius) + filter_trips,sim,trips = filter_data(user,radius) - # filter out users that haven't enough trips (at least 10) to analyze - if len(filter_trips) < 10: + # filter out users that haven't enough trips to analyze + if not valid_user(filter_trips,trips): homo_score.append(NaN) comp_score.append(NaN) v_score.append(NaN) @@ -147,12 +159,6 @@ def v_measure_clusters(all_users,radius,sp2en=None,cvt_pur_mo=None): bin_trips = sim.newdata bins = sim.bins - if len(bin_trips) < 10: - homo_score.append(NaN) - comp_score.append(NaN) - v_score.append(NaN) - continue - # clustering the data only based on sil score (min_cluster = 0) instead of bins number (len(bins)) feat = featurization.featurization(bin_trips) min = 0 @@ -186,7 +192,8 @@ def v_measure_clusters(all_users,radius,sp2en=None,cvt_pur_mo=None): labels_true.append(no_dup_list.index(trip)) labels_pred = feat.labels - # compare the points in cluster_trips and those in feat.points, return nothing if two data frames are the same + # compare the points in cluster_trips and those in feat.points, the program will continue to score calculation + # if the frames are the same cluster_ps = [] for trip in cluster_trips: cluster_ps.append([trip["data"]["start_loc"]["coordinates"][0], diff --git a/tour_model_eval/query_times_all_users.ipynb b/tour_model_eval/query_times_all_users.ipynb index 20164ba..a15e626 100644 --- a/tour_model_eval/query_times_all_users.ipynb +++ b/tour_model_eval/query_times_all_users.ipynb @@ -2,21 +2,12 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, - "id": "pending-avatar", + "execution_count": null, + "id": "inner-sacramento", "metadata": { "scrolled": true }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "storage not configured, falling back to sample, default configuration\n", - "Connecting to database URL localhost\n" - ] - } - ], + "outputs": [], "source": [ "import logging\n", "\n", @@ -33,13 +24,15 @@ "from sklearn import metrics\n", "from pandas.testing import assert_frame_equal\n", "import matplotlib.pyplot as plt\n", - "from matplotlib.ticker import MaxNLocator" + "from matplotlib.ticker import MaxNLocator\n", + "import numpy as np\n", + "# import matplotlib.ticker as ticker" ] }, { "cell_type": "code", - "execution_count": 2, - "id": "handmade-burning", + "execution_count": null, + "id": "subjective-cruise", "metadata": {}, "outputs": [], "source": [ @@ -49,8 +42,8 @@ }, { "cell_type": "code", - "execution_count": 3, - "id": "outstanding-representation", + "execution_count": null, + "id": "posted-broadcasting", "metadata": {}, "outputs": [], "source": [ @@ -59,8 +52,8 @@ }, { "cell_type": "code", - "execution_count": 4, - "id": "needed-backing", + "execution_count": null, + "id": "lesbian-employee", "metadata": {}, "outputs": [], "source": [ @@ -69,8 +62,8 @@ }, { "cell_type": "code", - "execution_count": 5, - "id": "pacific-ranking", + "execution_count": null, + "id": "wound-thomson", "metadata": {}, "outputs": [], "source": [ @@ -79,8 +72,8 @@ }, { "cell_type": "code", - "execution_count": 6, - "id": "minute-anniversary", + "execution_count": null, + "id": "destroyed-attention", "metadata": {}, "outputs": [], "source": [ @@ -94,8 +87,8 @@ }, { "cell_type": "code", - "execution_count": 7, - "id": "chief-renewal", + "execution_count": null, + "id": "breeding-cream", "metadata": {}, "outputs": [], "source": [ @@ -109,43 +102,34 @@ }, { "cell_type": "code", - "execution_count": 8, - "id": "iraqi-festival", + "execution_count": null, + "id": "formed-drive", "metadata": {}, "outputs": [], "source": [ - "def plot_day(query_day_ls): \n", - " query_day_ls_df = pd.DataFrame(data = query_day_ls)\n", - " query_day_df=query_day_ls_df.value_counts(sort = False).rename_axis('query times').to_frame('frequecy').reset_index()\n", - " query_day_df.set_index(['query times'], inplace=True)\n", - " query_day=query_day_df.plot(kind = 'bar',title='query times in a day')\n", - " query_day.yaxis.set_major_locator(MaxNLocator(integer=True))" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "stopped-tractor", - "metadata": {}, - "outputs": [], - "source": [ - "for i in range(len(all_users)):\n", - " user = all_users[i]\n", - " filter_trips,sim = evaluation.filter_data(user,radius)\n", + "# build a base dataframe for query times in January \n", + "date_df = pd.DataFrame(data = {'date':np.arange(1,32),'drop_col':np.arange(1,32)})\n", + "date_df.set_index(['date'], inplace=True)\n", + "\n", + "\n", + "for a in range(len(all_users)):\n", + " user = all_users[a]\n", + " filter_trips,sim,trips = evaluation.filter_data(user,radius)\n", " logging.debug(\"len(filter_trips)is %s \"% len(filter_trips))\n", "\n", - " # filter out users that don't have valid labeled trips\n", - " if len(filter_trips) == 0:\n", + " # filter out users that don't have enough valid labeled trips\n", + " if not evaluation.valid_user(filter_trips,trips):\n", " query_day.append(NaN)\n", - " query_month.append(NaN)\n", + " query_month.append(NaN) \n", " continue\n", " \n", " sim.bin_data()\n", " sim.delete_bins()\n", " bins = sim.bins\n", " \n", - " # collect query trips indices above cutoff\n", + " # collect query trips and common trips(no need to query) indices above cutoff\n", " ab_trip_ls = []\n", + " no_query_trip_ls = []\n", " for bin in bins:\n", " early_trip = filter_trips[bin[0]]\n", " trip_index = 0\n", @@ -161,6 +145,10 @@ " early_trip = compare_trip\n", " trip_index = i\n", " ab_trip_ls.append(bin[trip_index])\n", + " \n", + " for k in range(len(bin)):\n", + " if k != trip_index:\n", + " no_query_trip_ls.append(bin[k])\n", "\n", "\n", " \n", @@ -174,7 +162,8 @@ " bl_trip_ls.append(index)\n", " \n", " # whole list of query trips indices\n", - " query_trips_ls=ab_trip_ls+bl_trip_ls \n", + " query_trips_ls=ab_trip_ls+bl_trip_ls\n", + " \n", " \n", " # collect query times in a day\n", " bin_day = []\n", @@ -190,11 +179,23 @@ " query_day_ls = []\n", " for bin in bin_day:\n", " query_day_ls.append(len(bin))\n", + " \n", + " # collect 0 query days \n", + " for trip_index in no_query_trip_ls:\n", + " trip = filter_trips[trip_index]\n", + " match = False\n", + " for bin in bin_day:\n", + " if match_day(trip,bin):\n", + " match = True\n", + " break\n", + " if not match:\n", + " query_day_ls.append(0)\n", + " \n", "\n", " # collect query times in a day for every user\n", " query_day.append(query_day_ls)\n", " \n", - " \n", + " \n", " # collect query times in a month\n", " bin_month = []\n", " for trip_index in query_trips_ls:\n", @@ -211,652 +212,120 @@ " query_month_ls.append(len(bin))\n", "\n", " # collect query times in a month for every user\n", - " query_month.append(query_month_ls)\n" + " query_month.append(query_month_ls)\n", + " \n", + " # select the trips that are in Jan 2021\n", + " jan_trips = []\n", + " for trip_index in query_trips_ls:\n", + " if filter_trips[trip_index]['data']['start_local_dt']['year']==2021 and filter_trips[trip_index]['data']['start_local_dt']['month']==1:\n", + " jan_trips.append(trip_index)\n", + " \n", + " # create the data frame for query times in Jan 2021\n", + " date = []\n", + " for trip_index in jan_trips:\n", + " trip_date = filter_trips[trip_index]['data']['start_local_dt']['day']\n", + " date.append(trip_date)\n", + " new_date_df = pd.DataFrame(data = date)\n", + " new_date_df=new_date_df.value_counts(sort = False).rename_axis('date').to_frame('user'+str(a+1)).reset_index()\n", + " new_date_df.set_index(['date'], inplace=True)\n", + " date_df = date_df.join(new_date_df,how='outer')\n", + "date_df=date_df.drop(columns=['drop_col'])" ] }, { "cell_type": "code", - "execution_count": 10, - "id": "victorian-rating", + "execution_count": null, + "id": "functional-proposal", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[[5,\n", - " 6,\n", - " 6,\n", - " 9,\n", - " 8,\n", - " 1,\n", - " 1,\n", - " 1,\n", - " 4,\n", - " 1,\n", - " 1,\n", - " 2,\n", - " 2,\n", - " 1,\n", - " 3,\n", - " 2,\n", - " 2,\n", - " 2,\n", - " 2,\n", - " 1,\n", - " 2,\n", - " 2,\n", - " 2,\n", - " 2,\n", - " 3,\n", - " 2,\n", - " 1,\n", - " 2,\n", - " 2,\n", - " 2,\n", - " 1,\n", - " 1,\n", - " 1,\n", - " 3,\n", - " 2,\n", - " 2,\n", - " 2,\n", - " 1,\n", - " 1,\n", - " 5,\n", - " 4,\n", - " 3,\n", - " 2,\n", - " 4,\n", - " 2,\n", - " 4,\n", - " 2,\n", - " 3,\n", - " 1],\n", - " nan,\n", - " [2,\n", - " 4,\n", - " 3,\n", - " 4,\n", - " 2,\n", - " 4,\n", - " 7,\n", - " 2,\n", - " 5,\n", - " 6,\n", - " 3,\n", - " 3,\n", - " 9,\n", - " 1,\n", - " 2,\n", - " 7,\n", - " 2,\n", - " 5,\n", - " 2,\n", - " 6,\n", - " 1,\n", - " 1,\n", - " 2,\n", - " 1,\n", - " 1,\n", - " 6,\n", - " 2,\n", - " 3,\n", - " 6,\n", - " 2,\n", - " 1,\n", - " 2,\n", - " 5,\n", - " 1,\n", - " 3,\n", - " 3,\n", - " 9,\n", - " 4,\n", - " 6,\n", - " 4,\n", - " 5,\n", - " 2,\n", - " 3,\n", - " 4,\n", - " 1,\n", - " 1,\n", - " 3,\n", - " 1,\n", - " 1],\n", - " [3,\n", - " 2,\n", - " 1,\n", - " 1,\n", - " 3,\n", - " 3,\n", - " 3,\n", - " 3,\n", - " 1,\n", - " 4,\n", - " 2,\n", - " 4,\n", - " 2,\n", - " 2,\n", - " 4,\n", - " 1,\n", - " 1,\n", - " 2,\n", - " 2,\n", - " 4,\n", - " 2,\n", - " 2,\n", - " 3,\n", - " 2,\n", - " 1,\n", - " 2,\n", - " 4,\n", - " 4,\n", - " 1,\n", - " 1,\n", - " 1,\n", - " 2,\n", - " 1,\n", - " 2,\n", - " 2,\n", - " 2,\n", - " 2,\n", - " 1,\n", - " 1,\n", - " 2,\n", - " 1,\n", - " 1,\n", - " 2,\n", - " 3,\n", - " 2],\n", - " [2, 1, 2, 2],\n", - " [2,\n", - " 3,\n", - " 3,\n", - " 1,\n", - " 3,\n", - " 3,\n", - " 2,\n", - " 2,\n", - " 2,\n", - " 3,\n", - " 2,\n", - " 2,\n", - " 2,\n", - " 3,\n", - " 2,\n", - " 1,\n", - " 3,\n", - " 1,\n", - " 5,\n", - " 2,\n", - " 1,\n", - " 2,\n", - " 2,\n", - " 3,\n", - " 2,\n", - " 1,\n", - " 5,\n", - " 3,\n", - " 4,\n", - " 1,\n", - " 2,\n", - " 2,\n", - " 5,\n", - " 2,\n", - " 4,\n", - " 2,\n", - " 2,\n", - " 3,\n", - " 1,\n", - " 3,\n", - " 2,\n", - " 1,\n", - " 1,\n", - " 1],\n", - " [2, 3, 3, 1, 2, 2, 4, 2, 2, 4, 2, 2, 2, 1, 2, 1, 1, 2, 2, 3, 1, 3, 2, 1],\n", - " [3,\n", - " 8,\n", - " 8,\n", - " 9,\n", - " 1,\n", - " 7,\n", - " 2,\n", - " 8,\n", - " 12,\n", - " 8,\n", - " 11,\n", - " 4,\n", - " 6,\n", - " 9,\n", - " 4,\n", - " 6,\n", - " 4,\n", - " 5,\n", - " 4,\n", - " 5,\n", - " 5,\n", - " 8,\n", - " 11,\n", - " 4,\n", - " 9,\n", - " 9,\n", - " 6,\n", - " 3,\n", - " 1,\n", - " 3,\n", - " 1,\n", - " 12,\n", - " 4,\n", - " 2,\n", - " 9,\n", - " 6,\n", - " 3,\n", - " 15,\n", - " 1,\n", - " 2,\n", - " 4,\n", - " 6,\n", - " 3,\n", - " 6,\n", - " 1,\n", - " 2,\n", - " 1,\n", - " 3,\n", - " 4,\n", - " 2,\n", - " 4,\n", - " 5,\n", - " 2,\n", - " 1,\n", - " 1],\n", - " [2,\n", - " 1,\n", - " 5,\n", - " 2,\n", - " 2,\n", - " 4,\n", - " 2,\n", - " 5,\n", - " 3,\n", - " 5,\n", - " 8,\n", - " 6,\n", - " 5,\n", - " 7,\n", - " 1,\n", - " 2,\n", - " 4,\n", - " 2,\n", - " 1,\n", - " 1,\n", - " 1,\n", - " 4,\n", - " 3,\n", - " 4,\n", - " 4,\n", - " 8,\n", - " 5,\n", - " 8,\n", - " 3,\n", - " 2,\n", - " 4,\n", - " 2,\n", - " 4,\n", - " 3,\n", - " 3,\n", - " 6,\n", - " 4,\n", - " 8,\n", - " 1,\n", - " 1,\n", - " 1,\n", - " 1,\n", - " 1,\n", - " 1,\n", - " 3,\n", - " 3,\n", - " 3,\n", - " 4,\n", - " 16,\n", - " 5,\n", - " 5,\n", - " 4,\n", - " 5],\n", - " [10,\n", - " 4,\n", - " 3,\n", - " 14,\n", - " 3,\n", - " 1,\n", - " 8,\n", - " 5,\n", - " 2,\n", - " 5,\n", - " 5,\n", - " 4,\n", - " 3,\n", - " 4,\n", - " 4,\n", - " 4,\n", - " 1,\n", - " 4,\n", - " 8,\n", - " 2,\n", - " 2,\n", - " 2,\n", - " 2,\n", - " 2,\n", - " 2,\n", - " 3,\n", - " 5,\n", - " 2,\n", - " 7,\n", - " 6,\n", - " 2,\n", - " 4,\n", - " 4,\n", - " 4,\n", - " 1,\n", - " 2,\n", - " 1],\n", - " [3, 2, 3, 1, 2, 1, 6],\n", - " nan,\n", - " [10,\n", - " 5,\n", - " 8,\n", - " 6,\n", - " 3,\n", - " 5,\n", - " 4,\n", - " 9,\n", - " 7,\n", - " 6,\n", - " 7,\n", - " 2,\n", - " 6,\n", - " 5,\n", - " 7,\n", - " 3,\n", - " 3,\n", - " 3,\n", - " 4,\n", - " 10,\n", - " 7,\n", - " 2,\n", - " 4,\n", - " 4,\n", - " 8,\n", - " 10,\n", - " 7,\n", - " 6,\n", - " 7,\n", - " 9,\n", - " 6,\n", - " 3,\n", - " 5,\n", - " 7,\n", - " 3,\n", - " 5,\n", - " 6,\n", - " 13,\n", - " 4,\n", - " 5,\n", - " 6,\n", - " 6,\n", - " 8,\n", - " 7,\n", - " 4,\n", - " 4,\n", - " 5,\n", - " 2,\n", - " 6,\n", - " 3,\n", - " 8,\n", - " 15,\n", - " 10,\n", - " 7,\n", - " 4,\n", - " 6,\n", - " 5,\n", - " 3,\n", - " 5,\n", - " 7,\n", - " 5,\n", - " 8,\n", - " 2,\n", - " 10,\n", - " 5,\n", - " 8,\n", - " 4,\n", - " 4,\n", - " 4,\n", - " 1,\n", - " 2,\n", - " 2,\n", - " 5,\n", - " 4,\n", - " 9,\n", - " 5,\n", - " 5,\n", - " 11,\n", - " 4,\n", - " 5,\n", - " 3,\n", - " 5,\n", - " 4,\n", - " 5,\n", - " 8,\n", - " 3,\n", - " 1]]" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "query_day" ] }, { "cell_type": "code", - "execution_count": 11, - "id": "victorian-venue", + "execution_count": null, + "id": "logical-adolescent", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[[26, 61, 18, 7, 12],\n", - " nan,\n", - " [36, 52, 75],\n", - " [42, 28, 25],\n", - " [2, 3, 2],\n", - " [14, 38, 50],\n", - " [18, 7, 24, 1],\n", - " [131, 148, 4],\n", - " [71, 91, 28, 8],\n", - " [48, 50, 47],\n", - " [16, 2],\n", - " nan,\n", - " [153, 182, 152]]" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "query_month" ] }, { "cell_type": "markdown", - "id": "seven-istanbul", + "id": "ruled-dictionary", "metadata": {}, "source": [ "### Plot query times in a day" ] }, { - "cell_type": "markdown", - "id": "supreme-search", + "cell_type": "code", + "execution_count": null, + "id": "biological-middle", "metadata": {}, + "outputs": [], "source": [ - "Note: frequecy represents the number of days have specific query times. Each graph represents query times for a user" + "# show query times in a data frame\n", + "base = 0\n", + "for i in range (len(query_day)):\n", + " if query_day[i] is not NaN:\n", + " query_day_ls_df = pd.DataFrame(data = query_day[i])\n", + " query_day_df=query_day_ls_df.value_counts(sort = False).rename_axis('query times').to_frame('user'+str(i+1)).reset_index()\n", + " query_day_df.set_index(['query times'], inplace=True)\n", + " base = i\n", + " break\n", + " \n", + "for i in range (base+1,len(query_day)):\n", + " if query_day[i] is not NaN:\n", + " new_day_df = pd.DataFrame(data = query_day[i])\n", + " new_day_df = new_day_df.value_counts(sort = False).rename_axis('query times').to_frame('user'+str(i+1)).reset_index()\n", + " new_day_df.set_index(['query times'], inplace=True)\n", + " query_day_df=query_day_df.join(new_day_df,how='outer',sort='query times')\n", + " \n", + "query_day_df" ] }, { "cell_type": "code", - "execution_count": 12, - "id": "corresponding-graphics", + "execution_count": null, + "id": "revised-venice", + "metadata": {}, + "outputs": [], + "source": [ + "# plot a graph for all valid users\n", + "yticks_max = query_day_df.max().max()\n", + "graph_day = query_day_df.plot(kind='bar',figsize=(14,16),title='query times in a day',fontsize=18,yticks=np.arange(0, yticks_max+4, step=4))\n", + "graph_day.title.set_size(20)\n", + "plt.xlabel('query times',fontsize=16)\n", + "plt.ylabel('days', fontsize=16)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "requested-canyon", "metadata": { "scrolled": false }, - "outputs": [ - { - "data": { - "image/png": "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OrW8A9zMCtXU1MSuu+7KyJEjfZ9IF0QEa9eupampif32269T7/HTCM2sUO+//z5DhgxxeHeRJIYMGdKlv1wc4GZWOId393R1vznAzWybM3PmTA4++GDOOOOMWpfSo9wGXoWRl95V+DpXX3V84es0q6Wif0868zvygx/8gPnz53+iLXnjxo307bttRZ7PwM1sm3L++eezatUqTjzxRAYNGkRDQwNTpkzhzDPPpLm5mZNPPpmJEycyceJEHnoo+9KitWvXMmXKFMaNG8d5553HvvvuyxtvvMHq1asZPfrjb6a75ppruOKKKwB44YUXmDp1KhMmTOCoo45i5cqVAKxZs4Zp06YxZswYxowZw+LFi/ne977HjBkzNq/nsssuY+bMmVV/1m3rcGRm271Zs2axYMECFi5cyHXXXccdd9zBgw8+yIABAzj99NO55JJLOPLII3nppZc47rjjWLFiBVdeeSVHHnkk06dP56677mL27NkVt9PQ0MCsWbMYNWoUjz76KBdccAH3338/F110Eccccwy33347mzZtYsOGDQwbNoyTTjqJiy++mJaWFm655RYee+yxqj+rA9zMtmknnngiAwYMAOC+++5j+fLlm+etX7+et99+m0WLFnHbbdljno4//nh23333Dte5YcMGFi9ezCmnnLJ52gcffADA/fffz49+lH1ndJ8+fRg0aBCDBg1iyJAhPPXUU6xZs4Zx48YxZMiQqj+bA9zMtmkDBw7cPNzS0sLDDz+8OdBLtdUDpG/fvrS0tGweb+3i19LSwuDBg1myZMkW72nPueeey0033cRrr73G2Wef3ZWP0C63gZvZdmPKlClcd911m8dbA/joo49m7ty5AMyfP59169YBsMcee/D666+zdu1aPvjgA+68804AdtttN/bbbz/mzZsHZDfhLF26FIBjjz2W66+/HoBNmzaxfn329O1p06axYMECHn/8cY47rpjHRjnAzWy7MXPmTBobGzn88MM55JBDmDVrFgCXX345ixYtYvz48dxzzz2MGDECgH79+jF9+nSOOOIITjjhBEq/z2Du3LnMmTOHMWPGcOihh/Lzn/8cgBkzZrBw4UIOO+wwJkyYwLPPPgvAjjvuyOc//3lOPfVU+vTpU8jnqfidmEXa1p4H7m6EZltasWIFBx98cK3LqMrIkSNpbGxk6NChha2zpaWF8ePHM2/e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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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c9myZQtnnXUW48ePZ/z48dx7b/alRU1NTUyePJkxY8Zw4YUXcvjhh/P888+zceNGjjvujW+mmz17NpdffjkATz75JFOnTmXcuHGcfPLJPPbYYwBs3ryZ6dOnM3r0aEaPHs3y5cv58pe/zJw5c3a1c+mllzJ37tyK3+vetTkys7e8efPmsXjxYpYuXcpVV13Frbfeyj333MOAAQP4+Mc/zhe+8AVOOukknnrqKaZMmcK6deu44oorOOmkk5g1axa333478+fP73A5DQ0NzJs3j5EjR3L//fdz8cUXs2TJEi655BJOPfVUbr75Znbu3Mn27dsZNmwYZ555JjNmzKC5uZkbbriBBx54oOL36gA3s73a6aefzoABAwC46667WLt27a5pW7duZdu2bSxbtoybbsq+jnXatGkcfPDB7ba5fft2li9fztlnn71r3KuvvgrAkiVL+OEPs++M7tOnD4MGDWLQoEEMGTKEhx56iM2bNzNmzBiGDBlS8XtzgJvZXu2AAw7YNdzc3Mx99923K9BLtXYGSN++fWlubt71vOUUv+bmZgYPHszq1as7XccFF1zAtddey6ZNm/jsZz/blbfQJveBm9lbxuTJk7nqqqt2PW8J4FNOOYUFCxYAsGjRIl544QUADjnkEJ577jmampp49dVXue222wAYOHAgI0aMYOHChUB2Ec7DDz8MwKRJk/jud78LwM6dO9m6dSsA06dPZ/HixTz44INMmTKlkPfjADezt4y5c+eyYsUK3vOe9zBq1CjmzZsHwGWXXcayZcsYO3Ysd955J7W1tQD069ePWbNmMWHCBE477TSOPvroXW0tWLCAa665htGjR3Psscdyyy23ADBnzhyWLl3K8ccfz7hx43j00UcB2HfffXnf+97HOeecQ58+fQp5Pz36nZj19fXRmfuBp3J6Xip1mvWkdevWccwxx1S7jIq0fHfB0KFDC2uzubmZsWPHsnDhQkaOHNnmfK2tP0krI6K+fF7vgZuZ7WFr167lyCOPZNKkSe2Gd1f5IKaZWZmNGzcW2t6oUaNYv359oW2C98DNzJLlADezwvXksbW9SVfXmwPczArVv39/mpqaHOJd1HI/8P79+3f6Ne4DN7NCDR8+nMbGRrZs2VLtUpLT8o08neUAN7NC9evXr9PfKGOV6bALRdL3JD0naU3JuLdJ+rmkx/Of7d84wMzM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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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aEX1UdvuK6le2fevfTP/XrbWy9Qp+xJODR8+vPXsN6m56medKrQj275yTofL3HTTTVq2bNkb+nsPHDigfv142ivS0tV/H71dMfmQsqIuz4uI1yPiNEnDJJ1u+01fIxQRN0fEhIiYMHhwm3dBltWll16qLVu2aMaMGaqqqlJdXZ2mTp2qCy+8UDt27NB5552niRMnauLEiXr00ewLMxobGzV16lTV1tbqkksu0YgRI7Rz505t27ZNY8b8cRPMnTtX1113nSTpmWee0fTp0zV+/HidccYZevLJJyVJ27dv18yZMzV27FiNHTtWK1eu1Be/+EXNmzevpZ2rr75a8+fP776NAuCQ0KnrqCPiZUkPSZpekmpKaMGCBRoyZIiWL1+uK6+8UvX19Vq6dKluv/12XXHFFbryyiu1atUq3XXXXZozZ44k6frrr9f73vc+rV27VjNmzNCzzz7b4Xrq6ur0jW98Q/X19Zo7d64uu+wySdLll1+us846S+vXr9eaNWs0evRozZ49W7fddpskqampSYsXL6ZbBsCbdPiZ3/ZgSa9FxMu2+0v6gLLvnzukzZgxQ/3795ckPfDAA9q0aVPLvN27d2vPnj1asWKF7r47+2q/c845R0cdddRbtrl3716tXLlSs2bNapm2f/9+SdKDDz6o7343+57Rvn37qqqqSlVVVaqurtbatWu1fft21dbWqrq6ukvfJ4BDXzGds++WdFveT91H0h0RcU9pyyq9ww8/vGW4qalJjz32WEtwF2rrqot+/fqpqampZbz58rmmpiYNHDhQ69atK7qOOXPmaOHChXrxxRd18cUXd+YtAOglirnq4/GIqI2IUyNiTET8S3cU1p2mTp2qG2+8sWW8OWjPPPNMLVq0SJK0bNky7dq1S5J09NFH66WXXlJjY6P279+ve+7J9ltHHnmkRo4cqSVLlkjKblhZv369JGnKlCn61re+JUl6/fXXtXv3bknSzJkzde+992rVqlWaNm1aN7xbAIcanvWh7LK91atX69RTT9WoUaO0YMECSdK1116rFStWaNy4cbr//vtbrmapqKjQNddco0mTJuncc8/VSSed1NLWokWLdMstt2js2LEaPXq0li5dKkmaN2+eli9frlNOOUXjx4/Xxo0bJUmHHXaY3v/+9+v8889X3759u/mdAzgUlOQ7EydMmBCtn0e9efNmnXzy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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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dtqJt73tbRNdylNqEH3g7wa+PNLMJPPoPXyVWbNmjbSY1hOzj7t4oksY1eKTDpnoErQWBv1vaiy//09/+tNccsklT+pLfvzxx5k8ecM67dfXZYRJjqf3+K0RH0JbVfOram5VzZ0x40/uBJWkgTr66KO58847Oeyww5g2bRrz5s3jwAMP5Mgjj2TZsmW84Q1vYJ999mGfffbh2mt7Dy1avnw5Bx54IHPmzOF973sf2267Lffffz+LFy9m113/+GS6k08+mY997GMA3HHHHRx88MHsvffevOxlL+P2228HYOnSpRx++OHsscce7LHHHlx33XV89KMf5ZRTTlnVzvHHH8+pp57a97aO++MoyTuBQ4EDyu+klbSeOP3007n00ku58sorOe200/jmN7/JNddcw8Ybb8xb3/pWPvShD7Hffvtx9913c9BBB7Fo0SI+/vGPs99++3HCCSdw8cUXM3/+/FHXM2/ePE4//XR22GEHrr/+et7//vdzxRVXcMwxx/CKV7yCCy+8kCeeeIKHH36Yrbfemte//vUce+yxrFixgnPPPZcf/OAHfW/ruAI8ycH0nn34iqr6Xd9VSNJT5LDDDmPjjTcG4PLLL+e2225bNe/BBx/koYce4uqrr+aCC3qPYz3kkEPYcsst19jmww8/zHXXXccRRxyxatqjjz4KwBVXXMEXvtB7ZvSkSZOYNm0a06ZNY/r06dx0000sXbqUOXPmMH369L63bdQAT3IOsD+wVZIlwIn0rjp5JvDt7qzp96vq6L6rkaQB22STTVYNr1ixgu9973urAn2o1V0BMnnyZFasWLFqfOUlfitWrGCLLbZg4cKFY67jve99L2eddRb33nsv7373u9dmE0Y0lqtQ3lJVz6+qKVU1s6rOrKrtq+oFVbVn9zK8Ja33DjzwQE477bRV4ysD+OUvfzlnn907lXfJJZfwwAMPAPDc5z6X++67j+XLl/Poo49y0UUXAbD55puz3Xbbcd555wG9m3BuvvlmAA444AA+85nPAPDEE0/w4IMPAnD44Ydz6aWX8sMf/pCDDjpoINvjd6FIeto49dRTWbBgAbvvvjs777wzp59+OgAnnngiV199NXvttReXXXbZqivmpkyZwgknnMC+++7LoYceyo477riqrbPPPpszzzyTPfbYg1122YWvf/3rAJxyyilceeWV7Lbbbuy9997c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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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2wpQd96d7Xrc8kvGVrkTs/b/Pbakkr/Tyy+/nBkzZnxovHfdunX07Ll57X5rdYs6IpaSXR3j92QXMF1Idgmn5stNjYj6iKivqSn7LUgzs6o588wzWbZsGePGjaNfv340NDQwevRoTjnlFFatWsXxxx/PyJEjGTlyJA8+mF0EZ/Xq1YwePZrhw4dzxhlnsPPOO/PKK6+wfPly9tnngyuaTZo0iYsuugiAZ555hjFjxnDAAQdwyCGH8MQTTwCwcuVKxo8fz7Bhwxg2bBgPPfQQ3//+95k8efKG9Zx//vlMmTKlw8+1op2JEXFVRIyIiEPJruD8VIcrm5l1wBVXXMGgQYO47777OPfcc5k7dy633347119/PRMnTuTcc89l9uzZ3HzzzUyYMAGAiy++mM985jPMnz+fcePGsWLFilbrNDQ08LOf/Yy5c+cyadIkzjrrLADOOeccDjvsMBYuXMi8efMYOnQop59+Otdeey0A69ev58Ybb6zKsExFnw8kfTwiXpZUS3bliE93uLKZWRWNGzeOPn36AHDPPfewZMmSDfPWrFnD2rVrmTVrFrfckl2uc+zYsWy//fYbXefrr7/OQw89xAknnLDhvnfeeQeAe++9l1/9Krt2cI8ePejXrx/9+vVjwIABzJ8/n5UrVzJ8+HAGDBjQ4edW6UDOzfkY9XvA2RHxaocrm5lV0TbbbLNhev369Tz88MMbgrtUuaMuevbsyfr16zfcbjp8bv369fTv358FCxZU3MeECRO45ppreOmllzjttNPa8hRaVOnQxyERMSQihkXEf1WlsplZQUaPHs1ll1224XZT0B566KFMmzYNgBkzZvDqq9k25w477MDLL7/M6tWreeedd7jjjjsA2G677dhll12YPn06kH1hZeHChQCMGjWKn//85wC8//77rFmzBoDx48dz1113MXv2bI4++uiqPB+f68PMNjtTpkxhzpw57LfffgwZMoQrrrgCgAsvvJBZs2YxYsQIZs6cueEItV69enHBBRdw0EEHcdxxx7HXXnttWNe0adO46qqrGDZsGEOHDuX2228HYPLkydx3333su+++HHDAATz++OMAbLnllhxxxBGceOKJ9OjRoyrPp5BrJtbX14fPR108H55nXWnp0qXsvffeXd1GhzSdO3/gwIFVW+f69esZMWIE06dPZ/fdy383sNxrJ2luRNSX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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXAAAAEZCAYAAACO4n6tAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAYX0lEQVR4nO3df5xVdZ3H8ddbwEAUMJg0JBxSTFFDYJB28wdFAYWri6aVlT/SHd22dNtfsbmhbruPh7u6W/Bgi2W1rJXVDdNMfYBm4JLiqvxSFCwVWJwURLIA8xfMZ/84Z+h6m2HuzD0zd774fj4e98G555z7/X7umeF9z3zPuecoIjAzs/TsV+sCzMyscxzgZmaJcoCbmSXKAW5mligHuJlZohzgZmaJcoBb0iR9VdL1Na5hoaTza9DvRElN3d2v9RzyeeCWCkkTgZsiYlita+kJvD3Me+BWM5J617oGs5Q5wO33SBojaaWkHZL+W9Itkv4hX3aBpAfK1g9JR+bT75B0naRNkrZImiupX75soqQmSV+RtBn4rqQnJP1RSVt9JL0k6YSyPvoDC4Ghknbmj6GSrpJ0U75OfV7LhZKek/SypEsljZf0uKRfS5pT1u7nJa3L171H0uH5fEn6hqQXJf0mf/1xbWyv+yVdXLp98m3wsqQNkj62l209Q9Kz+bZeK2n6XtbtJ+nGvN21wPhK2sp/Jr+SdHzJuu+S9Kqkurb6s57PAW5vIWl/4EfAfwLvBBYAZ3WgiX8CjgJOAI4EDgNmliw/NG/3cKAR+D7w2ZLlHwdeiIjVpY1GxCvAx4DnI+LA/PF8GzVMAEYCnwS+CVwBfAQ4FjhH0qn5e/1j4KvAmUAd8DPg5ryNycAp+XsZlLe1rcJtMAH4OTAE+GfgBklqY91ngZOBgcDVwE2S3t3GulcCR+SPKUD5uHurbUXE68AtvHU7fxq4LyK2VvierCeKCD/82PMgC63nyY+P5POWAf+QT18APFD2miALawGvAEeULPsDYEM+PRF4A+hbsnwosAMYkD+/FfibNmqbCDSVzbuKbBwYoD6v5bCS5duAT5Y8/yHw5/n0QuCikmX7Ab8l+3D5MPAL4APAfu1ss/uBi0u2zzMlyw7Iazq0wu2/GjijjWXrgaklzxvLt0dbbZF9qDzX8l6A5cA5tf5986O6h/fArdxQ4JeR/y/P/V+Fr60jC6wV+XDFr4FF+fwWWyPitZYnke1FPwicJWkQ2V72/GreALClZPrVVp4fmE8fDswqqfVXZB9Ch0XEYmAO8G/AFknzJA2osP/NLRMR8dt88sDWVpR0nqTVJTUcR7bn3pqhZCHc4i0/l721FREPk324nirpaLIP3B9X+H6sh3KAW7kXgMPK/uQfXjL9CllIAyDp0JJlL5EF5LERMSh/DIyI0vBq7bSn75H9eX828FBE/LKN2oo+Zeo54JKSWgdFRL+IWAYQEbMjYhzZ0MtRwF8X2Xk+3v4fwBeBwRExCHiC7EOkNS8A7yl5vufnUmFbLdv5c8CtpR+kliYHuJV7CNgFXCapt6QzgRNLlj8GHCvpBEl9yYYwAIiIZrIQ+YakdwFIOkzSlHb6/BEwFricbEy8LVuAwZIGdvA9tWUu8LeSjgWQNFDS2fn0eEkTJPUh+9B6DdhdUL8t+pN9KG3N+7yQbK+5LT/I6z1Y0jDgSx1s6z+B6WQhvrftbIlwgNtbRMQbZAf1LgBeJjt4d1vJ8l8Afw/cBzwNPFDWxFeAZ4D/lbQ9X+997fT5KtnY9IjSvlpZ7ymyg4zr82GCoR15b620dzvZQddb8lqfIBvCARhA9mH0MtlQxTbgumr6a6X/tcC/kH1obgGOJxtOasvVeS0bgHvJArnitiKiCVhJFvQ/K+p9WO34izzWLkk3kh0s+7su7GMmcFREfLbdla3TJH2H7EyeLvtZWvfxFyms5iS9E7iIbGzWuoikerK/rsbUthIriodQrKYk/QnZwcSFEbG01vXsqyR9nWyI6NqI2FDreqwYHkIxM0uU98DNzBLlADczS1S3HsQcMmRI1NfXd2eXZmbJW7FixUsR8XsXHuvWAK+vr2f58uXd2aWZWfIktXo5Cw+hmJklygFuZpYoB7iZWaL8TUwzK9Sbb75JU1MTr73mix12VN++fRk2bBh9+vSpaH0HuJkVqqmpiYMOOoj6+nravhGRlYsItm3bRlNTEyNGjKjoNR5CMbNCvfbaawwePNjh3UGSGDx4cIf+cnGAm1nhHN6d09Ht5gA3s33O7NmzOeaYY/jMZz5T61K6VI8bA6+fcXdhbW28ZlphbZlZ5xT5fxoq+3/9rW99i4ULF75lLHnXrl307t3jIq8q3gM3s33KpZdeyvr16zn99NMZOHAgjY2NTJ48mfPOO4+tW7dy1llnMX78eMaPH8+DD2Y3Ldq2bRuTJ09mzJgxXHLJJRx++OG89NJLbNy4keOO+92d6a677jquuuoqAJ599lmmTp3KuHHjOPnkk3nqqacA2LJlC9OnT2f06NGMHj2aZcuW8bWvfY1Zs2btaeeKK65g9uzZVb/XfevjyMze9ubOncuiRYtYsmQJc+bM4c477+SBBx6gX79+nHvuuXz5y1/mpJNOYtOmTUyZMoV169Zx9dVXc9JJJzFz5kzuvvtu5s2b124/jY2NzJ07l5EjR/Lwww/zhS98gcWLF3PZZZdx6qmncvvtt7N792527tzJ0KFDOfPMM7n88stpbm7mlltu4ZFHHqn6vTrAzWyfdvrpp9OvXz8A7rvvPtauXbtn2fbt29mxYwdLly7lttuy27FOmzaNgw8+eK9t7ty5k2XLlnH22Wfvmff6668DsHjxYr7//eye0b169WLgwIEMHDiQwYMHs2rVKrZs2cKYMWMYPHhw1e/NAW5m+7T+/fvvmW5ubuahhx7aE+ilWjsDpHfv3jQ3N+953nKKX3NzM4MGDWL16tUV13HxxRdz4403snnzZj7/+c935C20yWPgZva2MXnyZObMmbPneUsAn3LKKcyfPx+AhQsX8vLLLwNwyCGH8OKLL7Jt2zZef/117rrrLgAGDBjAiBEjWLBgAZB9Ceexxx4DYNKkSXz7298GYPfu3Wzfvh2A6dOns2jRIh599FGmTJlSyPtxgJvZ28bs2bNZvnw573//+xk1ahRz584F4Morr2Tp0qWMHTuWe++9l+HDhwPQp08fZs6cyYQJEzjttNM4+uij97Q1f/58brjhBkaPHs2xxx7LHXfcAcCsWbNYsmQJxx9/POPGjePJJ58EYP/99+dDH/oQ55xzDr169Srk/XTrPTEbGhqiveuB+zRCs7StW7eOY445ptZlVKXl3gVDhgwprM3m5mbGjh3LggULGDlyZJvrtbb9JK2IiIbydb0HbmbWxdauXcuRRx7JpEmT9hreHeWDmGZmZTZu3Fhoe6NGjWL9+vWFtgneAzczS5YD3MwK153H1vYlHd1uDnAzK1Tfvn3Ztm2bQ7yDWq4H3rdv34pf4zFwMyvUsGHDaGpqYuvWrbUuJTktd+SplAPczArVp0+fiu8oY9VpdwhF0nckvSjpiZJ575T0E0lP5//u/cIBZmZWuErGwG8EppbNmwH8NCJGAj/Nn5uZWTdqN8AjYinwq7LZZwDfy6e/B/xxwXWZmVk7OnsWyiER8QJA/u+7iivJzMwq0eUHMSU1Ao3AngvE2L6rqGvZ+Do2Zu3r7B74FknvBsj/fbGtFSNiXkQ0RERDXV1dJ7szM7NynQ3wHwPn59PnA3cUU46ZmVWqktMIbwYeAt4nqUnSRcA1wEclPQ18NH9uZmbdqN0x8Ij4dBuLJhVci5mZdYCvhWJmligHuJlZohzgZmaJcoCbmSXKAW5mligHuJlZohzgZmaJcoCbmSXKAW5mligHuJlZohzgZmaJcoCbmSXKAW5mligHuJlZohzgZmaJcoCbmSXKAW5mligHuJlZohzgZmaJcoCbmSXKAW5mligHuJlZohzgZmaJcoCbmSXKAW5mligHuJlZohzgZmaJcoCbmSXKAW5mlqiqAlzSlyU9KekJSTdL6ltUYWZmtnedDnBJhwGXAQ0RcRzQC/hUUYWZmdneVTuE0hvoJ6k3cADwfPUlmZlZJXp39oUR8UtJ1wGbgFeBeyPi3vL1JDUCjQDDhw/vbHc1VT/j7sLa2njNtMLaKqquImvqiXrqz8+sWtUMoRwMnAGMAIYC/SV9tny9iJgXEQ0R0VBXV9f5Ss3M7C2qGUL5CLAhIrZGxJvAbcAfFlOWmZm1p5oA3wR8QNIBkgRMAtYVU5aZmbWn0wEeEQ8DtwIrgTV5W/MKqsvMzNrR6YOYABFxJXBlQbWYmVkH+JuYZmaJcoCbmSXKAW5mligHuJlZohzgZmaJcoCbmSXKAW5mligHuJlZohzgZmaJcoCbmSXKAW5mligHuJlZohzgZmaJcoCbmSXKAW5mligHuJlZohzgZmaJcoCbmSXKAW5mligHuJlZohzgZmaJcoCbmSXKAW5mligHuJlZohzgZmaJcoCbmSXKAW5mligHuJlZohzgZmaJqirAJQ2SdKukpyStk/QHRRVmZmZ717vK188CFkXEJyTtDxxQQE1mZlaBTge4pAHAKcAFABHxBvBGMWWZmVl7qhlCeS+wFfiupFWSrpfUv3wlSY2SlktavnXr1iq6MzOzUtUEeG9gLPDtiBgDvALMKF8pIuZFRENENNTV1VXRnZmZlaomwJuApoh4OH9+K1mgm5lZN+h0gEfEZuA5Se/LZ00C1hZSlZmZtavas1C+BMzPz0BZD1xYfUlmZlaJqgI8IlYDDQXVYmZmHeBvYpqZJcoBbmaWKAe4mVmiHOBmZolygJuZJcoBbmaWKAe4mVmiHOBmZolygJuZJcoBbmaWKAe4mVmiHOBmZolygJuZJcoBbmaWKAe4mVmiHOBmZolygJuZJcoBbmaWKAe4mVmiHOBmZolygJuZJcoBbmaWKAe4mVmiHOBmZolygJuZJcoBbmaWKAe4mVmiHOBmZomqOsAl9ZK0StJdRRRkZmaVKWIP/HJgXQHtmJlZB1QV4JKGAdOA64spx8zMKlXtHvg3gb8BmguoxczMOqB3Z18o6TTgxYhYIWniXtZrBBoBhg8f3tnuzOxtqn7G3YW0s/GaaYW005NUswf+QeB0SRuBW4APS7qpfKWImBcRDRHRUFdXV0V3ZmZWqtMBHhF/GxHDIqIe+BSwOCI+W1hlZma2Vz4P3MwsUZ0eAy8VEfcD9xfRlpmZVcZ74GZmiXKAm5klygFuZpYoB7iZWaIc4GZmiXKAm5klygFuZpYoB7iZWaIc4GZmiXKAm5klygFuZpYoB7iZWaIc4GZmiXKAm5klygFuZpYoB7iZWaIc4GZmiXKAm5klygFuZpYoB7iZWaIc4GZmiXKAm5klygFuZpYoB7iZWaIc4GZmiXKAm5klygFuZpYoB7iZWaIc4GZmiep0gEt6j6QlktZJelLS5UUWZmZme9e7itfuAv4yIlZKOghYIeknEbG2oNrMzGwvOr0HHhEvRMTKfHoHsA44rKjCzMxs76rZA99DUj0wBni4lWWNQCPA8OHDi+jOLHn1M+4urK2N10wrrC1LS9UHMSUdCPwQ+POI2F6+PCLmRURDRDTU1dVV252ZmeWqCnBJfcjCe35E3FZMSWZmVolqzkIRcAOwLiL+tbiSzMysEtXsgX8Q+BzwYUmr88fHC6rLzMza0emDmBHxAKACazEzsw7wNzHNzBLlADczS5QD3MwsUQ5wM7NEOcDNzBLlADczS5QD3MwsUQ5wM7NEOcDNzBLlADczS5QD3MwsUQ5wM7NEOcDNzBJVyC3VzCx9vs1b5YraVtVuJ++Bm5klygFuZpYoB7iZWaIc4GZmiXKAm5klygFuZpYoB7iZWaIc4GZmiXKAm5klygFuZpYoB7iZWaIc4GZmiXKAm5klygFuZpYoB7iZWaKqCnBJUyX9XNIzkmYUVZSZmbWv0wEuqRfwb8DHgFHApyWNKqowMzPbu2r2wE8EnomI9RHxBnALcEYxZZmZWXsUEZ17ofQJYGpEXJw//xwwISK+WLZeI9CYP30f8PPOl/sWQ4CXCmqrKK6pMq6pcj2xLtdUmSJrOjwi6spnVnNPTLUy7/c+DSJiHjCvin5a71xaHhENRbdbDddUGddUuZ5Yl2uqTHfUVM0QShPwnpLnw4DnqyvHzMwqVU2APwqMlDRC0v7Ap4AfF1OWmZm1p9NDKBGxS9IXgXuAXsB3IuLJwiprX+HDMgVwTZVxTZXriXW5psp0eU2dPohpZma15W9impklygFuZpYoB7iZWaIc4J0k6WhJkyQdWDZ/aq1qyvs/UdL4fHqUpL+Q9PFa1lRO0vdrXUMpSSfl22lyDWuYIGlAPt1P0tWS7pT0T5IG1rCuyyS9p/01u4+k/SWdJ+kj+fNzJc2R9GeS+tS6vu6U/EFMSRdGxHe7uc/LgD8D1gEnAJdHxB35spURMbY76ymp60qya9P0Bn4CTADuBz4C3BMR/1iDmspPLRXwIWAxQEScXoOaHomIE/PpPyH7Wd4OTAbujIhralDTk8Do/OyuecBvgVuBSfn8M7u7pryu3wCvAM8CNwMLImJrLWopqWk+2e/4AcCvgQOB28i2lSLi/BqWt4ekwRGxrUs7iYikH8CmGvS5Bjgwn64HlpOFOMCqGm6LNWSndB4AbAcG5PP7AY/XqKaVwE3ARODU/N8X8ulTa1TTqpLpR4G6fLo/sKZGNa0r3WZly1bX8HdqFdlf6pOBG4CtwCLgfOCgGtX0eP5vb2AL0Ct/rhr+nl8DDMmnG4D1wDPA/3Xl73kSQyiSHm/jsQY4pAYl9YqInQARsZEslD4m6V9p/RID3WVXROyOiN8Cz0bEdoCIeBVorlFNDcAK4ArgNxFxP/BqRPxPRPxPjWraT9LBkgaT7bFtBYiIV4BdNarpCUkX5tOPSWoAkHQU8GaNagKIiGiOiHsj4iJgKPAtYCpZSNXCfvmXBw8i21lpGWJ6B1CrIZRpEdFy3ZNrgU9GxJHAR4F/6apOq7kWSnc6BJgCvFw2X8Cy7i+HzZJOiIjVABGxU9JpwHeA42tQT4s3JB2QB/i4lpn5GGpNAjwimoFvSFqQ/7uF2v/eDST7UBEQkg6NiM358YxafQBfDMyS9HdkF0B6SNJzwHP5slp5y/aIiDfJvnH9Y0n9alMSNwBPkf21eQWwQNJ64ANkV0WthT6SekfELqBfRDwKEBG/kPSOruo0iTFwSTcA342IB1pZ9l8RcW431zOMbG93cyvLPhgRD3ZnPSV9vyMiXm9l/hDg3RGxpgZlldcyDfhgRHy11rWUk3QAcEhEbKhhDQcB7yX7kGuKiC21qiWv56iI+EUta2iNpKEAEfG8pEFkx3k2RcQjNarnS8AfkQ2lnAIM4nfj8u+NiM91Sb8pBLiZWU8naSLwp8BRZB/AzwE/IrvMSJcMzTnAzcy6UFeeKecANzPrQpI2RcTwrmi71geTzMySJ+nxthbRhWfKOcDNzKpXkzPlHOBmZtW7i+zLfavLF0i6v6s69Ri4mVmikvgmppmZ/T4HuJlZohzgZiUkDZL0hZLnQyXdWsuazNriMXB7W5DUKyJ2V7BePXBXRBzX5UWZVcl74NbjSLpC0s8l3SfpZkl/lc+/v+QqfUMkbcyne0m6VtKj+VUqL8nnT5S0RNJ/AWskfV3S5SX9/GN+bfdS1wBHSFqdt1kv6Yl8/Qsk/Si/0cIGSV/MbwSxStL/Snpnvt4RkhZJWiHpZ5KOzuefLekJSY9JWtq1W9HeDnwaofUoksYBnwLGkP1+riS7cuDeXER2qdrx+ZXfHpR0b77sROC4iNiQ713fRnbVv/3yfk4sa2tGvv4JeT31ZcuPy2vrS3a9569ExBhJ3wDOA74JzAMujYinJU0gu/zqh4GZwJSI+GV+ASazqjjArac5Gbg9vyRua3f0ac1k4P2SPpE/HwiMBN4AHmm5umBEbJS0TdIYsi9erIqO3zFlSUTsAHbkd6u5M5+/Jq/hQOAPyS5x2vKalsuJPgjcKOkHZB8kZlVxgFtP1NaBmV38btivb8l8AV+KiHtKV86vDvdKWRvXAxcAh5Jdv72jSi/X21zyvJns/9N+wK9b9uBLRcSl+R75NGB1fk35rr3llu3TPAZuPc1SYLqyG/seRHaN5RYb+d2NKj5RMv8e4E+V39BW0lGS+rfR/u1kd5MZn7+u3A6yO710Sn4XpA2Szs5rkaTR+fQREfFwRMwku2lDj7pZsKXHAW49SkSsBP4bWA38EPhZyeLryIJ6GTCkZP71wFpgZX7A8d9p46/LiHgDWAL8oLWzUvI94gfzg43XdvJtfAa4SNJjwJPAGfn8ayWtyWtcCjzWyfbNAJ9GaD2cpKuAnRFxXUHt7Ud2YPTsiHi6iDbNasV74Pa2IWkU2ZkjP3V4277Ae+BmZonyHriZWaIc4GZmiXKAm5klygFuZpYoB7iZWaIc4GZmifp/KNrt+Jc6FdwAAAAASUVORK5CYII=\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXAAAAEZCAYAAACO4n6tAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAY0UlEQVR4nO3df5QU5Z3v8fdHQEGEQWGiIsFhFaOoQWCQ7MYfJLhAgjGLBjcxiTHqojebyObem4SNG9C7u+eYG+41cNiEZTVxs7K6YjSJekBjwEsUV+WnIphEgcWJguPEBPA3zvf+UTWkGed39/T0g5/XOX2muqr6eb5dM/Pp6qerqxQRmJlZeg7p6QLMzKxrHOBmZolygJuZJcoBbmaWKAe4mVmiHOBmZolygFvSJH1T0k09XMMySV/ogX4nSqord79WOeTjwC0VkiYCt0bEsJ6upRJ4e5j3wK3HSOrd0zWYpcwBbu8iaYykdZL2SPoPSbdL+od82WWSHm62fkg6MZ8+TNI8STsk7ZK0SFK/fNlESXWSviFpJ/BDSZskfaKgrT6SXpZ0RrM++gPLgKGS9ua3oZKuk3Rrvk5NXssXJT0v6RVJV0saL+lJSb+XtLBZu5dL2pKve7+k4/P5knSjpJck/SF//GmtbK+HJF1ZuH3ybfCKpG2SPtbGtp4t6bl8W2+WNL2NdftJuiVvdzMwviNt5b+T30k6vWDd90l6XVJ1a/1Z5XOA2wEkHQr8BPg34ChgKXBRJ5r4NnAScAZwInAcMKdg+TF5u8cDM4EfAZ8rWP5x4MWI2FDYaES8CnwMeCEijshvL7RSwwRgJPCXwHeBa4HzgFOBiyWdmz/XvwC+CVwIVAO/BG7L25gMnJM/l0F5Ww0d3AYTgF8BQ4D/DdwsSa2s+xxwNlAFXA/cKunYVtadC5yQ36YAzcfdW2wrIt4EbufA7fwZ4MGIqO/gc7JKFBG++bb/RhZaL5B/PpLPWw38Qz59GfBws8cEWVgLeBU4oWDZnwLb8umJwFtA34LlQ4E9wMD8/p3A11upbSJQ12zedWTjwAA1eS3HFSxvAP6y4P6Pgb/Jp5cBVxQsOwR4jezF5aPAr4EPAYe0s80eAq4s2D7PFiw7PK/pmA5u/w3AJ1tZthWYWnB/ZvPt0VpbZC8qzzc9F2ANcHFP/735VtzNe+DW3FDgt5H/l+f+q4OPrSYLrLX5cMXvgeX5/Cb1EfFG053I9qIfAS6SNIhsL3tJMU8A2FUw/XoL94/Ip48H5hfU+juyF6HjImIFsBD4J2CXpMWSBnaw/51NExHxWj55REsrSrpU0oaCGk4j23NvyVCyEG5ywO+lrbYi4jGyF9dzJZ1M9oL7sw4+H6tQDnBr7kXguGZv+YcXTL9KFtIASDqmYNnLZAF5akQMym9VEVEYXi0d9vSvZG/vZwCPRsRvW6mt1IdMPQ9cVVDroIjoFxGrASJiQUSMIxt6OQn4Wik7z8fb/wX4MjA4IgYBm8heRFryIvD+gvv7fy8dbKtpO38euLPwhdTS5AC35h4F9gHXSOot6ULgzILlG4FTJZ0hqS/ZEAYAEdFIFiI3SnofgKTjJE1pp8+fAGOBWWRj4q3ZBQyWVNXJ59SaRcDfSjoVQFKVpBn59HhJEyT1IXvRegN4p0T9NulP9qJUn/f5RbK95tbckdd7pKRhwFc62da/AdPJQryt7WyJcIDbASLiLbIP9S4DXiH78O6uguW/Bv4X8CDwG+DhZk18A3gW+E9Ju/P1PtBOn6+TjU2PKOyrhfWeIfuQcWs+TDC0M8+thfbuJvvQ9fa81k1kQzgAA8lejF4hG6poAOYV018L/W8G/g/Zi+Yu4HSy4aTWXJ/Xsg14gCyQO9xWRNQB68iC/peleh7Wc/xFHmuXpFvIPiz7u27sYw5wUkR8rt2Vrcsk/YDsSJ5u+11a+fiLFNbjJB0FXEE2NmvdRFIN2burMT1biZWKh1CsR0n6K7IPE5dFxKqerudgJenvyYaIvhMR23q6HisND6GYmSXKe+BmZolygJuZJaqsH2IOGTIkampqytmlmVny1q5d+3JEvOvEY2UN8JqaGtasWVPOLs3MkiepxdNZeAjFzCxRDnAzs0Q5wM3MEuVvYppZSb399tvU1dXxxhs+2WFn9e3bl2HDhtGnT58Ore8AN7OSqqurY8CAAdTU1ND6hYisuYigoaGBuro6RowY0aHHtDuEIukH+XUBNxXMO0rSzyX9Jv95ZBF1m9lB5I033mDw4MEO706SxODBgzv1zqUjY+C3AFObzZsN/CIiRgK/yO+bmQE4vLuos9ut3QDPTzD0u2azP0l2dQ/yn3/RqV7NzLrRggULOOWUU/jsZz/b06V0q66OgR8dES8CRMSLTVdfaYmkmWQXX2X48OGtrVZRambfV3Qb22+YVoJKzNJXiv+nQh353/re977HsmXLDhhL3rdvH717H1wf+3X7YYQRsTgiaiOitrr6Xd8ENTMrqauvvpqtW7dywQUXUFVVxcyZM5k8eTKXXnop9fX1XHTRRYwfP57x48fzyCPZRYsaGhqYPHkyY8aM4aqrruL444/n5ZdfZvv27Zx22h+vTDdv3jyuu+46AJ577jmmTp3KuHHjOPvss3nmmWcA2LVrF9OnT2f06NGMHj2a1atX861vfYv58+fvb+faa69lwYIFRT/Xrr4c7ZJ0bL73fSzwUtGVmJmVwKJFi1i+fDkrV65k4cKF3HPPPTz88MP069ePSy65hK9+9aucddZZ7NixgylTprBlyxauv/56zjrrLObMmcN9993H4sWL2+1n5syZLFq0iJEjR/LYY4/xpS99iRUrVnDNNddw7rnncvfdd/POO++wd+9ehg4dyoUXXsisWbNobGzk9ttv5/HHHy/6uXY1wH8GfAG4If/506IrMTPrBhdccAH9+vUD4MEHH2Tz5s37l+3evZs9e/awatUq7roruxzrtGnTOPLItg+s27t3L6tXr2bGjBn757355psArFixgh/9KLtmdK9evaiqqqKqqorBgwezfv16du3axZgxYxg8eHDRz63dAJd0GzARGCKpDphLFtx3SLoC2AHMaL0FM7Oe079///3TjY2NPProo/sDvVBLR4D07t2bxsbG/febDvFrbGxk0KBBbNiwocN1XHnlldxyyy3s3LmTyy+/vDNPoVUdOQrlMxFxbET0iYhhEXFzRDRExKSIGJn/bH6UiplZxZk8eTILFy7cf78pgM855xyWLFkCwLJly3jllVcAOProo3nppZdoaGjgzTff5N577wVg4MCBjBgxgqVLlwLZl3A2btwIwKRJk/j+978PwDvvvMPu3bsBmD59OsuXL+eJJ55gypQpJXk+PheKmb1nLFiwgDVr1vDBD36QUaNGsWjRIgDmzp3LqlWrGDt2LA888MD+I+b69OnDnDlzmDBhAueffz4nn3zy/raWLFnCzTffzOjRozn11FP56U+zkeT58+ezcuVKTj/9dMaNG8fTTz8NwKGHHspHPvIRLr74Ynr16lWS51PWa2LW1tZGCucD92GEZl23ZcsWTjnllJ4uoyhN1y4YMmRIydpsbGxk7NixLF26lJEjR7a6XkvbT9LaiKhtvq73wM3MutnmzZs58cQTmTRpUpvh3VkH11HtZmYlsH379pK2N2rUKLZu3VrSNsF74GZmyXKAm1nJlfOztYNJZ7ebA9zMSqpv3740NDQ4xDup6Xzgffv27fBjPAZuZiU1bNgw6urqqK+v7+lSktN0RZ6OcoCbWUn16dOnw1eUseJ4CMXMLFEOcDOzRDnAzcwS5QA3M0uUA9zMLFEOcDOzRPkwQmuTz8xoVrm8B25mligHuJlZohzgZmaJcoCbmSXKAW5mligHuJlZohzgZmaJcoCbmSXKAW5mligHuJlZohzgZmaJcoCbmSXKAW5mligHuJlZohzgZmaJcoCbmSWqqACX9FVJT0vaJOk2SX1LVZiZmbWtywEu6TjgGqA2Ik4DegGfLlVhZmbWtmKHUHoD/ST1Bg4HXii+JDMz64guB3hE/BaYB+wAXgT+EBEPNF9P0kxJayStqa+v73qlZmZ2gGKGUI4EPgmMAIYC/SV9rvl6EbE4Imojora6urrrlZqZ2QGKGUI5D9gWEfUR8TZwF/BnpSnLzMzaU0yA7wA+JOlwSQImAVtKU5aZmbWnmDHwx4A7gXXAU3lbi0tUl5mZtaN3MQ+OiLnA3BLVYmZmneBvYpqZJcoBbmaWKAe4mVmiHOBmZolygJuZJcoBbmaWKAe4mVmiHOBmZolygJuZJcoBbmaWKAe4mVmiHOBmZolygJuZJcoBbmaWKAe4mVmiHOBmZolygJuZJcoBbmaWKAe4mVmiHOBmZolygJuZJcoBbmaWKAe4mVmiHOBmZolygJuZJcoBbmaWKAe4mVmiHOBmZolygJuZJcoBbmaWKAe4mVmiHOBmZokqKsAlDZJ0p6RnJG2R9KelKszMzNrWu8jHzweWR8SnJB0KHF6CmszMrAO6HOCSBgLnAJcBRMRbwFulKcvMzNpTzBDKnwD1wA8lrZd0k6T+JarLzMzaUUyA9wbGAt+PiDHAq8Ds5itJmilpjaQ19fX1RXRnZmaFignwOqAuIh7L799JFugHiIjFEVEbEbXV1dVFdGdmZoW6HOARsRN4XtIH8lmTgM0lqcrMzNpV7FEoXwGW5EegbAW+WHxJZmbWEUUFeERsAGpLVIuZmXWCv4lpZpYoB7iZWaIc4GZmiXKAm5klygFuZpYoB7iZWaIc4GZmiXKAm5klygFuZpYoB7iZWaIc4GZmiXKAm5klygFuZpYoB7iZWaIc4GZmiXKAm5klygFuZpYoB7iZWaIc4GZmiXKAm5klygFuZpYoB7iZWaIc4GZmiXKAm5klygFuZpYoB7iZWaIc4GZmiXKAm5klygFuZpYoB7iZWaIc4GZmiXKAm5klygFuZpaoogNcUi9J6yXdW4qCzMysY0qxBz4L2FKCdszMrBOKCnBJw4BpwE2lKcfMzDqqd5GP/y7wdWBAaytImgnMBBg+fHibjdXMvq/IcmD7DdOKbqMSeFv8kbeFWcu6vAcu6XzgpYhY29Z6EbE4Imojora6urqr3ZmZWTPFDKF8GLhA0nbgduCjkm4tSVVmZtauLgd4RPxtRAyLiBrg08CKiPhcySozM7M2+ThwM7NEFfshJgAR8RDwUCnaMjOzjvEeuJlZohzgZmaJcoCbmSXKAW5mligHuJlZohzgZmaJcoCbmSXKAW5mligHuJlZohzgZmaJcoCbmSXKAW5mligHuJlZohzgZmaJcoCbmSXKAW5mligHuJlZohzgZmaJcoCbmSXKAW5mligHuJlZohzgZmaJcoCbmSXKAW5mligHuJlZohzgZmaJcoCbmSXKAW5mligHuJlZohzgZmaJcoCbmSXKAW5mlqguB7ik90taKWmLpKclzSplYWZm1rbeRTx2H/A/ImKdpAHAWkk/j4jNJarNzMza0OU98Ih4MSLW5dN7gC3AcaUqzMzM2laSMXBJNcAY4LFStGdmZu0rZggFAElHAD8G/iYidrewfCYwE2D48OHFdmdmFaBm9n1FPX77DdNKVMl7W1F74JL6kIX3koi4q6V1ImJxRNRGRG11dXUx3ZmZWYFijkIRcDOwJSL+b+lKMjOzjihmD/zDwOeBj0rakN8+XqK6zMysHV0eA4+IhwGVsBYzM+sEfxPTzCxRDnAzs0Q5wM3MEuUANzNLlAPczCxRDnAzs0Q5wM3MEuUANzNLlAPczCxRDnAzs0Q5wM3MEuUANzNLlAPczCxRDnAzs0Q5wM3MElX0NTHN3isq4TqQxdZQqjoqQaVsi578u/AeuJlZohzgZmaJcoCbmSXKAW5mligHuJlZohzgZmaJcoCbmSXKAW5mligHuJlZohzgZmaJcoCbmSXKAW5mligHuJlZohzgZmaJcoCbmSXKAW5mligHuJlZoooKcElTJf1K0rOSZpeqKDMza1+XA1xSL+CfgI8Bo4DPSBpVqsLMzKxtxeyBnwk8GxFbI+It4Hbgk6Upy8zM2qOI6NoDpU8BUyPiyvz+54EJEfHlZuvNBGbmdz8A/Krr5QIwBHi5yDaKVQk1QGXUUQk1QGXUUQk1QGXUUQk1QGXUUYoajo+I6uYzi7kqvVqY965Xg4hYDCwuop8DO5XWRERtqdpLtYZKqaMSaqiUOiqhhkqpoxJqqJQ6urOGYoZQ6oD3F9wfBrxQXDlmZtZRxQT4E8BISSMkHQp8GvhZacoyM7P2dHkIJSL2SfoycD/QC/hBRDxdsspaV7LhmCJUQg1QGXVUQg1QGXVUQg1QGXVUQg1QGXV0Ww1d/hDTzMx6lr+JaWaWKAe4mVmiHOBmZolygHeApJMlTZJ0RLP5U8tYw5mSxufToyT9d0kfL1f/bdT1ox7u/6x8W0wuc78TJA3Mp/tJul7SPZK+LamqTDVcI+n97a/Z7XUcKulSSefl9y+RtFDSX0vq09P1HcyS/RBT0hcj4odl6Oca4K+BLcAZwKyI+Gm+bF1EjC1DDXPJzjnTG/g5MAF4CDgPuD8i/rG7a8jraH6YqICPACsAIuKCMtTweEScmU//Fdnv5m5gMnBPRNzQ3TXkfT8NjM6PxloMvAbcCUzK519Yhhr+ALwKPAfcBiyNiPru7reFOpaQ/W0eDvweOAK4i2xbKCK+UO6aKomk90XES93SeEQkeQN2lKmfp4Aj8ukaYA1ZiAOsL2MNvcj+QXYDA/P5/YAny7jN1wG3AhOBc/OfL+bT55aphvUF008A1fl0f+CpMm6LLYXbpdmyDeXaFmTvoicDNwP1wHLgC8CAMm6LJ/OfvYFdQK/8vsr891kF3AA8AzTkty35vEFlquGoZrfBwHbgSOCoUvdXzFfpu52kJ1tbBBxdpjJ6RcRegIjYLmkicKek42n5dALdYV9EvAO8Jum5iNid1/O6pMYy1QBQC8wCrgW+FhEbJL0eEf+vjDUcIulIsuBS5HucEfGqpH1lrGNTwbvAjZJqI2KNpJOAt8tUQ0REI/AA8EA+XPEx4DPAPOBd587oJofkX+brT7aTUQX8DjgMKOcQyh1k7wYnRsROAEnHkL2gLQX+vAw1vAz8V7N5x5Ht/ATwJ6XsrKIDnCykpwCvNJsvYHWZatgp6YyI2AAQEXslnQ/8ADi9TDW8JenwiHgNGNc0Mx9rLVuA52Fxo6Sl+c9dlP9vqApYS/Y3EJKOiYid+ecT5XpBBbgSmC/p78j+aR+V9DzwfL6sHA54vhHxNtm3oX8mqV+ZaoBs7/8ZsneJ1wJLJW0FPkR2ltJyqYmIbxfOyIP825IuL1MNXycb2vxaRDwFIGlbRIzojs4qegxc0s3ADyPi4RaW/XtEXFKGGoaR7QHvbGHZhyPikTLUcFhEvNnC/CHAsU1/KOUmaRrw4Yj4Zk/036yWw4GjI2JbmfsdQLZX1Ruoi4hdZez7pIj4dbn6a4ukoQAR8YKkQWQhtiMiHi9jDQ8ADwL/2vR7kHQ0cBnw5xFxXpnqGAbcSPZiPhfYGBEl3fPe31clB7iZWUflQ2uzya5L8L589i6ydyU3RETzd/LdXc8nyN6R1ETEMd3ShwPczA525TpqrYV++wEnRMSm7qjBAW5mBz1JOyJi+MFWQ6V/iGlm1iGVcNRauWtwgJvZwaISjloraw0OcDM7WNxL9qW7Dc0XSHroYKzBY+BmZonyyazMzBLlADczS5QD3KyApEGSvlRwf6ikO3uyJrPWeAzc3hMk9cpPCNbeejXAvRFxWrcXZVYk74FbxZF0raRfSXpQ0m2S/mc+/yFJtfn0EEnb8+lekr4j6QlJT0q6Kp8/UdJKSf8OPCXp7yXNKujnH/PzvRe6AThB0oa8zRpJm/L1L5P0k/zCDdskfTm/mMR6Sf8p6ah8vRMkLZe0VtIvJZ2cz58haZOkjZJWde9WtPcCH0ZoFUXSOODTwBiyv891ZGcfbMsVwB8iYrykw4BH8hMbAZwJnBYR2/K967vIziJ4SN7Pmc3amp2vf0ZeT02z5afltfUFngW+ERFjJN0IXAp8F1gMXB0Rv5E0Afge8FFgDjAlIn6bn/DJrCgOcKs0ZwN356fObekqQC2ZDHxQ0qfy+1XASOAt4PGmMxTm53NvkDSG7AsX6yOioZP1rYyIPcCe/Io49+Tzn8prOAL4M7JTqjY95rD85yPALZLuIHshMSuKA9wqUWsfzOzjj8N+fQvmC/hKRNxfuHJ+8Y1Xm7VxE9npRY8hO6d7ZxWe1rex4H4j2f/TIcDvm/bgC0XE1fke+TRgQ36e+c6+gJjt5zFwqzSrgOnKLhQ8APhEwbLt/PGCFp8qmH8/8N/yK9Ig6SRJ/Vtp/25gKjA+f1xze4ABXS0+v1rSNkkz8lokaXQ+fUJEPBYRc8guAtHjFyS2tDnAraJExDrgP4ANwI+BXxYsnkcW1KuBIQXzbwI2A+vyDxz/mVbeXUbEW8BK4I6WjkrJ94gfyT9s/E4Xn8ZngSskbQSeJjs/NcB3JD2V17gK2NjF9s0AH0ZoFU7SdcDeiJhXovYOIftgdEZE/KYUbZr1FO+B23uGpFFkR478wuFtBwPvgZuZJcp74GZmiXKAm5klygFuZpYoB7iZWaIc4GZmiXKAm5kl6v8DNcQiX8EvWq8AAAAASUVORK5CYII=\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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09zczJFHHsnYsWMZO3YsDzyQ3bRo+fLljBs3jjFjxnDaaaexxRZb8MYbb7BkyRJ22unTO9NdcsklXHjhhQC88MILjB8/nt133529996bZ555BoClS5dy+OGHM3r0aEaPHs2DDz7Ij370IyZPnrymnfPOO48pU6bUvK196+3IzD73pk2bxh133MHs2bOZOnUqt956K/fffz+DBg3iO9/5Dueccw577bUXL730EgcffDCLFi3ioosuYq+99uL888/n9ttvZ/r06R3WaWxsZNq0aYwaNYq5c+dyxhlncO+993LWWWex7777ctNNN7Fq1Sreffddhg8fzhFHHMHZZ59NS0sL1157LQ8//HDN2+oAN7M+7dBDD2XQoEEA3HPPPSxcuHDNsrfffpt33nmHOXPmcOON2e1YJ0yYwEYbbdRum++++y4PPvggRx111Jp5H330EQD33nsvV12V3TO6X79+DB48mMGDBzN06FAee+wxli5dypgxYxg6dGjN2+YAN7M+bb311lsz3dLSwkMPPbQm0Eu1dgZI//79aWlpWfN89Sl+LS0tDBkyhAULFlTcj1NPPZUZM2bw+uuvc/LJJ3dmE9rkY+Bm9rkxbtw4pk6duub56gDeZ599mDlzJgCzZs1ixYoVAGyyySYsW7aM5cuX89FHH3HbbbcBsOGGG7Llllty/fXXA9mXcB5//HEADjzwQC6//HIAVq1axdtvvw3A4Ycfzh133MEjjzzCwQcfXMj2OMDN7HNjypQpzJs3j1122YUddtiBadOmAXDBBRcwZ84cdtttN+666y5GjhwJwIABAzj//PPZc889OeSQQ9huu+3WtDVz5kyuuOIKRo8ezY477sgtt9wCwOTJk5k9ezY777wzu+++O08//TQAa6+9Nvvvvz9HH300/fr1K2R7uvWemA0NDeHrgafFpxFaZy1atIjtt9++p7tRk9X3Lhg2bFhhbba0tLDbbrtx/fXXM2rUqDbXa23/SXo0IhrK1/UI3Mysiy1cuJCtt96aAw88sN3w7qwOP8SUdCVwCLAsInYqmf894ExgJXB7RJxbWK/MzHrQkiVLCm1vhx12YPHixYW2CZWNwGcA40tnSNofOAzYJSJ2BC4pvGdmZtauDgM8IuYAb5bN/jtgUkR8lK+zrAv6ZmaJ6s7P1vqSzu63ao+BbwPsLWmupN9JGtvWipIaJc2T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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ - "for i in range (len(query_day)):\n", - " if query_day[i] is not NaN:\n", - " plot_day(query_day[i])" + "# subplots\n", + "day_ax_arr = query_day_df.plot(subplots=True,layout=(2,4),kind='bar',figsize=(16,8),fontsize=15,sharey=True)\n", + "\n", + "for ax in day_ax_arr[-1]:\n", + " ax.set_xlabel('query times', fontsize=16)\n", + " \n", + "for ax_arr in day_ax_arr:\n", + " ax_arr[0].yaxis.set_major_locator(MaxNLocator(integer=True))\n", + " ax_arr[0].set_ylabel('days', fontsize=16)\n", + "plt.tight_layout()" ] }, { "cell_type": "markdown", - "id": "worst-musical", + "id": "confident-capacity", "metadata": {}, "source": [ "### Plot query times in a month" @@ -864,156 +333,107 @@ }, { "cell_type": "markdown", - "id": "adverse-bruce", + "id": "younger-destiny", "metadata": {}, "source": [ - "Note: not all users have data on the same number of months. Each graph represents query times for a user in a month." + "Note: not all users have data on the same number of months. " ] }, { "cell_type": "code", - "execution_count": 13, - "id": "removed-sheffield", + "execution_count": null, + "id": "quiet-minister", "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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DiaJiooK/+VjlrCyBzjg8C4Tn3eztHWKAO/Ktm7dyk9+8pO9y+vXr+eiiy4qY0Vmloqyj4E3VjXt0aLur3bGJ4u6v0Lt3r2b7t27t9ivIcCvvvpqAIYMGcKDDz5Y6vLMSqrY/487m3LlSmO+Age++93vcuSRR3LGGWdw+eWX84Mf5D6Y5bTTTtv75OjmzZtpeBuA3bt3M3XqVE444QSOO+447rzzTgAWLlzI+PHj+fSnP82xxx7Lt771LW699da9x/nGN77Bj370o/cde9q0aaxdu5bq6mqmTp1KbW0to0blPnVr1qxZTJo0iYkTJzJ8+HBuu+02fvjDHzJmzBhOPvlk3njjDQDWrl3LOeecw/HHH88pp5zCSy+9BMDcuXMZNWoUo0eP5tRTTy3dCTSzsuh0V+AdbdmyZcyZM4fly5eza9cuxo4dy/HHH7/fbe666y769evHkiVL2LFjB+PGjeOss84CYPHixaxatYrhw4dTW1vLhRdeyLXXXsuePXuYM2cOixcvft++ZsyYwapVq1ixYgUAtbW171u/atUqli9fzvbt2xkxYgS33HILy5cv5ytf+Qp333031113HVOmTOGOO+5g5MiRLFq0iKuvvpqnnnqKm266iSeeeIKhQ4eydevW4p00M+sUunyA//a3v+WCCy7gQx/KfRD7eeed1+I2Tz75JCtXrtw71PGnP/2JNWvW0KtXL0488cS9t+VVVVVRUVHB8uXL2bhxI2PGjKGioqJV9Y0fP56+ffvSt29f+vXrx8SJEwE49thjWblyJW+99RbPPPMMF1988d5tduzYAcC4ceO44ooruOSSS7jwwgtbdVwz6/y6fIBD83dj9OjRgz179gC873a7iODHP/4xZ5/9/g9jX7hwIQcddND72q666ipmzZrF66+/zhe/+MVW1/aBD3xg73y3bt32Lnfr1o1du3axZ88e+vfvv/cKPt8dd9zBokWLePTRR6murmbFihWt/gViZp1Xlx8DP/XUU3nooYd499132bZtG7/85S/3rquqqmLZsmUA73th8eyzz+b2229n586dALz88su8/fbbTe7/ggsu4PHHH2fJkiX7BD5A37592bZtW5vrP/jggxk+fDhz584Fcr9cnnvuOSA3Nn7SSSdx0003ceihh7Ju3bo2H8fMOp8ufwU+duxYLr30Uqqrqzn88MM55ZRT9q67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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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JHr16tWo/3wc4Ga2D4d322js6+4ANzPLs2XLFn784x/vmV+7di3nnXdeG1ZUvwN6DLxs2iNtXUKLqpr5mbYuwTqAYv8etdXP7a5du+jcuXOD/WoC/MorrwSgb9++3H///S1dXpP4CNzM2p3vfve7HHPMMZx22mlcdNFF3HRT7mZJY8eO3XM196ZNm6j5aI5du3YxdepUTjzxRI4//njuuOMOABYtWsS4ceP4/Oc/z7Bhw/jmN7/Jrbfeumc/119/PT/84Q/32ve0adN47bXXKC8vZ+rUqVRVVTF0aO5OeHPnzuXss89m4sSJDBw4kNtuu42bb76ZESNGcPLJJ/POO+8A8NprrzFhwgROOOEETjnlFF5++WUAFixYwNChQxk+fDhjxoxp9ut0QB+Bm1l6li9fzvz581mxYgU7d+5k5MiRnHDCCftdZ86cOXTv3p2lS5eyY8cORo8ezemnnw7AkiVLqKysZODAgVRVVXHOOedw9dVXs3v3bubPn8+SJUv22tbMmTOprKxk5cqVAFRVVe21vLKykhUrVrB9+3YGDRrEjTfeyIoVK/jKV77CXXfdxTXXXMOUKVO4/fbbGTx4MIsXL+bKK6/kqaeeYsaMGTz++OP069ePLVu2NPu1coCbWbvym9/8hkmTJvHhD38YgDPPPLPBdZ544glWrVq1Z6jjj3/8I2vWrOHggw9m1KhRe07LKysro1evXqxYsYL169czYsQIevXq1aj6xo0bR0lJCSUlJXTv3p2JEycCMGzYMFatWsW2bdt49tlnOf/88/ess2PHDgBGjx7NJZdcwgUXXMA555zTqP3WxQFuZu1OfWdjHHTQQezevRtgr9PtIoIf/ehHnHHGGXv1X7RoEYceeuhebZdffjlz587l7bff5tJLL210bR/60If2THfq1GnPfKdOndi5cye7d++mR48ee47g891+++0sXryYRx55hPLyclauXNnoPyD5PAZuZu3KmDFjeOCBB3j//ffZunUrv/rVr/YsKysrY/ny5QB7vbF4xhlnMGvWLD744AMAXnnlFd577706tz9p0iQee+wxli5duk/gA5SUlLB169Ym13/YYYcxcOBAFixYAOT+uDz//PNAbmz8pJNOYsaMGfTu3Zs333yzyfuBRgS4pM6SVkh6OJvvKWmhpDXZ8+HNqsTMDBg5ciQXXngh5eXlnHvuuZxy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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXAAAAETCAYAAAAveV3LAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAX6ElEQVR4nO3deZRV5Z3u8e/DFBJBkKI0DNGiGzQqSoE49CLaIMbhplEkjpkw0cu90dzWrCsJiRmQZTqYzk23iZ0oHdPg0KHFjkrCcgpebmKbZgqIKEbEVKQaZFISMEIYfvePvYsciirqVNWpOvVSz2ets84e3r337+yqes6u9+x9tiICMzNLT5dyF2BmZi3jADczS5QD3MwsUQ5wM7NEOcDNzBLlADczS5QD3Do0SV+W9MMy1/CEpMnlrKGtSaqSFJK6lbsWK558Hrh1FJLGAg9GxOBy13Kkk1QD3BARP8/Hq4DfAt0jYm/5KrPm8BG4tRkfzZm1LQd4JyRppKRfS9oh6d8kzZV0Rz7vOknP1Wsfkobmw++R9G1Jb0jaJOkeSe/N542VVCvpi5LeBP5F0mpJEwrW1V3SVknV9bZxFPAEMFDSzvwxUNJ0SQ/mber+zf+0pPWS3pb0PyWdKWmVpO2S7q633s9IWpO3fUrSCfl0SfoHSZsl/T5ffngj+2uRpBsK90++D96W9FtJlxxmX0+TtC7f1y9LuvwwbadLmifpwbz9i5JOlPSlvM71ki4saD9Q0nxJb0l6TdJ/r7euhyXdn6/rJUmj83kPAMcDP8338xcKyvh4/rPdKum2xmq1jsEB3slI6gE8BjwA9APmAR9txiruBE4EqoGhwCDgawXz35+v9wRgCnA/8ImC+f8N2BgRKwtXGhHvAJcAGyKiV/7Y0EgNZwPDgKuBfwRuAy4ATgWukvTX+WudCHwZmARUAr8Efpyv40LgvPy19M3Xta3IfXA28BugP/At4D5JaqTtOuBcoA9wO/CgpAGHWfcEsp/NMcAK4Cmyv9NBwAzg3oK2PwZqgYHAFcDfSRpfMP9SYG7++uYDdwNExCeBN4AJ+X7+VsEyHwJOAsYDX5N08mFqtXKLCD860YMstDaQf/6RT3seuCMfvg54rt4yQRbWAt4B/rJg3l8Bv82HxwJ/AnoWzB8I7ACOzscfAb7QSG1jgdp606aT9YsDVOW1DCqYvw24umD834Fb8uEngOsL5nUB/kj25nI+8CpwDtCliX22iKy/uG7/vFYw7315Te8vcv+vBC5rZN504JmC8QnATqBrPt4731Zf4APAPqB3QftvArML1vXzgnmnAO8WjNcAFxSM1+3bwQXTlgDXlPt31o/GHz4C73wGAv8V+V9o7ndFLltJFljL8+6K7cCT+fQ6WyJiV91IZEfR/wF8VFJfsqPsh1rzAoBNBcPvNjDeKx8+AbiroNa3yN6EBkXEs2RHpP8EbJI0S9LRRW7/zbqBiPhjPtiroYaSPiVpZUENw8mO3It9bVsjYl/BeN22BgJvRcSOgva/IztSP6ROsjeunkV8LlF/mQZfl3UMDvDOZyMwqN6//McXDL9DFtIASHp/wbytZCFyakT0zR99IqLwj7yh05rmkHWjXAn8KiL+q5HaSn1K1HrgfxTU2jci3hsRzwNExHcj4gyyrpcTgaml3Hje3/7PwOeAiojoC6wmexNprQ1AP0m9C6YdDzS2b+vz6WdHAAd45/MrYC/wt5K6SZoEnFUw/wXgVEnVknqS/SsOQETsJwukf5B0LICkQZIuamKbjwGjgJvJ+sQbswmokNSnma+pMfcAX5J0KoCkPpKuzIfPlHS2pO5kb1q7yLokSukosqDckm/z02RH4K0WEevJur6+KamnpNOB6yn+v5tNwF+UohYrHwd4JxMRfyL7UO864G2yD+9+UjD/VbIPy34OrAWeq7eKLwKvAf8p6Q95u5Oa2Oa7ZH3TQwq31UC7V8g+mHs973IY2JzX1sD6HiX70HVuXutqsi4cgKPJ3ozeJut62AZ8uzXba2D7LwP/h+xNcxNwGll3UqlcS9Z3vQF4FPh6RDxT5LLfBL6S7+dbS1iTtSNfyGNImk324eFX2nAbXwNOjIhPNNnYzIriCy2szUnqR/bv/SfLXYvZkcRdKNam8otL1gNPRMQvyl2P2ZHEXShmZonyEbiZWaIc4GZmiWrXDzH79+8fVVVV7blJM7PkLV++fGtEVNaf3q4BXlVVxbJly9pzk2ZmyZPU4NdduAvFzCxRDnAzs0Q5wM3MElX2KzH37NlDbW0tu3btarqxlVTPnj0ZPHgw3bt3L3cpZtYCZQ/w2tpaevfuTVVVFY3f1MRKLSLYtm0btbW1DBkypNzlmFkLFNWFIqkmvz/fSknL8mn9JD0jaW3+fExLCti1axcVFRUO73YmiYqKCv/nY5aw5vSBj4uI6ogYnY9PAxZGxDBgYT7eIg7v8vB+N0tbaz7EvIzsTivkzxNbX07ns337dr7//e8fGN+wYQNXXHFFGSsys1QU2wcewNOSArg3ImYBx0XERoCI2Fh3h5b6JE0huzs5xx9/fENNDlI1bUGRJRWnZuZHSrq+Yu3bt4+uXbs22a4uwG+88UYABg4cyCOPPNLW5Zm1qVL/HXc05cqV+oo9Ah8TEaPI7mZyk6Tzit1ARMyKiNERMbqy8pArQTuEb3zjG5x00klccMEFXHvttXz729mNWcaOHXvgytGtW7dS9zUA+/btY+rUqZx55pmcfvrp3HvvvQAsWrSIcePG8bGPfYzTTjuNr371q9x1110HtnPbbbfx3e9+96BtT5s2jXXr1lFdXc3UqVOpqalh+PDsrluzZ89m4sSJTJgwgSFDhnD33Xfzne98h5EjR3LOOefw1ltvAbBu3TouvvhizjjjDM4991xeeeUVAObNm8fw4cMZMWIE551X9I/MzBJR1BF4fmdxImKzpEfJ7qG4SdKA/Oh7ALC5DetsM8uXL2fu3LmsWLGCvXv3MmrUKM4444zDLnPffffRp08fli5dyu7duxkzZgwXXnghAEuWLGH16tUMGTKEmpoaJk2axM0338z+/fuZO3cuS5YsOWhdM2fOZPXq1axcuRKAmpqag+avXr2aFStWsGvXLoYOHcqdd97JihUr+PznP8/999/PLbfcwpQpU7jnnnsYNmwYixcv5sYbb+TZZ59lxowZPPXUUwwaNIjt27eXbqeZWYfQZIBLOgroEhE78uELye6ZOB+YDMzMnx9vy0Lbyi9/+Usuv/xy3ve+7Ebsl156aZPLPP3006xatepAV8fvf/971q5dS48ePTjrrLMOnJZXVVVFRUUFK1asYNOmTYwcOZKKiopm1Tdu3Dh69+5N79696dOnDxMmTADgtNNOY9WqVezcuZPnn3+eK6+88sAyu3fvBmDMmDFcd911XHXVVUyaNKlZ2zWzjq+YI/DjgEfzMxa6Af8aEU9KWgo8LOl64A3gysOso0Nr7GyMbt26sX//foCDTreLCL73ve9x0UUH34x90aJFHHXUUQdNu+GGG5g9ezZvvvkmn/nMZ5pd23ve854Dw126dDkw3qVLF/bu3cv+/fvp27fvgSP4Qvfccw+LFy9mwYIFVFdXs3Llyma/gZhZx9VkH3hEvB4RI/LHqRHxjXz6togYHxHD8ue32r7c0jvvvPN49NFHeffdd9mxYwc//elPD8yrqqpi+fLlAAd9sHjRRRfxgx/8gD179gDw6quv8s477zS4/ssvv5wnn3ySpUuXHhL4AL1792bHjh0trv/oo49myJAhzJs3D8jeXF544QUg6xs/++yzmTFjBv3792f9+vUt3o6ZdTxlvxKz3EaNGsXVV19NdXU1J5xwAueee+6BebfeeitXXXUVDzzwAOeff/6B6TfccAM1NTWMGjWKiKCyspLHHnuswfX36NGDcePG0bdv3wbPSqmoqGDMmDEMHz6cSy65hJtuuqnZr+Ghhx7is5/9LHfccQd79uzhmmuuYcSIEUydOpW1a9cSEYwfP54RI0Y0e91m1nG16z0xR48eHfW/D3zNmjWcfPLJ7VZDU6ZPn06vXr249dZbS7K+/fv3M2rUKObNm8ewYcNKss5S6mj7344MPo2wtCQtL7iI8gB/G2Ebevnllxk6dCjjx4/vkOFtZmnr9F0o9U2fPr1k6zrllFN4/fXXS7Y+M7NCPgI3M0tUhwjw9uyHtz/zfjdLW9kDvGfPnmzbts1h0s7qvg+8Z8+e5S7FzFqo7H3ggwcPpra2li1btpS7lE6n7o48Zpamsgd49+7dfUcYM7MWKHsXipmZtYwD3MwsUQ5wM7NEOcDNzBLlADczS5QD3MwsUQ5wM7NEOcDNzBLlADczS5QD3MwsUQ5wM7NEOcDNzBLlADczS5QD3MwsUQ5wM7NEOcDNzBLlADczS5QD3MwsUQ5wM7NEOcDNzBLlADczS5QD3MwsUQ5wM7NEFR3gkrpKWiHpZ/l4P0nPSFqbPx/TdmWamVl9zTkCvxlYUzA+DVgYEcOAhfm4mZm1k6ICXNJg4CPADwsmXwbMyYfnABNLW5qZmR1OsUfg/wh8AdhfMO24iNgIkD8fW+LazMzsMJoMcEl/A2yOiOUt2YCkKZKWSVq2ZcuWlqzCzMwaUMwR+BjgUkk1wFzgfEkPApskDQDInzc3tHBEzIqI0RExurKyskRlm5lZkwEeEV+KiMERUQVcAzwbEZ8A5gOT82aTgcfbrEozMztEa84Dnwl8WNJa4MP5uJmZtZNuzWkcEYuARfnwNmB86UsyM7Ni+EpMM7NEOcDNzBLlADczS1Sz+sDN2kvVtAXlLqFN1cz8SLlLsCOAj8DNzBLlADczS5QD3MwsUQ5wM7NEOcDNzBLlADczS5QD3MwsUQ5wM7NEOcDNzBLlADczS5QD3MwsUQ5wM7NEOcDNzBLlADczS5QD3MwsUQ5wM7NEOcDNzBLlADczS5QD3MwsUQ5wM7NEOcDNzBLlADczS5QD3MwsUQ5wM7NEOcDNzBLlADczS5QD3MwsUQ5wM7NENRngknpKWiLpBUkvSbo9n95P0jOS1ubPx7R9uWZmVqeYI/DdwPkRMQKoBi6WdA4wDVgYEcOAhfm4mZm1kyYDPDI789Hu+SOAy4A5+fQ5wMQ2qdDMzBpUVB+4pK6SVgKbgWciYjFwXERsBMifj227Ms3MrL6iAjwi9kVENTAYOEvS8GI3IGmKpGWSlm3ZsqWldZqZWT3NOgslIrYDi4CLgU2SBgDkz5sbWWZWRIyOiNGVlZWtLNfMzOoUcxZKpaS++fB7gQuAV4D5wOS82WTg8bYq0szMDtWtiDYDgDmSupIF/sMR8TNJvwIelnQ98AZwZRvWaWZm9TQZ4BGxChjZwPRtwPi2KMrMzJrmKzHNzBLlADczS5QD3MwsUQ5wM7NEOcDNzBLlADczS5QD3MwsUQ5wM7NEOcDNzBLlADczS5QD3MwsUQ5wM7NEOcDNzBLlADczS5QD3MwsUQ5wM7NEOcDNzBLlADczS5QD3MwsUQ5wM7NEOcDNzBLlADczS5QD3MwsUQ5wM7NEOcDNzBLlADczS5QD3MwsUQ5wM7NEOcDNzBLlADczS5QD3MwsUQ5wM7NEOcDNzBLVZIBL+oCk/ytpjaSXJN2cT+8n6RlJa/PnY9q+XDMzq1PMEfhe4H9HxMnAOcBNkk4BpgELI2IYsDAfNzOzdtJkgEfExoj4dT68A1gDDAIuA+bkzeYAE9uqSDMzO1Sz+sAlVQEjgcXAcRGxEbKQB44tdXFmZta4ogNcUi/g34FbIuIPzVhuiqRlkpZt2bKlJTWamVkDigpwSd3JwvuhiPhJPnmTpAH5/AHA5oaWjYhZETE6IkZXVlaWomYzM6O4s1AE3AesiYjvFMyaD0zOhycDj5e+PDMza0y3ItqMAT4JvChpZT7ty8BM4GFJ1wNvAFe2TYlmZtaQJgM8Ip4D1Mjs8aUtx8zMiuUrMc3MEuUANzNLlAPczCxRDnAzs0Q5wM3MEuUANzNLlAPczCxRDnAzs0Q5wM3MEuUANzNLlAPczCxRDnAzs0Q5wM3MEuUANzNLlAPczCxRDnAzs0Q5wM3MEuUANzNLlAPczCxRxdzUOFlV0xaUu4Q2VTPzI+UuwczKyEfgZmaJcoCbmSXKAW5mligHuJlZohzgZmaJcoCbmSXKAW5mligHuJlZohzgZmaJcoCbmSXKAW5mligHuJlZopoMcEk/krRZ0uqCaf0kPSNpbf58TNuWaWZm9RVzBD4buLjetGnAwogYBizMx83MrB01GeAR8QvgrXqTLwPm5MNzgIklrsvMzJrQ0j7w4yJiI0D+fGzpSjIzs2K0+YeYkqZIWiZp2ZYtW9p6c2ZmnUZLA3yTpAEA+fPmxhpGxKyIGB0RoysrK1u4OTMzq6+lAT4fmJwPTwYeL005ZmZWrGJOI/wx8CvgJEm1kq4HZgIflrQW+HA+bmZm7ajJmxpHxLWNzBpf4lrMzKwZfCWmmVmiHOBmZolygJuZJcoBbmaWKAe4mVmiHOBmZolygJuZJcoBbmaWKAe4mVmiHOBmZolygJuZJcoBbmaWKAe4mVmiHOBmZolygJuZJcoBbmaWKAe4mVmiHOBmZolygJuZJcoBbmaWKAe4mVmiHOBmZolygJuZJcoBbmaWKAe4mVmiHOBmZolygJuZJcoBbmaWKAe4mVmiHOBmZolygJuZJcoBbmaWKAe4mVmiWhXgki6W9BtJr0maVqqizMysaS0OcEldgX8CLgFOAa6VdEqpCjMzs8NrzRH4WcBrEfF6RPwJmAtcVpqyzMysKd1asewgYH3BeC1wdv1GkqYAU/LRnZJ+04ptdnT9ga3ttTHd2V5b6hT8s0vbkf7zO6Ghia0JcDUwLQ6ZEDELmNWK7SRD0rKIGF3uOqz5/LNLW2f9+bWmC6UW+EDB+GBgQ+vKMTOzYrUmwJcCwyQNkdQDuAaYX5qyzMysKS3uQomIvZI+BzwFdAV+FBEvlayyNHWKrqIjlH92aeuUPz9FHNJtbWZmCfCVmGZmiXKAm5klygFuZpao1pwH3qlJ+iDZlaeDyM5/3wDMj4g1ZS3MrBPI//4GAYsjYmfB9Isj4snyVda+fATeApK+SPbVAQKWkJ1SKeDH/lKvtEn6dLlrsMOT9LfA48D/AlZLKvwKj78rT1Xl4bNQWkDSq8CpEbGn3vQewEsRMaw8lVlrSXojIo4vdx3WOEkvAn8VETslVQGPAA9ExF2SVkTEyLIW2I7chdIy+4GBwO/qTR+Qz7MOTNKqxmYBx7VnLdYiXeu6TSKiRtJY4BFJJ9DwV3wcsRzgLXMLsFDSWv78hV7HA0OBz5WtKivWccBFwNv1pgt4vv3LsWZ6U1J1RKwEyI/E/wb4EXBaeUtrXw7wFoiIJyWdSPaVuoPI/vBrgaURsa+sxVkxfgb0qguAQpIWtX851kyfAvYWToiIvcCnJN1bnpLKw33gZmaJ8lkoZmaJcoCbmSXKAW5HPEl9Jd1YMD5W0s+KWG6GpAuaua0aSf1bUqdZcznArTPoC9zYZKt6IuJrEfHzNqjHrCQc4NZhSKqS9IqkH0paLekhSRdI+g9JayWdlbfrJ+kxSask/aek0/Pp0yX9SNIiSa/nV+wBzAT+UtJKSX+fT+sl6ZF8ew9JOuT8YUmzJV2RD9dIul3SryW9mF/KjaQKSU9LWpGfAaGC5T8haUm+3XsldZV0Zl53T0lHSXpJ0vC226t2JHOAW0czFLgLOB34IPAx4EPArcCX8za3Aysi4vR82v0Fy3+Q7Bzvs4CvS+oOTAPWRUR1REzN240kO5//FOAvgDFF1LY1IkYBP8jrAfg68Fx+9d98susBkHQycDUwJiKqgX3AxyNiad7uDuBbwIMRsbrIfWN2EJ8Hbh3NbyPiRQBJLwELIyLyy6er8jYfAj4KEBHP5kfBffJ5CyJiN7Bb0mYav7JySUTU5ttZma/7uSZq+0n+vByYlA+fVzccEQsk1V0cNB44A1iaH9y/F9icz5tB9v05u4C6/xLMms0Bbh3N7oLh/QXj+/nz72tDl0vXXdBQuPw+Gv8dL7ZdQ8vUb9/QxRQC5kTElxqY1w/oBXQHegLvFLFts0O4C8VS9Avg45CdUULWtfGHw7TfAfRuh1ouAY7Jpy8ErpB0bD6vX/5dHZDdv/GrwEPAnW1Ul3UCPgK3FE0H/iX/Uqo/ApMP1zgituUfhK4GngAWlLCW28m+RvjXwP8D3si3+bKkrwBPS+oC7AFukvTXwN6I+FdJXYHnJZ0fEc+WsCbrJHwpvZlZotyFYmaWKAe4mVmiHOBmZolygJuZJcoBbmaWKAe4mVmiHOBmZolygJuZJer/A9xpvw0Did7zAAAAAElFTkSuQmCC\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXcAAAETCAYAAADNpUayAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAaRklEQVR4nO3de5RU5Z3u8e/DRYmCINAaAWOTgEZEudiiOUQHxYhOgrd4wcQEox7ORDPRrCMJxkSNSyea8ZgxcbxwogGVkREmKonLKw7HOCbcBJGLCiqBDggNXoJGCJff+aN2M2VbTVd3VXfTL89nrV6197vfvfevdsNTu9/au0oRgZmZpaVdaxdgZmbl53A3M0uQw93MLEEOdzOzBDnczcwS5HA3M0uQw93aJEk/lPSrVq7hCUljW7OG5iapUlJI6tDatVjjyNe52+5O0gjgwYjo09q1pE7SSuDSiHg2m68E3gI6RsS21qvMGstn7tbifBZo1vwc7raTpCGSXpK0SdK/S5oq6cZs2UWSXqjTPyT1y6b3lnSrpFWS1km6W9KnsmUjJFVL+oGkt4FfS1osaXTetjpK2iBpcJ197As8AfSS9EH200vS9ZIezPrUDh18S9JqSe9K+gdJx0haJOk9SXfU2e7FkpZlfZ+SdEjWLkk/l7Re0vvZ+gPrOV6zJF2af3yyY/CupLcknbaLYz1B0hvZsV4q6axd9L1e0jRJD2b9X5F0qKSrszpXSzolr38vSTMkvSNphaT/WWdbD0u6P9vWEklV2bIHgM8Av82O8/fzyvh69rvdIOma+mq13YfD3QCQtBfwKPAA0B2YBny1EZu4BTgUGAz0A3oD1+Yt/3S23UOAccD9wIV5y/8eWBsRC/M3GhEfAqcBayKic/azpp4ajgX6A+cD/wJcA5wMHAGcJ+nvsud6JvBD4GygAvg98FC2jVOAE7Ln0i3b1sYij8GxwGtAT+BnwL2SVE/fN4Djga7AT4AHJR20i22PJve72R9YADxF7v9vb+AG4J68vg8B1UAv4BzgnySNzFt+OjA1e34zgDsAIuIbwCpgdHacf5a3zheBw4CRwLWSDt9FrbY7iAj/+AdygbaG7H2YrO1F4MZs+iLghTrrBLkgF/Ah8Lm8ZV8A3sqmRwB/AzrlLe8FbAL2y+anA9+vp7YRQHWdtuvJjcMDVGa19M5bvhE4P2/+P4Ars+kngEvylrUD/kruheck4HXgOKBdA8dsFrnx6drjsyJv2T5ZTZ8u8vgvBM6oZ9n1wDN586OBD4D22XyXbF/dgIOB7UCXvP4/BSblbevZvGUDgI/y5lcCJ+fN1x7bPnltc4Axrf1v1j+7/vGZu9XqBfw5sv+9mT8VuW4FuTCbnw2BvAc8mbXXqomIzbUzkTv7/i/gq5K6kTs7n1LKEwDW5U1/VGC+czZ9CHB7Xq3vkHuB6h0Rz5E7k/1XYJ2kiZL2K3L/b9dORMRfs8nOhTpK+qakhXk1DCR3xl/sc9sQEdvz5mv31Qt4JyI25fX/E7kz/E/USe5FrVMR74PUXafg87Ldh8Pdaq0FetcZRvhM3vSH5AIcAEmfzlu2gVzAHBER3bKfrhGRHwCFLsuaTG5o5lzgDxHx53pqK/clXauB/5VXa7eI+FREvAgQEb+IiKPJDeccCowv586z8f3/C3wH6BER3YDF5F5gSrUG6C6pS17bZ4D6jm1dvnwuEQ53q/UHYBvwXUkdJJ0NDMtb/jJwhKTBkjqR+/MegIjYQS6sfi7pAABJvSWNamCfjwJDgSvIjcHXZx3QQ1LXRj6n+twNXC3pCABJXSWdm00fI+lYSR3JvaBtJjfMUU77kgvRmmyf3yJ35l6yiFhNbjjtp5I6SToKuITi/ypaB3y2HLVY63K4GwAR8TdybzBeBLxL7o3E3+Qtf53cG3fPAsuBF+ps4gfACuCPkv6S9TusgX1+RG4svG/+vgr0e5Xcm4RvZsMYvRrz3Aps7xFybwBPzWpdTG5YCGA/ci9U75IbztgI3FrK/grsfynwf8i9oK4DjiQ3RFUuF5AbK18DPAJcFxHPFLnuT4EfZcf5qjLWZC3MNzFZvSRNIvdG5o+acR/XAodGxIUNdjazovlmEms1krqTGzL4RmvXYpYaD8tYq8hurFkNPBERz7d2PWap8bCMmVmCfOZuZpYgh7uZWYJ2izdUe/bsGZWVla1dhplZmzJ//vwNEVFRaNluEe6VlZXMmzevtcswM2tTJNX7ESEeljEzS5DD3cwsQQ53M7ME7RZj7ma2+9u6dSvV1dVs3ry54c5WVp06daJPnz507Nix6HUc7mZWlOrqarp06UJlZSX1f8GUlVtEsHHjRqqrq+nbt2/R63lYxsyKsnnzZnr06OFgb2GS6NGjR6P/YnK4m1nRHOytoynH3eFuZlaE9957jzvvvHPn/Jo1azjnnHNasaJd85i7tTmVEx5v7RKa1cqbv9zaJRSl3L+H1nre27dvp3379g32qw33yy67DIBevXoxffr05i6vyXzmbmZtxk033cRhhx3GySefzAUXXMCtt+a+JGvEiBE773LfsGEDtR9nsn37dsaPH88xxxzDUUcdxT333APArFmzOPHEE/na177GkUceyY9//GNuv/32nfu55ppr+MUvfvGxfU+YMIE33niDwYMHM378eFauXMnAgblvR5w0aRJnnnkmo0ePpm/fvtxxxx3cdtttDBkyhOOOO4533nkHgDfeeINTTz2Vo48+muOPP55XX30VgGnTpjFw4EAGDRrECSecUJZj5TN3M2sT5s+fz9SpU1mwYAHbtm1j6NChHH300btc595776Vr167MnTuXLVu2MHz4cE455RQA5syZw+LFi+nbty8rV67k7LPP5oorrmDHjh1MnTqVOXPmfGxbN998M4sXL2bhwoUArFy58mPLFy9ezIIFC9i8eTP9+vXjlltuYcGCBXzve9/j/vvv58orr2TcuHHcfffd9O/fn9mzZ3PZZZfx3HPPccMNN/DUU0/Ru3dv3nvvvbIcL4e7mbUJv//97znrrLPYZ599ADj99NMbXOfpp59m0aJFO4dP3n//fZYvX85ee+3FsGHDdl5aWFlZSY8ePViwYAHr1q1jyJAh9OjRo1H1nXjiiXTp0oUuXbrQtWtXRo8eDcCRRx7JokWL+OCDD3jxxRc599xzd66zZcsWAIYPH85FF13Eeeedx9lnn92o/dbH4W5mbUZ9V4106NCBHTt2AHzsksGI4Je//CWjRo36WP9Zs2ax7777fqzt0ksvZdKkSbz99ttcfPHFja5t77333jndrl27nfPt2rVj27Zt7Nixg27duu0888939913M3v2bB5//HEGDx7MwoULG/3iUpfH3M2sTTjhhBN45JFH+Oijj9i0aRO//e1vdy6rrKxk/vz5AB97k3PUqFHcddddbN26FYDXX3+dDz/8sOD2zzrrLJ588knmzp37iRcDgC5durBp06Ym17/ffvvRt29fpk2bBuReeF5++WUgNxZ/7LHHcsMNN9CzZ09Wr17d5P3U8pm7mbUJQ4cO5fzzz2fw4MEccsghHH/88TuXXXXVVZx33nk88MAD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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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UVZW1qS/fBzgZrYXh3dpNPW4O8DNzPJs2bKFn/zkJ3um165dy8UXX1zCihrmMXCrpWLKvFKX0KiqaeeVuoR2pdi/E6X699u1axcdO3ZstF1NgF977bUA9O3blzlz5rR0ec3iHriZtTnf//73OeaYYzjzzDO54ooruOOO3JcljR49es/V3Js2baLm1hy7du1i8uTJnHzyyZx44oncd999ACxYsIAxY8Zw5ZVXcsIJJ/Cd73yHO++8c89+br75Zu66665a+54yZQqrV69m6NChTJ48maqqKgYPzn0T3vTp07nwwgsZN24cAwYM4O677+ZHP/oRw4YN47TTTuOtt94CYPXq1ZxzzjmcdNJJnH766bz88ssAzJ49m8GDBzNkyBBGjRq138fJPXAza1OWLl3KrFmzqKysZOfOnQwfPpyTTjppn+s88MAD9OjRg8WLF7N9+3ZGjhzJWWedBcCiRYtYsWIFAwYMoKqqivHjx3P99deze/duZs2axaJFi2pta9q0aaxYsYJly5YBUFVVVWv5ihUrqKysZNu2bQwcOJDbb7+dyspKvv71r/Pggw9yww03MGnSJO69914GDRrEwoULufbaa3nmmWe49dZbefLJJ+nXrx9btmzZ72PlADezNuW3v/0tF110EYcccggA559/fqPrPPXUUyxfvnzPUMc777zDqlWr6NKlC6eccsqe0/IqKiooKyujsrKSDRs2MGzYMMrKyppU35gxY+jevTvdu3enR48ejBs3DoATTjiB5cuX89577/Hcc89xySWX7Fln+/btAIwcOZKrr76aSy+9lPHjxzdpv/VxgJtZm9PQ2RidOnVi9+7dALVOt4sIfvzjH3P22WfXar9gwQIOPfTQWvMmTpzI9OnTWb9+PV/+8pebXNtBBx2053mHDh32THfo0IGdO3eye/duevbsuacHn+/ee+9l4cKFzJs3j6FDh7Js2bImv4Hk8xi4mbUpo0aN4pFHHuHDDz9k69at/PrXv96zrKKigqVLlwLU+mDx7LPP5p577mHHjh0AvPLKK7z//vv1bv+iiy7iiSeeYPHixXsFPkD37t3ZunVrs+s/7LDDGDBgALNnzwZyby6///3vgdzY+Kmnnsqtt95K7969WbNmTbP3A+6Bm1kbM3z4cC677DKGDh3K0Ucfzemnn75n2Y033sill17KQw89xBlnnLFn/sSJ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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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2vz56DbUbmaHiJ07d1JWVubw7mCSKCsra9FfPi0ZA58QEZURMTafnwEsiogRwKJ83swOAw7vztHS496WNzEvJfumFfLnyW3YlpnZIWHbtm18//vf3ze/YcMGLr/88k6sqGnFjoEH8LSkAO6JiDnAsRGxESAiNtZ/Q0tDkqaRfTs5xx13XGNdzA5QMePxzi6hXVXP/uvOLqFopf5ZdNZr37t3L927d2+2X32A33DDDQAMHjyYhx9+uL3La5Viz8DHRcQYsm8zuVHSucXuICLmRMTYiBhbXn7AnaBmZgf4+te/zoknnsj555/PNddcw7e+lX1Z0vjx4/fdzb1lyxbqP5pj7969TJ8+nTPOOIPTTjuNe+65B4DFixczYcIEPvrRj3Lqqafyla98hTvvvHPffm699Va+853v7LfvGTNmsG7dOiorK5k+fTrV1dWMHJl9E97cuXOZPHkykyZNYtiwYdx11118+9vfZvTo0Zx99tm89dZbAKxbt46LLrqI008/nXPOOYdXXnkFgAULFjBy5EhGjRrFuecWHaNNKuoMPP9mcSJis6RHyL5DcZOkQfnZ9yBgc5urMbMub8WKFcyfP5+VK1eyZ88exowZw+mnn37Qde6991769evHsmXL2LVrF+PGjeOCCy4AYOnSpVRVVTFs2DCqq6uZMmUKN910E3V1dcyfP5+lS5fut63Zs2dTVVXFqlWrAKiurt5veVVVFStXrmTnzp0MHz6cO+64g5UrV/K5z32O++67j5tvvplp06Zx9913M2LECJYsWcINN9zAs88+y6xZs3jqqacYMmQI27Zta/OxajbAJR0JdIuI7fn0BWTfmbgQmArMzp8fa3M1Ztbl/fKXv+Syyy7jve99LwCXXHJJs+s8/fTTrF69et9Qx+9//3vWrl1Lr169OPPMM/ddlldRUUFZWRkrV65k06ZNjB49mrKyshbVN2HCBPr27Uvfvn3p168fkyZNAuDUU09l9erV7Nixg+eff54rrrhi3zq7du0CYNy4cVx77bVceeWVTJkypUX7bUwxZ+DHAo/k7472AP4lIp6UtAx4SNJ1wBvAFQfZhplZ0Zq6GqNHjx7U1dUB7He5XUTw3e9+lwsvvHC//osXL+bII4/cr+36669n7ty5vPnmm3z6059ucW3vec979k1369Zt33y3bt3Ys2cPdXV19O/ff98ZfKG7776bJUuW8Pjjj1NZWcmqVata/AukULNj4BHxekSMyh+nRMTX8/atETExIkbkz2+1ugozs9y5557LI488wrvvvsv27dv56U9/um9ZRUUFK1asANjvjcULL7yQH/zgB+zevRuAV199lXfeeafR7V922WU8+eSTLFu27IDAB+jbty/bt29vdf1HHXUUw4YNY8GCBUD2y+WFF14AsrHxs846i1mzZjFw4EDWr1/f6v2A78Q0s0PMmDFjuOqqq6isrOT444/nnHPO2bfslltu4corr+T+++/nvPPO29d+/fXXU11dzZgxY4gIysvLefTRRxvdfq9evZgwYQL9+/dv9KqUsrIyxo0bx8iRI7n44ou58cYbW/waHnzwQT7zmc9w++23s3v3bq6++mpGjRrF9OnTWbt2LRHBxIkTGTVqVIu3XahDvxNz7Nix4c8Dt2L4MsLOs2bNGk466aTOLmOfmTNn0qdPH2655ZaSbK+uro4xY8awYMECRowYUZJtllJjx1/SioKbKPfxpxGaWZfx8ssvM3z4cCZOnHhIhndLHdZDKD6LM0vfzJkzS7atk08+mddff71k2+tsPgM3M0uUA9zMDtCR743Zn7X0uDvAzWw/vXv3ZuvWrQ7xDlb/eeC9e/cuep3DegzczFpu6NCh1NTUUFtb2+pt1Lz9bgkrOvQMPfqIdtlu/TfyFMsBbmb76dmzZ9HfCNOUi30BQYfwEIqZWaIc4GZmiXKAm5klygFuZpYoB7iZWaIc4GZmiXKAm5klygFuZpYoB7iZWaIc4GZmiXKAm5klygFuZpYoB7iZWaIc4GZmiXKAm5klygFuZpYoB7iZWaIc4GZmiXKAm5klygFuZpYoB7iZWaIc4GZmiXKAm5klqugAl9Rd0kpJP8vnB0h6RtLa/Pno9ivTzMwaaskZ+E3AmoL5GcCiiBgBLMrnzcysgxQV4JKGAn8N/LCg+VJgXj49D5hc2tLMzOxgij0D/0fg80BdQduxEbERIH8+psS1mZnZQTQb4JL+BtgcEStaswNJ0yQtl7S8tra2NZswM7NGFHMGPg64RFI1MB84T9IDwCZJgwDy582NrRwRcyJibESMLS8vL1HZZmbWbIBHxBcjYmhEVABXA89GxMeBhcDUvNtU4LF2q9LMzA7QluvAZwMflrQW+HA+b2ZmHaRHSzpHxGJgcT69FZhY+pLMzKwYvhPTzCxRDnAzs0Q5wM3MEuUANzNLlAPczCxRDnAzs0Q5wM3MEuUANzNLlAPczCxRDnAzs0Q5wM3MEuUANzNLlAPczCxRDnAzs0Q5wM3MEuUANzNLlAPczCxRDnAzs0Q5wM3MEuUANzNLlAPczCxRDnAzs0Q5wM3MEuUANzNLlAPczCxRDnAzs0Q5wM3MEuUANzNLlAPczCxRDnAzs0Q5wM3MEuUANzNLVLMBLqm3pKWSXpD0kqTb8vYBkp6RtDZ/Prr9yzUzs3rFnIHvAs6LiFFAJXCRpLOBGcCiiBgBLMrnzcysgzQb4JHZkc/2zB8BXArMy9vnAZPbpUIzM2tUUWPgkrpLWgVsBp6JiCXAsRGxESB/Pqb9yjQzs4aKCvCI2BsRlcBQ4ExJI4vdgaRpkpZLWl5bW9vaOs3MrIEWXYUSEduAxcBFwCZJgwDy581NrDMnIsZGxNjy8vI2lmtmZvWKuQqlXFL/fPoI4HzgFWAhMDXvNhV4rL2KNDOzA/Uoos8gYJ6k7mSB/1BE/EzSr4CHJF0HvAFc0Y51mplZA80GeESsBkY30r4VmNgeRZmZWfN8J6aZWaIc4GZmiXKAm5klygFuZpYoB7iZWaIc4GZmiXKAm5klygFuZpYoB7iZWaIc4GZmiXKAm5klygFuZpYoB7iZWaIc4GZmiXKAm5klygFuZpYoB7iZWaIc4GZmiXKAm5klygFuZpYoB7iZWaIc4GZmiXKAm5klygFuZpYoB7iZWaIc4GZmiXKAm5klygFuZpYoB7iZWaIc4GZmiXKAm5klygFuZpYoB7iZWaKaDXBJ75f075LWSHpJ0k15+wBJz0hamz8f3f7lmplZvWLOwPcA/zciTgLOBm6UdDIwA1gUESOARfm8mZl1kGYDPCI2RsSv8+ntwBpgCHApMC/vNg+Y3F5FmpnZgVo0Bi6pAhgNLAGOjYiNkIU8cEypizMzs6YVHeCS+gD/BtwcEX9owXrTJC2XtLy2trY1NZqZWSOKCnBJPcnC+8GI+EnevEnSoHz5IGBzY+tGxJyIGBsRY8vLy0tRs5mZUdxVKALuBdZExLcLFi0EpubTU4HHSl+emZk1pUcRfcYBnwBelLQqb/sSMBt4SNJ1wBvAFe1TopmZNabZAI+I5wA1sXhiacsxM7Ni+U5MM7NEOcDNzBLlADczS5QD3MwsUQ5wM7NEOcDNzBLlADczS5QD3MwsUQ5wM7NEOcDNzBLlADczS5QD3MwsUQ5wM7NEOcDNzBLlADczS5QD3MwsUQ5wM7NEOcDNzBLlADczS5QD3MwsUQ5wM7NEOcDNzBLlADczS5QD3MwsUQ5wM7NEOcDNzBLlADczS5QD3MwsUQ5wM7NEOcDNzBLlADczS5QD3MwsUc0GuKQfSdosqaqgbYCkZyStzZ+Pbt8yzcysoWLOwOcCFzVomwEsiogRwKJ83szMOlCzAR4RvwDeatB8KTAvn54HTC5xXWZm1ozWjoEfGxEbAfLnY0pXkpmZFaPd38SUNE3ScknLa2tr23t3ZmZdRmsDfJOkQQD58+amOkbEnIgYGxFjy8vLW7k7MzNrqLUBvhCYmk9PBR4rTTlmZlasYi4j/DHwK+BESTWSrgNmAx+WtBb4cD5vZmYdqEdzHSLimiYWTSxxLWZm1gK+E9PMLFEOcDOzRDnAzcwS5QA3M0uUA9zMLFEOcDOzRDnAzcwS5QA3M0uUA9zMLFEOcDOzRDnAzcwS5QA3M0uUA9zMLFEOcDOzRDnAzcwS5QA3M0uUA9zMLFEOcDOzRDnAzcwS5QA3M0uUA9zMLFEOcDOzRDnAzcwS5QA3M0uUA9zMLFEOcDOzRDnAzcwS5QA3M0uUA9zMLFEOcDOzRDnAzcwS5QA3M0uUA9zMLFFtCnBJF0n6jaTXJM0oVVFmZta8Vge4pO7A94CLgZOBaySdXKrCzMzs4NpyBn4m8FpEvB4RfwLmA5eWpiwzM2tOjzasOwRYXzBfA5zVsJOkacC0fHaHpN+0YZ+HuoHAlo7ame7oqD11Cf7Zpe1w//kd31hjWwJcjbTFAQ0Rc4A5bdhPMiQtj4ixnV2HtZx/dmnrqj+/tgyh1ADvL5gfCmxoWzlmZlastgT4MmCEpGGSegFXAwtLU5aZmTWn1UMoEbFH0meBp4DuwI8i4qWSVZamLjFUdJjyzy5tXfLnp4gDhq3NzCwBvhPTzCxRDnAzs0Q5wM3MEtWW68C7NEkfJLvzdAjZ9e8bgIURsaZTCzPrAvL/f0OAJRGxo6D9ooh4svMq61g+A28FSV8g++gAAUvJLqkU8GN/qFfaJH2qs2uwg5P0t8BjwP8BqiQVfoTH33VOVZ3DV6G0gqRXgVMiYneD9l7ASxExonMqs7aS9EZEHNfZdVjTJL0I/GVE7JBUATwM3B8Rd0paGRGjO7XADuQhlNapAwYDv2vQPihfZocwSaubWgQc25G1WKt0rx82iYhqSeOBhyUdT+Mf8XHYcoC3zs3AIklr+fMHeh0HDAc+22lVWbGOBS4E3m7QLuD5ji/HWuhNSZURsQogPxP/G+BHwKmdW1rHcoC3QkQ8KekEso/UHUL2H78GWBYRezu1OCvGz4A+9QFQSNLiji/HWuiTwJ7ChojYA3xS0j2dU1Ln8Bi4mVmifBWKmVmiHOBmZolygNthT1J/STcUzI+X9LMi1psl6fwW7qta0sDW1GnWUg5w6wr6Azc026uBiPhqRPy8HeoxKwkHuB0yJFVIekXSDyVVSXpQ0vmS/lPSWkln5v0GSHpU0mpJ/yXptLx9pqQfSVos6fX8jj2A2cAHJK2S9Pd5Wx9JD+f7e1DSAdcPS5or6fJ8ulrSbZJ+LenF/FZuJJVJelrSyvwKCBWs/3FJS/P93iOpu6Qz8rp7SzpS0kuSRrbfUbXDmQPcDjXDgTuB04APAh8FPgTcAnwp73MbsDIiTsvb7itY/4Nk13ifCXxNUk9gBrAuIiojYnrebzTZ9fwnA38BjCuiti0RMQb4QV4PwNeA5/K7/xaS3Q+ApJOAq4BxEVEJ7AU+FhHL8n63A98EHoiIqiKPjdl+fB24HWp+GxEvAkh6CVgUEZHfPl2R9/kQ8BGAiHg2Pwvuly97PCJ2AbskbabpOyuXRkRNvp9V+bafa6a2n+TPK4Ap+fS59dMR8bik+puDJgKnA8vyk/sjgM35sllkn5+zE6j/K8GsxRzgdqjZVTBdVzBfx5//vTZ2u3T9DQ2F6++l6X/jxfZrbJ2G/Ru7mULAvIj4YiPLBgB9gJ5Ab+CdIvZtdgAPoViKfgF8DLIrSsiGNv5wkP7bgb4dUMvFwNF5+yLgcknH5MsG5J/VAdn3N34FeBC4o53qsi7AZ+CWopnAP+cfSvVHYOrBOkfE1vyN0CrgCeDxEtZyG9nHCP8a+A/gjXyfL0v6MvC0pG7AbuBGSX8F7ImIf5HUHXhe0nkR8WwJa7IuwrfSm5klykMoZmaJcoCbmSXKAW5mligHuJlZohzgZmaJcoCbmSXKAW5mligHuJlZov4/H5fCMrkux94AAAAASUVORK5CYII=\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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ftzU680sLVu3bqWiosLh3cEkUVFR0aq/fIoZA58LTCzoaDxwFjAiIo6mzLfhNLPO5fDuHK3d7y0GeHYDos0Fi78KXB8R27I2G1rVq5nZPurtt9/mF7/4xe75devWce6553ZiRU1r6xj4EcBJkn5I7kkm0yJiSWMNJU0l93RyBg0a1FiTfU7VjAc7u4T9Su31n+/sEqwE5f596Kyfh507d9K1a9cW2+0K8CuuuAKA/v37c88997R3eW3S1tMIuwGHknui93Tg39TEsX9EzImI6oiorqzc60pQM7O9/PCHP2TYsGGceuqpTJkyhRtvzI3Sjhs3bvfV3Bs3bmTXrTl27tzJ9OnTOe644xgxYgS33norAAsXLmT8+PF88Ytf5JhjjuF73/seN9100+5+rrnmGn72s5/t0feMGTNYs2YNo0aNYvr06dTW1jJ8eO5JeHPnzuXss89m0qRJDB48mJtvvpmf/OQnjB49mhNPPJHNm3ODFWvWrGHixIkce+yxnHTSSbz00ksALFiwgOHDhzNy5EhOPvnkkvdTW4/A64B7syebL5bUQO5J2/UlV2RmB7Rly5Yxf/58li9fzo4dOxgzZgzHHntss6+57bbb6NOnD0uWLGHbtm2MHTuW0047DYDFixdTU1PD4MGDqa2tZfLkyVx55ZU0NDQwf/58Fi9evMe2rr/+empqalixYgUAtbW1e6yvqalh+fLlbN26lSFDhnDDDTewfPlyvvnNb3LHHXdw1VVXMXXqVGbPns3QoUNZtGgRV1xxBU888QSzZs3ikUceYcCAAbz99tsl76u2Bvj9wCnAQklHAD3IPbHczKwkv//97znnnHM46KCDADjzzDNbfM2jjz7KypUrdw91vPPOO6xevZoePXpw/PHH7z4tr6qqioqKCpYvX8769esZPXo0FRUVrapv/Pjx9O7dm969e9OnTx8mTZoEwDHHHMPKlSt59913efrppznvvPN2v2bbtm0AjB07lksuuYTzzz+fyZMnt6rfxrQY4JLuBsYB/STVAdcCtwO3Z6cWfgBcHH4yhJmVSVNnY3Tr1o2GhgaAPU63iwh+/vOfc/rpp+/RfuHChRx88MF7LLv88suZO3cub775Jpdeemmra/vQhz60e7pLly6757t06cKOHTtoaGigb9++u4/g882ePZtFixbx4IMPMmrUKFasWNHqN5B8xZyF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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXcAAAETCAYAAADNpUayAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAaPUlEQVR4nO3deZRU5Z3/8fcHRImCoNAaAbFR0KgozSJmDoEB8ecyE1SIC2TTqCGJOtGcn0xQk0g4OtGMxp+JE5GMDG4jikZjYtwdYhwTWQSxXRHtSAdkdcEFwvL9/VG3SdlW09Vd1TQ8fF7n1Ol7n/vce791Gz51+6l7qxQRmJlZWtq0dgFmZlZ+DnczswQ53M3MEuRwNzNLkMPdzCxBDnczswQ53G2HJOlSSf/ZyjU8JOnM1qyhpUmqlBSSdmntWqxp5OvcbXsnaThwe0T0aO1aUiepBjg3Ih7P5iuBN4F2EbGx9SqzpvKZu21zPgs0a3kOd9tCUn9Jz0laK+kuSTMkXZEtO0vS0/X6h6Te2fRukq6R9Jak5ZKmSPpMtmy4pFpJ35f0NvBfkqoljcrbVjtJqyRV1dvHHsBDQDdJH2SPbpImSbo961M3dPANSUskvSPp25KOkrRQ0ruSbqi33bMlvZz1fUTSAVm7JF0naYWk97L1+zZwvGZJOjf/+GTH4B1Jb0o6cSvHeqKkxdmxfknS6K30nSRppqTbs/4vSDpY0iVZnUskHZfXv5ukByStkfS6pG/W29bdkm7NtvWipEHZstuAnsBvs+P8r3llfCX73a6SdFlDtdr2w+FuAEjaFbgfuA3YG5gJfKkJm7gaOBioAnoD3YEf5S3/bLbdA4DxwK3AV/OW/xOwLCIW5G80Ij4ETgSWRkSH7LG0gRqOBvoAZwD/D7gMOBY4HDhd0j9mz/UU4FJgDFAB/BG4M9vGccCw7Ll0zra1ushjcDTwKtAV+ClwsyQ10HcxMBToBPwYuF3SflvZ9ihyv5u9gPnAI+T+/3YHJgM35fW9E6gFugGnAv8maWTe8pOAGdnzewC4ASAivga8BYzKjvNP89b5AnAIMBL4kaRDt1KrbQ8iwg8/IBdoS8neh8nangGuyKbPAp6ut06QC3IBHwIH5S37B+DNbHo48Degfd7ybsBaYM9s/h7gXxuobThQW69tErlxeIDKrJbuectXA2fkzd8LXJRNPwSck7esDfARuReeY4DXgM8DbRo5ZrPIjU/XHZ/X85btntX02SKP/wLg5AaWTQIey5sfBXwAtM3mO2b76gzsD2wCOub1/wkwPW9bj+ctOwz4OG++Bjg2b77u2PbIa5sNjG3tf7N+bP3hM3er0w34a2T/ezN/KXLdCnJhNi8bAnkXeDhrr7MyItbVzUTu7Pt/gS9J6kzu7PyOUp4AsDxv+uMC8x2y6QOA6/NqXUPuBap7RDxJ7kz2P4DlkqZK2rPI/b9dNxERH2WTHQp1lPR1SQvyauhL7oy/2Oe2KiI25c3X7asbsCYi1ub1/wu5M/xP1UnuRa19Ee+D1F+n4POy7YfD3eosA7rXG0bomTf9IbkAB0DSZ/OWrSIXMIdHROfs0Ski8gOg0GVZt5AbmjkN+FNE/LWB2sp9SdcS4Ft5tXaOiM9ExDMAEfHziBhIbjjnYGBCOXeeje//CrgA6BIRnYFqci8wpVoK7C2pY15bT6ChY1ufL59LhMPd6vwJ2Ah8V9IuksYAg/OWPw8cLqlKUntyf94DEBGbyYXVdZL2AZDUXdLxjezzfmAAcCG5MfiGLAe6SOrUxOfUkCnAJZIOB5DUSdJp2fRRko6W1I7cC9o6csMc5bQHuRBdme3zG+TO3EsWEUvIDaf9RFJ7SUcC51D8X0XLgQPLUYu1Loe7ARARfyP3BuNZwDvk3kj8dd7y18i9cfc4sAh4ut4mvg+8DvxZ0vtZv0Ma2efH5MbCe+Xvq0C/V8i9SfhGNozRrSnPrcD27iP3BvCMrNZqcsNCAHuSe6F6h9xwxmrgmlL2V2D/LwHXkntBXQ4cQW6IqlzGkRsrXwrcB1weEY8Vue5PgB9kx/niMtZk25hvYrIGSZpO7o3MH7TgPn4EHBwRX220s5kVzTeTWKuRtDe5IYOvtXYtZqnxsIy1iuzGmiXAQxHxVGvXY5YaD8uYmSXIZ+5mZglyuJuZJWi7eEO1a9euUVlZ2dplmJntUObNm7cqIioKLdsuwr2yspK5c+e2dhlmZjsUSQ1+RIiHZczMEuRwNzNLkMPdzCxB28WYu5lt/zZs2EBtbS3r1q1rvLOVVfv27enRowft2rUreh2Hu5kVpba2lo4dO1JZWUnDXzBl5RYRrF69mtraWnr16lX0eh6WMbOirFu3ji5dujjYtzFJdOnSpcl/MTnczaxoDvbW0Zzj7nA3MyvCu+++yy9/+cst80uXLuXUU09txYq2zmPutsOpnPhga5fQomqu+ufWLqEo5f49tNbz3rRpE23btm20X124n3feeQB069aNe+65p6XLazafuZvZDuPKK6/kkEMO4dhjj2XcuHFcc03uS7KGDx++5S73VatWUfdxJps2bWLChAkcddRRHHnkkdx0000AzJo1ixEjRvDlL3+ZI444gh/+8Idcf/31W/Zz2WWX8fOf//wT+544cSKLFy+mqqqKCRMmUFNTQ9++uW9HnD59OqeccgqjRo2iV69e3HDDDfzsZz+jf//+fP7zn2fNmjUALF68mBNOOIGBAwcydOhQXnnlFQBmzpxJ37596devH8OGDSvLsfKZu5ntEObNm8eMGTOYP38+GzduZMCAAQwcOHCr69x888106tSJOXPmsH79eoYMGcJxxx0HwOzZs6murqZXr17U1NQwZswYLrzwQjZv3syMGTOYPXv2J7Z11VVXUV1dzYIFCwCoqan5xPLq6mrmz5/PunXr6N27N1dffTXz58/ne9/7HrfeeisXXXQR48ePZ8qUKfTp04dnn32W8847jyeffJLJkyfzyCOP0L17d959992yHC+Hu5ntEP74xz8yevRodt99dwBOOumkRtd59NFHWbhw4Zbhk/fee49Fixax6667Mnjw4C2XFlZWVtKlSxfmz5/P8uXL6d+/P126dGlSfSNGjKBjx4507NiRTp06MWrUKACOOOIIFi5cyAcffMAzzzzDaaedtmWd9evXAzBkyBDOOussTj/9dMaMGdOk/TbE4W5mO4yGrhrZZZdd2Lx5M8AnLhmMCH7xi19w/PHHf6L/rFmz2GOPPT7Rdu655zJ9+nTefvttzj777CbXtttuu22ZbtOmzZb5Nm3asHHjRjZv3kznzp23nPnnmzJlCs8++ywPPvggVVVVLFiwoMkvLvU1OuYuaZqkFZKq89rukrQge9RIWpC1V0r6OG/ZlJKqMzPLDBs2jPvuu4+PP/6YtWvX8tvf/nbLssrKSubNmwfwiTc5jz/+eG688UY2bNgAwGuvvcaHH35YcPujR4/m4YcfZs6cOZ96MQDo2LEja9eubXb9e+65J7169WLmzJlA7oXn+eefB3Jj8UcffTSTJ0+ma9euLFmypNn7qVPMmft04Abg1rqGiDijblrStcB7ef0X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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ + "# put all query times in a month for all valid users in a data frame\n", + "start = 0\n", + "\n", "for i in range (len(query_month)):\n", " if query_month[i] is not NaN:\n", - " query_month_df = pd.DataFrame(data = {'query times':query_month[i]})\n", - " query_month_df.plot(xlabel='month index',kind = 'bar',title='query times in a month')" + " query_month_df = pd.DataFrame({'user'+str(i+1):query_month[i]}).rename_axis('month indicies').reset_index()\n", + " query_month_df.set_index(['month indicies'], inplace=True)\n", + " start = i\n", + " break\n", + "query_month_df\n", + "\n", + " \n", + "for t in range(start+1,len(query_month)):\n", + " if query_month[t] is not NaN:\n", + " new_month_df = pd.DataFrame({'user'+str(t+1):query_month[t]}).rename_axis('month indicies').reset_index()\n", + " new_month_df.set_index(['month indicies'], inplace=True)\n", + " query_month_df = query_month_df.join(new_month_df,how='outer')\n", + "\n", + "query_month_df" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "naked-february", + "metadata": {}, + "outputs": [], + "source": [ + "# plot a graph for all valid users\n", + "graph_month = query_month_df.plot(kind='bar',figsize=(12,8),title='query times in a month',fontsize=18)\n", + "graph_month.title.set_size(20)\n", + "plt.xlabel('month indicies',fontsize=16)\n", + "plt.ylabel('query times', fontsize=16)\n", + "graph_day.yaxis.set_major_locator(MaxNLocator(integer=True))" + ] + }, + { + "cell_type": "markdown", + "id": "satisfied-essay", + "metadata": {}, + "source": [ + "### Get query times for all valid users in January" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "korean-vintage", + "metadata": {}, + "outputs": [], + "source": [ + "date_df" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "oriented-possibility", + "metadata": {}, + "outputs": [], + "source": [ + "# plot data graph\n", + "graph_date = date_df.plot(kind='bar',figsize=(20,10),title='query times in January',fontsize=18)\n", + "graph_date.title.set_size(20)\n", + "plt.xlabel('date',fontsize=16)\n", + "plt.ylabel('query times', fontsize=16)\n", + "graph_date.yaxis.set_major_locator(MaxNLocator(integer=True))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "alpha-vermont", + "metadata": {}, + "outputs": [], + "source": [ + "# subplots on January query times\n", + "date_ax_arr = date_df.plot(subplots=True,layout=(2,4),kind='bar',figsize=(16,8),fontsize=15,sharey =True)\n", + "\n", + "for ax in date_ax_arr[-1]:\n", + " ax.set_xlabel(\"date\", fontsize=16)\n", + " \n", + "for ax_arr in date_ax_arr:\n", + " ax_arr[0].yaxis.set_major_locator(MaxNLocator(integer=True))\n", + " ax_arr[0].set_ylabel(\"query times\", fontsize=16)\n", + " \n", + "date_ax_arr[-1][0].set_xticks(list(range(0,len(date_df.index),5)))\n", + "date_ax_arr[-1][0].set_xticklabels(list(range(date_df.index[0],date_df.index[-1]+1,5)))" ] } ], diff --git a/tour_model_eval/v-measurel_all_bins_single_user.ipynb b/tour_model_eval/v-measurel_all_bins_single_user.ipynb index cf2aa3a..0b0e3f0 100644 --- a/tour_model_eval/v-measurel_all_bins_single_user.ipynb +++ b/tour_model_eval/v-measurel_all_bins_single_user.ipynb @@ -3,7 +3,7 @@ { "cell_type": "code", "execution_count": null, - "id": "republican-pleasure", + "id": "level-offering", "metadata": {}, "outputs": [], "source": [ @@ -26,7 +26,7 @@ { "cell_type": "code", "execution_count": null, - "id": "decent-passion", + "id": "significant-leone", "metadata": {}, "outputs": [], "source": [ @@ -37,7 +37,7 @@ { "cell_type": "code", "execution_count": null, - "id": "preliminary-example", + "id": "graduate-oliver", "metadata": {}, "outputs": [], "source": [ @@ -48,7 +48,7 @@ { "cell_type": "code", "execution_count": null, - "id": "executive-heather", + "id": "quality-aerospace", "metadata": {}, "outputs": [], "source": [ @@ -66,17 +66,17 @@ { "cell_type": "code", "execution_count": null, - "id": "genuine-shipping", + "id": "awful-career", "metadata": {}, "outputs": [], "source": [ - "user = all_users[6]" + "user = all_users[4]" ] }, { "cell_type": "code", "execution_count": null, - "id": "sorted-juvenile", + "id": "designing-fourth", "metadata": {}, "outputs": [], "source": [ @@ -87,7 +87,7 @@ { "cell_type": "code", "execution_count": null, - "id": "primary-friendly", + "id": "interested-carroll", "metadata": {}, "outputs": [], "source": [ @@ -99,31 +99,33 @@ { "cell_type": "code", "execution_count": null, - "id": "medical-spider", + "id": "adverse-female", "metadata": {}, "outputs": [], "source": [ "# filter out trips that are not fully labeled(contain NaN in user_input)\n", - "valid_trips = [t for t in non_empty_trips if 'mode_confirm' in t[\"data\"][\"user_input\"] and \n", - " 'purpose_confirm'in t[\"data\"][\"user_input\"] and 'replaced_mode' in t[\"data\"][\"user_input\"]]\n", + "non_empty_trips_df = pd.DataFrame(t[\"data\"][\"user_input\"]for t in non_empty_trips)\n", + "valid_trips_df = non_empty_trips_df.dropna(axis=0,how='any',thresh=None,subset=None,inplace=False)\n", + "valid_trips_idx_ls = valid_trips_df.index.tolist()\n", + "valid_trips = [non_empty_trips[i]for i in valid_trips_idx_ls]\n", "len(valid_trips),valid_trips" ] }, { "cell_type": "code", "execution_count": null, - "id": "latest-reconstruction", + "id": "proof-ridge", "metadata": {}, "outputs": [], "source": [ "sim = similarity.similarity(valid_trips, radius)\n", - "sim.data" + "len(sim.data)" ] }, { "cell_type": "code", "execution_count": null, - "id": "stone-omega", + "id": "fuzzy-mexico", "metadata": {}, "outputs": [], "source": [ @@ -133,7 +135,7 @@ { "cell_type": "code", "execution_count": null, - "id": "individual-insert", + "id": "fourth-disposition", "metadata": {}, "outputs": [], "source": [ @@ -152,7 +154,7 @@ { "cell_type": "code", "execution_count": null, - "id": "continued-borough", + "id": "ranging-composition", "metadata": {}, "outputs": [], "source": [ @@ -162,7 +164,7 @@ { "cell_type": "code", "execution_count": null, - "id": "outside-fairy", + "id": "royal-elephant", "metadata": {}, "outputs": [], "source": [ @@ -175,7 +177,7 @@ }, { "cell_type": "markdown", - "id": "extraordinary-penalty", + "id": "unnecessary-significance", "metadata": {}, "source": [ "### Original output" @@ -184,7 +186,7 @@ { "cell_type": "code", "execution_count": null, - "id": "advised-wiring", + "id": "played-passage", "metadata": {}, "outputs": [], "source": [ @@ -195,7 +197,7 @@ { "cell_type": "code", "execution_count": null, - "id": "careful-sally", + "id": "collected-consensus", "metadata": {}, "outputs": [], "source": [ @@ -207,7 +209,7 @@ { "cell_type": "code", "execution_count": null, - "id": "elect-hardwood", + "id": "reverse-hollow", "metadata": {}, "outputs": [], "source": [ @@ -219,7 +221,7 @@ { "cell_type": "code", "execution_count": null, - "id": "dynamic-grace", + "id": "sealed-georgia", "metadata": {}, "outputs": [], "source": [ @@ -231,7 +233,7 @@ { "cell_type": "code", "execution_count": null, - "id": "romance-chrome", + "id": "occupational-attention", "metadata": {}, "outputs": [], "source": [ @@ -241,7 +243,7 @@ { "cell_type": "code", "execution_count": null, - "id": "further-moscow", + "id": "automatic-rebate", "metadata": {}, "outputs": [], "source": [ @@ -256,7 +258,7 @@ { "cell_type": "code", "execution_count": null, - "id": "welsh-trustee", + "id": "raised-hundred", "metadata": {}, "outputs": [], "source": [ @@ -271,7 +273,7 @@ { "cell_type": "code", "execution_count": null, - "id": "minimal-fever", + "id": "noticed-default", "metadata": {}, "outputs": [], "source": [ @@ -284,7 +286,7 @@ { "cell_type": "code", "execution_count": null, - "id": "corporate-missile", + "id": "municipal-rally", "metadata": {}, "outputs": [], "source": [ @@ -297,7 +299,7 @@ { "cell_type": "code", "execution_count": null, - "id": "radio-meter", + "id": "flying-hazard", "metadata": {}, "outputs": [], "source": [ @@ -308,7 +310,7 @@ { "cell_type": "code", "execution_count": null, - "id": "fancy-mount", + "id": "outstanding-differential", "metadata": {}, "outputs": [], "source": [ @@ -318,7 +320,7 @@ { "cell_type": "code", "execution_count": null, - "id": "brown-traveler", + "id": "danish-glasgow", "metadata": {}, "outputs": [], "source": [ @@ -328,7 +330,7 @@ { "cell_type": "code", "execution_count": null, - "id": "chemical-rider", + "id": "spoken-bangkok", "metadata": {}, "outputs": [], "source": [ @@ -337,7 +339,7 @@ }, { "cell_type": "markdown", - "id": "excessive-spell", + "id": "moved-inflation", "metadata": {}, "source": [ "### After changing language" @@ -346,7 +348,7 @@ { "cell_type": "code", "execution_count": null, - "id": "christian-legislature", + "id": "cellular-bruce", "metadata": {}, "outputs": [], "source": [ @@ -359,7 +361,7 @@ { "cell_type": "code", "execution_count": null, - "id": "ready-delay", + "id": "genetic-stuff", "metadata": {}, "outputs": [], "source": [ @@ -374,7 +376,7 @@ { "cell_type": "code", "execution_count": null, - "id": "blind-router", + "id": "attempted-confidentiality", "metadata": {}, "outputs": [], "source": [ @@ -387,7 +389,7 @@ { "cell_type": "code", "execution_count": null, - "id": "suited-institution", + "id": "north-bobby", "metadata": { "scrolled": true }, @@ -401,7 +403,7 @@ { "cell_type": "code", "execution_count": null, - "id": "incomplete-confusion", + "id": "supported-judge", "metadata": {}, "outputs": [], "source": [ @@ -413,7 +415,7 @@ { "cell_type": "code", "execution_count": null, - "id": "ahead-hawaiian", + "id": "corresponding-officer", "metadata": {}, "outputs": [], "source": [ @@ -428,7 +430,7 @@ { "cell_type": "code", "execution_count": null, - "id": "collectible-australia", + "id": "accepting-waterproof", "metadata": {}, "outputs": [], "source": [ @@ -443,7 +445,7 @@ { "cell_type": "code", "execution_count": null, - "id": "changed-pollution", + "id": "german-sugar", "metadata": {}, "outputs": [], "source": [ @@ -453,7 +455,7 @@ { "cell_type": "code", "execution_count": null, - "id": "judicial-printer", + "id": "impossible-rescue", "metadata": {}, "outputs": [], "source": [ @@ -463,7 +465,7 @@ { "cell_type": "code", "execution_count": null, - "id": "female-confidentiality", + "id": "comfortable-playback", "metadata": {}, "outputs": [], "source": [ @@ -472,7 +474,7 @@ }, { "cell_type": "markdown", - "id": "foster-reading", + "id": "israeli-alexandria", "metadata": {}, "source": [ "### After converting purposes and mode" @@ -481,7 +483,7 @@ { "cell_type": "code", "execution_count": null, - "id": "opposite-aurora", + "id": "removed-gallery", "metadata": {}, "outputs": [], "source": [ @@ -492,7 +494,7 @@ { "cell_type": "code", "execution_count": null, - "id": "western-commissioner", + "id": "temporal-campaign", "metadata": {}, "outputs": [], "source": [ @@ -502,7 +504,7 @@ { "cell_type": "code", "execution_count": null, - "id": "vocal-saudi", + "id": "joint-november", "metadata": {}, "outputs": [], "source": [ @@ -522,7 +524,7 @@ { "cell_type": "code", "execution_count": null, - "id": "recreational-label", + "id": "specialized-airport", "metadata": { "scrolled": true }, @@ -536,7 +538,7 @@ { "cell_type": "code", "execution_count": null, - "id": "adequate-notice", + "id": "meaning-planet", "metadata": {}, "outputs": [], "source": [ @@ -548,7 +550,7 @@ { "cell_type": "code", "execution_count": null, - "id": "stuck-survivor", + "id": "patient-monitoring", "metadata": {}, "outputs": [], "source": [ @@ -563,7 +565,7 @@ { "cell_type": "code", "execution_count": null, - "id": "floppy-flight", + "id": "computational-lightning", "metadata": {}, "outputs": [], "source": [ @@ -578,7 +580,7 @@ { "cell_type": "code", "execution_count": null, - "id": "broken-demand", + "id": "boring-cream", "metadata": {}, "outputs": [], "source": [ @@ -588,7 +590,7 @@ { "cell_type": "code", "execution_count": null, - "id": "nasty-potato", + "id": "animated-presentation", "metadata": {}, "outputs": [], "source": [ @@ -598,7 +600,7 @@ { "cell_type": "code", "execution_count": null, - "id": "regular-glance", + "id": "collaborative-essence", "metadata": {}, "outputs": [], "source": [ diff --git a/tour_model_eval/v-measurel_bins_all_user.ipynb b/tour_model_eval/v-measurel_bins_all_user.ipynb index c74fe3c..a5fdab5 100644 --- a/tour_model_eval/v-measurel_bins_all_user.ipynb +++ b/tour_model_eval/v-measurel_bins_all_user.ipynb @@ -3,7 +3,7 @@ { "cell_type": "code", "execution_count": null, - "id": "spoken-acrobat", + "id": "superior-snowboard", "metadata": { "scrolled": true }, @@ -28,7 +28,7 @@ { "cell_type": "code", "execution_count": null, - "id": "solid-decimal", + "id": "brave-finnish", "metadata": {}, "outputs": [], "source": [ @@ -39,7 +39,7 @@ { "cell_type": "code", "execution_count": null, - "id": "acute-departure", + "id": "maritime-arcade", "metadata": {}, "outputs": [], "source": [ @@ -49,7 +49,17 @@ { "cell_type": "code", "execution_count": null, - "id": "practical-flour", + "id": "final-stability", + "metadata": {}, + "outputs": [], + "source": [ + "user_ls = evaluation.get_user_ls(all_users)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "colored-arctic", "metadata": {}, "outputs": [], "source": [ @@ -59,7 +69,7 @@ }, { "cell_type": "markdown", - "id": "indirect-retrieval", + "id": "complete-excess", "metadata": {}, "source": [ "## Bins above cutoff" @@ -67,7 +77,7 @@ }, { "cell_type": "markdown", - "id": "deadly-microwave", + "id": "higher-charge", "metadata": {}, "source": [ "### Original user input" @@ -76,7 +86,7 @@ { "cell_type": "code", "execution_count": null, - "id": "strange-dining", + "id": "joined-mauritius", "metadata": {}, "outputs": [], "source": [ @@ -86,7 +96,7 @@ { "cell_type": "code", "execution_count": null, - "id": "black-mobility", + "id": "cooked-louis", "metadata": {}, "outputs": [], "source": [ @@ -95,7 +105,7 @@ }, { "cell_type": "markdown", - "id": "composite-possibility", + "id": "personalized-stable", "metadata": {}, "source": [ "### After changing language" @@ -104,7 +114,7 @@ { "cell_type": "code", "execution_count": null, - "id": "wanted-mustang", + "id": "august-breed", "metadata": { "scrolled": true }, @@ -116,7 +126,7 @@ { "cell_type": "code", "execution_count": null, - "id": "productive-palestine", + "id": "frequent-niagara", "metadata": {}, "outputs": [], "source": [ @@ -125,7 +135,7 @@ }, { "cell_type": "markdown", - "id": "heard-florist", + "id": "connected-haven", "metadata": {}, "source": [ "### After converting purposes and replaced mode" @@ -134,7 +144,7 @@ { "cell_type": "code", "execution_count": null, - "id": "smaller-creek", + "id": "animated-tumor", "metadata": {}, "outputs": [], "source": [ @@ -144,7 +154,7 @@ { "cell_type": "code", "execution_count": null, - "id": "square-importance", + "id": "primary-tampa", "metadata": {}, "outputs": [], "source": [ @@ -153,7 +163,7 @@ }, { "cell_type": "markdown", - "id": "approximate-groove", + "id": "agricultural-syndicate", "metadata": {}, "source": [ "### DataFrame" @@ -162,7 +172,7 @@ { "cell_type": "code", "execution_count": null, - "id": "studied-saint", + "id": "sorted-honey", "metadata": {}, "outputs": [], "source": [ @@ -176,7 +186,7 @@ }, { "cell_type": "markdown", - "id": "wrapped-rebate", + "id": "conservative-pregnancy", "metadata": {}, "source": [ "#### homogeneity_score" @@ -185,20 +195,19 @@ { "cell_type": "code", "execution_count": null, - "id": "suburban-insertion", + "id": "western-safety", "metadata": {}, "outputs": [], "source": [ "homo_df = pd.DataFrame(data={'original user input':homo_score_ori,'after translation':homo_score_sp2en,\n", " 'after converting purposes and replaced mode':homo_score_cvt}, \n", - " index=['user1','user2','user3','user4','user5','user6','user7','user8',\n", - " 'user9','user10','user11','user12','user13'])" + " index=user_ls)" ] }, { "cell_type": "code", "execution_count": null, - "id": "everyday-conditioning", + "id": "spectacular-haven", "metadata": {}, "outputs": [], "source": [ @@ -207,7 +216,7 @@ }, { "cell_type": "markdown", - "id": "engaged-injury", + "id": "incorporated-google", "metadata": {}, "source": [ "#### completeness_score" @@ -216,20 +225,19 @@ { "cell_type": "code", "execution_count": null, - "id": "mighty-consolidation", + "id": "adapted-insight", "metadata": {}, "outputs": [], "source": [ "comp_df = pd.DataFrame(data={'original user input':comp_score_ori,'after translation':comp_score_sp2en,\n", " 'after converting purposes and replaced mode':comp_score_cvt},\n", - " index=['user1','user2','user3','user4','user5','user6','user7','user8',\n", - " 'user9','user10','user11','user12','user13'])" + " index=user_ls)" ] }, { "cell_type": "code", "execution_count": null, - "id": "christian-revelation", + "id": "chemical-california", "metadata": {}, "outputs": [], "source": [ @@ -238,7 +246,7 @@ }, { "cell_type": "markdown", - "id": "lovely-particle", + "id": "living-archives", "metadata": {}, "source": [ "#### v_measure_score" @@ -247,20 +255,19 @@ { "cell_type": "code", "execution_count": null, - "id": "documented-perfume", + "id": "indonesian-magnet", "metadata": {}, "outputs": [], "source": [ "v_df = pd.DataFrame(data={'original user input':v_score_ori,'after translation':v_score_sp2en,\n", " 'after converting purposes and replaced mode':v_score_cvt},\n", - " index=['user1','user2','user3','user4','user5','user6','user7','user8',\n", - " 'user9','user10','user11','user12','user13'])" + " index=user_ls)" ] }, { "cell_type": "code", "execution_count": null, - "id": "published-kruger", + "id": "demonstrated-resident", "metadata": {}, "outputs": [], "source": [ @@ -269,7 +276,7 @@ }, { "cell_type": "markdown", - "id": "large-cement", + "id": "lined-manner", "metadata": {}, "source": [ "## All bins" @@ -277,7 +284,7 @@ }, { "cell_type": "markdown", - "id": "wrapped-channels", + "id": "insured-kingdom", "metadata": {}, "source": [ "### Original user input" @@ -286,7 +293,7 @@ { "cell_type": "code", "execution_count": null, - "id": "assigned-pearl", + "id": "latest-finding", "metadata": {}, "outputs": [], "source": [ @@ -296,7 +303,7 @@ { "cell_type": "code", "execution_count": null, - "id": "rotary-macro", + "id": "extended-processing", "metadata": {}, "outputs": [], "source": [ @@ -305,7 +312,7 @@ }, { "cell_type": "markdown", - "id": "communist-harvard", + "id": "european-philadelphia", "metadata": {}, "source": [ "### After changing language" @@ -314,7 +321,7 @@ { "cell_type": "code", "execution_count": null, - "id": "median-speed", + "id": "developing-password", "metadata": {}, "outputs": [], "source": [ @@ -324,7 +331,7 @@ { "cell_type": "code", "execution_count": null, - "id": "present-installation", + "id": "collective-calculator", "metadata": {}, "outputs": [], "source": [ @@ -333,7 +340,7 @@ }, { "cell_type": "markdown", - "id": "armed-former", + "id": "capable-bathroom", "metadata": {}, "source": [ "### After converting purposes and replaced mode" @@ -342,7 +349,7 @@ { "cell_type": "code", "execution_count": null, - "id": "august-maintenance", + "id": "obvious-faculty", "metadata": {}, "outputs": [], "source": [ @@ -352,7 +359,7 @@ { "cell_type": "code", "execution_count": null, - "id": "shaped-strip", + "id": "transparent-theology", "metadata": {}, "outputs": [], "source": [ @@ -361,7 +368,7 @@ }, { "cell_type": "markdown", - "id": "gentle-plenty", + "id": "charged-greeting", "metadata": {}, "source": [ "### DataFrame" @@ -370,7 +377,7 @@ { "cell_type": "code", "execution_count": null, - "id": "architectural-perspective", + "id": "extraordinary-friday", "metadata": {}, "outputs": [], "source": [ @@ -384,7 +391,7 @@ }, { "cell_type": "markdown", - "id": "periodic-password", + "id": "trying-flesh", "metadata": {}, "source": [ "#### homogeneity_score" @@ -393,20 +400,19 @@ { "cell_type": "code", "execution_count": null, - "id": "theoretical-oliver", + "id": "distinguished-morris", "metadata": {}, "outputs": [], "source": [ "ab_homo_df=pd.DataFrame(data={'original user input':ab_homo_score_ori,'after translation':ab_homo_score_sp2en,\n", " 'after converting purposes and replaced mode':ab_homo_score_cvt},\n", - " index=['user1','user2','user3','user4','user5','user6','user7','user8',\n", - " 'user9','user10','user11','user12','user13'])" + " index=user_ls)" ] }, { "cell_type": "code", "execution_count": null, - "id": "seasonal-coalition", + "id": "blocked-judge", "metadata": {}, "outputs": [], "source": [ @@ -415,7 +421,7 @@ }, { "cell_type": "markdown", - "id": "outdoor-pavilion", + "id": "english-quick", "metadata": {}, "source": [ "#### completeness_score" @@ -424,20 +430,19 @@ { "cell_type": "code", "execution_count": null, - "id": "activated-schedule", + "id": "speaking-watson", "metadata": {}, "outputs": [], "source": [ "ab_comp_df = pd.DataFrame(data={'original user input':ab_comp_score_ori,'after translation':ab_comp_score_sp2en,\n", " 'after converting purposes and replaced mode':ab_comp_score_cvt},\n", - " index=['user1','user2','user3','user4','user5','user6','user7','user8',\n", - " 'user9','user10','user11','user12','user13'])" + " index=user_ls)" ] }, { "cell_type": "code", "execution_count": null, - "id": "graphic-revision", + "id": "equivalent-fleece", "metadata": {}, "outputs": [], "source": [ @@ -446,7 +451,7 @@ }, { "cell_type": "markdown", - "id": "golden-philadelphia", + "id": "white-reasoning", "metadata": {}, "source": [ "#### v_measure_score" @@ -455,20 +460,19 @@ { "cell_type": "code", "execution_count": null, - "id": "relevant-nebraska", + "id": "sacred-celebrity", "metadata": {}, "outputs": [], "source": [ "ab_v_df = pd.DataFrame(data={'original user input':ab_v_score_ori,'after translation':ab_v_score_sp2en,\n", " 'after converting purposes and replaced mode':ab_v_score_cvt},\n", - " index=['user1','user2','user3','user4','user5','user6','user7','user8',\n", - " 'user9','user10','user11','user12','user13'])" + " index=user_ls)" ] }, { "cell_type": "code", "execution_count": null, - "id": "assisted-franchise", + "id": "figured-stack", "metadata": {}, "outputs": [], "source": [ diff --git a/tour_model_eval/v-measurel_clusters_above_cutoff_all_users.ipynb b/tour_model_eval/v-measurel_clusters_above_cutoff_all_users.ipynb index f44bfdc..a35b9a6 100644 --- a/tour_model_eval/v-measurel_clusters_above_cutoff_all_users.ipynb +++ b/tour_model_eval/v-measurel_clusters_above_cutoff_all_users.ipynb @@ -3,7 +3,7 @@ { "cell_type": "code", "execution_count": null, - "id": "secondary-armor", + "id": "warming-ghana", "metadata": {}, "outputs": [], "source": [ @@ -26,7 +26,7 @@ { "cell_type": "code", "execution_count": null, - "id": "smooth-reviewer", + "id": "hindu-homeless", "metadata": {}, "outputs": [], "source": [ @@ -37,7 +37,7 @@ { "cell_type": "code", "execution_count": null, - "id": "accessible-jaguar", + "id": "serious-guide", "metadata": {}, "outputs": [], "source": [ @@ -47,7 +47,17 @@ { "cell_type": "code", "execution_count": null, - "id": "endangered-device", + "id": "split-burden", + "metadata": {}, + "outputs": [], + "source": [ + "user_ls = evaluation.get_user_ls(all_users)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "abstract-complaint", "metadata": {}, "outputs": [], "source": [ @@ -57,7 +67,7 @@ }, { "cell_type": "markdown", - "id": "prescription-disease", + "id": "colored-surprise", "metadata": {}, "source": [ "## Evaluate clusters above cutoff based on silhouette_score" @@ -65,7 +75,7 @@ }, { "cell_type": "markdown", - "id": "fatal-castle", + "id": "received-isolation", "metadata": {}, "source": [ "### Original user input" @@ -74,7 +84,7 @@ { "cell_type": "code", "execution_count": null, - "id": "federal-convertible", + "id": "original-parade", "metadata": {}, "outputs": [], "source": [ @@ -84,7 +94,7 @@ { "cell_type": "code", "execution_count": null, - "id": "polyphonic-astronomy", + "id": "professional-evans", "metadata": {}, "outputs": [], "source": [ @@ -93,7 +103,7 @@ }, { "cell_type": "markdown", - "id": "later-share", + "id": "latin-boulder", "metadata": {}, "source": [ "### After changing language" @@ -102,7 +112,7 @@ { "cell_type": "code", "execution_count": null, - "id": "lesbian-realtor", + "id": "prescription-supplement", "metadata": {}, "outputs": [], "source": [ @@ -112,7 +122,7 @@ { "cell_type": "code", "execution_count": null, - "id": "defensive-numbers", + "id": "lesbian-testing", "metadata": {}, "outputs": [], "source": [ @@ -121,7 +131,7 @@ }, { "cell_type": "markdown", - "id": "amended-girlfriend", + "id": "opened-norway", "metadata": {}, "source": [ "### After converting purposes and replaced mode" @@ -130,7 +140,7 @@ { "cell_type": "code", "execution_count": null, - "id": "synthetic-debate", + "id": "wicked-timeline", "metadata": {}, "outputs": [], "source": [ @@ -140,7 +150,7 @@ { "cell_type": "code", "execution_count": null, - "id": "finite-ireland", + "id": "severe-plant", "metadata": {}, "outputs": [], "source": [ @@ -149,7 +159,7 @@ }, { "cell_type": "markdown", - "id": "inclusive-champagne", + "id": "matched-custody", "metadata": {}, "source": [ "### DataFrame" @@ -158,7 +168,7 @@ { "cell_type": "code", "execution_count": null, - "id": "protective-appraisal", + "id": "bizarre-retailer", "metadata": {}, "outputs": [], "source": [ @@ -172,7 +182,7 @@ }, { "cell_type": "markdown", - "id": "intended-campaign", + "id": "sacred-applicant", "metadata": {}, "source": [ "#### homogeneity_score" @@ -181,20 +191,19 @@ { "cell_type": "code", "execution_count": null, - "id": "robust-matthew", + "id": "alpha-differential", "metadata": {}, "outputs": [], "source": [ "homo_df = pd.DataFrame(data={'original user input':homo_score_ori,'after translation':homo_score_sp2en,\n", " 'after converting purposes and replaced mode':homo_score_cvt}, \n", - " index=['user1','user2','user3','user4','user5','user6','user7','user8',\n", - " 'user9','user10','user11','user12','user13'])" + " index=user_ls)" ] }, { "cell_type": "code", "execution_count": null, - "id": "surrounded-karma", + "id": "mental-abraham", "metadata": {}, "outputs": [], "source": [ @@ -203,7 +212,7 @@ }, { "cell_type": "markdown", - "id": "furnished-valve", + "id": "premium-force", "metadata": {}, "source": [ "#### completeness_score" @@ -212,20 +221,19 @@ { "cell_type": "code", "execution_count": null, - "id": "regulation-storage", + "id": "former-store", "metadata": {}, "outputs": [], "source": [ "comp_df = pd.DataFrame(data={'original user input':comp_score_ori,'after translation':comp_score_sp2en,\n", " 'after converting purposes and replaced mode':comp_score_cvt},\n", - " index=['user1','user2','user3','user4','user5','user6','user7','user8',\n", - " 'user9','user10','user11','user12','user13'])" + " index=user_ls)" ] }, { "cell_type": "code", "execution_count": null, - "id": "liked-palestine", + "id": "brave-kentucky", "metadata": { "scrolled": true }, @@ -236,7 +244,7 @@ }, { "cell_type": "markdown", - "id": "gorgeous-denver", + "id": "affecting-daughter", "metadata": {}, "source": [ "#### v_measure_score" @@ -245,20 +253,19 @@ { "cell_type": "code", "execution_count": null, - "id": "quiet-capital", + "id": "cheap-psychiatry", "metadata": {}, "outputs": [], "source": [ "v_df = pd.DataFrame(data={'original user input':v_score_ori,'after translation':v_score_sp2en,\n", " 'after converting purposes and replaced mode':v_score_cvt},\n", - " index=['user1','user2','user3','user4','user5','user6','user7','user8',\n", - " 'user9','user10','user11','user12','user13'])" + " index=user_ls)" ] }, { "cell_type": "code", "execution_count": null, - "id": "behavioral-embassy", + "id": "violent-consideration", "metadata": {}, "outputs": [], "source": [ diff --git a/tour_model_eval/v-measurel_cutoff_bins_single_user.ipynb b/tour_model_eval/v-measurel_cutoff_bins_single_user.ipynb index 271ef9f..a88733a 100644 --- a/tour_model_eval/v-measurel_cutoff_bins_single_user.ipynb +++ b/tour_model_eval/v-measurel_cutoff_bins_single_user.ipynb @@ -113,8 +113,10 @@ "outputs": [], "source": [ "# filter out trips that are not fully labeled(contain NaN in user_input)\n", - "valid_trips = [t for t in non_empty_trips if 'mode_confirm' in t[\"data\"][\"user_input\"] and \n", - " 'purpose_confirm'in t[\"data\"][\"user_input\"] and 'replaced_mode' in t[\"data\"][\"user_input\"]]\n", + "non_empty_trips_df = pd.DataFrame(t[\"data\"][\"user_input\"]for t in non_empty_trips)\n", + "valid_trips_df = non_empty_trips_df.dropna(axis=0,how='any',thresh=None,subset=None,inplace=False)\n", + "valid_trips_idx_ls = valid_trips_df.index.tolist()\n", + "valid_trips = [non_empty_trips[i]for i in valid_trips_idx_ls]\n", "len(valid_trips),valid_trips" ] }, diff --git a/tour_model_eval/v-measurel_cutoff_clusters_single_user.ipynb b/tour_model_eval/v-measurel_cutoff_clusters_single_user.ipynb index c1c1ea9..e16031c 100644 --- a/tour_model_eval/v-measurel_cutoff_clusters_single_user.ipynb +++ b/tour_model_eval/v-measurel_cutoff_clusters_single_user.ipynb @@ -70,7 +70,7 @@ "metadata": {}, "outputs": [], "source": [ - "user = all_users[6]" + "user = all_users[0]" ] }, { @@ -104,9 +104,11 @@ "outputs": [], "source": [ "# filter out trips that are not fully labeled(contain NaN in user_input)\n", - "valid_trips = [t for t in non_empty_trips if 'mode_confirm' in t[\"data\"][\"user_input\"] and \n", - " 'purpose_confirm'in t[\"data\"][\"user_input\"] and 'replaced_mode' in t[\"data\"][\"user_input\"]]\n", - "len(valid_trips)" + "non_empty_trips_df = pd.DataFrame(t[\"data\"][\"user_input\"]for t in non_empty_trips)\n", + "valid_trips_df = non_empty_trips_df.dropna(axis=0,how='any',thresh=None,subset=None,inplace=False)\n", + "valid_trips_idx_ls = valid_trips_df.index.tolist()\n", + "valid_trips = [non_empty_trips[i]for i in valid_trips_idx_ls]\n", + "len(valid_trips),valid_trips" ] }, { From 1be3341b32752acaa35124fbde7afb322545a05c Mon Sep 17 00:00:00 2001 From: Chunrui Huang Date: Sat, 13 Mar 2021 14:18:39 -0800 Subject: [PATCH 11/16] change'query times' to 'user input request times', add scatter(v-score,user input request proportion median) --- ... user_input_request_times_all_users.ipynb} | 311 ++++++++++++------ 1 file changed, 209 insertions(+), 102 deletions(-) rename tour_model_eval/{query_times_all_users.ipynb => user_input_request_times_all_users.ipynb} (55%) diff --git a/tour_model_eval/query_times_all_users.ipynb b/tour_model_eval/user_input_request_times_all_users.ipynb similarity index 55% rename from tour_model_eval/query_times_all_users.ipynb rename to tour_model_eval/user_input_request_times_all_users.ipynb index a15e626..8d4528d 100644 --- a/tour_model_eval/query_times_all_users.ipynb +++ b/tour_model_eval/user_input_request_times_all_users.ipynb @@ -26,7 +26,7 @@ "import matplotlib.pyplot as plt\n", "from matplotlib.ticker import MaxNLocator\n", "import numpy as np\n", - "# import matplotlib.ticker as ticker" + "from matplotlib import cm" ] }, { @@ -57,7 +57,7 @@ "metadata": {}, "outputs": [], "source": [ - "query_day = []" + "req_day = []" ] }, { @@ -67,7 +67,17 @@ "metadata": {}, "outputs": [], "source": [ - "query_month = []" + "req_month = []" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "incident-hampton", + "metadata": {}, + "outputs": [], + "source": [ + "req_propor_median = []" ] }, { @@ -103,14 +113,50 @@ { "cell_type": "code", "execution_count": null, - "id": "formed-drive", + "id": "frozen-stanford", "metadata": {}, "outputs": [], "source": [ - "# build a base dataframe for query times in January \n", + "# bin trips according to ['start_local_dt']\n", + "def bin_date(trip_ls,day=None,month=None):\n", + " bin_date = []\n", + " for trip_index in trip_ls:\n", + " added = False\n", + " trip = filter_trips[trip_index]\n", + "\n", + " for bin in bin_date:\n", + " if day:\n", + " if match_day(trip,bin):\n", + " bin.append(trip_index)\n", + " added = True\n", + " break\n", + " if month:\n", + " if match_month(trip,bin):\n", + " bin.append(trip_index)\n", + " added = True\n", + " break\n", + "\n", + " if not added:\n", + " bin_date.append([trip_index])\n", + "\n", + " return bin_date " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "formed-drive", + "metadata": { + "scrolled": false + }, + "outputs": [], + "source": [ + "# build a base dataframe for request times in January \n", "date_df = pd.DataFrame(data = {'date':np.arange(1,32),'drop_col':np.arange(1,32)})\n", "date_df.set_index(['date'], inplace=True)\n", "\n", + "# get valid user list\n", + "valid_users = []\n", "\n", "for a in range(len(all_users)):\n", " user = all_users[a]\n", @@ -119,36 +165,39 @@ "\n", " # filter out users that don't have enough valid labeled trips\n", " if not evaluation.valid_user(filter_trips,trips):\n", - " query_day.append(NaN)\n", - " query_month.append(NaN) \n", + " req_day.append(NaN)\n", + " req_month.append(NaN) \n", " continue\n", - " \n", + " val_user = 'user' + str(a + 1)\n", + " valid_users.append(val_user)\n", " sim.bin_data()\n", " sim.delete_bins()\n", " bins = sim.bins\n", " \n", - " # collect query trips and common trips(no need to query) indices above cutoff\n", + " # collect requested trips and common trips(no need to request) indices above cutoff\n", " ab_trip_ls = []\n", - " no_query_trip_ls = []\n", + " no_req_trip_ls = []\n", " for bin in bins:\n", " early_trip = filter_trips[bin[0]]\n", - " trip_index = 0\n", + " index = 0\n", " for i in range(1,len(bin)):\n", " compare_trip = filter_trips[bin[i]]\n", " if early_trip['data']['start_local_dt']['year']>compare_trip['data']['start_local_dt']['year']:\n", " early_trip = compare_trip\n", - " trip_index = i\n", + " index = i\n", " elif early_trip['data']['start_local_dt']['year']==compare_trip['data']['start_local_dt']['year'] and early_trip['data']['start_local_dt']['month']>compare_trip['data']['start_local_dt']['month']:\n", " early_trip = compare_trip\n", - " trip_index = i\n", + " index = i\n", " elif early_trip['data']['start_local_dt']['year']==compare_trip['data']['start_local_dt']['year'] and early_trip['data']['start_local_dt']['month']==compare_trip['data']['start_local_dt']['month'] and early_trip['data']['start_local_dt']['day']>compare_trip['data']['start_local_dt']['day']:\n", " early_trip = compare_trip\n", - " trip_index = i\n", - " ab_trip_ls.append(bin[trip_index])\n", + " index = i\n", + " early_trip_index = bin[index]\n", + " ab_trip_ls.append(early_trip_index)\n", " \n", " for k in range(len(bin)):\n", - " if k != trip_index:\n", - " no_query_trip_ls.append(bin[k])\n", + " if k != index:\n", + " no_req_trip_idx = bin[k]\n", + " no_req_trip_ls.append(no_req_trip_idx)\n", "\n", "\n", " \n", @@ -158,30 +207,21 @@ " # collect query trips indices below cutoff\n", " bl_trip_ls = []\n", " for bin in bl_bins:\n", - " for index in bin:\n", - " bl_trip_ls.append(index)\n", + " for trip_index in bin:\n", + " bl_trip_ls.append(trip_index)\n", " \n", - " # whole list of query trips indices\n", - " query_trips_ls=ab_trip_ls+bl_trip_ls\n", + " # whole list of requested trips indices\n", + " req_trips_ls=ab_trip_ls+bl_trip_ls\n", " \n", " \n", - " # collect query times in a day\n", - " bin_day = []\n", - " for trip_index in query_trips_ls:\n", - " added = False\n", - " trip = filter_trips[trip_index]\n", - " for bin in bin_day:\n", - " if match_day(trip,bin):\n", - " bin.append(trip_index)\n", - " added = True\n", - " if not added:\n", - " bin_day.append([trip_index])\n", - " query_day_ls = []\n", + " # collect request times in a day\n", + " bin_day = bin_date(req_trips_ls,day=True)\n", + " req_day_ls = []\n", " for bin in bin_day:\n", - " query_day_ls.append(len(bin))\n", - " \n", - " # collect 0 query days \n", - " for trip_index in no_query_trip_ls:\n", + " req_day_ls.append(len(bin))\n", + " \n", + " # collect 0 request days \n", + " for trip_index in no_req_trip_ls:\n", " trip = filter_trips[trip_index]\n", " match = False\n", " for bin in bin_day:\n", @@ -189,43 +229,56 @@ " match = True\n", " break\n", " if not match:\n", - " query_day_ls.append(0)\n", + " req_day_ls.append(0)\n", " \n", - "\n", - " # collect query times in a day for every user\n", - " query_day.append(query_day_ls)\n", + " # collect request times in a day for every user\n", + " req_day.append(req_day_ls)\n", + " \n", + " # collect user input request proportion in a day\n", + " filter_trips_df = pd.DataFrame(filter_trips)\n", + " filter_trips_idx_ls = filter_trips_df.index.values.tolist()\n", + " bin_filter_trips_day = bin_date(filter_trips_idx_ls,day=True)\n", + " propor_single_user = []\n", + " for valid_trips_bin in bin_filter_trips_day:\n", + " match = False\n", + " for req_trips_bin in bin_day:\n", + " req_trip = filter_trips[req_trips_bin[0]]\n", + " if match_day(req_trip,valid_trips_bin):\n", + " proportion = round(len(req_trips_bin)/len(valid_trips_bin), 2)\n", + " propor_single_user.append(proportion)\n", + " match = True\n", + " break\n", + " if not match:\n", + " propor_single_user.append(0) \n", + " \n", + " # get user input request proportion median in a day\n", + " median = np.median(propor_single_user)\n", " \n", + " # collect medians for every user\n", + " req_propor_median.append(median)\n", " \n", - " # collect query times in a month\n", - " bin_month = []\n", - " for trip_index in query_trips_ls:\n", - " added = False\n", - " trip = filter_trips[trip_index]\n", - " for bin in bin_month:\n", - " if match_month(trip,bin):\n", - " bin.append(trip_index)\n", - " added = True\n", - " if not added:\n", - " bin_month.append([trip_index])\n", - " query_month_ls = []\n", + " \n", + " # collect request times in a month\n", + " bin_month = bin_date(req_trips_ls,month=True)\n", + " req_month_ls = []\n", " for bin in bin_month:\n", - " query_month_ls.append(len(bin))\n", + " req_month_ls.append(len(bin))\n", "\n", - " # collect query times in a month for every user\n", - " query_month.append(query_month_ls)\n", + " # collect request times in a month for every user\n", + " req_month.append(req_month_ls)\n", " \n", " # select the trips that are in Jan 2021\n", " jan_trips = []\n", - " for trip_index in query_trips_ls:\n", + " for trip_index in req_trips_ls:\n", " if filter_trips[trip_index]['data']['start_local_dt']['year']==2021 and filter_trips[trip_index]['data']['start_local_dt']['month']==1:\n", " jan_trips.append(trip_index)\n", " \n", - " # create the data frame for query times in Jan 2021\n", - " date = []\n", + " # create the data frame for request times in Jan 2021\n", + " jan_date = []\n", " for trip_index in jan_trips:\n", " trip_date = filter_trips[trip_index]['data']['start_local_dt']['day']\n", - " date.append(trip_date)\n", - " new_date_df = pd.DataFrame(data = date)\n", + " jan_date.append(trip_date)\n", + " new_date_df = pd.DataFrame(data = jan_date)\n", " new_date_df=new_date_df.value_counts(sort = False).rename_axis('date').to_frame('user'+str(a+1)).reset_index()\n", " new_date_df.set_index(['date'], inplace=True)\n", " date_df = date_df.join(new_date_df,how='outer')\n", @@ -239,7 +292,7 @@ "metadata": {}, "outputs": [], "source": [ - "query_day" + "req_day" ] }, { @@ -249,7 +302,7 @@ "metadata": {}, "outputs": [], "source": [ - "query_month" + "req_month" ] }, { @@ -257,7 +310,7 @@ "id": "ruled-dictionary", "metadata": {}, "source": [ - "### Plot query times in a day" + "### Plot request times in a day" ] }, { @@ -267,24 +320,24 @@ "metadata": {}, "outputs": [], "source": [ - "# show query times in a data frame\n", + "# show request times in a data frame\n", "base = 0\n", - "for i in range (len(query_day)):\n", - " if query_day[i] is not NaN:\n", - " query_day_ls_df = pd.DataFrame(data = query_day[i])\n", - " query_day_df=query_day_ls_df.value_counts(sort = False).rename_axis('query times').to_frame('user'+str(i+1)).reset_index()\n", - " query_day_df.set_index(['query times'], inplace=True)\n", + "for i in range (len(req_day)):\n", + " if req_day[i] is not NaN:\n", + " req_day_ls_df = pd.DataFrame(data = req_day[i])\n", + " req_day_df=req_day_ls_df.value_counts(sort = False).rename_axis('request times').to_frame('user'+str(i+1)).reset_index()\n", + " req_day_df.set_index(['request times'], inplace=True)\n", " base = i\n", " break\n", " \n", - "for i in range (base+1,len(query_day)):\n", - " if query_day[i] is not NaN:\n", - " new_day_df = pd.DataFrame(data = query_day[i])\n", - " new_day_df = new_day_df.value_counts(sort = False).rename_axis('query times').to_frame('user'+str(i+1)).reset_index()\n", - " new_day_df.set_index(['query times'], inplace=True)\n", - " query_day_df=query_day_df.join(new_day_df,how='outer',sort='query times')\n", + "for i in range (len(req_day)):\n", + " if req_day[i] is not NaN and i is not base:\n", + " new_day_df = pd.DataFrame(data = req_day[i])\n", + " new_day_df = new_day_df.value_counts(sort = False).rename_axis('request times').to_frame('user'+str(i+1)).reset_index()\n", + " new_day_df.set_index(['request times'], inplace=True)\n", + " req_day_df=req_day_df.join(new_day_df,how='outer',sort='request times')\n", " \n", - "query_day_df" + "req_day_df" ] }, { @@ -295,10 +348,10 @@ "outputs": [], "source": [ "# plot a graph for all valid users\n", - "yticks_max = query_day_df.max().max()\n", - "graph_day = query_day_df.plot(kind='bar',figsize=(14,16),title='query times in a day',fontsize=18,yticks=np.arange(0, yticks_max+4, step=4))\n", + "yticks_max = req_day_df.max().max()\n", + "graph_day = req_day_df.plot(kind='bar',figsize=(14,16),title='request times in a day',fontsize=18,yticks=np.arange(0, yticks_max+4, step=4))\n", "graph_day.title.set_size(20)\n", - "plt.xlabel('query times',fontsize=16)\n", + "plt.xlabel('request times',fontsize=16)\n", "plt.ylabel('days', fontsize=16)" ] }, @@ -312,7 +365,7 @@ "outputs": [], "source": [ "# subplots\n", - "day_ax_arr = query_day_df.plot(subplots=True,layout=(2,4),kind='bar',figsize=(16,8),fontsize=15,sharey=True)\n", + "day_ax_arr = req_day_df.plot(subplots=True,layout=(2,4),kind='bar',figsize=(16,8),fontsize=15,sharey=True)\n", "\n", "for ax in day_ax_arr[-1]:\n", " ax.set_xlabel('query times', fontsize=16)\n", @@ -328,7 +381,7 @@ "id": "confident-capacity", "metadata": {}, "source": [ - "### Plot query times in a month" + "### Plot request times in a month" ] }, { @@ -346,25 +399,25 @@ "metadata": {}, "outputs": [], "source": [ - "# put all query times in a month for all valid users in a data frame\n", + "# put all request times in a month for all valid users in a data frame\n", "start = 0\n", "\n", - "for i in range (len(query_month)):\n", - " if query_month[i] is not NaN:\n", - " query_month_df = pd.DataFrame({'user'+str(i+1):query_month[i]}).rename_axis('month indicies').reset_index()\n", - " query_month_df.set_index(['month indicies'], inplace=True)\n", + "for i in range (len(req_month)):\n", + " if req_month[i] is not NaN:\n", + " req_month_df = pd.DataFrame({'user'+str(i+1):req_month[i]}).rename_axis('month indicies').reset_index()\n", + " req_month_df.set_index(['month indicies'], inplace=True)\n", " start = i\n", " break\n", - "query_month_df\n", + "req_month_df\n", "\n", " \n", - "for t in range(start+1,len(query_month)):\n", - " if query_month[t] is not NaN:\n", - " new_month_df = pd.DataFrame({'user'+str(t+1):query_month[t]}).rename_axis('month indicies').reset_index()\n", + "for t in range(len(req_month)):\n", + " if req_month[t] is not NaN and t is not start:\n", + " new_month_df = pd.DataFrame({'user'+str(t+1):req_month[t]}).rename_axis('month indicies').reset_index()\n", " new_month_df.set_index(['month indicies'], inplace=True)\n", - " query_month_df = query_month_df.join(new_month_df,how='outer')\n", + " req_month_df = req_month_df.join(new_month_df,how='outer')\n", "\n", - "query_month_df" + "req_month_df" ] }, { @@ -375,11 +428,11 @@ "outputs": [], "source": [ "# plot a graph for all valid users\n", - "graph_month = query_month_df.plot(kind='bar',figsize=(12,8),title='query times in a month',fontsize=18)\n", + "graph_month = req_month_df.plot(kind='bar',figsize=(12,8),title='request times in a month',fontsize=18)\n", "graph_month.title.set_size(20)\n", "plt.xlabel('month indicies',fontsize=16)\n", - "plt.ylabel('query times', fontsize=16)\n", - "graph_day.yaxis.set_major_locator(MaxNLocator(integer=True))" + "plt.ylabel('request times', fontsize=16)\n", + "graph_month.yaxis.set_major_locator(MaxNLocator(integer=True))" ] }, { @@ -387,7 +440,7 @@ "id": "satisfied-essay", "metadata": {}, "source": [ - "### Get query times for all valid users in January" + "### Get request times for all valid users in January" ] }, { @@ -408,10 +461,10 @@ "outputs": [], "source": [ "# plot data graph\n", - "graph_date = date_df.plot(kind='bar',figsize=(20,10),title='query times in January',fontsize=18)\n", + "graph_date = date_df.plot(kind='bar',figsize=(20,10),title='request times in January',fontsize=18)\n", "graph_date.title.set_size(20)\n", "plt.xlabel('date',fontsize=16)\n", - "plt.ylabel('query times', fontsize=16)\n", + "plt.ylabel('request times', fontsize=16)\n", "graph_date.yaxis.set_major_locator(MaxNLocator(integer=True))" ] }, @@ -419,10 +472,12 @@ "cell_type": "code", "execution_count": null, "id": "alpha-vermont", - "metadata": {}, + "metadata": { + "scrolled": true + }, "outputs": [], "source": [ - "# subplots on January query times\n", + "# subplots on January request times\n", "date_ax_arr = date_df.plot(subplots=True,layout=(2,4),kind='bar',figsize=(16,8),fontsize=15,sharey =True)\n", "\n", "for ax in date_ax_arr[-1]:\n", @@ -430,11 +485,63 @@ " \n", "for ax_arr in date_ax_arr:\n", " ax_arr[0].yaxis.set_major_locator(MaxNLocator(integer=True))\n", - " ax_arr[0].set_ylabel(\"query times\", fontsize=16)\n", + " ax_arr[0].set_ylabel(\"request times\", fontsize=16)\n", " \n", "date_ax_arr[-1][0].set_xticks(list(range(0,len(date_df.index),5)))\n", "date_ax_arr[-1][0].set_xticklabels(list(range(date_df.index[0],date_df.index[-1]+1,5)))" ] + }, + { + "cell_type": "markdown", + "id": "applied-residence", + "metadata": {}, + "source": [ + "## Scatter(v-score on valid trips above cutoff, user input request proportion median)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "olympic-guarantee", + "metadata": {}, + "outputs": [], + "source": [ + "# Here we use v-score on bins above cutoff after changing language and converting purposes and modes\n", + "homo_score_cvt, comp_score_cvt, v_score_cvt = evaluation.v_measure_bins(all_users,radius,cvt_pur_mo=True,cutoff=True)\n", + "v_score_df = pd.DataFrame(data = {'v score':v_score_cvt}).dropna().reset_index(drop=True)\n", + "valid_v_score = v_score_df['v score'].values.tolist()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "current-crime", + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "x=req_propor_median\n", + "y=valid_v_score\n", + "v=valid_users\n", + "cmp = cm.get_cmap('Dark2', len(valid_users))\n", + "\n", + "for i in range(len(valid_users)):\n", + " plt.scatter(x[i], y[i], color=cmp.colors[i], label=v[i], s=70, alpha=0.7)\n", + "plt.legend(markerscale=0.7, scatterpoints=1)\n", + "plt.xlabel('user input request proportion median',fontsize=16)\n", + "plt.ylabel('v measure score',fontsize=16)\n", + "plt.xticks(fontsize=14)\n", + "plt.yticks(fontsize=14)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "velvet-sweden", + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { From 302c6811d2a454d6a8f931c97336d2158ac44682 Mon Sep 17 00:00:00 2001 From: Chunrui Huang Date: Sat, 27 Mar 2021 17:38:52 -0700 Subject: [PATCH 12/16] modified evaluation code, changed to use homogeneity score for evaluation --- .../confirmed_trips_eval_bins_clusters.py | 116 +++++++++-------- .../user_input_request_times_all_users.ipynb | 32 ++--- .../v-measurel_bins_all_user.ipynb | 121 +++++------------- ...urel_clusters_above_cutoff_all_users.ipynb | 61 +++------ 4 files changed, 126 insertions(+), 204 deletions(-) diff --git a/tour_model_eval/confirmed_trips_eval_bins_clusters.py b/tour_model_eval/confirmed_trips_eval_bins_clusters.py index a538910..9131e61 100644 --- a/tour_model_eval/confirmed_trips_eval_bins_clusters.py +++ b/tour_model_eval/confirmed_trips_eval_bins_clusters.py @@ -22,12 +22,20 @@ map_pur_dict = {'course':'school','work_- lunch break':'lunch_break','on_the way home':'home', 'insurance_payment':'insurance'} -def get_user_ls(all_users): +def get_user_ls(all_users,radius): user_ls = [] + valid_user_ls = [] for i in range(len(all_users)): curr_user = 'user' + str(i + 1) - user_ls.append(curr_user) - return user_ls + user = all_users[i] + filter_trips,sim,trips = filter_data(user,radius) + if valid_user(filter_trips,trips): + valid_user_ls.append(curr_user) + user_ls.append(curr_user) + else: + user_ls.append(curr_user) + continue + return user_ls,valid_user_ls def filter_data(user,radius): @@ -48,6 +56,44 @@ def valid_user(filter_trips,trips): valid = True return valid +def map_labels(user_input_df,span_eng_dict,map_pur_dict,sp2en,cvt_pur_mo): + if sp2en: + # change language + user_input_df = user_input_df.replace(span_eng_dict) + elif cvt_pur_mo: + # change language first + user_input_df = user_input_df.replace(span_eng_dict) + # convert purpose + user_input_df = user_input_df.replace(map_pur_dict) + # convert mode + for a in range(len(user_input_df)): + if user_input_df.iloc[a]["replaced_mode"] == "same_mode": + # to see which row will be converted + logging.debug("The following rows will be changed: %s", user_input_df.iloc[a]) + user_input_df.iloc[a]["replaced_mode"] = user_input_df.iloc[a]['mode_confirm'] + return user_input_df + + +def valid_user_check(filter_trips,trips,homo_score,comp_score,v_score): + if not valid_user(filter_trips, trips): + homo_score.append(NaN) + comp_score.append(NaN) + v_score.append(NaN) + skip = True + else: + skip = False + return homo_score,comp_score,v_score,skip + + +def compute_score(labels_true,labels_pred,homo_score,comp_score,v_score): + homo = metrics.homogeneity_score(labels_true, labels_pred) + homo_score.append(float('%.3f' % homo)) + comp = metrics.completeness_score(labels_true, labels_pred) + comp_score.append(float('%.3f' % comp)) + v = metrics.v_measure_score(labels_true, labels_pred) + v_score.append(float('%.3f' % v)) + return homo_score,comp_score,v_score + # v_measure_bins takes 5 parameters # - sp2en=True: change Spanish to English @@ -63,13 +109,10 @@ def v_measure_bins(all_users,radius,sp2en=None,cvt_pur_mo=None,cutoff=None): user = all_users[i] filter_trips,sim,trips = filter_data(user,radius) - # filter out users that haven't enough trips (at least 10 valid trips - # and 50% of total trips are valid) to analyze - if not valid_user(filter_trips,trips): - homo_score.append(NaN) - comp_score.append(NaN) - v_score.append(NaN) + homo_score,comp_score,v_score,skip = valid_user_check(filter_trips,trips,homo_score,comp_score,v_score) + if skip: continue + sim.bin_data() if cutoff is None: trip_index_ls = [] @@ -84,23 +127,13 @@ def v_measure_bins(all_users,radius,sp2en=None,cvt_pur_mo=None,cutoff=None): bin_trips = sim.newdata bins = sim.bins - bin_trips_df = pd.DataFrame(data=[trip["data"]["user_input"] for trip in bin_trips]) - - if sp2en: - bin_trips_df = bin_trips_df.replace(span_eng_dict) - elif cvt_pur_mo: - bin_trips_df = bin_trips_df.replace(span_eng_dict) - bin_trips_df = bin_trips_df.replace(map_pur_dict) - for a in range(len(bin_trips_df)): - if bin_trips_df.iloc[a]["replaced_mode"] == "same_mode": - # to see which row will be converted - logging.debug("The following rows will be changed: %s", bin_trips_df.iloc[a]) - bin_trips_df.iloc[a]["replaced_mode"] = bin_trips_df.iloc[a]['mode_confirm'] + bin_trips_user_input_df = pd.DataFrame(data=[trip["data"]["user_input"] for trip in bin_trips]) + bin_trips_user_input_df = map_labels(bin_trips_user_input_df, span_eng_dict, map_pur_dict, sp2en, cvt_pur_mo) # turn all user_input into list without binning - bin_trips_user_input_ls = bin_trips_df.values.tolist() + bin_trips_user_input_ls = bin_trips_user_input_df.values.tolist() # drop duplicate user_input - no_dup_df = bin_trips_df.drop_duplicates() + no_dup_df = bin_trips_user_input_df.drop_duplicates() # turn non-duplicate user_input into list no_dup_list = no_dup_df.values.tolist() @@ -125,12 +158,7 @@ def v_measure_bins(all_users,radius,sp2en=None,cvt_pur_mo=None,cutoff=None): bins_ts = pd.DataFrame(data=[filter_trips[i]["data"]["start_ts"] for i in bin_ls]) # compare two data frames, the program will continue to score calculation if two data frames are the same assert_frame_equal(bins_ts, bin_trips_ts) - homo = metrics.homogeneity_score(labels_true, labels_pred) - homo_score.append(float('%.3f' % homo)) - comp = metrics.completeness_score(labels_true, labels_pred) - comp_score.append(float('%.3f' % comp)) - v = metrics.v_measure_score(labels_true, labels_pred) - v_score.append(float('%.3f' % v)) + homo_score, comp_score, v_score = compute_score(labels_true, labels_pred, homo_score, comp_score, v_score) return homo_score, comp_score, v_score @@ -148,12 +176,10 @@ def v_measure_clusters(all_users,radius,sp2en=None,cvt_pur_mo=None): user = all_users[i] filter_trips,sim,trips = filter_data(user,radius) - # filter out users that haven't enough trips to analyze - if not valid_user(filter_trips,trips): - homo_score.append(NaN) - comp_score.append(NaN) - v_score.append(NaN) + homo_score,comp_score,v_score,skip = valid_user_check(filter_trips,trips,homo_score,comp_score,v_score) + if skip: continue + sim.bin_data() sim.delete_bins() bin_trips = sim.newdata @@ -166,19 +192,7 @@ def v_measure_clusters(all_users,radius,sp2en=None,cvt_pur_mo=None): feat.cluster(min_clusters=min, max_clusters=max) cluster_trips = feat.data cluster_user_input_df = pd.DataFrame(data=[i["data"]["user_input"] for i in cluster_trips]) - if sp2en: - # change language - cluster_user_input_df = cluster_user_input_df.replace(span_eng_dict) - cluster_user_input_ls = cluster_user_input_df.values.tolist() - elif cvt_pur_mo: - # change language first - cluster_user_input_df = cluster_user_input_df.replace(span_eng_dict) - # convert purpose - cluster_user_input_df = cluster_user_input_df.replace(map_pur_dict) - # convert mode - for a in range(len(cluster_user_input_df)): - if cluster_user_input_df.iloc[a]["replaced_mode"] == "same_mode": - cluster_user_input_df.iloc[a]["replaced_mode"] = cluster_user_input_df.iloc[a]['mode_confirm'] + cluster_user_input_df = map_labels(cluster_user_input_df, span_eng_dict, map_pur_dict, sp2en, cvt_pur_mo) # turn cluster_trips to list without any changes cluster_user_input_ls = cluster_user_input_df.values.tolist() # drop duplicate user_input @@ -203,13 +217,7 @@ def v_measure_clusters(all_users,radius,sp2en=None,cvt_pur_mo=None): cluster_ps_df = pd.DataFrame(data=cluster_ps) label_ps_df = pd.DataFrame(data=feat.points) assert_frame_equal(cluster_ps_df, label_ps_df) - - homo = metrics.homogeneity_score(labels_true, labels_pred) - homo_score.append(float('%.3f' % homo)) - comp = metrics.completeness_score(labels_true, labels_pred) - comp_score.append(float('%.3f' % comp)) - v = metrics.v_measure_score(labels_true, labels_pred) - v_score.append(float('%.3f' % v)) + homo_score, comp_score, v_score = compute_score(labels_true, labels_pred, homo_score, comp_score, v_score) return homo_score, comp_score, v_score diff --git a/tour_model_eval/user_input_request_times_all_users.ipynb b/tour_model_eval/user_input_request_times_all_users.ipynb index 8d4528d..f78a808 100644 --- a/tour_model_eval/user_input_request_times_all_users.ipynb +++ b/tour_model_eval/user_input_request_times_all_users.ipynb @@ -73,7 +73,7 @@ { "cell_type": "code", "execution_count": null, - "id": "incident-hampton", + "id": "arabic-growth", "metadata": {}, "outputs": [], "source": [ @@ -113,7 +113,7 @@ { "cell_type": "code", "execution_count": null, - "id": "frozen-stanford", + "id": "progressive-playback", "metadata": {}, "outputs": [], "source": [ @@ -156,7 +156,7 @@ "date_df.set_index(['date'], inplace=True)\n", "\n", "# get valid user list\n", - "valid_users = []\n", + "user_ls,valid_users = evaluation.get_user_ls(all_users,radius)\n", "\n", "for a in range(len(all_users)):\n", " user = all_users[a]\n", @@ -168,8 +168,6 @@ " req_day.append(NaN)\n", " req_month.append(NaN) \n", " continue\n", - " val_user = 'user' + str(a + 1)\n", - " valid_users.append(val_user)\n", " sim.bin_data()\n", " sim.delete_bins()\n", " bins = sim.bins\n", @@ -424,7 +422,9 @@ "cell_type": "code", "execution_count": null, "id": "naked-february", - "metadata": {}, + "metadata": { + "scrolled": true + }, "outputs": [], "source": [ "# plot a graph for all valid users\n", @@ -493,36 +493,36 @@ }, { "cell_type": "markdown", - "id": "applied-residence", + "id": "endless-copper", "metadata": {}, "source": [ - "## Scatter(v-score on valid trips above cutoff, user input request proportion median)" + "## Scatter(homogeneity score on valid trips above cutoff, user input request proportion median)" ] }, { "cell_type": "code", "execution_count": null, - "id": "olympic-guarantee", + "id": "creative-restaurant", "metadata": {}, "outputs": [], "source": [ - "# Here we use v-score on bins above cutoff after changing language and converting purposes and modes\n", + "# Here we use homogeneity score on bins above cutoff after changing language and converting purposes and modes\n", "homo_score_cvt, comp_score_cvt, v_score_cvt = evaluation.v_measure_bins(all_users,radius,cvt_pur_mo=True,cutoff=True)\n", - "v_score_df = pd.DataFrame(data = {'v score':v_score_cvt}).dropna().reset_index(drop=True)\n", - "valid_v_score = v_score_df['v score'].values.tolist()" + "homo_score_df = pd.DataFrame(data = {'homo score':homo_score_cvt}).dropna().reset_index(drop=True)\n", + "valid_homo_score = homo_score_df['homo score'].values.tolist()" ] }, { "cell_type": "code", "execution_count": null, - "id": "current-crime", + "id": "serious-default", "metadata": { "scrolled": true }, "outputs": [], "source": [ "x=req_propor_median\n", - "y=valid_v_score\n", + "y=valid_homo_score\n", "v=valid_users\n", "cmp = cm.get_cmap('Dark2', len(valid_users))\n", "\n", @@ -530,7 +530,7 @@ " plt.scatter(x[i], y[i], color=cmp.colors[i], label=v[i], s=70, alpha=0.7)\n", "plt.legend(markerscale=0.7, scatterpoints=1)\n", "plt.xlabel('user input request proportion median',fontsize=16)\n", - "plt.ylabel('v measure score',fontsize=16)\n", + "plt.ylabel('homogeneity score',fontsize=16)\n", "plt.xticks(fontsize=14)\n", "plt.yticks(fontsize=14)" ] @@ -538,7 +538,7 @@ { "cell_type": "code", "execution_count": null, - "id": "velvet-sweden", + "id": "double-newman", "metadata": {}, "outputs": [], "source": [] diff --git a/tour_model_eval/v-measurel_bins_all_user.ipynb b/tour_model_eval/v-measurel_bins_all_user.ipynb index a5fdab5..bb7a27a 100644 --- a/tour_model_eval/v-measurel_bins_all_user.ipynb +++ b/tour_model_eval/v-measurel_bins_all_user.ipynb @@ -22,7 +22,8 @@ "from numpy import *\n", "import confirmed_trips_eval_bins_clusters as evaluation\n", "from sklearn import metrics\n", - "from pandas.testing import assert_frame_equal" + "from pandas.testing import assert_frame_equal\n", + "import numpy as np" ] }, { @@ -53,7 +54,7 @@ "metadata": {}, "outputs": [], "source": [ - "user_ls = evaluation.get_user_ls(all_users)" + "user_ls,_ = evaluation.get_user_ls(all_users,radius)" ] }, { @@ -93,16 +94,6 @@ "homo_score_ori, comp_score_ori, v_score_ori = evaluation.v_measure_bins(all_users,radius,cutoff=True)" ] }, - { - "cell_type": "code", - "execution_count": null, - "id": "cooked-louis", - "metadata": {}, - "outputs": [], - "source": [ - "mean_v_ori=round(mean([x for x in v_score_ori if str(x) != 'nan']),3)" - ] - }, { "cell_type": "markdown", "id": "personalized-stable", @@ -123,16 +114,6 @@ "homo_score_sp2en, comp_score_sp2en, v_score_sp2en = evaluation.v_measure_bins(all_users,radius,sp2en=True,cutoff=True)" ] }, - { - "cell_type": "code", - "execution_count": null, - "id": "frequent-niagara", - "metadata": {}, - "outputs": [], - "source": [ - "mean_v_sp2en=round(mean([x for x in v_score_sp2en if str(x) != 'nan']),3)" - ] - }, { "cell_type": "markdown", "id": "connected-haven", @@ -151,16 +132,6 @@ "homo_score_cvt, comp_score_cvt, v_score_cvt = evaluation.v_measure_bins(all_users,radius,cvt_pur_mo=True,cutoff=True)" ] }, - { - "cell_type": "code", - "execution_count": null, - "id": "primary-tampa", - "metadata": {}, - "outputs": [], - "source": [ - "mean_v_cvt=round(mean([x for x in v_score_cvt if str(x) != 'nan']),3)" - ] - }, { "cell_type": "markdown", "id": "agricultural-syndicate", @@ -176,10 +147,9 @@ "metadata": {}, "outputs": [], "source": [ - "cutoff_df = pd.DataFrame(data={'homogeneity_score':[homo_score_ori,homo_score_sp2en,homo_score_cvt],\n", - " 'completeness_score':[comp_score_ori,comp_score_sp2en,comp_score_cvt],\n", - " 'v_measure_score':[v_score_ori,v_score_sp2en,v_score_cvt],\n", - " 'mean v_measure_score':[mean_v_ori,mean_v_sp2en,mean_v_cvt]},\n", + "cutoff_df = pd.DataFrame(data={'homogeneity score':[homo_score_ori,homo_score_sp2en,homo_score_cvt],\n", + " 'completeness score':[comp_score_ori,comp_score_sp2en,comp_score_cvt],\n", + " 'v-measure score':[v_score_ori,v_score_sp2en,v_score_cvt]},\n", " index = ['original user input','after translation','after converting purposes and replaced mode'])\n", "cutoff_df" ] @@ -189,7 +159,7 @@ "id": "conservative-pregnancy", "metadata": {}, "source": [ - "#### homogeneity_score" + "#### homogeneity score" ] }, { @@ -201,7 +171,8 @@ "source": [ "homo_df = pd.DataFrame(data={'original user input':homo_score_ori,'after translation':homo_score_sp2en,\n", " 'after converting purposes and replaced mode':homo_score_cvt}, \n", - " index=user_ls)" + " index=user_ls).dropna()\n", + "homo_df" ] }, { @@ -211,7 +182,7 @@ "metadata": {}, "outputs": [], "source": [ - "homo_df.plot(kind = 'bar',title='homogeneity_score',yticks=(0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1))" + "homo_df.plot(kind = 'bar',title='homogeneity score',yticks=(0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1))" ] }, { @@ -219,7 +190,7 @@ "id": "incorporated-google", "metadata": {}, "source": [ - "#### completeness_score" + "#### completeness score" ] }, { @@ -231,7 +202,7 @@ "source": [ "comp_df = pd.DataFrame(data={'original user input':comp_score_ori,'after translation':comp_score_sp2en,\n", " 'after converting purposes and replaced mode':comp_score_cvt},\n", - " index=user_ls)" + " index=user_ls).dropna()" ] }, { @@ -241,7 +212,7 @@ "metadata": {}, "outputs": [], "source": [ - "comp_df.plot(kind = 'bar',title='completeness_score',yticks=(0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1))" + "comp_df.plot(kind = 'bar',title='completeness score',yticks=(0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1))" ] }, { @@ -249,7 +220,7 @@ "id": "living-archives", "metadata": {}, "source": [ - "#### v_measure_score" + "#### v-measure score" ] }, { @@ -261,17 +232,20 @@ "source": [ "v_df = pd.DataFrame(data={'original user input':v_score_ori,'after translation':v_score_sp2en,\n", " 'after converting purposes and replaced mode':v_score_cvt},\n", - " index=user_ls)" + " index=user_ls).dropna()\n", + "v_df" ] }, { "cell_type": "code", "execution_count": null, "id": "demonstrated-resident", - "metadata": {}, + "metadata": { + "scrolled": true + }, "outputs": [], "source": [ - "v_df.plot(kind = 'bar',title='v_measure_score',yticks=(0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1))" + "v_df.plot(kind = 'bar',title='v-measure score',yticks=(0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1))" ] }, { @@ -300,16 +274,6 @@ "ab_homo_score_ori, ab_comp_score_ori, ab_v_score_ori = evaluation.v_measure_bins(all_users,radius)" ] }, - { - "cell_type": "code", - "execution_count": null, - "id": "extended-processing", - "metadata": {}, - "outputs": [], - "source": [ - "ab_mean_v_ori=round(mean([x for x in ab_v_score_ori if str(x) != 'nan']),3)" - ] - }, { "cell_type": "markdown", "id": "european-philadelphia", @@ -328,16 +292,6 @@ "ab_homo_score_sp2en, ab_comp_score_sp2en, ab_v_score_sp2en = evaluation.v_measure_bins(all_users,radius,sp2en=True)" ] }, - { - "cell_type": "code", - "execution_count": null, - "id": "collective-calculator", - "metadata": {}, - "outputs": [], - "source": [ - "ab_mean_v_sp2en=round(mean([x for x in ab_v_score_sp2en if str(x) != 'nan']),3)" - ] - }, { "cell_type": "markdown", "id": "capable-bathroom", @@ -356,16 +310,6 @@ "ab_homo_score_cvt, ab_comp_score_cvt, ab_v_score_cvt = evaluation.v_measure_bins(all_users,radius,cvt_pur_mo=True)" ] }, - { - "cell_type": "code", - "execution_count": null, - "id": "transparent-theology", - "metadata": {}, - "outputs": [], - "source": [ - "ab_mean_v_cvt=round(mean([x for x in ab_v_score_cvt if str(x) != 'nan']),3)" - ] - }, { "cell_type": "markdown", "id": "charged-greeting", @@ -381,10 +325,9 @@ "metadata": {}, "outputs": [], "source": [ - "all_df = pd.DataFrame(data={'homogeneity_score':[ab_homo_score_ori,ab_homo_score_sp2en,ab_homo_score_cvt],\n", - " 'completeness_score':[ab_comp_score_ori,ab_comp_score_sp2en,ab_comp_score_cvt],\n", - " 'v_measure_score':[ab_v_score_ori,ab_v_score_sp2en,ab_v_score_cvt],\n", - " 'mean v_measure_score':[ab_mean_v_ori,ab_mean_v_sp2en,ab_mean_v_cvt]},\n", + "all_df = pd.DataFrame(data={'homogeneity score':[ab_homo_score_ori,ab_homo_score_sp2en,ab_homo_score_cvt],\n", + " 'completeness score':[ab_comp_score_ori,ab_comp_score_sp2en,ab_comp_score_cvt],\n", + " 'v-measure score':[ab_v_score_ori,ab_v_score_sp2en,ab_v_score_cvt]},\n", " index = ['original user input','after translation','after converting purposes and replaced mode'])\n", "all_df" ] @@ -394,7 +337,7 @@ "id": "trying-flesh", "metadata": {}, "source": [ - "#### homogeneity_score" + "#### homogeneity score" ] }, { @@ -406,7 +349,7 @@ "source": [ "ab_homo_df=pd.DataFrame(data={'original user input':ab_homo_score_ori,'after translation':ab_homo_score_sp2en,\n", " 'after converting purposes and replaced mode':ab_homo_score_cvt},\n", - " index=user_ls)" + " index=user_ls).dropna()" ] }, { @@ -416,7 +359,7 @@ "metadata": {}, "outputs": [], "source": [ - "ab_homo_df.plot(kind = 'bar',title='homogeneity_score',yticks=(0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1))" + "ab_homo_df.plot(kind = 'bar',title='homogeneity score',yticks=(0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1))" ] }, { @@ -424,7 +367,7 @@ "id": "english-quick", "metadata": {}, "source": [ - "#### completeness_score" + "#### completeness score" ] }, { @@ -436,7 +379,7 @@ "source": [ "ab_comp_df = pd.DataFrame(data={'original user input':ab_comp_score_ori,'after translation':ab_comp_score_sp2en,\n", " 'after converting purposes and replaced mode':ab_comp_score_cvt},\n", - " index=user_ls)" + " index=user_ls).dropna()" ] }, { @@ -446,7 +389,7 @@ "metadata": {}, "outputs": [], "source": [ - "ab_comp_df.plot(kind = 'bar',title='completeness_score',yticks=(0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1))" + "ab_comp_df.plot(kind = 'bar',title='completeness score',yticks=(0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1))" ] }, { @@ -454,7 +397,7 @@ "id": "white-reasoning", "metadata": {}, "source": [ - "#### v_measure_score" + "#### v-measure score" ] }, { @@ -466,7 +409,7 @@ "source": [ "ab_v_df = pd.DataFrame(data={'original user input':ab_v_score_ori,'after translation':ab_v_score_sp2en,\n", " 'after converting purposes and replaced mode':ab_v_score_cvt},\n", - " index=user_ls)" + " index=user_ls).dropna()" ] }, { @@ -476,7 +419,7 @@ "metadata": {}, "outputs": [], "source": [ - "ab_v_df.plot(kind = 'bar',title='v_measure_score',yticks=(0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1))" + "ab_v_df.plot(kind = 'bar',title='v-measure score',yticks=(0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1))" ] } ], diff --git a/tour_model_eval/v-measurel_clusters_above_cutoff_all_users.ipynb b/tour_model_eval/v-measurel_clusters_above_cutoff_all_users.ipynb index a35b9a6..af38b51 100644 --- a/tour_model_eval/v-measurel_clusters_above_cutoff_all_users.ipynb +++ b/tour_model_eval/v-measurel_clusters_above_cutoff_all_users.ipynb @@ -20,7 +20,8 @@ "from numpy import *\n", "import confirmed_trips_eval_bins_clusters as evaluation\n", "from sklearn import metrics\n", - "from pandas.testing import assert_frame_equal" + "from pandas.testing import assert_frame_equal\n", + "import numpy as np" ] }, { @@ -51,7 +52,7 @@ "metadata": {}, "outputs": [], "source": [ - "user_ls = evaluation.get_user_ls(all_users)" + "user_ls,_ = evaluation.get_user_ls(all_users,radius)" ] }, { @@ -91,16 +92,6 @@ "homo_score_ori, comp_score_ori, v_score_ori = evaluation.v_measure_clusters(all_users,radius)" ] }, - { - "cell_type": "code", - "execution_count": null, - "id": "professional-evans", - "metadata": {}, - "outputs": [], - "source": [ - "mean_v_ori=round(mean([x for x in v_score_ori if str(x) != 'nan']),3)" - ] - }, { "cell_type": "markdown", "id": "latin-boulder", @@ -119,16 +110,6 @@ "homo_score_sp2en, comp_score_sp2en, v_score_sp2en = evaluation.v_measure_clusters(all_users,radius,sp2en=True)" ] }, - { - "cell_type": "code", - "execution_count": null, - "id": "lesbian-testing", - "metadata": {}, - "outputs": [], - "source": [ - "mean_v_sp2en=round(mean([x for x in v_score_sp2en if str(x) != 'nan']),3)" - ] - }, { "cell_type": "markdown", "id": "opened-norway", @@ -147,16 +128,6 @@ "homo_score_cvt, comp_score_cvt, v_score_cvt = evaluation.v_measure_clusters(all_users,radius,cvt_pur_mo=True)" ] }, - { - "cell_type": "code", - "execution_count": null, - "id": "severe-plant", - "metadata": {}, - "outputs": [], - "source": [ - "mean_v_cvt=round(mean([x for x in v_score_cvt if str(x) != 'nan']),3)" - ] - }, { "cell_type": "markdown", "id": "matched-custody", @@ -172,10 +143,9 @@ "metadata": {}, "outputs": [], "source": [ - "df = pd.DataFrame(data={'homogeneity_score':[homo_score_ori,homo_score_sp2en,homo_score_cvt],\n", - " 'completeness_score':[comp_score_ori,comp_score_sp2en,comp_score_cvt],\n", - " 'v_measure_score':[v_score_ori,v_score_sp2en,v_score_cvt],\n", - " 'mean v_measure_score':[mean_v_ori,mean_v_sp2en,mean_v_cvt]},\n", + "df = pd.DataFrame(data={'homogeneity score':[homo_score_ori,homo_score_sp2en,homo_score_cvt],\n", + " 'completeness score':[comp_score_ori,comp_score_sp2en,comp_score_cvt],\n", + " 'v-measure score':[v_score_ori,v_score_sp2en,v_score_cvt]},\n", " index = ['original user input','after translation','after converting purposes and replaced mode'])\n", "df" ] @@ -185,7 +155,7 @@ "id": "sacred-applicant", "metadata": {}, "source": [ - "#### homogeneity_score" + "#### homogeneity score" ] }, { @@ -197,7 +167,7 @@ "source": [ "homo_df = pd.DataFrame(data={'original user input':homo_score_ori,'after translation':homo_score_sp2en,\n", " 'after converting purposes and replaced mode':homo_score_cvt}, \n", - " index=user_ls)" + " index=user_ls).dropna()" ] }, { @@ -207,7 +177,7 @@ "metadata": {}, "outputs": [], "source": [ - "homo_df.plot(kind = 'bar',title='homogeneity_score',yticks=(0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1))" + "homo_df.plot(kind = 'bar',title='homogeneity score',yticks=(0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1))" ] }, { @@ -215,7 +185,7 @@ "id": "premium-force", "metadata": {}, "source": [ - "#### completeness_score" + "#### completeness score" ] }, { @@ -227,7 +197,7 @@ "source": [ "comp_df = pd.DataFrame(data={'original user input':comp_score_ori,'after translation':comp_score_sp2en,\n", " 'after converting purposes and replaced mode':comp_score_cvt},\n", - " index=user_ls)" + " index=user_ls).dropna()" ] }, { @@ -239,7 +209,7 @@ }, "outputs": [], "source": [ - "comp_df.plot(kind = 'bar',title='completeness_score',yticks=(0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1))" + "comp_df.plot(kind = 'bar',title='completeness score',yticks=(0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1))" ] }, { @@ -247,7 +217,7 @@ "id": "affecting-daughter", "metadata": {}, "source": [ - "#### v_measure_score" + "#### v-measure score" ] }, { @@ -259,7 +229,8 @@ "source": [ "v_df = pd.DataFrame(data={'original user input':v_score_ori,'after translation':v_score_sp2en,\n", " 'after converting purposes and replaced mode':v_score_cvt},\n", - " index=user_ls)" + " index=user_ls).dropna()\n", + "v_df" ] }, { @@ -269,7 +240,7 @@ "metadata": {}, "outputs": [], "source": [ - "v_df.plot(kind = 'bar',title='v_measure_score',yticks=(0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1))" + "v_df.plot(kind = 'bar',title='v-measure score',yticks=(0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1))" ] } ], From 0e7f803645bfa8cb8926b2cf356c2848f5ad85e8 Mon Sep 17 00:00:00 2001 From: Chunrui Huang Date: Mon, 29 Mar 2021 19:51:36 -0700 Subject: [PATCH 13/16] modified evaluation code and added comments in the notebooks --- .../confirmed_trips_eval_bins_clusters.py | 26 ++++++++++--------- .../user_input_request_times_all_users.ipynb | 18 ++++++------- .../v-measurel_all_bins_single_user.ipynb | 8 ++++++ .../v-measurel_bins_all_user.ipynb | 8 ++++++ ...urel_clusters_above_cutoff_all_users.ipynb | 8 ++++++ .../v-measurel_cutoff_bins_single_user.ipynb | 8 ++++++ ...measurel_cutoff_clusters_single_user.ipynb | 8 ++++++ 7 files changed, 63 insertions(+), 21 deletions(-) diff --git a/tour_model_eval/confirmed_trips_eval_bins_clusters.py b/tour_model_eval/confirmed_trips_eval_bins_clusters.py index 9131e61..fb4dffa 100644 --- a/tour_model_eval/confirmed_trips_eval_bins_clusters.py +++ b/tour_model_eval/confirmed_trips_eval_bins_clusters.py @@ -12,15 +12,6 @@ from sklearn import metrics from pandas.testing import assert_frame_equal -# Spanish words to English -span_eng_dict = {'revisado_bike':'test ride with bike','placas_de carro':'car plates','aseguranza':'insurance', - 'iglesia':'church','curso':'course','mi_hija recién aliviada':'my daughter just had a new baby', - 'servicio_comunitario':'community service','pago_de aseguranza':'insurance payment', - 'grupo_comunitario':'community group','caminata_comunitaria':'community walk'} - -# Convert purpose -map_pur_dict = {'course':'school','work_- lunch break':'lunch_break','on_the way home':'home', - 'insurance_payment':'insurance'} def get_user_ls(all_users,radius): user_ls = [] @@ -56,7 +47,18 @@ def valid_user(filter_trips,trips): valid = True return valid -def map_labels(user_input_df,span_eng_dict,map_pur_dict,sp2en,cvt_pur_mo): +def map_labels(user_input_df,sp2en,cvt_pur_mo): + # Spanish words to English + span_eng_dict = {'revisado_bike': 'test ride with bike', 'placas_de carro': 'car plates', 'aseguranza': 'insurance', + 'iglesia': 'church', 'curso': 'course', + 'mi_hija recién aliviada': 'my daughter just had a new baby', + 'servicio_comunitario': 'community service', 'pago_de aseguranza': 'insurance payment', + 'grupo_comunitario': 'community group', 'caminata_comunitaria': 'community walk'} + + # Convert purpose + map_pur_dict = {'course': 'school', 'work_- lunch break': 'lunch_break', 'on_the way home': 'home', + 'insurance_payment': 'insurance'} + if sp2en: # change language user_input_df = user_input_df.replace(span_eng_dict) @@ -128,7 +130,7 @@ def v_measure_bins(all_users,radius,sp2en=None,cvt_pur_mo=None,cutoff=None): bins = sim.bins bin_trips_user_input_df = pd.DataFrame(data=[trip["data"]["user_input"] for trip in bin_trips]) - bin_trips_user_input_df = map_labels(bin_trips_user_input_df, span_eng_dict, map_pur_dict, sp2en, cvt_pur_mo) + bin_trips_user_input_df = map_labels(bin_trips_user_input_df, sp2en, cvt_pur_mo) # turn all user_input into list without binning bin_trips_user_input_ls = bin_trips_user_input_df.values.tolist() @@ -192,7 +194,7 @@ def v_measure_clusters(all_users,radius,sp2en=None,cvt_pur_mo=None): feat.cluster(min_clusters=min, max_clusters=max) cluster_trips = feat.data cluster_user_input_df = pd.DataFrame(data=[i["data"]["user_input"] for i in cluster_trips]) - cluster_user_input_df = map_labels(cluster_user_input_df, span_eng_dict, map_pur_dict, sp2en, cvt_pur_mo) + cluster_user_input_df = map_labels(cluster_user_input_df, sp2en, cvt_pur_mo) # turn cluster_trips to list without any changes cluster_user_input_ls = cluster_user_input_df.values.tolist() # drop duplicate user_input diff --git a/tour_model_eval/user_input_request_times_all_users.ipynb b/tour_model_eval/user_input_request_times_all_users.ipynb index f78a808..c6c3973 100644 --- a/tour_model_eval/user_input_request_times_all_users.ipynb +++ b/tour_model_eval/user_input_request_times_all_users.ipynb @@ -1,5 +1,13 @@ { "cells": [ + { + "cell_type": "markdown", + "id": "competitive-involvement", + "metadata": {}, + "source": [ + "This notebook integrates user inputs request times in a day, in a month, and in January 2021 for all users. The scatter at the bottom shows the relationship between homogeneity score and the median of user input request proportion in a day on valid common trips after the first round clustering for all users." + ] + }, { "cell_type": "code", "execution_count": null, @@ -202,7 +210,7 @@ " # bins below cutoff\n", " bl_bins = sim.below_cutoff\n", " \n", - " # collect query trips indices below cutoff\n", + " # collect requested trips indices below cutoff\n", " bl_trip_ls = []\n", " for bin in bl_bins:\n", " for trip_index in bin:\n", @@ -534,14 +542,6 @@ "plt.xticks(fontsize=14)\n", "plt.yticks(fontsize=14)" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "double-newman", - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/tour_model_eval/v-measurel_all_bins_single_user.ipynb b/tour_model_eval/v-measurel_all_bins_single_user.ipynb index 0b0e3f0..d2fb745 100644 --- a/tour_model_eval/v-measurel_all_bins_single_user.ipynb +++ b/tour_model_eval/v-measurel_all_bins_single_user.ipynb @@ -1,5 +1,13 @@ { "cells": [ + { + "cell_type": "markdown", + "id": "operating-disabled", + "metadata": {}, + "source": [ + "This notebook is for evaluating all valid bins and exploring data for a single user after first round clustering." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/tour_model_eval/v-measurel_bins_all_user.ipynb b/tour_model_eval/v-measurel_bins_all_user.ipynb index bb7a27a..6486ff6 100644 --- a/tour_model_eval/v-measurel_bins_all_user.ipynb +++ b/tour_model_eval/v-measurel_bins_all_user.ipynb @@ -1,5 +1,13 @@ { "cells": [ + { + "cell_type": "markdown", + "id": "visible-annual", + "metadata": {}, + "source": [ + "This notebook shows the homogeneity scores, completeness scores, and v-measure scores based on original user inputs, user inputs after converting language, and user inputs after converting purposes and replaced mode on valid bins above cutoff and on all valid bins for all users after the first round clustering." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/tour_model_eval/v-measurel_clusters_above_cutoff_all_users.ipynb b/tour_model_eval/v-measurel_clusters_above_cutoff_all_users.ipynb index af38b51..4c40c4a 100644 --- a/tour_model_eval/v-measurel_clusters_above_cutoff_all_users.ipynb +++ b/tour_model_eval/v-measurel_clusters_above_cutoff_all_users.ipynb @@ -1,5 +1,13 @@ { "cells": [ + { + "cell_type": "markdown", + "id": "proper-research", + "metadata": {}, + "source": [ + "This notebook shows the homogeneity scores, completeness scores, and v-measure scores based on original user inputs, user inputs after converting language, and user inputs after converting purposes and replaced mode on valid clusters above cutoff after the first round clustering for all users. The clustering process is based on silhouette score, setting the min cluster to 0." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/tour_model_eval/v-measurel_cutoff_bins_single_user.ipynb b/tour_model_eval/v-measurel_cutoff_bins_single_user.ipynb index a88733a..2906745 100644 --- a/tour_model_eval/v-measurel_cutoff_bins_single_user.ipynb +++ b/tour_model_eval/v-measurel_cutoff_bins_single_user.ipynb @@ -1,5 +1,13 @@ { "cells": [ + { + "cell_type": "markdown", + "id": "aging-evaluation", + "metadata": {}, + "source": [ + "This notebook is for evaluating bins above cutoff and exploring the data for a single user after first round clustering." + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/tour_model_eval/v-measurel_cutoff_clusters_single_user.ipynb b/tour_model_eval/v-measurel_cutoff_clusters_single_user.ipynb index e16031c..7bab80b 100644 --- a/tour_model_eval/v-measurel_cutoff_clusters_single_user.ipynb +++ b/tour_model_eval/v-measurel_cutoff_clusters_single_user.ipynb @@ -1,5 +1,13 @@ { "cells": [ + { + "cell_type": "markdown", + "id": "developing-commerce", + "metadata": {}, + "source": [ + "This notebook is for evaluating clusters above cutoff and exploring data for a single user after first round clustering." + ] + }, { "cell_type": "code", "execution_count": null, From 8db9a7235783b5f9e6ed4ecfc16b83b8e8fb3ec1 Mon Sep 17 00:00:00 2001 From: Chunrui Huang Date: Mon, 5 Apr 2021 23:06:48 -0700 Subject: [PATCH 14/16] add more comments in evaluation code --- .../confirmed_trips_eval_bins_clusters.py | 16 ++++ .../user_input_request_times_all_users.ipynb | 76 +++++++++---------- 2 files changed, 54 insertions(+), 38 deletions(-) diff --git a/tour_model_eval/confirmed_trips_eval_bins_clusters.py b/tour_model_eval/confirmed_trips_eval_bins_clusters.py index fb4dffa..af11212 100644 --- a/tour_model_eval/confirmed_trips_eval_bins_clusters.py +++ b/tour_model_eval/confirmed_trips_eval_bins_clusters.py @@ -13,6 +13,8 @@ from pandas.testing import assert_frame_equal +# - user_ls: a list of all users +# - valid_user_ls: a list of valid users def get_user_ls(all_users,radius): user_ls = [] valid_user_ls = [] @@ -29,6 +31,8 @@ def get_user_ls(all_users,radius): return user_ls,valid_user_ls +# - trips: all trips read from database +# - filter_trips: valid trips that have user labels and are not points def filter_data(user,radius): trips = pipeline.read_data(uuid=user, key=esda.CONFIRMED_TRIP_KEY) non_empty_trips = [t for t in trips if t["data"]["user_input"] != {}] @@ -37,16 +41,25 @@ def filter_data(user,radius): valid_trips_idx_ls = valid_trips_df.index.tolist() valid_trips = [non_empty_trips[i]for i in valid_trips_idx_ls] + # similarity codes can filter out trips that are points in valid_trips sim = similarity.similarity(valid_trips, radius) filter_trips = sim.data return filter_trips,sim,trips + +# to determine if the user is valid: +# valid user should have >= 10 trips for further analysis and the proportion of filter_trips is >=50% def valid_user(filter_trips,trips): valid = False if len(filter_trips) >= 10 and len(filter_trips) / len(trips) >= 0.5: valid = True return valid + +# to map the user labels +# - user_input_df: pass in original user input dataframe, return changed user input dataframe +# - sp2en: change Spanish to English +# - cvt_pur_mo: convert purposes and replaced mode def map_labels(user_input_df,sp2en,cvt_pur_mo): # Spanish words to English span_eng_dict = {'revisado_bike': 'test ride with bike', 'placas_de carro': 'car plates', 'aseguranza': 'insurance', @@ -76,6 +89,8 @@ def map_labels(user_input_df,sp2en,cvt_pur_mo): return user_input_df +# check if the user is valid +# append NaN to the score lists when the user invalid def valid_user_check(filter_trips,trips,homo_score,comp_score,v_score): if not valid_user(filter_trips, trips): homo_score.append(NaN) @@ -87,6 +102,7 @@ def valid_user_check(filter_trips,trips,homo_score,comp_score,v_score): return homo_score,comp_score,v_score,skip +# This function is to get homogeneity score, complete score, and v-score def compute_score(labels_true,labels_pred,homo_score,comp_score,v_score): homo = metrics.homogeneity_score(labels_true, labels_pred) homo_score.append(float('%.3f' % homo)) diff --git a/tour_model_eval/user_input_request_times_all_users.ipynb b/tour_model_eval/user_input_request_times_all_users.ipynb index c6c3973..a3b0167 100644 --- a/tour_model_eval/user_input_request_times_all_users.ipynb +++ b/tour_model_eval/user_input_request_times_all_users.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "competitive-involvement", + "id": "compact-toolbox", "metadata": {}, "source": [ "This notebook integrates user inputs request times in a day, in a month, and in January 2021 for all users. The scatter at the bottom shows the relationship between homogeneity score and the median of user input request proportion in a day on valid common trips after the first round clustering for all users." @@ -95,12 +95,12 @@ "metadata": {}, "outputs": [], "source": [ - "def match_day(trip,bin):\n", - " if bin:\n", - " t = filter_trips[bin[0]]\n", - " if trip['data']['start_local_dt']['year']==t['data']['start_local_dt']['year']and trip['data']['start_local_dt']['month']==t['data']['start_local_dt']['month']and trip['data']['start_local_dt']['day']==t['data']['start_local_dt']['day']:\n", - " return True\n", - " return False" + "# def match_day(trip,bin):\n", + "# if bin:\n", + "# t = filter_trips[bin[0]]\n", + "# if trip['data']['start_local_dt']['year']==t['data']['start_local_dt']['year']and trip['data']['start_local_dt']['month']==t['data']['start_local_dt']['month']and trip['data']['start_local_dt']['day']==t['data']['start_local_dt']['day']:\n", + "# return True\n", + "# return False" ] }, { @@ -110,12 +110,12 @@ "metadata": {}, "outputs": [], "source": [ - "def match_month(trip,bin):\n", - " if bin:\n", - " t = filter_trips[bin[0]]\n", - " if trip['data']['start_local_dt']['year']==t['data']['start_local_dt']['year']and trip['data']['start_local_dt']['month']==t['data']['start_local_dt']['month']:\n", - " return True\n", - " return False" + "# def match_month(trip,bin):\n", + "# if bin:\n", + "# t = filter_trips[bin[0]]\n", + "# if trip['data']['start_local_dt']['year']==t['data']['start_local_dt']['year']and trip['data']['start_local_dt']['month']==t['data']['start_local_dt']['month']:\n", + "# return True\n", + "# return False" ] }, { @@ -125,29 +125,29 @@ "metadata": {}, "outputs": [], "source": [ - "# bin trips according to ['start_local_dt']\n", - "def bin_date(trip_ls,day=None,month=None):\n", - " bin_date = []\n", - " for trip_index in trip_ls:\n", - " added = False\n", - " trip = filter_trips[trip_index]\n", + "# # bin trips according to ['start_local_dt']\n", + "# def ,filter_trips,filter_trips,filter_trips,filter_trips(trip_ls,day=None,month=None):\n", + "# bin_date = []\n", + "# for trip_index in trip_ls:\n", + "# added = False\n", + "# trip = filter_trips[trip_index]\n", "\n", - " for bin in bin_date:\n", - " if day:\n", - " if match_day(trip,bin):\n", - " bin.append(trip_index)\n", - " added = True\n", - " break\n", - " if month:\n", - " if match_month(trip,bin):\n", - " bin.append(trip_index)\n", - " added = True\n", - " break\n", + "# for bin in bin_date:\n", + "# if day:\n", + "# if evaluation.match_day(trip,bin,filter_trips):\n", + "# bin.append(trip_index)\n", + "# added = True\n", + "# break\n", + "# if month:\n", + "# if evaluation.match_month(trip,bin,filter_trips):\n", + "# bin.append(trip_index)\n", + "# added = True\n", + "# break\n", "\n", - " if not added:\n", - " bin_date.append([trip_index])\n", + "# if not added:\n", + "# bin_date.append([trip_index])\n", "\n", - " return bin_date " + "# return bin_date " ] }, { @@ -221,7 +221,7 @@ " \n", " \n", " # collect request times in a day\n", - " bin_day = bin_date(req_trips_ls,day=True)\n", + " bin_day = evaluation.bin_date(req_trips_ls,filter_trips,day=True)\n", " req_day_ls = []\n", " for bin in bin_day:\n", " req_day_ls.append(len(bin))\n", @@ -231,7 +231,7 @@ " trip = filter_trips[trip_index]\n", " match = False\n", " for bin in bin_day:\n", - " if match_day(trip,bin):\n", + " if evaluation.match_day(trip,bin,filter_trips):\n", " match = True\n", " break\n", " if not match:\n", @@ -243,13 +243,13 @@ " # collect user input request proportion in a day\n", " filter_trips_df = pd.DataFrame(filter_trips)\n", " filter_trips_idx_ls = filter_trips_df.index.values.tolist()\n", - " bin_filter_trips_day = bin_date(filter_trips_idx_ls,day=True)\n", + " bin_filter_trips_day = evaluation.bin_date(filter_trips_idx_ls,filter_trips,day=True)\n", " propor_single_user = []\n", " for valid_trips_bin in bin_filter_trips_day:\n", " match = False\n", " for req_trips_bin in bin_day:\n", " req_trip = filter_trips[req_trips_bin[0]]\n", - " if match_day(req_trip,valid_trips_bin):\n", + " if evaluation.match_day(req_trip,valid_trips_bin,filter_trips):\n", " proportion = round(len(req_trips_bin)/len(valid_trips_bin), 2)\n", " propor_single_user.append(proportion)\n", " match = True\n", @@ -265,7 +265,7 @@ " \n", " \n", " # collect request times in a month\n", - " bin_month = bin_date(req_trips_ls,month=True)\n", + " bin_month = evaluation.bin_date(req_trips_ls,filter_trips,month=True)\n", " req_month_ls = []\n", " for bin in bin_month:\n", " req_month_ls.append(len(bin))\n", From 56049d23b31b50fac59041d754399ce0ba1e32cb Mon Sep 17 00:00:00 2001 From: Chunrui Huang Date: Wed, 7 Apr 2021 10:32:34 -0700 Subject: [PATCH 15/16] add more functions in the evaluation code --- .../confirmed_trips_eval_bins_clusters.py | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/tour_model_eval/confirmed_trips_eval_bins_clusters.py b/tour_model_eval/confirmed_trips_eval_bins_clusters.py index af11212..01aaef4 100644 --- a/tour_model_eval/confirmed_trips_eval_bins_clusters.py +++ b/tour_model_eval/confirmed_trips_eval_bins_clusters.py @@ -113,6 +113,66 @@ def compute_score(labels_true,labels_pred,homo_score,comp_score,v_score): return homo_score,comp_score,v_score +# This function is to compare a trip with a group of trips to see if they happened in a same day +def match_day(trip,bin,filter_trips): + if bin: + t = filter_trips[bin[0]] + if trip['data']['start_local_dt']['year']==t['data']['start_local_dt']['year']\ + and trip['data']['start_local_dt']['month']==t['data']['start_local_dt']['month']\ + and trip['data']['start_local_dt']['day']==t['data']['start_local_dt']['day']: + return True + return False + + +# This function is to compare a trip with a group of trips to see if they happened in a same month +def match_month(trip,bin,filter_trips): + if bin: + t = filter_trips[bin[0]] + if trip['data']['start_local_dt']['year']==t['data']['start_local_dt']['year']\ + and trip['data']['start_local_dt']['month']==t['data']['start_local_dt']['month']: + return True + return False + + +# This function bins trips according to ['start_local_dt'] +def bin_date(trip_ls,filter_trips,day=None,month=None): + bin_date = [] + for trip_index in trip_ls: + added = False + trip = filter_trips[trip_index] + + for bin in bin_date: + if day: + if match_day(trip,bin,filter_trips): + bin.append(trip_index) + added = True + break + if month: + if match_month(trip,bin,filter_trips): + bin.append(trip_index) + added = True + break + + if not added: + bin_date.append([trip_index]) + + return bin_date + + +# compare the trip orders in bin_trips with those in filter_trips above cutoff +def compare_trip_orders(bins,bin_trips,filter_trips): + # compare the trips order in bins and those in valid_trips using timestamp + bin_trips_ts = pd.DataFrame(data=[trip["data"]["start_ts"] for trip in bin_trips]) + bin_ls = [] + for bin in bins: + for index in bin: + bin_ls.append(index) + bins_ts = pd.DataFrame(data=[filter_trips[i]["data"]["start_ts"] for i in bin_ls]) + # compare two data frames, the program will continue to score calculation if two data frames are the same + assert_frame_equal(bins_ts, bin_trips_ts) + + + # v_measure_bins takes 5 parameters # - sp2en=True: change Spanish to English # - cvt_pur_mo=True: convert purposes and replaced mode From 644c2dd1e64734d194270ccba0920f3bfe64d209 Mon Sep 17 00:00:00 2001 From: Chunrui Huang Date: Thu, 8 Apr 2021 01:47:24 -0700 Subject: [PATCH 16/16] add find_first_trip function using start_ts --- .../confirmed_trips_eval_bins_clusters.py | 15 ++++ .../user_input_request_times_all_users.ipynb | 79 +------------------ 2 files changed, 17 insertions(+), 77 deletions(-) diff --git a/tour_model_eval/confirmed_trips_eval_bins_clusters.py b/tour_model_eval/confirmed_trips_eval_bins_clusters.py index 01aaef4..f28f271 100644 --- a/tour_model_eval/confirmed_trips_eval_bins_clusters.py +++ b/tour_model_eval/confirmed_trips_eval_bins_clusters.py @@ -172,6 +172,21 @@ def compare_trip_orders(bins,bin_trips,filter_trips): assert_frame_equal(bins_ts, bin_trips_ts) +def find_first_trip(filter_trips,bin): + early_trip = filter_trips[bin[0]] + index = 0 + for i in range(1,len(bin)): + compare_trip = filter_trips[bin[i]] + if early_trip['data']["start_ts"] > compare_trip['data']["start_ts"]: + early_trip = compare_trip + index = i + early_trip_index = bin[index] + return early_trip_index, index + + + + + # v_measure_bins takes 5 parameters # - sp2en=True: change Spanish to English diff --git a/tour_model_eval/user_input_request_times_all_users.ipynb b/tour_model_eval/user_input_request_times_all_users.ipynb index a3b0167..95623b8 100644 --- a/tour_model_eval/user_input_request_times_all_users.ipynb +++ b/tour_model_eval/user_input_request_times_all_users.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "compact-toolbox", + "id": "cellular-panel", "metadata": {}, "source": [ "This notebook integrates user inputs request times in a day, in a month, and in January 2021 for all users. The scatter at the bottom shows the relationship between homogeneity score and the median of user input request proportion in a day on valid common trips after the first round clustering for all users." @@ -88,68 +88,6 @@ "req_propor_median = []" ] }, - { - "cell_type": "code", - "execution_count": null, - "id": "destroyed-attention", - "metadata": {}, - "outputs": [], - "source": [ - "# def match_day(trip,bin):\n", - "# if bin:\n", - "# t = filter_trips[bin[0]]\n", - "# if trip['data']['start_local_dt']['year']==t['data']['start_local_dt']['year']and trip['data']['start_local_dt']['month']==t['data']['start_local_dt']['month']and trip['data']['start_local_dt']['day']==t['data']['start_local_dt']['day']:\n", - "# return True\n", - "# return False" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "breeding-cream", - "metadata": {}, - "outputs": [], - "source": [ - "# def match_month(trip,bin):\n", - "# if bin:\n", - "# t = filter_trips[bin[0]]\n", - "# if trip['data']['start_local_dt']['year']==t['data']['start_local_dt']['year']and trip['data']['start_local_dt']['month']==t['data']['start_local_dt']['month']:\n", - "# return True\n", - "# return False" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "progressive-playback", - "metadata": {}, - "outputs": [], - "source": [ - "# # bin trips according to ['start_local_dt']\n", - "# def ,filter_trips,filter_trips,filter_trips,filter_trips(trip_ls,day=None,month=None):\n", - "# bin_date = []\n", - "# for trip_index in trip_ls:\n", - "# added = False\n", - "# trip = filter_trips[trip_index]\n", - "\n", - "# for bin in bin_date:\n", - "# if day:\n", - "# if evaluation.match_day(trip,bin,filter_trips):\n", - "# bin.append(trip_index)\n", - "# added = True\n", - "# break\n", - "# if month:\n", - "# if evaluation.match_month(trip,bin,filter_trips):\n", - "# bin.append(trip_index)\n", - "# added = True\n", - "# break\n", - "\n", - "# if not added:\n", - "# bin_date.append([trip_index])\n", - "\n", - "# return bin_date " - ] - }, { "cell_type": "code", "execution_count": null, @@ -184,20 +122,7 @@ " ab_trip_ls = []\n", " no_req_trip_ls = []\n", " for bin in bins:\n", - " early_trip = filter_trips[bin[0]]\n", - " index = 0\n", - " for i in range(1,len(bin)):\n", - " compare_trip = filter_trips[bin[i]]\n", - " if early_trip['data']['start_local_dt']['year']>compare_trip['data']['start_local_dt']['year']:\n", - " early_trip = compare_trip\n", - " index = i\n", - " elif early_trip['data']['start_local_dt']['year']==compare_trip['data']['start_local_dt']['year'] and early_trip['data']['start_local_dt']['month']>compare_trip['data']['start_local_dt']['month']:\n", - " early_trip = compare_trip\n", - " index = i\n", - " elif early_trip['data']['start_local_dt']['year']==compare_trip['data']['start_local_dt']['year'] and early_trip['data']['start_local_dt']['month']==compare_trip['data']['start_local_dt']['month'] and early_trip['data']['start_local_dt']['day']>compare_trip['data']['start_local_dt']['day']:\n", - " early_trip = compare_trip\n", - " index = i\n", - " early_trip_index = bin[index]\n", + " early_trip_index, index = evaluation.find_first_trip(filter_trips,bin)\n", " ab_trip_ls.append(early_trip_index)\n", " \n", " for k in range(len(bin)):\n",