{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import random\n",
    "import math\n",
    "import matplotlib.pyplot as plt\n",
    "from pydataset import data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "144\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "nums_orig = data('cats').Bwt  #body weight of a bunch of cats\n",
    "print(len(nums_orig))\n",
    "\n",
    "plt.hist(nums_orig,bins=100)\n",
    "plt.axvline(x=nums_orig.mean(), color='r')\n",
    "plt.show()\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "true mean=2.72, est. mean=2.67, 95%ci = (2.54, 2.80)\n"
     ]
    }
   ],
   "source": [
    "#compute std error of the mean to get confidence intervals \n",
    "# on mean from a sample using closed form estimate\n",
    "N=50\n",
    "\n",
    "def sample_mean_std(buf, N):\n",
    "    samp = np.random.choice(buf, size=N)\n",
    "    mean = samp.mean()\n",
    "    mean_diff = samp-mean\n",
    "    s = (np.sum(np.power(mean_diff, 2)) / N)\n",
    "    std_dev_est = math.sqrt(s)/math.sqrt(N)\n",
    "    return (mean, std_dev_est)\n",
    "\n",
    "(u,std) = sample_mean_std(nums_orig, N)\n",
    "true_u=nums_orig.mean()\n",
    "print(\"true mean=%.2f, est. mean=%.2f, 95%%ci = (%.2f, %.2f)\"%(true_u, u, u-2*std, u+2*std))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "hit 94.14% of samples\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<matplotlib.lines.Line2D at 0x3320cd050>"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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EqLvf//7Hdh519Oeud62bZuys7O1ePFiHT9+XC+++KJeffVV/eu//msHdt71tGeuFy5cqF/84hdav369PvjgAz388MP6h3/4B7333nsd2HnXdNNNN2n58uUqLS3V4cOHNX78eE2dOlXl5eWXrN+/f78efPBBpaen67333tO0adM0bdo0vf/++207sAW/qq6utiRZ+/btu2zN5s2bLafT2XFNGepq5nrjxo3Wt7/9baupqakDOzPT1cz3V61evdrq0aOHVV9fH8DOzHM1c52ZmWmNHz/eZ938+fOt0aNHB7o9o1zNXPfp08d67rnnfNbdd999VlpaWqDbM1LPnj2tf/u3f7vk2AMPPGClpKT4rEtISLB+8pOftOkYXLnxs7q6OklSdHT0Fevq6+vVr18/xcXFXTHF4vKuZq7ffPNNJSYmKjMzUy6XS7fddpuefvpptbS0dFSbxrja7+0ve/HFF5Wamqru3bsHqi0jXc1c33XXXSotLdXBgwclSR999JF27dqlKVOmdEiPpriauW5sbLzo1oHIyEj98Y9/DGhvpmlpadErr7yihoaGy36UUnFxsZKSknzWJScnq7i4uG0Ha3f0wkVaWlqslJSUr/2f0/79+62tW7da7733nvX2229bf/d3f2c5HA6rsrKygzrt+q52rgcOHGiFh4dbs2bNsg4fPmy98sorVnR0tLVkyZIO6tQMVzvfX1ZSUmJJskpKSgLYmXnaMtdr1661unXrZoWGhlqSrIcffrgDOjTH1c71gw8+aA0ePNj68MMPrZaWFmv37t1WZGSkFRYW1kGddm1Hjx61unfvboWEhFhOp9PauXPnZWu7detmbdu2zWfdhg0brJiYmDYdk3DjRw8//LDVr1+/NoeUpqYma8CAAdbChQsD1Jl5rnaub775ZisuLs46f/68ve5nP/uZ5Xa7A92iUdrzvZ2RkWENHTo0gF2Z6Wrn+g9/+IPlcrmsF154wTp69Kj1+uuvW3FxcdayZcs6qNOu72rnurq62po6daoVHBxshYSEWLfccov1yCOPWBERER3UadfW2NhonThxwjp8+LCVnZ1t9e7d2yovL79kLeHmOpOZmWnddNNN1kcffdSu7e+//34rNTXVz12ZqS1zPXbsWGvChAk+63bt2mVJshobGwPVolHa871dX19vORwOa82aNQHszDxtmesxY8ZY//Iv/+Kz7t///d+tyMhIq6WlJVAtGqM939d//etfrf/+7/+2Wltbrccee8waPHhwADs014QJE6yMjIxLjsXFxVmrV6/2WZebm2sNGzasTcfgnptrZFmWsrKy9MYbb2jv3r2Kj49v8z5aWlp07Ngx9enTJwAdmqM9cz169Gj9+c9/Vmtrq73uww8/VJ8+fRQWFhbIdru8a/nefu2119TY2Kgf/vCHAezQHO2Z688//1zBwb4/wkNCQuz94dKu5fs6IiJC3/rWt3T+/Hn95je/0dSpUwPYqblaW1vV2Nh4ybHExETt2bPHZ11hYeFl79G5rLZnLnzZnDlzLKfTab399tvWp59+ai+ff/65XTNjxgwrOzvbfr106VLrrbfesv7yl79YpaWlVmpqqhUREXHZy3T4Qnvm+vTp01aPHj2srKwsq6KiwtqxY4cVExNjPfnkk51xCl1Ke+b7gjFjxlg/+MEPOrLdLq09c7148WKrR48e1i9/+Uvro48+snbv3m0NGDDAeuCBBzrjFLqM9sz1gQMHrN/85jfWX/7yF6uoqMgaP368FR8fb509e7YTzqBryc7Otvbt22edPHnSOnr0qJWdnW0FBQVZu3fvtizr4rl+9913rdDQUGvlypXW8ePHrcWLF1vdunWzjh071qbjEm6ukaRLLps3b7Zr/vZv/9aaOXOm/Xru3LlW3759rbCwMMvlcllTpkyxjhw50vHNdzHtmWvL+uIG7oSEBCs8PNz69re/bT311FM+9+Dg0to733/6058sSfYPL3y99sx1c3OztWTJEmvAgAFWRESEFRcXZz3yyCP8wv0a7Znrt99+2xo0aJAVHh5u9erVy5oxY4b1ySefdHzzXdCsWbOsfv36WWFhYdbf/M3fWBMmTPD52XCpnyG/+tWvrFtuucUKCwuzhgwZcsUbkC8nyLK4fgkAAMzBPTcAAMAohBsAAGAUwg0AADAK4QYAABiFcAMAAIxCuAEAAEYh3AAAAKMQbgAAgFEINwAAwCiEGwAAYBTCDQAAMArhBgAAGOX/Adn6R4b+xcuKAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "hit = 0\n",
    "means = []\n",
    "\n",
    "for i in range(0,10000):\n",
    "    (u,std) = sample_mean_std(nums_orig, N)\n",
    "    err = np.abs(u - true_u)\n",
    "    success = err < 2 * std\n",
    "    if (success):\n",
    "        hit = hit + 1\n",
    "    means.append(u)\n",
    "\n",
    "print(\"hit %.2f%% of samples\"%(hit/10000.0 * 100))\n",
    "plt.hist(means,bins=20)\n",
    "plt.axvline(x=nums_orig.mean(), color='r')\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "true median=2.70\n",
      "bootstrap median=2.60, 2.95\n"
     ]
    },
    {
     "data": {
      "image/png": "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8HZcXFzw69bWVuXl5cnlcunAgQM6d+6c5syZo+joaD3//POd8JIAAEBPF1ag7NixI+T25s2blZycrOrqao0bNy64Py4uTi6Xq93H2LVrl06cOKHdu3crJSVFDzzwgJ577jktXbpUq1atUkxMTAdeBgAA6E1u6TMojY2NkqSkpKSQ/a+99poGDhyoUaNGqaioSJcvXw4eq6qqUmZmplJSUoL7cnNz5ff7dfz48XafJxAIyO/3h2wAAKD3CusKyp9qa2vT008/rUcffVSjRo0K7v/Wt76l9PR0paWl6ejRo1q6dKlqamr05ptvSpJ8Pl9InEgK3vb5fO0+V3FxsVavXt3RUQEAQA/T4UDxer366KOP9N5774XsX7BgQfDrzMxMpaamauLEiaqtrdXQoUM79FxFRUUqLCwM3vb7/XK73R0bHAAAWK9Db/EUFBSovLxcv/3tbzVo0KAbrs3OzpYknTp1SpLkcrlUX18fsuba7et9bsXhcMjpdIZsAACg9worUIwxKigo0LZt27R3714NGTLkK+9z5MgRSVJqaqokyePx6NixY2poaAiuqaiokNPpVEZGRjjjAACAXiqst3i8Xq/Kysr0m9/8RvHx8cHPjCQkJKhv376qra1VWVmZpk6dqgEDBujo0aNavHixxo0bp6ysLEnSpEmTlJGRodmzZ2vdunXy+Xxavny5vF6vHA5H579CAADQ44R1BaW0tFSNjY0aP368UlNTg9vrr78uSYqJidHu3bs1adIkjRgxQv/wD/+g/Px8vf3228HHiIqKUnl5uaKiouTxePTtb39bc+bMCfl3UwAAwJ0trCsoxpgbHne73aqsrPzKx0lPT9f27dvDeWoAAHAH4XfxAAAA6xAoAADAOgQKAACwDoECAACsQ6AAAADrECgAAMA6BAoAALAOgQIAAKxDoAAAAOsQKAAAwDoECgAAsA6BAgAArEOgAAAA6xAoAADAOgQKAACwDoECAACsQ6AAAADrECgAAMA6BAoAALAOgQIAAKxDoAAAAOsQKAAAwDoECgAAsA6BAgAArEOgAAAA6xAoAADAOgQKAACwDoECAACsQ6AAAADrECgAAMA6BAoAALAOgQIAAKxDoAAAAOsQKAAAwDoECgAAsA6BAgAArEOgAAAA6xAoAADAOmEFSnFxsR5++GHFx8crOTlZ06dPV01NTciaK1euyOv1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30zfvn1Na2trV43YI3Tk+/H//u//zGeffWba2trMM888YzIyMrpwwp5n4sSJZsGCBe0ec7vdZv369SH7VqxYYbKysrp0Jj6DYhljjAoKCrRt2zbt3btXQ4YMCfsxWltbdezYMaWmpnbBhD1DR87jo48+qlOnTqmtrS247/e//71SU1MVExPTleNa61a+H7du3apAIKBvf/vbXThhz9CR83j58mVFRob+FR0VFRV8vDvRrXw/xsbG6utf/7quXr2qX//615o2bVoXTtrztLW1KRAItHvM4/Foz549IfsqKiqu+5mVTtOl+YOwLVq0yCQkJJh9+/aZc+fOBbfLly8H18yePdssW7YseHv16tVm586dpra21lRXV5uZM2ea2NjY616uuxN05DzW1dWZ+Ph4U1BQYGpqakx5eblJTk42P/rRj7rjJVihI+fxmrFjx5onnnjido5rrY6cx5UrV5r4+Hjzy1/+0nzyySdm165dZujQoeab3/xmd7wEK3TkPB48eND8+te/NrW1tWb//v1mwoQJZsiQIeZ///d/u+EV2GHZsmWmsrLSnD592hw9etQsW7bMREREmF27dhljvnwO//M//9P06dPHvPDCC+bkyZNm5cqVJjo62hw7dqxL5yRQLCOp3W3Tpk3BNX/xF39h5s6dG7z99NNPm8GDB5uYmBiTkpJipk6dan73u9/d/uEt0pHzaMwfP3CcnZ1tHA6Hueeee8yPf/zjkM+k3Gk6eh7/67/+y0gK/oV3p+vIeWxpaTGrVq0yQ4cONbGxscbtdpvvf//7d/R/WDtyHvft22dGjhxpHA6HGTBggJk9e7b5wx/+cPuHt8j3vvc9k56ebmJiYsxdd91lJk6cGPJntb0/07/61a/MsGHDTExMjLn//vtv+KHazhJhzB16rRAAAFiLz6AAAADrECgAAMA6BAoAALAOgQIAAKxDoAAAAOsQKAAAwDoECgAAsA6BAgAArEOgAAAA6xAoAADAOgQKAACwDoECAACs8/8ArAZPTSsiYjAAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "true mean=2.72\n",
      "bootstrap mean=2.70, 2.85\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAi4AAAGdCAYAAAA1/PiZAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAiDUlEQVR4nO3dfXBU5fnG8StEsgmShAmYN0kwIPIihk4RYgqlCBEIDEJhLL5UwTowYLAjqaLpqBCqDWOnFdvG2KkItkOgWgWrIijYhFEIShQRbSPEMAQhwUHJQpAFyfP7w7I/FxLJbs5m82S/n5kzwzn77Nn7PJ6cXJ7s3hthjDECAACwQJdQFwAAANBaBBcAAGANggsAALAGwQUAAFiD4AIAAKxBcAEAANYguAAAAGsQXAAAgDUuCXUB52tqatKhQ4cUGxuriIiIUJcDAABawRij48ePKzU1VV26BO++SIcLLocOHVJaWlqoywAAAAGora1V7969g7b/DhdcYmNjJX174HFxcSGuBmGnsVFKTf3234cOSZdeGtp6AMASbrdbaWlp3t/jwdLhgsu5Pw/FxcURXND+IiP//99xcQQXAPBTsN/mwZtzAQCANQguAADAGgQXAABgDYILAACwBsEFAABYg+ACAACsQXABAADWILgAAABrEFwAAIA1CC4AAMAaBBcAAGANggsAALAGwQUAAFiD4AIAAKxxSagLAIDWuOLB13zW9y+bHKJKAIQSd1wAAIA1CC4AAMAaBBcAAGANggsAALAGwQUAAFjDr+BSUlKizMxMxcXFKS4uTtnZ2Xr99de9j48ZM0YRERE+y7x58xwvGgAAhCe/Pg7du3dvLVu2TP3795cxRs8995ymTp2qDz74QFdffbUkac6cOVq6dKn3Od26dXO2YgAAELb8Ci5TpkzxWX/sscdUUlKiiooKb3Dp1q2bkpOTnasQAADgfwJ+j8vZs2e1du1aNTY2Kjs727t99erV6tWrl4YMGaKCggKdPHnye/fj8Xjkdrt9FgAAgOb43Tn3o48+UnZ2tk6dOqXu3btr3bp1Gjx4sCTp1ltvVZ8+fZSamqrdu3frgQceUFVVlV566aUW91dUVKTCwsLAjwAAAISNCGOM8ecJp0+f1oEDB9TQ0KB//vOfeuaZZ1ReXu4NL9/11ltvady4cdq3b5/69evX7P48Ho88Ho933e12Ky0tTQ0NDYqLi/PzcIA2amyUunf/9t8nTkiXXhraeuBFy3+gY3O73YqPjw/672+/77hERUXpyiuvlCQNGzZM7733np588kn95S9/uWBsVlaWJH1vcHG5XHK5XP6WAQAAwlCb+7g0NTX53DH5rl27dkmSUlJS2voyAAAA/t1xKSgoUG5urtLT03X8+HGVlpaqrKxMmzZtUnV1tUpLSzVp0iT17NlTu3fv1sKFCzV69GhlZmYGq34AABBG/AouR44c0R133KHDhw8rPj5emZmZ2rRpk2644QbV1tZq8+bNWr58uRobG5WWlqYZM2booYceClbtAAAgzPgVXFasWNHiY2lpaSovL29zQQAAAC3hu4oAAIA1CC4AAMAaBBcAAGANggsAALAGwQUAAFiD4AIAAKxBcAEAANYguAAAAGsQXAAAgDUILgAAwBoEFwAAYA2CCwAAsAbBBQAAWIPgAgAArEFwAQAA1iC4AAAAaxBcAACANQguAADAGgQXAABgDYILAACwBsEFAABYg+ACAACscUmoCwBgrysefM1nff+yySGqBEC44I4LAACwBsEFAABYg+ACAACsQXABAADWILgAAABrEFwAAIA1CC4AAMAaBBcAAGANggsAALAGnXMBBBXddQE4iTsuAADAGgQXAABgDYILAACwBsEFAABYg+ACAACs4VdwKSkpUWZmpuLi4hQXF6fs7Gy9/vrr3sdPnTqlvLw89ezZU927d9eMGTNUX1/veNEAACA8+RVcevfurWXLlqmyslI7d+7U2LFjNXXqVH388ceSpIULF+qVV17RCy+8oPLych06dEjTp08PSuEAACD8+NXHZcqUKT7rjz32mEpKSlRRUaHevXtrxYoVKi0t1dixYyVJK1eu1KBBg1RRUaHrrrvOuaoBAEBYCvg9LmfPntXatWvV2Nio7OxsVVZW6syZM8rJyfGOGThwoNLT07V9+/YW9+PxeOR2u30WAACA5vgdXD766CN1795dLpdL8+bN07p16zR48GDV1dUpKipKPXr08BmflJSkurq6FvdXVFSk+Ph475KWlub3QQAAgPDgd3AZMGCAdu3apR07dmj+/PmaNWuWPvnkk4ALKCgoUENDg3epra0NeF8AAKBz8/u7iqKionTllVdKkoYNG6b33ntPTz75pGbOnKnTp0/r2LFjPndd6uvrlZyc3OL+XC6XXC6X/5UDAICw0+Y+Lk1NTfJ4PBo2bJi6du2qLVu2eB+rqqrSgQMHlJ2d3daXAQAA8O+OS0FBgXJzc5Wenq7jx4+rtLRUZWVl2rRpk+Lj43XXXXcpPz9fCQkJiouL0z333KPs7Gw+UQQAABzhV3A5cuSI7rjjDh0+fFjx8fHKzMzUpk2bdMMNN0iSnnjiCXXp0kUzZsyQx+PRhAkT9NRTTwWlcAAAEH78Ci4rVqz43sejo6NVXFys4uLiNhUFAADQHL6rCAAAWIPgAgAArEFwAQAA1vC7jwuAju2KB1/zWd+/bHKIKgEA53HHBQAAWIPgAgAArEFwAQAA1iC4AAAAaxBcAACANQguAADAGgQXAABgDYILAACwBsEFAABYg865AFrl/I68ABAK3HEBAADWILgAAABrEFwAAIA1CC4AAMAaBBcAAGANggsAALAGwQUAAFiD4AIAAKxBAzrAIuc3gdu/bHKIKmmeU03qgtnsrqPPIYDvxx0XAABgDYILAACwBsEFAABYg+ACAACsQXABAADWILgAAABrEFwAAIA1CC4AAMAaBBcAAGANOucCCLlgdsoF0LlwxwUAAFiD4AIAAKxBcAEAANYguAAAAGsQXAAAgDX8Ci5FRUUaPny4YmNjlZiYqGnTpqmqqspnzJgxYxQREeGzzJs3z9GiAQBAePIruJSXlysvL08VFRV68803debMGY0fP16NjY0+4+bMmaPDhw97l8cff9zRogEAQHjyq4/Lxo0bfdZXrVqlxMREVVZWavTo0d7t3bp1U3JysjMVAgAA/E+b3uPS0NAgSUpISPDZvnr1avXq1UtDhgxRQUGBTp482eI+PB6P3G63zwIAANCcgDvnNjU16d5779XIkSM1ZMgQ7/Zbb71Vffr0UWpqqnbv3q0HHnhAVVVVeumll5rdT1FRkQoLCwMtA4ADmutcu3/Z5BBU4iw68gKdT8DBJS8vT3v27NHbb7/ts33u3Lnef19zzTVKSUnRuHHjVF1drX79+l2wn4KCAuXn53vX3W630tLSAi0LAAB0YgEFlwULFujVV1/V1q1b1bt37+8dm5WVJUnat29fs8HF5XLJ5XIFUgYAAAgzfgUXY4zuuecerVu3TmVlZcrIyLjoc3bt2iVJSklJCahAAACAc/wKLnl5eSotLdXLL7+s2NhY1dXVSZLi4+MVExOj6upqlZaWatKkSerZs6d2796thQsXavTo0crMzAzKAQAAgPDhV3ApKSmR9G2Tue9auXKlZs+eraioKG3evFnLly9XY2Oj0tLSNGPGDD300EOOFQwAAMKX338q+j5paWkqLy9vU0EAAAAt4buKAACANQguAADAGgQXAABgjYAb0AFAuOisnYUBG3HHBQAAWIPgAgAArEFwAQAA1iC4AAAAaxBcAACANQguAADAGgQXAABgDYILAACwBg3oAHQazTWKA9C5cMcFAABYg+ACAACsQXABAADWILgAAABrEFwAAIA1CC4AAMAaBBcAAGANggsAALAGwQUAAFiDzrlAO2hNR9f9yya3QyVoDTrwAh0Xd1wAAIA1CC4AAMAaBBcAAGANggsAALAGwQUAAFiD4AIAAKxBcAEAANYguAAAAGsQXAAAgDXonAsAQXJ+B166IwNtxx0XAABgDYILAACwBsEFAABYg+ACAACsQXABAADW8Cu4FBUVafjw4YqNjVViYqKmTZumqqoqnzGnTp1SXl6eevbsqe7du2vGjBmqr693tGgAABCe/Aou5eXlysvLU0VFhd58802dOXNG48ePV2Njo3fMwoUL9corr+iFF15QeXm5Dh06pOnTpzteOAAACD9+9XHZuHGjz/qqVauUmJioyspKjR49Wg0NDVqxYoVKS0s1duxYSdLKlSs1aNAgVVRU6LrrrnOucgAAEHba9B6XhoYGSVJCQoIkqbKyUmfOnFFOTo53zMCBA5Wenq7t27c3uw+PxyO32+2zAAAANCfgzrlNTU269957NXLkSA0ZMkSSVFdXp6ioKPXo0cNnbFJSkurq6prdT1FRkQoLCwMtAwCscX4nXYluuoC/Ar7jkpeXpz179mjt2rVtKqCgoEANDQ3epba2tk37AwAAnVdAd1wWLFigV199VVu3blXv3r2925OTk3X69GkdO3bM565LfX29kpOTm92Xy+WSy+UKpAwAABBm/LrjYozRggULtG7dOr311lvKyMjweXzYsGHq2rWrtmzZ4t1WVVWlAwcOKDs725mKAQBA2PLrjkteXp5KS0v18ssvKzY21vu+lfj4eMXExCg+Pl533XWX8vPzlZCQoLi4ON1zzz3Kzs7mE0UAAKDN/AouJSUlkqQxY8b4bF+5cqVmz54tSXriiSfUpUsXzZgxQx6PRxMmTNBTTz3lSLEAACC8+RVcjDEXHRMdHa3i4mIVFxcHXBQAAEBz+K4iAABgDYILAACwBsEFAABYI+DOuQCCq7kuq+H0+u0lXI4T6Cy44wIAAKxBcAEAANYguAAAAGsQXAAAgDUILgAAwBoEFwAAYA2CCwAAsAbBBQAAWIMGdEAn11yDtf3LJoegkm91loZv5x9HKOcUCCfccQEAANYguAAAAGsQXAAAgDUILgAAwBoEFwAAYA2CCwAAsAbBBQAAWIPgAgAArEFwAQAA1qBzLhCGOkP32s5wDAD8xx0XAABgDYILAACwBsEFAABYg+ACAACsQXABAADWILgAAABrEFwAAIA1CC4AAMAaBBcAAGANOucC/3PFg68p5vQp/ed/64Me3qj//GFGSGu6GLrHAgg33HEBAADWILgAAABrEFwAAIA1CC4AAMAafgeXrVu3asqUKUpNTVVERITWr1/v8/js2bMVERHhs0ycONGpegEAQBjzO7g0NjZq6NChKi4ubnHMxIkTdfjwYe+yZs2aNhUJAAAgBfBx6NzcXOXm5n7vGJfLpeTk5ICLAgAAaE5Q3uNSVlamxMREDRgwQPPnz9fRo0eD8TIAACDMON6AbuLEiZo+fboyMjJUXV2tX//618rNzdX27dsVGRl5wXiPxyOPx+Ndd7vdTpcEAAA6CceDy8033+z99zXXXKPMzEz169dPZWVlGjdu3AXji4qKVFhY6HQZQMgE2s2WLrhoSXPnxv5lk0NQCRB6Qf84dN++fdWrVy/t27ev2ccLCgrU0NDgXWpra4NdEgAAsFTQv6vo4MGDOnr0qFJSUpp93OVyyeVyBbsMAADQCfgdXE6cOOFz96Smpka7du1SQkKCEhISVFhYqBkzZig5OVnV1dVatGiRrrzySk2YMMHRwgEAQPjxO7js3LlT119/vXc9Pz9fkjRr1iyVlJRo9+7deu6553Ts2DGlpqZq/Pjx+s1vfsNdFQAA0GZ+B5cxY8bIGNPi45s2bWpTQQAAAC3hu4oAAIA1CC4AAMAaBBcAAGCNoH8cGrDZ+Y2/mmv6ReM4OInzCfh+3HEBAADWILgAAABrEFwAAIA1CC4AAMAaBBcAAGANggsAALAGwQUAAFiD4AIAAKxBcAEAANagcy4AOICOt0D74I4LAACwBsEFAABYg+ACAACsQXABAADWILgAAABrEFwAAIA1CC4AAMAaBBcAAGANggsAALAGnXNhveY6lu5fNjkElQAdy/k/G/xcoDPgjgsAALAGwQUAAFiD4AIAAKxBcAEAANYguAAAAGsQXAAAgDUILgAAwBoEFwAAYA2CCwAAsAadc9GhdbSuuM3VA7SFU+dUoPuhuy5swx0XAABgDYILAACwBsEFAABYg+ACAACs4Xdw2bp1q6ZMmaLU1FRFRERo/fr1Po8bY/TII48oJSVFMTExysnJ0d69e52qFwAAhDG/g0tjY6OGDh2q4uLiZh9//PHH9cc//lFPP/20duzYoUsvvVQTJkzQqVOn2lwsAAAIb35/HDo3N1e5ubnNPmaM0fLly/XQQw9p6tSpkqS//e1vSkpK0vr163XzzTe3rVoAABDWHH2PS01Njerq6pSTk+PdFh8fr6ysLG3fvt3JlwIAAGHI0QZ0dXV1kqSkpCSf7UlJSd7HzufxeOTxeLzrbrfbyZIAAEAnEvLOuUVFRSosLAx1GXBYR+t4CwDoHBz9U1FycrIkqb6+3md7fX2997HzFRQUqKGhwbvU1tY6WRIAAOhEHA0uGRkZSk5O1pYtW7zb3G63duzYoezs7Gaf43K5FBcX57MAAAA0x+8/FZ04cUL79u3zrtfU1GjXrl1KSEhQenq67r33Xj366KPq37+/MjIy9PDDDys1NVXTpk1zsm4AABCG/A4uO3fu1PXXX+9dz8/PlyTNmjVLq1at0qJFi9TY2Ki5c+fq2LFjGjVqlDZu3Kjo6GjnqgYAAGHJ7+AyZswYGWNafDwiIkJLly7V0qVL21QYAADA+fiuIgAAYA2CCwAAsAbBBQAAWCPkDeiA9kBDPADoHLjjAgAArEFwAQAA1iC4AAAAaxBcAACANQguAADAGgQXAABgDYILAACwBsEFAABYg+ACAACsQedcWKe5LrjBGgPgwp8Vuk4jlLjjAgAArEFwAQAA1iC4AAAAaxBcAACANQguAADAGgQXAABgDYILAACwBsEFAABYg+ACAACsQedcdCh0swWCh47S6Ay44wIAAKxBcAEAANYguAAAAGsQXAAAgDUILgAAwBoEFwAAYA2CCwAAsAbBBQAAWIPgAgAArEHnXFzU+Z009y+bHKJKAJxDh1uEK+64AAAAaxBcAACANQguAADAGgQXAABgDceDy5IlSxQREeGzDBw40OmXAQAAYSgonyq6+uqrtXnz5v9/kUv48BIAAGi7oCSKSy65RMnJycHYNQAACGNBeY/L3r17lZqaqr59++q2227TgQMHWhzr8Xjkdrt9FgAAgOY4fsclKytLq1at0oABA3T48GEVFhbqxz/+sfbs2aPY2NgLxhcVFamwsNDpMtAB0TALwHc1d02gwSUuxvE7Lrm5ubrpppuUmZmpCRMmaMOGDTp27Jief/75ZscXFBSooaHBu9TW1jpdEgAA6CSC/q7ZHj166KqrrtK+ffuafdzlcsnlcgW7DAAA0AkEvY/LiRMnVF1drZSUlGC/FAAA6OQcDy733XefysvLtX//fm3btk0//elPFRkZqVtuucXplwIAAGHG8T8VHTx4ULfccouOHj2qyy67TKNGjVJFRYUuu+wyp18KAACEGceDy9q1a53eJQAAgCS+qwgAAFiE4AIAAKxBcAEAANbg2w/hCLriAuGjo3W87Wj1ILi44wIAAKxBcAEAANYguAAAAGsQXAAAgDUILgAAwBoEFwAAYA2CCwAAsAbBBQAAWIPgAgAArEHn3DBCd0kAwXL+9cWpa0s4X7fC+di/D3dcAACANQguAADAGgQXAABgDYILAACwBsEFAABYg+ACAACsQXABAADWILgAAABrEFwAAIA16JxrodZ2U2xuHAC0h1B3fQ1WJ1+nBDo/Hf242gN3XAAAgDUILgAAwBoEFwAAYA2CCwAAsAbBBQAAWIPgAgAArEFwAQAA1iC4AAAAaxBcAACANcKuc24ouw461Skx0DFOPY+OvAAC4dS1oz2vW4H8juho18hQdzF2GndcAACANQguAADAGgQXAABgDYILAACwRtCCS3Fxsa644gpFR0crKytL7777brBeCgAAhImgBJd//OMfys/P1+LFi/X+++9r6NChmjBhgo4cORKMlwMAAGEiKMHlD3/4g+bMmaM777xTgwcP1tNPP61u3brp2WefDcbLAQCAMOF4H5fTp0+rsrJSBQUF3m1dunRRTk6Otm/ffsF4j8cjj8fjXW9oaJAkud1up0uTJDV5TvqsB+t1WvParX395p6H4Dh7+pTO/Rc56zmpJtMU0nqAcHP+NTHU179AfkcEWnMgxx7o75Bg/O47t09jjOP79mEc9vnnnxtJZtu2bT7b77//fjNixIgLxi9evNhIYmFhYWFhYekES3V1tdPRwkfIO+cWFBQoPz/fu97U1KQvv/xSPXv2VERERAgrc4bb7VZaWppqa2sVFxcX6nI6LOapdZin1mGeWod5ah3mqXUaGhqUnp6uhISEoL6O48GlV69eioyMVH19vc/2+vp6JScnXzDe5XLJ5XL5bOvRo4fTZYVcXFwcJ3wrME+twzy1DvPUOsxT6zBPrdOlS3A7rTi+96ioKA0bNkxbtmzxbmtqatKWLVuUnZ3t9MsBAIAwEpQ/FeXn52vWrFm69tprNWLECC1fvlyNjY268847g/FyAAAgTAQluMycOVNffPGFHnnkEdXV1ekHP/iBNm7cqKSkpGC8XIfmcrm0ePHiC/4cBl/MU+swT63DPLUO89Q6zFPrtNc8RRgT7M8tAQAAOIPvKgIAANYguAAAAGsQXAAAgDUILgAAwBoEFz8UFRVp+PDhio2NVWJioqZNm6aqqqqLPu/YsWPKy8tTSkqKXC6XrrrqKm3YsMH7+JIlSxQREeGzDBw4MJiHElSBzNOYMWMumIOIiAhNnjzZO8YYo0ceeUQpKSmKiYlRTk6O9u7dG+zDCZpgzdPs2bMveHzixInBPpygCfTnbvny5RowYIBiYmKUlpamhQsX6tSpUz5jiouLdcUVVyg6OlpZWVl69913g3UYQReseeL6JJ05c0ZLly5Vv379FB0draFDh2rjxo0XjAv386k18+TI+RTULxToZCZMmGBWrlxp9uzZY3bt2mUmTZpk0tPTzYkTJ1p8jsfjMddee62ZNGmSefvtt01NTY0pKyszu3bt8o5ZvHixufrqq83hw4e9yxdffNEehxQUgczT0aNHfY5/z549JjIy0qxcudI7ZtmyZSY+Pt6sX7/efPjhh+bGG280GRkZ5uuvv26Ho3JesOZp1qxZZuLEiT7jvvzyy3Y4ouAIZJ5Wr15tXC6XWb16tampqTGbNm0yKSkpZuHChd4xa9euNVFRUebZZ581H3/8sZkzZ47p0aOHqa+vb4/Dclyw5onrkzGLFi0yqamp5rXXXjPV1dXmqaeeMtHR0eb999/3juF8at08OXE+EVza4MiRI0aSKS8vb3FMSUmJ6du3rzl9+nSLYxYvXmyGDh0ahAo7htbM0/meeOIJExsb6/0haWpqMsnJyeZ3v/udd8yxY8eMy+Uya9ascbzmUHBinoz5NrhMnTo1CBV2DK2Zp7y8PDN27Fifbfn5+WbkyJHe9REjRpi8vDzv+tmzZ01qaqopKipyvugQcGqeuD4Zk5KSYv785z/7bJs+fbq57bbbvOucT62bJyfOJ/5U1AYNDQ2S9L1fKPWvf/1L2dnZysvLU1JSkoYMGaLf/va3Onv2rM+4vXv3KjU1VX379tVtt92mAwcOBLX29tSaeTrfihUrdPPNN+vSSy+VJNXU1Kiurk45OTneMfHx8crKytL27dudLThEnJinc8rKypSYmKgBAwZo/vz5Onr0qKO1hlJr5ulHP/qRKisrvbfqP/vsM23YsEGTJk2SJJ0+fVqVlZU+51OXLl2Uk5MTVufTxebpnHC/Pnk8HkVHR/tsi4mJ0dtvvy2J8+mci83TOW0+n9oUe8LY2bNnzeTJk33+z6Q5AwYMMC6Xy/ziF78wO3fuNGvXrjUJCQlmyZIl3jEbNmwwzz//vPnwww/Nxo0bTXZ2tklPTzdutzvYhxF0rZ2n79qxY4eRZHbs2OHd9s477xhJ5tChQz5jb7rpJvOzn/3MsXpDxal5MsaYNWvWmJdfftns3r3brFu3zgwaNMgMHz7cfPPNN06X3e78macnn3zSdO3a1VxyySVGkpk3b573sc8//9xIMtu2bfN5zv33329GjBjheN3tzal5MobrkzHG3HLLLWbw4MHm008/NWfPnjVvvPGGiYmJMVFRUcYYzqdzLjZPxjhzPhFcAjRv3jzTp08fU1tb+73j+vfvb9LS0nx+afz+9783ycnJLT7nq6++MnFxceaZZ55xrN5Qae08fdfcuXPNNddc47OtswcXp+apOdXV1UaS2bx5c1tK7BBaO0///ve/TVJSkvnrX/9qdu/ebV566SWTlpZmli5daozp/L9onJqn5oTj9enIkSNm6tSppkuXLiYyMtJcddVV5u677zbR0dHGGM6ncy42T80J5HwiuAQgLy/P9O7d23z22WcXHTt69Ggzbtw4n20bNmwwkozH42nxeddee6158MEH21xrKPkzT+ecOHHCxMXFmeXLl/tsP/fL94MPPvDZPnr0aPPLX/7SiXJDxsl5akmvXr3M008/HWiJHYI/8zRq1Chz3333+Wz7+9//bmJiYszZs2eNx+MxkZGRZt26dT5j7rjjDnPjjTc6WXa7c3KeWhKu16evv/7aHDx40DQ1NZlFixaZwYMHG2MM59N5Wpqnlvh7PvEeFz8YY7RgwQKtW7dOb731ljIyMi76nJEjR2rfvn1qamrybvv000+VkpKiqKioZp9z4sQJVVdXKyUlxbHa21Mg83TOCy+8II/Ho5///Oc+2zMyMpScnKwtW7Z4t7ndbu3YsUPZ2dmO1d6egjFPzTl48KCOHj0aVufTyZMn1aWL7+UtMjLSu7+oqCgNGzbM53xqamrSli1bwup8utg8NSecr0/R0dG6/PLL9c033+jFF1/U1KlTJYnz6TwtzVNzAjqfWh1xYObPn2/i4+NNWVmZz0e5Tp486R1z++23+yTHAwcOmNjYWLNgwQJTVVVlXn31VZOYmGgeffRR75hf/epXpqyszNTU1Jh33nnH5OTkmF69epkjR4606/E5JZB5OmfUqFFm5syZze532bJlpkePHt73b0ydOtXqj0MHY56OHz9u7rvvPrN9+3ZTU1NjNm/ebH74wx+a/v37m1OnTgX1eIIlkHlavHixiY2NNWvWrDGfffaZeeONN0y/fv18/qy4du1a43K5zKpVq8wnn3xi5s6da3r06GHq6ura9ficEqx54vpkTEVFhXnxxRdNdXW12bp1qxk7dqzJyMgwX331lXcM51Pr5smJ84ng4gdJzS7f7aHxk5/8xMyaNcvnedu2bTNZWVnG5XKZvn37mscee8znPS8zZ840KSkpJioqylx++eVm5syZZt++fe10VM4LdJ7++9//GknmjTfeaHa/TU1N5uGHHzZJSUnG5XKZcePGmaqqqiAeSXAFY55Onjxpxo8fby677DLTtWtX06dPHzNnzhxrL57GBDZPZ86cMUuWLDH9+vUz0dHRJi0tzdx9990+F1BjjPnTn/5k0tPTTVRUlBkxYoSpqKhon4MKgmDNE9cnY8rKysygQYOMy+UyPXv2NLfffrv5/PPPL9h3uJ9PrZknJ86niP8VCAAA0OHxHhcAAGANggsAALAGwQUAAFiD4AIAAKxBcAEAANYguAAAAGsQXAAAgDUILgAAwBoEFwAAYA2CCwAAsAbBBQAAWIPgAgAArPF/VN5mQRpSgvMAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# use bootstrap to get confidence intervals\n",
    "# on arbitrary functions \n",
    "N_boots = 1000\n",
    "N = 100\n",
    "\n",
    "def bootstrap(buf, fn, n_boots,ci,samp_size=N):\n",
    "    vals = []\n",
    "    buf_s = np.random.choice(buf,size=samp_size)\n",
    "    for i in range(0,n_boots):\n",
    "        samp = np.random.choice(buf_s, size=samp_size, replace=True)\n",
    "        vals.append(fn(samp))\n",
    "    return(np.percentile(vals,ci), np.percentile(vals,100.0-ci), vals)\n",
    "\n",
    "\n",
    "print(\"true median=%.2f\"%(np.median(nums_orig)))\n",
    "(ci1, ci2, vals) = bootstrap(nums_orig,np.median,N_boots,5.0)\n",
    "print(\"bootstrap median=%.2f, %.2f\"%(ci1, ci2))\n",
    "plt.hist(vals,bins=100)\n",
    "plt.axvline(x=nums_orig.median(), color='r')\n",
    "plt.show()\n",
    "\n",
    "\n",
    "print(\"true mean=%.2f\"%(true_u))\n",
    "(ci1, ci2, vals) = bootstrap(nums_orig,np.mean,N_boots,5.0)\n",
    "print(\"bootstrap mean=%.2f, %.2f\"%(ci1, ci2))\n",
    "plt.hist(vals,bins=100)\n",
    "plt.axvline(x=nums_orig.mean(), color='r')\n",
    "plt.show()\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "512 buckets needed\n",
      "[b'Monica Summers', b'Shelly Young', b'Nicole Flores']\n",
      "104\n"
     ]
    }
   ],
   "source": [
    "#hyperloglog\n",
    "import hyperloglog\n",
    "from faker import Faker\n",
    "\n",
    "error_rate = 0.05\n",
    "hll = hyperloglog.HyperLogLog(error_rate)  \n",
    "p = int(math.ceil(math.log((1.04 / error_rate) ** 2, 2)))\n",
    "\n",
    "#note that the number of buckets is independent of the dataset size\n",
    "print(\"%d buckets needed\"%(1 << p))\n",
    "\n",
    "# 100 distinct fake names\n",
    "fake = Faker()\n",
    "ns = []\n",
    "for i in range(0,100):\n",
    "    ns.append(fake.name().encode('utf-8'))\n",
    "print(ns[0:3])\n",
    "\n",
    "#10000 sample\n",
    "samps = np.random.choice(ns, size=10000, replace=True)\n",
    "for s in samps:\n",
    "    hll.add(s)\n",
    "print(len(hll))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [],
   "source": [
    "\n",
    "import hashlib\n",
    "def count_lead_zeroes(d,b):\n",
    "    # https://graphics.stanford.edu/~seander/bithacks.html#ZerosOnRightLinear\n",
    "    #print bin(d)\n",
    "    if d:\n",
    "        leading = b\n",
    "        v = d\n",
    "        while v:\n",
    "            v >>= 1\n",
    "            leading -= 1\n",
    "        #print bin(d)\n",
    "        #print leading\n",
    "        return leading + 1\n",
    "    return b\n",
    "\n",
    "nbits = 64\n",
    "\n",
    "def int_hash(s):\n",
    "    h = hashlib.sha1(s)\n",
    "    return h.hexdigest()[:nbits//4]\n",
    "\n",
    "def get_first(s,i):\n",
    "    part = s[0:i//4]\n",
    "    return int(part,16)\n",
    "\n",
    "def get_last(s,i):\n",
    "    offset = i//4\n",
    "    part = s[offset:]\n",
    "    return int(part,16)\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "256\n"
     ]
    }
   ],
   "source": [
    "bucket_bits = 8\n",
    "buckets = int(math.pow(2, bucket_bits))\n",
    "print(buckets)\n",
    "\n",
    "hashes = []\n",
    "for name in ns:\n",
    "    h = int_hash(name)\n",
    "    hashes.append(h)\n",
    "\n",
    "samps = np.random.choice(hashes, size=10000, replace=True)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [],
   "source": [
    "\n",
    "def get_alpha(p):\n",
    "    if not (4 <= p <= 16):\n",
    "        raise ValueError(\"p=%d should be in range [4 : 16]\" % p)\n",
    "\n",
    "    if p == 4:\n",
    "        return 0.673\n",
    "\n",
    "    if p == 5:\n",
    "        return 0.697\n",
    "\n",
    "    if p == 6:\n",
    "        return 0.709\n",
    "\n",
    "    return 0.7213 / (1.0 + 1.079 / (1 << p))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "99\n"
     ]
    }
   ],
   "source": [
    "#wikipedia algorithm https://en.wikipedia.org/wiki/HyperLogLog\n",
    "mx = np.zeros(buckets)\n",
    "\n",
    "for s in samps:\n",
    "    i = get_first(s,bucket_bits)\n",
    "    j = get_last(s,bucket_bits)\n",
    "    \n",
    "    nzeros = count_lead_zeroes(j, nbits - bucket_bits)\n",
    "    if (nzeros > mx[i]):\n",
    "        mx[i] = nzeros\n",
    "sum = 0\n",
    "\n",
    "#compute the harmonic mean of the registers\n",
    "for i in range(0,buckets):\n",
    "    exp = math.pow(2.0, -mx[i])\n",
    "    sum = sum + exp\n",
    "sum = 1/sum\n",
    "\n",
    "E = sum * buckets**2 * get_alpha(bucket_bits)\n",
    "\n",
    "zeros = len(mx) - np.count_nonzero(mx) \n",
    "if (zeros > 0 and E < 2.5 * buckets):\n",
    "    H = buckets * math.log(buckets / float(zeros))\n",
    "    print(int(round(H)))\n",
    "else:\n",
    "    print(int(round(E)))\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [],
   "source": [
    "# count min\n",
    "# see https://medium.com/@amirziai/count-min-sketch-4b0ab93bb37a\n",
    "from dataclasses import dataclass\n",
    "import mmh3  # pip install mmh3\n",
    "\n",
    "\n",
    "@dataclass\n",
    "class CountMinSketch:\n",
    "    tables: int\n",
    "    buckets: int\n",
    "        \n",
    "    def __post_init__(self):\n",
    "        self.x = np.zeros((self.tables, self.buckets))\n",
    "    \n",
    "    def increment(self, x: str) -> None:\n",
    "        for table_idx in range(self.tables):\n",
    "            b = self._get_bucket(x=x, table_idx=table_idx)\n",
    "            self.x[table_idx, b] += 1\n",
    "    \n",
    "    def count(self, x: str) -> int:\n",
    "        return min(\n",
    "            self.x[table_idx, self._get_bucket(x=x, table_idx=table_idx)]\n",
    "            for table_idx in range(self.tables)\n",
    "        )\n",
    "    \n",
    "    def _get_bucket(self, x: str, table_idx: int) -> int:\n",
    "        b = mmh3.hash(key=x, seed=table_idx, signed=False) % self.buckets\n",
    "        #print(f\"b = {b}, x = {x}, t={table_idx}\")\n",
    "        #freqs[b] = freqs[b] + 1\n",
    "        return b\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [],
   "source": [
    "#create synthetic data -- uuid's that appear with a skewed frequency\n",
    "from uuid import uuid4\n",
    "import pandas as pd\n",
    "data3 = []\n",
    "\n",
    "target = 100000  # total number of values\n",
    "inc = 100 # skew -- adjust maximum number of repeats of each value by this amount on each new iteration\n",
    "i = 100\n",
    "t = 2\n",
    "b = 50\n",
    "#freqs = np.zeros(b)\n",
    "while len(data3) < target:\n",
    "    i += inc\n",
    "    diff = target - len(data3)\n",
    "    n = np.random.randint(1, min(diff, i) + 1)\n",
    "    data3.extend([str(uuid4())] * n)\n",
    "\n",
    "counts_actual = pd.Series(data3).value_counts()\n",
    "cms = CountMinSketch(tables=t, buckets=b)\n",
    "for x in data3: cms.increment(x)\n",
    "#print(freqs)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [],
   "source": [
    "counts_cms = pd.Series(\n",
    "    (cms.count(x) for x in set(data3)),\n",
    "    index=set(data3),\n",
    ").sort_values(ascending=False)\n",
    "#counts_cms\n",
    "#print(len(counts_cms))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "                                      cnt_cms  cnt_actual\n",
      "index                                                    \n",
      "961b29e0-ed5a-4898-ab36-df327e21eb2c   8473.0        4145\n",
      "c5b63f9c-9a27-499d-86ad-0f2239decb5b   8473.0        3558\n",
      "a2c16d49-016e-4064-9e8d-81b967bc7fbf   5532.0        1452\n",
      "ed7b6de0-6ae8-4589-a8c1-598b002a6498   5532.0        1310\n",
      "6fdc273c-77f0-4938-83bf-7d42fa9a6ddd   5532.0        2739\n",
      "26e5fa02-361c-4604-ab2d-d9b862593d5d   5507.0        5444\n",
      "d9f07770-6071-4742-ab9a-0d5e078fe4a3   5441.0        4131\n",
      "22b1ad6d-0cee-4a26-ad19-ee8a46c8c526   5367.0        1769\n",
      "700cb033-25d1-49ef-8475-e18b75ca463f   5038.0        2000\n",
      "c79785b9-015e-4424-b64f-0304b919fa1a   5038.0        3038\n",
      "1f6c3384-6287-4b9f-9520-92475dfc1d25   4834.0         956\n",
      "f78cb45d-4594-429c-bb66-ea2d5e3671af   4834.0        3878\n",
      "bf245603-3170-493e-9170-121c38ab4f22   4544.0        4544\n",
      "1a44db91-85d1-4855-b617-f5576a13036c   4323.0        1307\n",
      "18c229e2-b9b8-4235-84dc-d1b59746f027   4323.0        3016\n",
      "7f25e409-4db5-4995-bf43-5f4c8e947940   3809.0        2811\n",
      "551c9be0-2e02-4c2c-82f7-c7906f440396   3651.0        3651\n",
      "49d53485-b484-4a91-919d-c6c160c2f94a   3489.0        3489\n",
      "2dab5a17-f709-4140-a1c5-68491ae3499c   3357.0        3357\n",
      "bad3e7ed-6565-47dc-85ec-2750ff00e11d   3259.0        1974\n",
      "9c208e67-a780-4612-9cdb-f0038a6398f3   2899.0        2828\n",
      "0edec1d3-b9d2-46f4-8ede-20dfebf254f8   2899.0          71\n",
      "8cac10e9-e4ec-46cb-b1b3-28c96c0d0b3e   2770.0         601\n",
      "bb0725d2-2ed4-4d7a-bd26-a981d309da93   2770.0        2168\n",
      "d12f1da2-621c-479e-8406-5227394a4a8f   2698.0         100\n",
      "90b451d2-e9ba-45bf-8af1-7d88c8406eb1   2692.0        2692\n",
      "e02b4646-32c4-4fb6-bac0-690a85dc4fb5   2645.0        2645\n",
      "ce1169dd-d14a-4c7f-975e-eaac9fa3450e   2426.0        2407\n",
      "5c4788aa-4526-4ea8-b72f-38a0292f9c59   2274.0        2274\n",
      "ecf825f2-0fb6-4c57-bdb6-40a9847970ee   2263.0        2263\n",
      "e02aafad-9170-461e-829d-1763326aedba   2199.0        1285\n",
      "76db60b5-2825-40a4-8483-8d6edf3223df   2199.0         802\n",
      "bd28b365-4e17-4dc5-85d3-daefd8403340   2142.0         831\n",
      "81814730-9e4c-4db4-aada-900dc865f2ba   1930.0        1930\n",
      "d25ffa05-c0e1-4a4d-a2b6-7c9d70178e0d   1671.0        1606\n",
      "a426bb6e-8261-4dc9-80ba-2d9034aafa43   1671.0          65\n",
      "d0a026c2-6b34-4be0-a6f2-1dd661bd97c2   1632.0        1632\n",
      "ea13bf67-03a7-4941-a831-7b80d4fc4242   1430.0        1430\n",
      "f3d743de-f361-4be5-b5ae-5124096c97ff   1404.0        1311\n",
      "dc78781f-73ad-4b46-983b-4134e3165cae   1290.0         398\n",
      "616cc036-52a0-490c-abaa-b9c47048d788   1112.0        1112\n",
      "4e8ed372-f443-4b35-b9cc-eac94d9bab3a    992.0         992\n",
      "6096f26f-d61f-4a1f-8f8a-5a606cd9d239    971.0         971\n",
      "700197b8-86cd-4c62-a5a4-ddf9989fcd72    849.0         849\n",
      "8ffeab0b-2df5-438e-9156-99b3f4a426ce    845.0         845\n",
      "ebaddff9-0d02-4d92-baed-b27857a1a807    791.0          63\n",
      "a1fbf8b7-97b8-413c-a671-23744250de89    791.0         653\n",
      "b994e7e7-f787-4a6c-a8dc-9dd6e8277d9f    781.0          97\n",
      "e515263a-8ec9-4faa-bb4f-4693f00b319a    781.0         569\n",
      "bc9a8163-eb25-41d9-a99f-33560f536cde    781.0           3\n",
      "bb8b6b0e-e724-45c2-acdd-0ab7cefdc6f7    781.0         112\n",
      "f4b6596b-49b8-4942-aa20-9aff617d3fc7    770.0         770\n",
      "0b592760-3c8a-4198-86e3-a17123f6c78e    674.0         442\n",
      "d2c60145-d131-442d-84b2-b3db8421c8f4    642.0         593\n",
      "b1c668d0-2102-4f69-84ec-162236574ba3    611.0         611\n",
      "43cd9281-2e45-4b46-a677-f41333af8c26    600.0         600\n",
      "a11991e0-f03a-4aba-b2fa-59e46b6ca372    595.0         595\n",
      "208c8a4d-8a87-4c94-842a-7e4ea51d0558    538.0         538\n",
      "61892a00-1052-4ee8-b3b2-afd05a892723    507.0         232\n",
      "9a9fbb8e-72a7-4fe5-8270-731ebb5265b0    507.0         275\n",
      "c329a8d6-b239-4ad1-8883-7ce09b7300d1    480.0          93\n",
      "c48117ae-b2df-4ca0-8ebc-0de28d51e645    462.0         462\n",
      "64ecc956-cf02-4a07-9f03-fbaec3aad0e6    436.0          49\n",
      "94a33936-daf1-4bc3-ad55-1292c1326e28    436.0         387\n",
      "422add41-e417-434e-82f0-96e74728ffac     75.0          75\n",
      "ee3a98ba-ae15-4e52-ab11-4592e8f384b5     47.0          47\n",
      "c4b5be44-3831-4f80-947f-596e098b5d64     31.0          31\n",
      "84d3b029-118b-4356-89a1-2d4a21396d88     19.0          19\n",
      "fa1342c1-5b6f-4649-bf27-3a7e4dfb7188      6.0           6\n",
      "389ddd65-ed88-42f7-bb2c-dd3075ea20d5      1.0           1\n",
      "[[0.0000e+00 6.0000e+00 2.6980e+03 0.0000e+00 0.0000e+00 7.7000e+02\n",
      "  1.6320e+03 2.1990e+03 1.2900e+03 0.0000e+00 1.0465e+04 5.9250e+03\n",
      "  6.4200e+02 2.6450e+03 1.4300e+03 5.3800e+02 1.2090e+03 3.1000e+01\n",
      "  0.0000e+00 5.4410e+03 7.9100e+02 5.3570e+03 6.7400e+02 8.6520e+03\n",
      "  2.4260e+03 0.0000e+00 0.0000e+00 2.2630e+03 2.1420e+03 5.7770e+03\n",
      "  0.0000e+00 0.0000e+00 0.0000e+00 4.8000e+02 8.4900e+02 0.0000e+00\n",
      "  6.0000e+02 0.0000e+00 5.9500e+02 1.0432e+04 3.5120e+03 6.4000e+03\n",
      "  0.0000e+00 0.0000e+00 0.0000e+00 0.0000e+00 6.6670e+03 2.6920e+03\n",
      "  0.0000e+00 2.7700e+03]\n",
      " [5.9500e+02 3.5230e+03 2.8990e+03 4.7000e+01 2.2740e+03 7.8100e+02\n",
      "  1.9440e+03 4.3600e+02 1.0000e+00 1.6710e+03 5.0700e+02 4.8340e+03\n",
      "  9.9200e+02 2.4340e+03 8.4730e+03 1.9000e+01 2.8560e+03 5.5320e+03\n",
      "  1.4040e+03 5.0380e+03 3.2590e+03 4.6200e+02 8.4500e+02 5.5070e+03\n",
      "  0.0000e+00 3.6510e+03 0.0000e+00 5.3800e+02 0.0000e+00 9.7100e+02\n",
      "  1.9300e+03 5.3670e+03 0.0000e+00 0.0000e+00 3.8090e+03 0.0000e+00\n",
      "  6.5440e+03 0.0000e+00 0.0000e+00 7.5000e+01 0.0000e+00 0.0000e+00\n",
      "  1.1120e+03 3.4890e+03 3.3570e+03 4.5440e+03 6.1100e+02 4.3230e+03\n",
      "  0.0000e+00 3.3460e+03]]\n"
     ]
    },
    {
     "data": {
      "image/png": "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tMjY7XZTWlpqjDHmoYceMldffbXbc44bN86kp6d7/DocDoeRZBwOh8c/AwAAfKsx399etRD95je/UUlJzX16zp07p9/85jeuf3/44Yfq2rVrvdeaOnWqxowZo7S0NLfj2dnZKisrczvep08fdevWTVlZWZKkrKws9evXT3Fxca4y6enpcjqd2rNnj6tM9Wunp6e7rlGb0tJSOZ1OtwcAAGi9vApETz75pIqLi2scLykp0ZNPPun69/XXX6+wsLA6r7N8+XJt27ZN8+bNq3EuLy9PoaGhioqKcjseFxenvLw8V5mqYajyfOW5+so4nU6dO3eu1nrNmzdPkZGRrkdiYmKdrwEAAAQ+rwKRMabW8UE7duxQp06dPLrG0aNHdf/99+vNN99U27ZtvalGs3nkkUfkcDhcj6NHj/q6SgAAoBm1aUzhjh07ymazyWaz6corr3QLReXl5SouLtaUKVM8ulZ2drYKCgo0aNAgt2ts3rxZL730kj766CNduHBBRUVFbq1E+fn5io+PlyTFx8dr69atbtetnIVWtUz1mWn5+fmy2+0KDw+vtW5hYWH1tmwBAIDWpVGB6Pnnn5cxRnfddZeefPJJRUZGus6FhoaqR48eSk1N9ehao0aN0q5du9yOTZo0SX369NGcOXOUmJiokJAQrVu3TmPHjpUk5ebm6siRI67nSE1N1dNPP62CggLFxsZKktauXSu73a6+ffu6ynzwwQduz7N27VqP6wkAAFq/RgWiO++8U5KUlJSkYcOGKSQkxOsn7tChg6655hq3Y+3atVPnzp1dxydPnqyZM2eqU6dOstvtmj59ulJTU3XddddJkkaPHq2+ffvqjjvu0IIFC5SXl6df//rXmjp1qquFZ8qUKXrppZf00EMP6a677tL69ev1zjvvaPXq1V7XHYB1HCgs1uFTJWzMCrRyjQpElW644QZVVFTo66+/VkFBgSoqKtzOjxw5skkq98c//lFBQUEaO3asSktLlZ6erj/96U+u88HBwVq1apXuvfdepaamql27drrzzjvdZrolJSVp9erVeuCBB/TCCy/oiiuu0Kuvvqr09PQmqSOA1qmo5ILuW5ajzfsKXcdG9orRwoyBiozw/o9BAP7Jq93uP/vsM91+++06fPhwjQ1cbTabysvLm6yC/oDd7gHrmfjaVmXuP6HyKv+PC7bZNDw5WksnD/VhzQB4qjHf3161EE2ZMkVDhgzR6tWr1aVLF49XpAaAQHCgsNitZahSuTHavK9QB0+cpfsMaGW8CkT79u3T3//+dyUnJzd1fQDA5w6fqrnwbFWHThKIgNbGq3WIUlJStH///qauCwD4he6dIuo936MzYQhobbxqIZo+fbpmzZqlvLw89evXr8Zss+qbtAJAIOkZ014je8XUOYbI6q1DzLxDa+TVoOqgoJoNSzabzbWCNYOqAQQ6R0mZpi/bziyzKph5h0DTmO9vrwLR4cOH6z3fvXv3xl7SrxGIAOs6eOKsDp08S2uImHmHwNPss8zeeustxcXF6a677nI7/te//lWFhYWaM2eON5cFAL+TFE0Qkph5h9bPq0HVf/7zn9WnT58ax6+++motXrz4sisFAPAvnsy8AwKZV4EoLy9PXbp0qXE8JiZGx48fv+xKAQD8CzPv0Np5FYgSExOVmZlZ43hmZqYSEhIuu1IAgJZxoLBYG3ILdPBE/S08lTPvgqstxBtss2lkrxi6yxDwvBpDdPfdd2vGjBkqKyvT9773PUnSunXr9NBDD2nWrFlNWkEAQNPzZsbYwoyBNWbeDU+O1sKMgc1eX6C5eTXLzBijhx9+WC+++KIuXLggSWrbtq3mzJmjuXPnNnklfY1ZZgBam8uZMcbMOwSKZp92X6m4uFh79+5VeHi4evXqpbCwMG8v5dcIRABakwOFxfrec5vqPL9h9o0EHbQKzT7tvlL79u117bXXXs4lAAAtjL3agJq8GlQNAAhczBgDaiIQAUAr09DMMWaMATVdVpcZAMB/NGbmGDPGAHeXNajaKhhUDSAQeDNzjBljaM1abFA1AMA/eLvXGHu1AZcwhgiAJM9XLIZ/Yq8x4PLQQgRYnDcrFsP/MHMMuDy0EAEWd9+yHGXuP+F2LHP/CU1ftt1HNYI3mDkGXB4CEWBhleNOyqvNrag67gSBY2HGQA1PjnY7xswxwDN0mQEWxorFrUtkRIiWTh7KzDHACwQiwMIYd9I6MXMMaDy6zAALY9wJAFxCIAIsjnEnAECXGWB5jDsBAAIRgP/DuBMAVkaXGQAAsDwCEQAAsDwCEQAAsDwCEQAAsDwGVfupA4XFOnyqhBk/gB/g8wi0fgQiP8PO44D/4PMIWAddZn6GnccB/8HnEbAOApEfYedxwH/weQSshUDkRzzZeRxAy+DzCFgLY4j8SCDvPM6gU7S290Agfx4BNB6ByI9U7jyeuf+EWzN9sM2m4cnRfvklw6BTtNb3QCB+HgF4jy4zPxNoO48z6BSt+T0QaJ9HAN6jhcjPVN95PNhmU7kxOlVywe/+2q4cdFpd1UGn/BXdugXye8CTLr7qn8fW0h0IoCYCkZ/qGBGix9875NfdEJ4MOuXLo3ULxPeAN118SdEEIaC1o8vMTwVCNwSDThFI74EDhcXakFugu9/4wu8/WwBaHi1EfihQuiEYdIpAeA/U1iJUnb99tgC0PFqI/FAgrX/CoFP4+3ugttbWuvjTZwtAy6KFyA8FUjcEg07hz++Bulpb6+JPny0ALYtA5IcCoRuiOgadwh/fAw21tlby588WgJZBl5mf8vduCCAQNNTaWonPFgBaiPyUP3dDAIGivtbWQd2j9MubkvlsAZBEIPJ7/tgNAQSShRkDNX3ZdrexRJUtQv6yphcA3yMQAWjVaG0F4AkCEQC/5MnWGo1BayuA+hCIAPgVb7bWAIDLxSwzAH4lELatAdD6EIgA+I3KhRSrzgiT3LfWAIDmQCAC4DcCadsaAK0LgQiA3wikbWsAtC4MqgbQIg4UFmvLwZOSbLquZ+daZ3wF4rY1AFoHAhGAZlVUckG/fHObPv3mpNvx1J6dtfhng2vMHKtvIUUAaC42Y6qNXkQNTqdTkZGRcjgcstvtvq4OEFAmvra1zh3nR/aK0dLJQ2s9x0KKAC5XY76/aSGCX2jqRfiamr/Xz19VzhqrS+XMsdruKQspAmhJBCL4lL8vwufv9fN3Dc0aky7NHCP4APA1ZpnBp2pbhO+TfYWa8OpnfrHmDIsEXp6GZo1JzBwD4B8IRPCZuhbhq5C0+5hTN/1+oya+tlWOkjK/qh+LBHquctZYXUb2iqF1CIBfIBDBZzzpTvFlawyLBDaNhRkDNew7nWscT+3ZmZljAPwGY4jgM550p1RtjWnplgQWCWwakREheuvu63TwxFltOXBSRqpzHSIA8BUCEXymrkX4auOLgbcsEti0mDUGwJ/5tMts3rx5uvbaa9WhQwfFxsbqtttuU25urluZ8+fPa+rUqercubPat2+vsWPHKj8/363MkSNHNGbMGEVERCg2NlYPPvigLl686FZm48aNGjRokMLCwpScnKwlS5Y098uDBxZmDNTw5OgGy/mqNaa2+rFIIAC0Pj5tIdq0aZOmTp2qa6+9VhcvXtSvfvUrjR49Wl9++aXatbv0BfjAAw9o9erVWrFihSIjIzVt2jT95Cc/UWZmpiSpvLxcY8aMUXx8vD799FMdP35cEydOVEhIiJ555hlJ0sGDBzVmzBhNmTJFb775ptatW6df/OIX6tKli9LT0332+nGpO2Xp5KE6eOKspi/bpi+POVVRpbHI160xVevHIoEA0Hr51UrVhYWFio2N1aZNmzRy5Eg5HA7FxMTorbfe0k9/+lNJ0ldffaWrrrpKWVlZuu666/Thhx/qlltu0bFjxxQXFydJWrx4sebMmaPCwkKFhoZqzpw5Wr16tXbv3u16rvHjx6uoqEhr1qxpsF6sVN0yHCVlNbZsYM0fAIC3AnalaofDIUnq1KmTJCk7O1tlZWVKS0tzlenTp4+6devmCkRZWVnq16+fKwxJUnp6uu69917t2bNHAwcOVFZWlts1KsvMmDGj+V8UPEZrTMtjBW4AuMRvAlFFRYVmzJih4cOH65prrpEk5eXlKTQ0VFFRUW5l4+LilJeX5ypTNQxVnq88V18Zp9Opc+fOKTw83O1caWmpSktLXf92Op2X/wLhMQbfNj9W4AYAd36zDtHUqVO1e/duLV++3NdV0bx58xQZGel6JCYm+rpKQJNiBW4AcOcXgWjatGlatWqVNmzYoCuuuMJ1PD4+XhcuXFBRUZFb+fz8fMXHx7vKVJ91VvnvhsrY7fYarUOS9Mgjj8jhcLgeR48evezXCPgLVuAGgJp8GoiMMZo2bZpWrlyp9evXKykpye384MGDFRISonXr1rmO5ebm6siRI0pNTZUkpaamateuXSooKHCVWbt2rex2u/r27esqU/UalWUqr1FdWFiY7Ha72wNoLViBGwBq8ukYoqlTp+qtt97Se++9pw4dOrjG/ERGRio8PFyRkZGaPHmyZs6cqU6dOslut2v69OlKTU3VddddJ0kaPXq0+vbtqzvuuEMLFixQXl6efv3rX2vq1KkKCwuTJE2ZMkUvvfSSHnroId11111av3693nnnHa1evdpnrx3wFVbgBoCafNpCtGjRIjkcDt14443q0qWL6/H222+7yvzxj3/ULbfcorFjx2rkyJGKj4/XP/7xD9f54OBgrVq1SsHBwUpNTdXPfvYzTZw4Ub/5zW9cZZKSkrR69WqtXbtWAwYM0HPPPadXX32VNYhgSZUrcAfbbG7Hg202NlsFYFl+tQ6Rv2IdIrQ2rPkEwAoCdh0iAC2DNZ8AwB2BCLAw1nwCgEv8Yto9AACAL9FC5IfYTsHa+P0DQMsjEPkRtlOwttp+/9ck2PXMj/upf2KU7yoGABZAl5kfYTsFa6vt97/7mFM/ejlTE1/bKkdJmY9qBgCtH4HIT7CdgrXV9fuv9Mn+QoIxADQjApGfYDsFa2vo919hRDAGgGZEIPITbKdgbQ39/isRjAGgeRCI/ATbKVhb5e+/oQ8kwRgAmgeByI8szBio4cnRbseGJ0drYcZAH9UILWlhxkBd3yum1nMEYwBoXuxl5oGW3suM7RSsbee/i/Srlbu0+1un6xjLLwBA4zXm+5tA5AE2d0VjNcXiigRjALg8bO4KNJOGgk5TLq7JPmMA0HIIRIAHPA069S2uuXTy0BarLwCgcRhUDXjAk1XEWVwTAAIXgQhogKdBh8U1ASBwEYiABngadFhcEwACF4EIOlBYrA25BXTp1MHToMPimgAQuBhUbWFNOSOqNasMOpn7T7h1mwXbbBqeHO0WdBZmDNT0Zdvd7imLawKA/2MdIg+01nWIJr62tc4veWZEuXOUlNUIOvWFR9YQAgDfYx0iNKhyoHB1VQcK80X+H5ERIVo6eajHQYc1hAAgsBCILMqTgcJ8oddE0AGA1olB1RbFjCgAAP6DQGRRzIgCAOA/CEQWtjBjoIYnR7sda+0zolhiAABQG8YQWVhjBwoHMpYYAADUhxYiKCm6nW7qHdtqw5Dk2V5kAADrIhCh1WPTVQBAQwhEaBXqGxvEpqsAgIYwhggBbcfR03p05W7tPuZ0Has+NoglBgAADaGFCAGpqOSCJr62Vbe+/KlbGJJqjg1iiQEAQEMIRAhI9y3L0Sf7a249ItU+NsiKSwwAADxHlxkCTl37sFVXdfsRKy0xAABoPAIRAk5Dg6Qr1TY2iL3IAAC1IRDBL23KLVDOv4s0qFtHjegV43auoUHSQZKuZ2wQAKARCETwK4dPntVtL2fqdEmZ61jHiBC9P/V6JXa+FIQqB0ln7j9RY20h6VIYYmwQAKAxGFTth1rDflvevobqYUiSTpeU6Ucvf+J2rLZB0td0tev9acO1dPJQtuMAADQKLUQ+dqCwWIdPlahH53bqGBFSY7+tId076gfXxCsirI1Senb2q26gqnWvrFdj9wyreo0jJ8/WCEOVTpeU6eN9ha7uMwZJAwCaEoHIR2oLDh0jQuSoFgi+OHxaXxw+7fr3sO901qIJg33aAlJf6Klvz7Clk4fWe43unesfG7TtyOka44kYJA0AaAp0mflIbcHhdEmZKhr4uU+/OenzDUnrCj2/WPq5x3uG1XaNow3MHhvUreNl1hwAgNoRiHygrs1GPeXLDUnr2yj180On6/ipSyr3DKvrGhX13I6OESE1WocAAGgqBCIf8HQdnfo014akDQ2Gvpy6V64L1NA12ocFu/27cpYZAADNhTFEPtDQOjqeaOoNST0dDN1Q3a/t3lHbjhS5tf4E22wanhztGuvT0DX+OX2E/n26RNuOnK51HSIAAJoaLUQ+UPdmo5daQxrSHBuS1jcYuqq66l4ppE2QhiZ1cjtWfc8wTzZbHdErRvePupIwBABoEQQiH6l9s9EYbZx9kzbMvlEv3T5QAxMja/zcsO90bvJFB+sbF1TbeKXa6l4p65uTCgkO0obZN+r1Sddqw+wba10XiM1WAQD+xGaMlyN7LcTpdCoyMlIOh0N2u71Jr93QOjoHT5zVZwdOyiY12zpEG3ILNOn1z+s8//qka3VT71i3YwcKi/W95zbV+TNv/SJFw+oITVWxjhAAoLk05vubMUQ+1tA6Oi2xzk5DY3qqjleqXEgxz3G+3p+5529faPeTNzf43KwjBADwBwQi1Lk3WNXB0LUNuq5PcWm528rSAAD4M8YQtSLVp8w3Zj+xhsb01DbouiHbjtS/LhEAAP6CFiI/V9t+YdXVtQ1I1X3B6ttPTKq5N1iwzaZyY3Sq5IJOni31uGWoKlaWBgAECgKRn2rMJql1bQNSVW37idWmY0SIHn/vkNvzXtO18QPJWVkaABBI6DLzM5XdXHe/8YVH6wJ5ug1IXVPoq3er1RauvjzmbNRriAxvw8rSAICAQguRn/Bk0HLVUFPZfdbYrTQOnTxb5yDpa3t0rHU/sso9xoIkt81nKwddP3nr1Vq985hOFJdq1FVxtAwBAAIOgchPNGbQcmWokRq/DUjlFPrani/7cP2DoPsm2LW7SmtR5aDryIgQTfter0bVAwAAf0Ig8gOV3V6eqrouUF1T5qurOoW+ruerb7d5SVp4+yBJYiFFAECrwxgiP+Bpt1fVvb6qqm3KfPU90apOoW/o+aq/Kao+b1J0O93UO5YwBABoVWgh8gOednvVtddX9Snzla03dW2L0dDzDe7eUZ9X6T5jjzEAQGtHIPID9a0UPah7lH55U7JHXVTVt8Goa1uMhlamri1cAQDQmtFl5ifqWin61YnXNksXVUMrU9M1BgCwEna790Bz7nZfXUu3zNASBABordjtPoC19O7v7DYPAABdZgAAAAQiAAAAAhEAALA8AhEAALA8BlX7qQOFxTp8qoTZXwAAtAACkZ/ZcfS0Hl25220T1ZG9YlybqAIAgKZnqS6zl19+WT169FDbtm2VkpKirVu3+rpKki61Bv31kwP6//6wUbe+/KlbGJKkzP0nNH3Zdh/VDgCA1s8yLURvv/22Zs6cqcWLFyslJUXPP/+80tPTlZubq9jYWJ/UqajkgjJe+Ux7887UW67cGG3eV6iDJ87SfQYAQDOwTAvRH/7wB919992aNGmS+vbtq8WLFysiIkJ//etffVKfwyfPashv//8Gw1BVh06ebcYaAQBgXZYIRBcuXFB2drbS0tJcx4KCgpSWlqasrCyf1OmHCz/RxYrG7ZrSozOtQwAANAdLdJmdOHFC5eXliouLczseFxenr776qkb50tJSlZaWuv7tdDprlLkcm3IL5Dx/0ePyQZKu7xVDdxkAAM3EEi1EjTVv3jxFRka6HomJiU16/Zx/FzWq/PX/N8sMAAA0D0sEoujoaAUHBys/P9/teH5+vuLj42uUf+SRR+RwOFyPo0ePNml9vntFlEflrulq1/vThmvp5KFMuQcAoBlZIhCFhoZq8ODBWrdunetYRUWF1q1bp9TU1Brlw8LCZLfb3R5N6YbesepYT8C5qksHvT9tuFZNH6H+HoYnAADgPUuMIZKkmTNn6s4779SQIUM0dOhQPf/88zp79qwmTZrkk/q8P/V6/ejlT3S6pMx1LCI0WK9OHKJhydE+qRMAAFZlmUA0btw4FRYWau7cucrLy9N3v/tdrVmzpsZA65aS2DlC2+eO1sf7CrXtyGkN6tZRI3rF+KQuAABYnc0Y07i53xbkdDoVGRkph8PR5N1nAACgeTTm+9sSY4gAAADqQyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWZ5m9zC5H5e4mTqfTxzUBAACeqvze9mSXMgKRB86cOSNJSkxM9HFNAABAY505c0aR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tGzZsqa6jQCaAIEIgM888sgjmj9/vh577DF9+eWXeuuttxQXF+c6/+ijj2r27NnKycnRlVdeqYyMDF28eFHDhg3T888/L7vdruPHj+v48eOaPXt2g89XVlamp556Sjt27NC7776rQ4cO6ec//7nr/LfffquRI0cqLCxM69evV3Z2tu666y5dvHhRs2fP1n//93/r5ptvdj3nsGHDPHqd58+f1+DBg7V69Wrt3r1b99xzj+644w5t3bq10fcMQPNo4+sKALCmM2fO6IUXXtBLL72kO++8U5L0ne98R9dff72rZWX27NkaM2aMJOnJJ5/U1Vdfrf3796tPnz6KjIyUzWZTfHy8x8951113uf67Z8+eevHFF3XttdequLhY7du318svv6zIyEgtX75cISEhkqQrr7zS9TPh4eEqLS1t1HNKUteuXd0C2/Tp0/XRRx/pnXfe0dChQxt1LQDNgxYiAD6xd+9elZaWatSoUXWW6d+/v+u/u3TpIkk1urgaIzs7Wz/84Q/VrVs3dejQQTfccIMk6ciRI5IudXWNGDHCFYaaSnl5uZ566in169dPnTp1Uvv27fXRRx+5nheA7xGIAPhEeHh4g2WqBhObzSbp0rgjb5w9e1bp6emy2+1688039fnnn2vlypWSpAsXLnhcp+qCgi79b9QY4zpWVlbmVubZZ5/VCy+8oDlz5mjDhg3KyclRenq663kB+B6BCIBP9OrVS+Hh4Vq3bp1XPx8aGqry8nKPy3/11Vc6efKk5s+frxEjRqhPnz41Wpv69++vjz/+uEagqe85Y2JiJEnHjx93HcvJyXErk5mZqVtvvVU/+9nPNGDAAPXs2VNff/21x3UH0PwIRAB8om3btpozZ44eeughLV26VN98840+++wzvfbaax79fI8ePVRcXKx169bpxIkTKikpqbd8t27dFBoaqoULF+rAgQN6//339dRTT7mVmTZtmpxOp8aPH68vvvhC+/bt09/+9jfl5ua6nnPnzp3Kzc3ViRMnVFZWpuTkZCUmJuqJJ57Qvn37tHr1aj333HNu1+3Vq5fWrl2rTz/9VHv37tX//M//KD8/vxF3C0BzIxAB8JnHHntMs2bN0ty5c3XVVVdp3LhxHo8RGjZsmKZMmaJx48YpJiZGCxYsqLd8TEyMlixZohUrVqhv376aP3++fv/737uV6dy5s9avX6/i4mLdcMMNGjx4sP7yl7+4uu7uvvtu9e7dW0OGDFFMTIwyMzMVEhKiZcuW6auvvlL//v31u9/9Tr/97W/drvvrX/9agwYNUnp6um688UbFx8ezwCPgZ2ymasc3AACABdFCBAAALI9ABKBV+Pjjj9W+ffs6HwBQH7rMALQK586d07ffflvn+eTk5BasDYBAQyACAACWR5cZAACwPAIRAACwPAIRAACwPAIRAACwPAIRAACwPAIRAACwPAIRAACwPAIRAACwvP8HFxyjkkz/ks4AAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "cnts = counts_cms.to_frame('cnt_cms').reset_index().merge(\n",
    "        counts_actual\n",
    "        .to_frame('cnt_actual')\n",
    "        .reset_index()\n",
    "    ).set_index('index')\n",
    "#print(cnts)\n",
    "cnts.plot.scatter(x='cnt_actual', y='cnt_cms')\n",
    "print(cnts.head(100))\n",
    "print (cms.x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "t=1, b=100: \t out of top 10, 4 shared\n",
      "t=2, b=50: \t out of top 10, 5 shared\n",
      "t=3, b=33: \t out of top 10, 6 shared\n",
      "t=4, b=25: \t out of top 10, 6 shared\n",
      "t=5, b=20: \t out of top 10, 6 shared\n"
     ]
    },
    {
     "data": {
      "image/png": "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12WXXYYXX3wRXbt2hV6vx3PPPYcbbrgBhw8fRtu2bSXrOxAkC2cGkr8Wzqw4egTv5R0FAIya3RlJnbs1swcREQFNF0sUQkBv0kvSF02UxqV5yiZMmIDXX3/dZltZWZlLq3c3Z8CAAbj55ptdXk+q/rHUP//5Tzz//PPYs2cP0tLSsHr1alx77bVe98fVftX/fv3ss89w/fXXe3QOXy2cyTs3REQUVPQmPQa/NViSc5fcXQKtUttsu1WrVuHnn39Gnz59sGjRIgCw3q1obuTuPffcg4KCgibbhRD4/PPPcfDgQTzzzDNu933GjBlYuXIlevXqhRUrVmDEiBEoKytDmzZt/N4vg8GAl19+GXFxccjIyHC7777G4oaIiMhNcXFxUKlU0Gq1TSadLS0tdbpv47sOVVVV6NChA2pra6FQKPDSSy/hz3/+s9t9mjJlCkaNGgWgbmTxli1bsHbtWsycOdNv/fr4449x1113QafTITk5Gdu2bUNCQoLbffc1FjdERBRUNFEalNwtTTBVE6Xx+hhpaWlutW/ZsiVKS0tRU1ODwsJC5ObmomvXrhg2bJhbx2k4+W1UVBQyMzOxf/9+v/bruuuuQ2lpKU6fPo1XXnkFd955J0pKStCuXTu3zuVrLG6IiCioyGQylx4NBSt3H//I5XJr4dGvXz/s378feXl5bhc3UvSrRYsWSEtLQ1paGq688kp0794da9euxezZs33ad3exuCEiIvKASqWC2Wxust3dxz+NWSwW1NbWut2fb775Btdccw0AwGQyYffu3TZzyAWiX5723ddY3BAREXkgNTUVJSUlKC8vR0xMDOLj423udrgiLy8PmZmZ6NatG2pra7F582b84x//wJo1a9zuz+rVq9G9e3f07NkTzz33HP744w/cd9991vd92a/z589jyZIluOWWW5CcnIzTp09j9erVOHHiBO644w63++5rLG6IiIg8MH36dIwfPx69evWCXq/3aCj4+fPn8fDDD+PXX3+FRqNBeno63njjDYwePdraZsGCBVi/fn2zM/Tn5+cjPz8fpaWlSEtLw4cffuhxuLe5fikUChw4cACvv/46Tp8+jTZt2uCKK67Al19+id69e3t0Tl/iPDc+wnluiIg842xuEwLGjx8PmUyG9evXS90Vv+M8N0RERGFOCIGioiLs3LlT6q6EFBY3REREQUomk+Ho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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import seaborn as sns\n",
    "nbuck = 100\n",
    "topn = 10\n",
    "for (tables,buckets) in ((1,int(nbuck)), (2,int(nbuck/2)), (3, int(nbuck/3)), (4, int(nbuck/4)), (5, int(nbuck/5))):\n",
    "    cms = CountMinSketch(tables=tables, buckets=buckets)\n",
    "    for x in data3: cms.increment(x)\n",
    "    counts_cms = pd.Series(\n",
    "        (cms.count(x) for x in set(data3)),\n",
    "        index=set(data3),\n",
    "    ).sort_values(ascending=False)\n",
    "    cnts = counts_cms.to_frame('cnt_cms').reset_index().merge(\n",
    "            counts_actual\n",
    "            .to_frame('cnt_actual')\n",
    "            .reset_index()\n",
    "        ).set_index('index')\n",
    "    cnts[\"errors\"] = (cnts.cnt_cms - cnts.cnt_actual)#/cnts.cnt_actual\n",
    "    sns.ecdfplot(cnts.errors, label=f\"t={tables}, b={buckets}\")\n",
    "    topk_actual = cnts.cnt_actual.sort_values(ascending=False).head(topn)\n",
    "    topk_cms = cnts.cnt_cms.head(topn)\n",
    "    merged = pd.Series(list(set(topk_actual.index) & set(topk_cms.index)))\n",
    "    print(f\"t={tables}, b={buckets}: \\t out of top {topn}, {len(merged)} shared\")\n",
    "\n",
    "    \n",
    "plt.legend()\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "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.11.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
