Created
December 9, 2022 21:06
-
-
Save TheLurps/79c45ca9573e857ea606c102e1fa8ca3 to your computer and use it in GitHub Desktop.
Evaluate number of online clients based upon heartbeats in MongoDB
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "cells": [ | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "# Counting heartbeats\n", | |
| "\n", | |
| "Purpose: A client is sending heartbeats to an API that stores them in MongoDB. A document looks as follows:\n", | |
| "\n", | |
| "```json\n", | |
| "{\n", | |
| " \"_id\": \"5a9b4b9b0f5ae10001e8b1f6\",\n", | |
| " \"timestamp\": \"2022-01-01T00:00:00.000Z\",\n", | |
| " \"hostname\": \"host1\"\n", | |
| "}\n", | |
| "```\n", | |
| "\n", | |
| "A heartbeat is sent every 30 minutes. The sum of all online clients should be calculated over time." | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "## Connect to MongoDB\n", | |
| "\n", | |
| "First, a instance of MongoDB is started in a Docker container. The container is started with the following command:\n", | |
| "\n", | |
| "```bash\n", | |
| "docker compose up -d\n", | |
| "```\n", | |
| "\n", | |
| "Then, a connection to the database is established." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 1, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "from dotenv import dotenv_values\n", | |
| "import pymongo\n", | |
| "\n", | |
| "env = dotenv_values('.env')\n", | |
| "connection_str = f\"mongodb://{env['MONGO_INITDB_ROOT_USERNAME']}:{env['MONGO_INITDB_ROOT_PASSWORD']}@127.0.0.1:27017\"\n", | |
| "\n", | |
| "client = pymongo.MongoClient(connection_str)\n", | |
| "db = client['heartbeats']\n", | |
| "collection = db['heartbeats']" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "## Generate dummy data" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 4, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "from datetime import datetime, timedelta\n", | |
| "import random\n", | |
| "\n", | |
| "start_date = datetime(2022, 1, 1)\n", | |
| "heartbeat_interval = timedelta(minutes=30)\n", | |
| "for host_id in range(20):\n", | |
| " hostname = f\"host{host_id}\"\n", | |
| "\n", | |
| " start = start_date + timedelta(days=random.randint(0, 30), hours=random.randint(0, 24), minutes=random.randint(0, 60))\n", | |
| " for heartbeat in range(random.randint(100, 200)):\n", | |
| " collection.insert_one({\n", | |
| " \"hostname\": hostname,\n", | |
| " \"timestamp\": start\n", | |
| " })\n", | |
| "\n", | |
| " start += (heartbeat_interval + timedelta(seconds=random.randint(-180, 180)))" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 11, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "len(data)=3109\n", | |
| "hostname='host0': len(data[data.hostname == hostname])=155\n", | |
| "hostname='host1': len(data[data.hostname == hostname])=170\n", | |
| "hostname='host2': len(data[data.hostname == hostname])=180\n", | |
| "hostname='host3': len(data[data.hostname == hostname])=143\n", | |
| "hostname='host4': len(data[data.hostname == hostname])=195\n", | |
| "hostname='host5': len(data[data.hostname == hostname])=101\n", | |
| "hostname='host6': len(data[data.hostname == hostname])=190\n", | |
| "hostname='host7': len(data[data.hostname == hostname])=122\n", | |
| "hostname='host8': len(data[data.hostname == hostname])=149\n", | |
| "hostname='host9': len(data[data.hostname == hostname])=156\n", | |
| "hostname='host10': len(data[data.hostname == hostname])=188\n", | |
| "hostname='host11': len(data[data.hostname == hostname])=199\n", | |
| "hostname='host12': len(data[data.hostname == hostname])=196\n", | |
| "hostname='host13': len(data[data.hostname == hostname])=110\n", | |
| "hostname='host14': len(data[data.hostname == hostname])=129\n", | |
| "hostname='host15': len(data[data.hostname == hostname])=106\n", | |
| "hostname='host16': len(data[data.hostname == hostname])=128\n", | |
| "hostname='host17': len(data[data.hostname == hostname])=189\n", | |
| "hostname='host18': len(data[data.hostname == hostname])=199\n", | |
| "hostname='host19': len(data[data.hostname == hostname])=104\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "import pandas as pd\n", | |
| "from pymongoarrow.monkey import patch_all\n", | |
| "\n", | |
| "patch_all()\n", | |
| "\n", | |
| "data = collection.find_pandas_all({})\n", | |
| "\n", | |
| "print(f\"{len(data)=}\")\n", | |
| "for hostname in data.hostname.unique():\n", | |
| " print(f\"{hostname=}: {len(data[data.hostname == hostname])=}\")" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "## Determine number of online clients" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 129, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<div>\n", | |
| "<style scoped>\n", | |
| " .dataframe tbody tr th:only-of-type {\n", | |
| " vertical-align: middle;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe tbody tr th {\n", | |
| " vertical-align: top;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe thead th {\n", | |
| " text-align: right;\n", | |
| " }\n", | |
| "</style>\n", | |
| "<table border=\"1\" class=\"dataframe\">\n", | |
| " <thead>\n", | |
| " <tr style=\"text-align: right;\">\n", | |
| " <th></th>\n", | |
| " <th>_id</th>\n", | |
| " <th>count</th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th>0</th>\n", | |
| " <td>2022-01-01 06:00:00</td>\n", | |
| " <td>2</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>1</th>\n", | |
| " <td>2022-01-01 07:00:00</td>\n", | |
| " <td>2</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>2</th>\n", | |
| " <td>2022-01-01 08:00:00</td>\n", | |
| " <td>2</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>3</th>\n", | |
| " <td>2022-01-01 09:00:00</td>\n", | |
| " <td>1</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>4</th>\n", | |
| " <td>2022-01-01 10:00:00</td>\n", | |
| " <td>2</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>...</th>\n", | |
| " <td>...</td>\n", | |
| " <td>...</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>712</th>\n", | |
| " <td>2022-02-02 13:00:00</td>\n", | |
| " <td>2</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>713</th>\n", | |
| " <td>2022-02-02 14:00:00</td>\n", | |
| " <td>2</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>714</th>\n", | |
| " <td>2022-02-02 15:00:00</td>\n", | |
| " <td>2</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>715</th>\n", | |
| " <td>2022-02-02 16:00:00</td>\n", | |
| " <td>2</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>716</th>\n", | |
| " <td>2022-02-02 17:00:00</td>\n", | |
| " <td>2</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "<p>717 rows × 2 columns</p>\n", | |
| "</div>" | |
| ], | |
| "text/plain": [ | |
| " _id count\n", | |
| "0 2022-01-01 06:00:00 2\n", | |
| "1 2022-01-01 07:00:00 2\n", | |
| "2 2022-01-01 08:00:00 2\n", | |
| "3 2022-01-01 09:00:00 1\n", | |
| "4 2022-01-01 10:00:00 2\n", | |
| ".. ... ...\n", | |
| "712 2022-02-02 13:00:00 2\n", | |
| "713 2022-02-02 14:00:00 2\n", | |
| "714 2022-02-02 15:00:00 2\n", | |
| "715 2022-02-02 16:00:00 2\n", | |
| "716 2022-02-02 17:00:00 2\n", | |
| "\n", | |
| "[717 rows x 2 columns]" | |
| ] | |
| }, | |
| "execution_count": 129, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "clients_count_over_time = collection.aggregate_pandas_all([\n", | |
| " {\n", | |
| " \"$match\": {}\n", | |
| " },\n", | |
| " {\n", | |
| " \"$group\": {\n", | |
| " \"_id\": {\n", | |
| " \"$dateFromString\": {\n", | |
| " \"dateString\": {\n", | |
| " \"$dateToString\": {\n", | |
| " \"format\": \"%Y-%m-%d %H:00:00\",\n", | |
| " \"date\": \"$timestamp\"\n", | |
| " }\n", | |
| " },\n", | |
| " \"format\": \"%Y-%m-%d %H:%M:%S\" \n", | |
| " }\n", | |
| " },\n", | |
| " \"count\": {\n", | |
| " \"$count\": {}\n", | |
| " }\n", | |
| " }\n", | |
| " },\n", | |
| " {\n", | |
| " \"$sort\": {\n", | |
| " \"_id\": 1\n", | |
| " }\n", | |
| " }\n", | |
| "])\n", | |
| "\n", | |
| "clients_count_over_time" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 130, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "image/png": "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9ddfRjfPMMePH5e+fftKixYt5JdffpF///1XJk+eLA0aNJBvvvnG6OYZ5ocffpBatWpJq1atZMqUKVK7dm1JSUmR77//3uimGeann36SevXqSYsWLWTOnDnSunVradmypbz//vtGN80wHFdc47jibO/evdK5c2dp1qyZ/PTTT/Ljjz/KHXfcIXXq1JH09HSjm2fFzIfONm/eDIvFgoULF6J9+/Zo0qQJ5s6di3PnzlnTgWKi1FcgaT/n7t27YbFYMGfOHHTo0AGJiYl49tlncenSJWv6OFL6RXXgwAHMnTsXffv2xW+//YZp06Zh+/btuHDhAnbv3g0g8vokNTUVCxYswK233op169Zh7Nix+OWXX1CpUiXs2bMnYjNCHFdsOK4U7JdffoHFYsHSpUvRqVMndOnSBR9//DGOHj2KHTt2GN08qxijGxDqrl69iujoaGs6q23btihdujQaNWpknebChQtISEhAVJQS65kq9RUgOTk5iIqKQkyMsog1btwYY8aMQUpKCgAgPz8fFosFVatWtW5QIqFftPLz85GQkIBhw4YhJiYGOTk5KFGiBJKSkrB9+3YAkdcnV69eRc2aNXH33XcjNjYWubm5KFasGMqWLYu///7bug6FO44rrnFccZafn2+3XnTv3h2VK1dGjRo1rI+lpqaiSpUqKFKkiAEtdI3Bhx+mT5+O9evXo2TJkrjnnntw0003oXLlyqhcuTIA20KRlpaGo0ePom7duga3ODief/55/PTTT4iLi8Ott96Ke++9FxUqVECFChUA2PfLzp070bhxY4NbHBxfffUVihUrhoYNG6JatWqoW7cuXn31VeuAULRoUVy9ehVnz57FnXfeaXBrg+Ozzz6DiKBhw4Zo1KgREhMT8fTTT1v7RN3InDt3Dm3btjWyqUHDccU1jivOXnnlFWzbtg1lypTBoEGDcP3116NatWqoVq0aAKWIPTo6Gmlpabh48SISEhIMbrFNZOxG6Gzjxo1ITk7G4sWLcfPNN+PEiRN45plnMG/ePLvp1Ih73bp1qFWrFurVqxfWKcCtW7eiZcuW+Oyzz3DfffehVKlSWLBgAV544QW76dQofdOmTahYsSKaNWtmRHOD5rvvvkP16tUxdepUjBgxAr169cKCBQsAKBtX7aGES5cuISMjAw0bNjSquUGxYsUKVK9eHS+99BKef/559OnT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lnnz5klMTIzMmzdPRJSUXpcuXaRdu3YiYt8vTZs2lccff1xERDIyMmTixImyaNEiYz6Mji5cuCD33XefXHPNNXLvvfdKy5YtpUiRItaLvx0/flwaNWokgwYNEhH7gsnGjRvL+PHjRURZ7oYMGSJly5aVd999N/gfREcZGRkyePBgueaaa2TIkCHStWtXiYmJkXfeece64bjxxhulZ8+eImJfHHfLLbfIvffea70/bdo0ufbaa63LWKjiuOIaxxVn2dnZMmXKFClfvrxMnDhRli5dKkOHDpXo6GjZuXOniCg7LykpKTJx4kS71544cUISExOty8axY8ekY8eOIdcnERl8/Pvvv9KqVSunFfu2226Te+65R0SUY9Fz5syRKlWqyH//+1/rNIcOHZLq1as7HZ8NB6dOnZKOHTs6bQSGDRsmN910k4gog8Ly5culePHi8s4771inOXv2rDRp0kRmzpwZ1DYH2sWLF+Xhhx+Wnj17yvbt262P9+nTR7p06SIiIllZWTJ37lwpUqSIbNq0SURsx/P79+8v3bt3t75uy5Ytdr/yCEVZWVny7LPPSvfu3a2fV0Rk1KhR0rp1a8nLy5P8/HxZsWKFREVF2WV+RETGjRsnycnJ1vsHDx4M+T4R4bjiDscVZzt37pSUlBS7QurMzEzp2LGjNdDKycmRRx55RJo1a2aXId22bZuULVtWfvnlF+tjjr+SCgUReW2XxMREPPTQQ+jWrZvd4yKCqlWrAlCORd95553Yt28fBg8ejAsXLiAlJQVfffUV4uLikJycbETTA6p8+fIYOnSoU7/ExMRYj6daLBbreSgefvhhHDt2DD179sQvv/yC9PR0dOzY0YCWB07JkiWRnp6Ofv36oUmTJtZrJfTo0QMzZszApUuXUKJECdx+++344YcfcM8992DFihWoVasWMjIysG/fPowePdo6v3A45XOxYsWQkZGBe+65B82bN0dubi6KFCmC22+/HZ9++inOnz+PsmXLokuXLnjooYcwevRolCxZEu3bt0dubi62bt2Ke++91zq/mjVrGvhp9MNxxTWOK84qVaqEoUOH4uabb7Y+Vrx4cWRkZKBSpUoAgCJFimDw4MFITU3F4MGDsXDhQtSuXRtff/01kpKSULt2betrQ/IEhEZHP2agHktr1qyZzJo1y+65/Px8GTZsmDRq1EiSkpKkevXqIXNMzRuuIme1X2666SZ56qmnnJ6fNm2atGnTRurVqyc1a9aUFStWBLydwaTujavHpbWPPfbYY9KjRw+76dPT0yU5OVkSExPl9ttvl9q1a0tycrIcPHgweI0OMPXzZ2ZmWh9Tl53XXntNbrjhBrvHRER69uwpVatWlY4dO0rt2rWlYcOG1tqGcMZxheOKp3JyciQnJ0fq168vn376qd1zJ06ckB49ekitWrUkMTFRqlevbj2MF8osImFywQgfyP+fiRJQzg7XvHlzrFmzxi6iBJRK46ysLOzevRstW7Y0oqlBofaHtl8yMjLQuHFjLF26FC1atLCbPj8/HyKCPXv2hPWF0Fz1S69evdC6dWtMnDgReXl51mu0HDt2DBs3bsT69etRo0YNjBkzxuDWB5a2T0aPHo2YmBi8/vrr1mUjOjoa586dw86dO/Hbb7+hbNmyGD58uMGtDiyOK/Y4rrin7ZP9+/ejU6dO2Lp1q/VKvarc3FycPXsW+/btc3kW05BkQMATcKmpqS4f155N0tHixYulcePG1vuZmZmyc+fOsDgWrdKeLVCroH5ZvXq11K1b17qnm5mZKWvXrpWsrKyAtNEorvbQXPVLXl6enD17VhITE60V+Oq0oXjctSDe9El2drZcd911smDBAuvjOTk5YbX+cFxxjeOKs02bNrlcXgrqk1mzZkmbNm2s9zMzM63zCKflRRVW5/lYuXIl6tevj2nTplkvUCWaxE50dDQA5aqar7zyCrKysqznEfjxxx/RunVrAMDbb7+NUqVKYe7cuSF9ngHV6tWrUb9+fYwaNQqHDx8G4LpfvvzySzzxxBM4ceKE02tLlCiBt99+G6VLl8b8+fPD4gqrK1euxAsvvID09HTrnplKre0AlPN4qFfPjIqKwpYtW5CdnY3u3bsDAF5//XUMGjQIR44cCfpn0NsPP/yAUaNG4fTp07BYLHbLv7ZPtm7daj03QVRUFP766y+cOHECffv2BQDMmTMHt99+u/Uqm6GM44prHFecLV++HPXr18cDDzyAFi1aYOTIkUhNTQWgZHTUPvnvf/+LhQsXArCdw0O9IB4AvPXWWyhVqhTeeOMNAAibCyjaMTDw0U1eXp4sWLBAGjZsKE2bNpUGDRrIN9984zTdkSNHpE2bNhIfHy9z5syx+znXDTfcIPfff7+0atVKypcvLx9//HGwP0ZAfPrpp3L99dfLjTfeKC1atJDXX3/daZrjx49Ly5Yt5dprr5XZs2dbf60gItK1a1fp1q2btGjRQsqVKxdyP+dy5cyZMzJ8+HCxWCySlJTkdIxVtWvXLmnbtq00a9ZM/vnnH+vj06ZNk8GDB8uGDRukYcOGUrp0aVOevtgb586dkzFjxkhsbKxUqlTJ5enfRUT+/vtvad++vTRo0EC2bdtmffz999+X3r17y88//yyNGjWS+Pj4kP+ZKMcV9ziu2Lty5Yq88MILUr16dZk1a5bs2bNHFi1aJKVKlZK3337bOt2hQ4ekXbt2UrJkSes5PfLz8yUrK0uaNWsm48aNk9atW4fVsuJOWAQfOTk5snjxYpkyZYqcOXNGWrVqJffcc4/1fP/5+fly9epVWbhwoYwcOVKOHDli9/r9+/eLxWKRokWLyoQJE4z4CLpTV/KVK1fK448/LidOnJD+/ftLt27dZPPmzXbT/PTTTzJq1Cinfjl58qS1X55++ungfoAA+vbbb6VDhw7y0UcfWc85oS4ranrz999/l7i4OBk8eLD1egn5+fly+fJladeunVgsFomOjrb+LC7U/frrr9K2bVtZsGCBDB06VDp27Cg7duwQEVuf7Nu3T4oVKyaDBw+2LivqutWvXz+xWCwSExMTNn3CccUZxxXXjhw5Ij179rQG3Oo6069fP7n99ttFRPmJ+rRp02TEiBF2lx0QUU7Kp/bJk08+GdzGGyRkgw/Hc9afPn3aevzwu+++k6pVq8q8efPsjpWpVdZa6oryxhtvhMU1Exyvb3D58mW5dOmSiChnGGzWrJk8/fTTdifCcnU8UX3s/fffD4t+0Tp16pQsX75cRJSzBSYnJ8vs2bPtpjl37pzs27fP5evbtGkjd911l921XEKVtq7j22+/FRGRn3/+Wdq3by8PP/yw03TaDJDWXXfdJQMHDgz5PuG44hrHFWeOy8qSJUusNSvq5xw7dqwMGDDAujxofyWmdezYMXn55ZdDfv3xRsgFHz/++KO0adNGOnfuLI8++qhs3LhRRGxftnp75513yk033WR3YqhwtnLlSklOTpZWrVrJAw88YN2QqAu92i/jx4+Xdu3ayf/+978C5xcuBU5r166V119/XdavXy+nTp0SEfszkIooeyeu9twcqa+7fPlyAFsceD///LNMnTpVvvvuO+upmx099dRTkpKSYj19tbtCOfXxUC8U5LjiGscVZ47Lyu+//273vJoRExFJSUmRZ5991ohmml5IVbF8/vnn6NevH7p06YKbbroJa9aswV133YWDBw9aC3LUQq7nn38e+/btw7fffovLly/bPRcOxV5a33//PQYMGIDevXtj6NChOH36NO666y6sW7fO+jMu9TOPHTsWeXl5+Prrr3Hu3DkAtoInbb+EeoFTZmYm7rnnHnTv3h1ffPEFevXqhf79+yM7OxsxMcq59XJzcwEofZKWloZly5bh6tWrbk/Yo75Oe7G0UCEiyMrKwuDBg3Hbbbdh/fr1GD58OLp162ZXKKv2yYABA3DNNdfgww8/RE5OjrVQzpH6eLFixQL/IQKE44prHFecuVpW+vXrZ70AnPz/T2ejo6Nx4sQJHDlyBH369HGaj4R4Ya0uDA5+PJaXlycDBgyQBx980PrYwYMHpVOnTpKSkmK9noSIbW/s8ccflyZNmsjatWtl165dMmnSJLdpr1Ck7n2MGzdOevToYd2ryMrKkv79+0u9evXsfgan9susWbOkRYsWsmjRItmzZ48MGzZM0tPTg/8BAuiHH36QevXqyc6dOyU3N1dWrVol9erVk969e7u8zPT48ePlxhtvtJ7QaP/+/cFucsD9/vvvUqdOHWuh6L59+6Rly5bStm1b2bVrl9P0s2fPltatW8v8+fNFRCk2DTccV5xxXHHNm2VFRGTVqlXSsGFDa6b01KlT8tVXX0lOTk5Q221WIRN8iCgX6XI8I97OnTulePHi1ori/Px868py5coVqVu3rtSuXVssFovcfvvtcvHixbA7H0OHDh1kyJAhImIbCDIzMyU+Pl6eeuop6+ECtV9ycnKkc+fOUqlSJYmOjpYOHTrIhQsXwqpfHnzwQenUqZPdY2pR17vvvmvtJ7VvDh8+LDfeeKM88MADMmLECImJiSk0hRxqpk6dKk2bNrXbUB47dkzKlSsnkydPloyMDBGx9cnJkydlwIAB0rlzZxk6dKhYLBb5/PPPDWl7IHFccY3jijNPlhU1uHjyySfl7rvvltzcXOuVm0ePHu0UpESqkAk+rly5IkOHDpWuXbtaB091oX7sscckISHBbvqLFy/KBx98IMWKFZPmzZvLTz/9FPQ2B5r6+Z955hmpX7++deOhLvyzZs2SsmXLyunTp62vyczMlPfee09KliwpycnJ8vPPPwe93YGkDoTTpk2TWrVqWR9XB8qRI0dK7dq1JS0tzem1vXv3FovFIg0aNAj5S3VraYv8rr32WuvjaqHkM888IzVr1rS7SJxq4MCBYrFY5Prrrw/L01xzXHHGccU1b5aVnJwcadeundx8881Sq1YtqVGjhvUq2KQImeBDREkDp6SkWK8GqX7xf/31l5QrV06++uor67Tr16+XqKgoefXVVw1pq94K2nv48ssvpWXLltbf2qsbmwsXLki5cuWsaXMRJU1osVjCpl/c+eqrr6Rhw4bWPXU1+Dh9+rTExcVZrx6al5cnaWlpUqtWLSlZsqS89957hrU50P766y9JSEhw2kMTEbnmmmus1x/Jy8uTM2fOyA033CAlSpSQuXPnGtHcoOG44hrHFWeeLiuHDx+WIkWKSPny5cPuirx6MU31zyeffIJdu3Y5PZ6Xl2ctWLrrrrtQtGhRLFu2DMeOHbMWPZUsWRLXXnstrly5Yn1dSkoKcnJy8OijjwbnAwTIvn377M7/r9L2S/v27VG/fn0sXboUBw4csCuSS0xMxKlTp6yvqVmzJnJzc0O+X9LS0lw+rhZMNmzYELVr18bixYtx6dIlxMTEIC8vD+XKlcMtt9yCFStWAFAK4CpUqIBRo0bhzJkzGDZsWNA+Q7CofVKhQgV0794d7733HjIyMlCkSBFkZ2cDAPr27Yv//e9/AJQ+KVu2LB588EGcO3cOI0aMMKzt/uK44hrHFWc7duxARkaG0+PeLCtZWVkAgOrVq2P+/Pk4fvw4HnnkkeB9iBBiiuBjyJAhuP/++/HZZ5/h0qVLAJRqYPV0tFFRUVi+fDksFgvGjBmDAwcO4OWXX7a+Pjs7G9nZ2ahRo4bdfN1V6IeCzz//HDVr1kS/fv2QkpKCd955x1o9fvXqVWu/fP755zh9+jRGjRoFAHjssces88jKysKFCxfQvHlzALb+COV+2b59O2rVqoXp06fj/PnzAGzLSn5+PooUKQIAqF27Nvr3749///0XM2fOBKB87pycHBw+fBjVq1cHYNswjx8/HrGxsQZ8Iv998cUXGDZsGF5//XXs2LHD+vjVq1ft+qRcuXIYNGgQcnNz8eSTTwIAYmNjISI4evQoatWqBcDWJ0OGDEHRokWD/Gn0w3HFGccVZ59++imuu+46DBgwAE2bNsWcOXMA+LasJCUlWR+7//77reseuWBg1sVaxPTEE09ISkqKlClTRn777Te7abZv3y433HCDVK1aVdasWSN5eXkya9YsiY+Ply5dusjkyZOlbt26ctttt8m5c+eM+Bi6W7BggSQlJcm8efNk/fr18vLLL4vFYpFXXnnFemIftV/KlCkjy5cvl/z8fPnmm2/k2muvlZYtW8rYsWOlXr160qlTJzlx4oTBn0g/r7/+ulgsFunYsaPLGoQ///xTWrRoIZMmTZKsrCyZOnWqFC9eXN5//33ZvXu3fPvtt1KnTp2wKCY9c+aM9O3bVypVqiQPPfSQtGvXTqpWrSoLFy60m+7PP/+U+vXry6BBg0REWb4sFotMnTpVfv31V1mxYoUkJSWF/CniVRxXXOO4Yi8tLU3uvfdeqVKlirzzzjuybt06mTJlihQtWtTuBGiRuKwEg+E1HxcvXpSWLVtKWlqaNG/eXO68805rMeDx48clKSlJRo0a5bSg//zzzzJ27Fjp0qWLTJ8+3Yim6y4/P1+ys7OlT58+8sgjj4iI7Thrr169pGLFirJ48WLJzs6WG2+80WW/bN++XZ599lm588475eWXXw76ZwgU7RkjX3rpJUlOTpZBgwbJsWPHRESp6XjyySelZMmSMmrUKOvVIC9evCjPPPOMJCQkSJ06daR06dJh0y9ffPGFtGrVytoHIspJsGrVqiVLly4VEZEXXnhBSpQoIaNHj7Y7pfM777wjTZs2lbp160qZMmXkxRdfDHr7A4njir2cnByOKw7WrVsnAwYMkJ07d1of279/v9SuXdt6duPU1NSIW1aCJajBx/r16+0uM5yXlydXr16VTp06yfnz52XVqlVisVisFeRXr14t9MyJBV2iOFQ49kv16tWtRUrqb8SHDBkilSpVkjvvvFPOnz9f6HkFwuFMgq706NFDvvjiC/n222+lWrVq8tFHH1mf+/jjj61nKXV05swZ+fXXX8PqfAx9+vSRO+64Q0SUja2IyIcffigWi0VuuukmyczMlFWrVrk9G+eVK1dk27Zt1r3ecHH16lXJz8+P+HHFUWJiovUyApE6rqxfv16OHz9uvf/333/bfdfjxo2Ttm3byueff24N1gs7DXw4LivBEJTgY9WqVZKUlCTVq1eXatWqybBhw2Tv3r0ioqS+EhMTrRcf6tu3r9SuXVuqV68eNhdjckfbL1WrVpUHH3xQdu3aJRMnTpTKlStbr6OxfPlyufHGG2XkyJGSlJQk69atM7jlgbVmzRr5/vvvXV4nonfv3taNSI8ePaRPnz4ya9YsmTZtmtv5hcN5Blz1yRNPPCH16tWzm+6pp56Sm2++Wdq0aSMffPCB2/mFQ5/8+OOPMnbsWJk1a5b88ccfds+dPn06YscVd/0yevRoqVq1akSOK47boKFDh9qdSPDgwYPSpEkTqVSpktx9991y/fXXS926dWX16tUGtjq8BTz4UC83PXnyZDlw4IB88cUXUrNmTbnjjjvk8OHDcuDAAenVq5d12pSUFImKipIuXbpYr8URjtz1S9++fWXlypXSsWNHqVKliiQkJEjRokVl3rx5IiJSqlQp695+OGxAtE6fPi0PPPCAWCwWadKkid11R9TP2rZtW1m1apWIiCxdulSKFSsmsbGxMnnyZLvpwkVBfXLw4EEpX768tG/fXl5++WVJSUmRpKQkWb16tTRp0iRs+yQ1NVV69uwpFSpUkAEDBkjjxo0lPj7eej0WEeWEcnfeeaeIRM64Uli/7N+/X5o2bSqJiYkRNa4Utg0SUU4UtnTpUrl48aJ1R6du3boyevRoEQm/PjGDgAcfP/74o8TFxdmdjnfp0qXSrl07GTdunOzatUtq164tgwYNkiJFisiQIUNk+PDhkpiYKH/99Vegm2cYV/3yxRdfSIcOHWTcuHFy9epVWbVqlcyfP9+aIr148aJcd9118v777xvV7IDJzc2Vt99+W7p27SpLliyR4sWLy/Tp0+2uGJqamiq33HKLpKamWs9CWqdOHbn++uvtNjzhwl2faM+QuG7dOhk6dKg0a9ZMxowZYz3x0/3332/d+IaTS5cuycCBA6Vfv352V9ht1aqVDB482Hp/w4YNUrt2bRk8eHBEjCsF9cvAgQOt98+ePSurVq2SDz74ICLGFRH326D27dvLsGHDnKZXs4t33HGHpKSkBK2dkSYm0L+mOXfuHK677jrrz7kAoFevXtizZw+WLFmC+Ph4xMfHY+/evfjuu+/QpUsXAMq5Bt544w288cYbIfsTyIK46pc+ffpg3759WLRoEfr06YObb77Z7jXr1q1Dbm4uOnXqFOzmBlxMTAyaNWuGatWq4bbbbsOePXswc+ZM3HrrrWjatCkAoHjx4tixYweqVq2KZs2aYe3atahTpw5uuOEGLFiwALVq1UKZMmWM/SA68qRP2rZti7Zt2yInJ8f6s9hTp05h27Zt6N+/PwDlvAyhfkEvVfHixREbG4v+/fsjKSkJV69eRUxMDLp37249dwug/PQxLy8PBw4ciIhxxdN+KVOmTESNK0DB26BPPvkEa9asQYcOHazPxcTEYO/evTh58iTGjh1rRJMjQ6Cjmx07dkixYsXk66+/tnt8y5Yt0qtXLxk2bJhs2rTJWvSmRp0rVqyQLVu2BLp5hnHXL9u2bZOuXbtaq9LPnz8vu3btknnz5kliYqKMHTtWrly5EpZpQMfPVKVKFRk+fLj19M5nz56VV199VRYtWmR3Wftnn31W7r77bpcXjAt1hfWJ9vmsrCzJycmRt99+W5KTk8NyD1/E/sysaor83nvvtduLzczMlI0bN1oLKCNhXCmsX7TLyrlz5yJmXPF0rD1z5ozs3btXPvroI0lKSpI77rjD5WUYSB9BKTjt1q2bdOjQwVqRrxowYID07t1b8vPzw3KhL4y7frn//vutdTA7d+6Ufv36SWJiYtif5lqlHmr5/PPPJSYmRn788Ufrc9oBNpKWmYL6RES5QNzbb78tLVq0kDJlyoTNOTs81bZtW+v5TUL9Fxl60vaLdn3ZtWtXRI0rhY21WVlZ8t///ldatGghNWrUkHfeeceglkaOoAQf27dvl5iYGHnnnXfsjuE//fTTUrt27WA0wZQ87Rf1EuiRKCUlRTp37iwnT54UEXF5YqNICkJEbH2i7pWpBZSLFy8O+2truHLw4EGpWLGi3c+sedly1/2iHWe2bt1qRLMM4W6snThxotSpU0dERDIyMsLi5IOhImjn+Xj66aelSpUqMm/ePMnMzJSMjAzp2rWrPPPMM8FqgimxX1xT0+Q7d+6U6Ohoef311+U///mPtGzZMqIGTS13fdKsWTPZsWOHwa0LPjXo/PDDD+2uYPzMM8/IQw89FLEp88L6JdTPTOord2Pt1KlTjW5aRLKIiASrvmT06NFYtmwZEhMTcfLkSZQoUQJffPEFGjRoEKwmmBL7pWCtWrXC5s2bkZiYiHfffRddu3Y1ukmGY5/YjBkzBiVKlEDnzp0xfPhwXL58GR9//DFuueUWo5tmKPaLM4615hHU4OPKlSvYvXs3tm7ditjYWNx3333BemtTY7+4dvDgQfTu3Rv//PMP5syZgwcffNDoJhmOfWLvypUraNy4MQ4ePIiiRYti2rRp1ovmRTL2i2sca80jqMEHkTcOHz6MhQsX4sknn0RcXJzRzTEF9omzLl26oE6dOpg5cyaKFStmdHNMg/1CZsbgg4hCWl5eXshezj2Q2C9kZgw+iIiIKKjC47SHREREFDIYfBAREVFQMfggIiKioGLwQUREREHF4IOIiIiCisEHERERBRWDDyIiIgoqBh9EREQUVAw+iIiIKKgYfBAREVFQ/R/kjziRcLndCwAAAABJRU5ErkJggg==", | |
| "text/plain": [ | |
| "<Figure size 640x480 with 1 Axes>" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| } | |
| ], | |
| "source": [ | |
| "from matplotlib import pyplot as plt\n", | |
| "from matplotlib import dates as mdates\n", | |
| "\n", | |
| "fig, ax = plt.subplots()\n", | |
| "ax.plot_date(clients_count_over_time['_id'], clients_count_over_time['count'], 'b-')\n", | |
| "ax.xaxis.set_major_locator(mdates.DayLocator(interval=5))\n", | |
| "ax.xaxis.set_major_formatter(mdates.DateFormatter('%d-%m-%Y'))\n", | |
| "plt.gcf().autofmt_xdate()" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "Fix delta between heartbeat interval and time window by using unique hostnames." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 131, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<div>\n", | |
| "<style scoped>\n", | |
| " .dataframe tbody tr th:only-of-type {\n", | |
| " vertical-align: middle;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe tbody tr th {\n", | |
| " vertical-align: top;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe thead th {\n", | |
| " text-align: right;\n", | |
| " }\n", | |
| "</style>\n", | |
| "<table border=\"1\" class=\"dataframe\">\n", | |
| " <thead>\n", | |
| " <tr style=\"text-align: right;\">\n", | |
| " <th></th>\n", | |
| " <th>_id</th>\n", | |
| " <th>count</th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th>0</th>\n", | |
| " <td>2022-01-01 06:00:00</td>\n", | |
| " <td>1</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>1</th>\n", | |
| " <td>2022-01-01 07:00:00</td>\n", | |
| " <td>1</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>2</th>\n", | |
| " <td>2022-01-01 08:00:00</td>\n", | |
| " <td>1</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>3</th>\n", | |
| " <td>2022-01-01 09:00:00</td>\n", | |
| " <td>1</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>4</th>\n", | |
| " <td>2022-01-01 10:00:00</td>\n", | |
| " <td>1</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>...</th>\n", | |
| " <td>...</td>\n", | |
| " <td>...</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>712</th>\n", | |
| " <td>2022-02-02 13:00:00</td>\n", | |
| " <td>1</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>713</th>\n", | |
| " <td>2022-02-02 14:00:00</td>\n", | |
| " <td>1</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>714</th>\n", | |
| " <td>2022-02-02 15:00:00</td>\n", | |
| " <td>1</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>715</th>\n", | |
| " <td>2022-02-02 16:00:00</td>\n", | |
| " <td>1</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>716</th>\n", | |
| " <td>2022-02-02 17:00:00</td>\n", | |
| " <td>1</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "<p>717 rows × 2 columns</p>\n", | |
| "</div>" | |
| ], | |
| "text/plain": [ | |
| " _id count\n", | |
| "0 2022-01-01 06:00:00 1\n", | |
| "1 2022-01-01 07:00:00 1\n", | |
| "2 2022-01-01 08:00:00 1\n", | |
| "3 2022-01-01 09:00:00 1\n", | |
| "4 2022-01-01 10:00:00 1\n", | |
| ".. ... ...\n", | |
| "712 2022-02-02 13:00:00 1\n", | |
| "713 2022-02-02 14:00:00 1\n", | |
| "714 2022-02-02 15:00:00 1\n", | |
| "715 2022-02-02 16:00:00 1\n", | |
| "716 2022-02-02 17:00:00 1\n", | |
| "\n", | |
| "[717 rows x 2 columns]" | |
| ] | |
| }, | |
| "execution_count": 131, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "clients_count_over_time = collection.aggregate_pandas_all([\n", | |
| " {\n", | |
| " \"$match\": {}\n", | |
| " },\n", | |
| " {\n", | |
| " \"$group\": {\n", | |
| " \"_id\": {\n", | |
| " \"hour\": {\n", | |
| " \"$dateFromString\": {\n", | |
| " \"dateString\": {\n", | |
| " \"$dateToString\": {\n", | |
| " \"format\": \"%Y-%m-%d %H:00:00\",\n", | |
| " \"date\": \"$timestamp\"\n", | |
| " }\n", | |
| " },\n", | |
| " \"format\": \"%Y-%m-%d %H:%M:%S\" \n", | |
| " }\n", | |
| " },\n", | |
| " \"hostname\": \"$hostname\"\n", | |
| " }\n", | |
| " }\n", | |
| " },\n", | |
| " {\n", | |
| " \"$project\": {\n", | |
| " \"_id\": 0,\n", | |
| " \"hour\": \"$_id.hour\",\n", | |
| " \"hostname\": \"$_id.hostname\",\n", | |
| " }\n", | |
| " },\n", | |
| " {\n", | |
| " \"$group\": {\n", | |
| " \"_id\": {\n", | |
| " \"$dateFromString\": {\n", | |
| " \"dateString\": {\n", | |
| " \"$dateToString\": {\n", | |
| " \"format\": \"%Y-%m-%d %H:00:00\",\n", | |
| " \"date\": \"$hour\"\n", | |
| " }\n", | |
| " },\n", | |
| " \"format\": \"%Y-%m-%d %H:%M:%S\"\n", | |
| " }\n", | |
| " },\n", | |
| " \"count\": {\n", | |
| " \"$sum\": 1\n", | |
| " }\n", | |
| " }\n", | |
| " },\n", | |
| " {\n", | |
| " \"$sort\": {\n", | |
| " \"_id\": 1\n", | |
| " }\n", | |
| " }\n", | |
| "])\n", | |
| "\n", | |
| "clients_count_over_time" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 132, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "image/png": "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f39/LF++HG+88YbJfMYEv3PnTjRq1AidO3d2R3Nd5vvvv0doaChmzpyJxx57DMOHD8fy5csBGDa05b92yM/PR25uLtq1a+eu5rrM+vXrERoaijfffBOvv/46RowYgYSEBACGfjG+T4zvofT0dHTq1Mlt7XUF1pWKWFfMS0lJQYcOHfDpp58iPDwcycnJePTRR/H999+bzGccK5s3b0aHDh3QuHFjVYwVhhEHuHDhApYtW4Zu3bph+/btmDp1KpKTk9GqVSv8+eefKC4uVuY1DoSdO3ciJiZGmfbbb7/h119/dUv7nSE/Px+ff/45WrdujW3btuGRRx7BypUrMWzYMBw9ehTZ2dkVljEWGeNlq7dt24avv/7axS13HhHBJ598gmeffRb/+Mc/sH37dqxbtw49e/ZEYmIiLl68CJ1OBy8vL6U47Nq1CxcuXEDLli2V9Vy6dElZn1asXr0azz33HCZPnozffvsN3377LR599FEsXboUZ8+ehU6nM9m9/scff+D48eMmn3YzMzMBQDPHkLCuVMS6Yl56ejree+893HbbbdixYwdmz56NtLQ06HQ6/P777wDK6oUxpKWkpGDgwIEADGNl7969OHjwoHueABhGHKK0tBRNmjTB448/jtq1aytFIjg4GKmpqRW+k8vPz8e2bdswcOBApKenY+jQodDr9cpGRguKi4sRFhaGJ554AoGBgbh27RoAIDAwEIcOHUJAQECFZTZs2IABAwbgzJkzGDp0KGJiYnDlyhVXN90pRARXr17F2bNncc899yA+Ph41atRAVFQUunXrhuzsbLPnFVmzZg369u2L+vXr49ixY4iNjcW0adNQWFioie++RQQlJSXIyclBTEwMnnjiCVSvXh0tWrRAdHQ0atSogQsXLlRY7ptvvkFUVBSaN2+Oo0eP4u6778aYMWPw999/a+YYEtaVilhXzNPpdKhfvz4ee+wx1KhRA4WFhQCAdu3aYffu3co8RpmZmThw4AAGDhyI48ePY+jQoejatatbz1OjjXetiyUmJmLOnDn49ddfUVBQgIYNG2L69OnKbkDjd9rnz583+532wYMHcebMGXz22WeIiIiAr68vsrKyMHz4cJc+D0f68MMPMWPGDKxevRr5+fm45ZZb8Pjjj6NXr14AytJ4Tk4OoqKiKmwwDh8+jD///BNfffUVWrRogerVqyMrKwsP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HnnkEVSvXt3Fz8ZxWFdMsa6Y9/nnn6NNmzYYN24coqKisGDBAgC2jZWwsDBl2oMPPqi89+g6btwrY5bxwKjnnntO9Hq91K1bV7Zt22YyT2pqqvTq1UuaNm0qmzdvlpKSEpk3b54EBgbKoEGD5OWXX5ZWrVrJXXfdJZcuXXLH03Co5cuXS1hYmCxdulRSUlLkrbfeEp1OJ3PmzFFONGTsk7p168q3334rpaWl8s0330idOnWkW7duMmXKFImMjJT+/ftLRkaGm5+R48yfP190Op3069fP7PELv//+u3Tt2lVeeuklKSgokJkzZ0rNmjXlww8/lD///FO+++47iYiI0MzBqRcuXJCRI0dKUFCQPP7449KnTx9p2rSpJCYmmsz3+++/S+vWreXhhx8WEcMY0+l0MnPmTPn1119l/fr1EhYWponT2ouwrpjDulJRVlaW3H///dKkSRNZtGiRbN26VV555RWpXr26yUnZqtpYcQXVhRERwwFh3bp1k6ysLOnSpYvce++9ygGGZ86ckbCwMHnyyScrDP5ffvlFpkyZIoMGDZKEhAR3NN2hSktLpbCwUEaMGCFPP/20iJR9Tzt8+HBp1KiRrFixQgoLC+XWW2812yepqakye/Zsuffee+Wtt95y+XNwlvJns3zzzTclOjpaHn74YTl9+rSIGI4Jef7556V27dry5JNPKle6vHLlirz66qsSHBwsEREREhAQoKl+WbVqlXTv3l3pBxHDSblatmwpq1evFhGRN954Q2rVqiXx8fEmp6BetGiRREVFSatWraRu3bryf//3fy5vvzOxrpQpKipiXTFj69atMm7cOElLS1OmHTlyRMLDw5UzMJ89e7ZKjRVXcXsYSUlJMbmscklJiVy7dk369+8vly9flo0bN4pOp1OOUL927dpNz+x4o0sye4Lr+yQ0NFQ54Mn4+/RHHnlEgoKC5N5775XLly/f9JwGWjnT4fWGDRsmq1atku+++06aNWsmH3/8sfK3Tz75RDmL6vUuXLggv/76q2bOBWE0YsQIueeee0TEsPEVEfnPf/4jOp1ObrvtNsnLy5ONGzdaPFvo1atXZe/evconY624du2alJaWVum6cr2QkBDlsgdVua6kpKTImTNnlPv79+83ea2nTp0qvXv3li+//FIJ7zc7db3WxooruC2MbNy4UcLCwiQ0NFSaNWsmkyZN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", | |
| "text/plain": [ | |
| "<Figure size 640x480 with 1 Axes>" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| } | |
| ], | |
| "source": [ | |
| "from matplotlib import pyplot as plt\n", | |
| "from matplotlib import dates as mdates\n", | |
| "\n", | |
| "fig, ax = plt.subplots()\n", | |
| "ax.plot_date(clients_count_over_time['_id'], clients_count_over_time['count'], 'b-')\n", | |
| "ax.xaxis.set_major_locator(mdates.DayLocator(interval=5))\n", | |
| "ax.xaxis.set_major_formatter(mdates.DateFormatter('%d-%m-%Y'))\n", | |
| "plt.gcf().autofmt_xdate()" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [] | |
| } | |
| ], | |
| "metadata": { | |
| "kernelspec": { | |
| "display_name": "Python 3.10.6 ('.venv': venv)", | |
| "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.10.6" | |
| }, | |
| "orig_nbformat": 4, | |
| "vscode": { | |
| "interpreter": { | |
| "hash": "feaa3b2af26749d0f89d3583bedb1781644964ad1dc24c1c1de79cba9cb058d9" | |
| } | |
| } | |
| }, | |
| "nbformat": 4, | |
| "nbformat_minor": 2 | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| version: '3' | |
| services: | |
| mongo: | |
| image: 'mongo:6.0' | |
| ports: | |
| - '27017:27017' | |
| env_file: | |
| - .env | |
| environment: | |
| MONGO_INITDB_ROOT_USERNAME: ${MONGO_INITDB_ROOT_USERNAME} | |
| MONGO_INITDB_ROOT_PASSWORD: ${MONGO_INITDB_ROOT_PASSWORD} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| asttokens==2.2.1 | |
| backcall==0.2.0 | |
| comm==0.1.2 | |
| contourpy==1.0.6 | |
| cycler==0.11.0 | |
| DateTime==4.7 | |
| debugpy==1.6.4 | |
| decorator==5.1.1 | |
| dnspython==2.2.1 | |
| entrypoints==0.4 | |
| executing==1.2.0 | |
| fonttools==4.38.0 | |
| ipykernel==6.19.2 | |
| ipython==8.7.0 | |
| jedi==0.18.2 | |
| jupyter_client==7.4.8 | |
| jupyter_core==5.1.0 | |
| kiwisolver==1.4.4 | |
| matplotlib==3.6.2 | |
| matplotlib-inline==0.1.6 | |
| nest-asyncio==1.5.6 | |
| numpy==1.23.5 | |
| packaging==22.0 | |
| pandas==1.5.2 | |
| parso==0.8.3 | |
| pexpect==4.8.0 | |
| pickleshare==0.7.5 | |
| Pillow==9.3.0 | |
| platformdirs==2.6.0 | |
| prompt-toolkit==3.0.36 | |
| psutil==5.9.4 | |
| ptyprocess==0.7.0 | |
| pure-eval==0.2.2 | |
| pyarrow==10.0.1 | |
| Pygments==2.13.0 | |
| pymongo==4.3.3 | |
| pymongoarrow==0.6.2 | |
| pyparsing==3.0.9 | |
| python-dateutil==2.8.2 | |
| python-dotenv==0.21.0 | |
| pytz==2022.6 | |
| pyzmq==24.0.1 | |
| six==1.16.0 | |
| stack-data==0.6.2 | |
| tornado==6.2 | |
| traitlets==5.7.0 | |
| wcwidth==0.2.5 | |
| zope.interface==5.5.2 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment