{"cells":[{"cell_type":"code","execution_count":null,"metadata":{},"outputs":[],"source":["import datetime as dt\n","import time\n","\n","import IPython.display\n","import matplotlib.dates as mdates\n","import matplotlib.pyplot as plt\n","import matplotlib.ticker as ticker\n","import matplotlib_inline.backend_inline\n","import numpy as np\n","import pandas as pd\n","import requests as rq\n","import seaborn as sns\n","from ipywidgets import interact\n","\n","matplotlib_inline.backend_inline.set_matplotlib_formats('svg')\n","\n","def compose_url(**kwargs):\n"," baseurl = \"https://lapis.cov-spectrum.org/gisaid/v1/sample/aggregated?fields=date&host=Human&dateFrom=2021-11-01\"\n"," for key, value in kwargs.items():\n"," baseurl += \"&\" + key + \"=\" + value\n"," return baseurl\n","\n","\n","def get_data(**kwargs):\n"," url = compose_url(**kwargs)\n"," res = rq.get(url).json()\n"," return res\n","\n","def get_df(column_name, **kwargs):\n"," data = get_data(**kwargs)\n"," df = pd.DataFrame(data[\"data\"])\n"," df[\"date\"] = pd.to_datetime(df[\"date\"])\n"," df.set_index(\"date\", inplace=True)\n"," df.sort_index(inplace=True)\n"," df.rename(columns={\"count\": column_name}, inplace=True)\n"," return (df, data[\"info\"][\"dataVersion\"])\n","\n","\n","@interact(country=\"Denmark\", baseline=\"BA.*\", query=\"BA.2\")\n","def ratio_plot(country, baseline, query):\n"," print(\"Start update\")\n"," try:\n"," while True:\n"," base_df, base_version = get_df(\"baseline\", country=country, pangoLineage=baseline)\n"," query_df, query_version = get_df(\"query\", country=country, pangoLineage=query)\n"," if base_version == query_version:\n"," break\n"," else:\n"," print(\"Data version mismatch, retrying\")\n"," time.sleep(1)\n"," df = pd.concat([base_df, query_df], axis=1).fillna(0).astype(int)\n"," df[\"ratio\"] = df[\"query\"] / df[\"baseline\"]\n"," min = df[df[\"ratio\"] != 0].ratio.min()*0.3\n"," max = 1-(1-df[df[\"ratio\"] != 1].ratio.max())*0.7\n"," df[\"ratio\"] = df[\"ratio\"].clip(min,max)\n"," error = False\n"," except:\n"," error = True\n"," print(\"Error\")\n"," if error == False: \n"," print(\"Update plots\")\n"," IPython.display.clear_output()\n"," # print(df)\n"," fig, ax = plt.subplots(\n"," num=None, figsize=(8, 4), facecolor=\"w\", edgecolor=\"k\"\n"," )\n"," sns.scatterplot(\n"," data=df, x=\"date\", y=\"ratio\", hue=\"baseline\", size=\"baseline\"\n"," )\n"," fig.text(\n"," 0.51,\n"," 0.05,\n"," f\"Date: {str(dt.date.today())} | Data source: GISAID via covSpectrum | Viz: @CorneliusRoemer\",\n"," size=6,\n"," va=\"bottom\",\n"," ha=\"center\",\n"," )\n"," ax.set_xlim(left=df[df[\"query\"] != 0].index.min() - pd.Timedelta(days=1))\n","\n"," ax.set_yscale(\"logit\")\n"," # ax.set_ylim(\n"," # bottom=min,\n"," # top=max,\n"," # )\n"," ax.set_ylabel(f\"Proportion of {baseline} that are {query}\")\n"," ax.set_xlabel(\"Sample date\")\n","\n"," ax.set_title(f\"Share of {query} of all {baseline} in {country}\")\n","\n"," ax.get_legend().set_title(f\"{baseline} samples\")\n"," locator = mdates.AutoDateLocator()\n"," formatter = mdates.ConciseDateFormatter(locator)\n"," ax.xaxis.set_major_locator(locator)\n"," ax.xaxis.set_major_formatter(formatter)\n"," ax.xaxis.set_minor_locator(ticker.MultipleLocator(base=1.0))\n"," ax.grid(True, which=\"major\", linewidth=0.25)\n"," ax.grid(True, which=\"minor\", linewidth=0.1)\n"," ax.set_axisbelow(True)\n","\n"," percent_formatter = ticker.FuncFormatter(\n"," lambda y, _: f'{ np.format_float_positional(100*y, trim=\"-\", precision=6).rstrip(\".\")}%'\n"," )\n"," ax.yaxis.set_major_formatter(percent_formatter)\n"," ax.yaxis.set_minor_formatter(plt.NullFormatter())\n"," plt.subplots_adjust(left=0.15, right=0.9, top=0.9, bottom=0.20)\n"," plt.show()\n"," # plt.savefig(f\"{country}_{query}.png\", dpi=300)\n","\n"]}],"metadata":{"interpreter":{"hash":"82a7b143dffa2834bbebfae7ca04eb9403e273373f4b2947f57e402f018d2408"},"kernelspec":{"display_name":"Python 3.9.7 64-bit ('general': conda)","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.9.7"},"orig_nbformat":4},"nbformat":4,"nbformat_minor":2}