{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "5f9b9285-93d2-4603-859e-2b1677ec1cac",
   "metadata": {},
   "outputs": [],
   "source": [
    "from IPython.display import Markdown as md\n",
    "from IPython.display import display, HTML"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3a5adf9e-a6ba-4b87-89f6-d2f613bfee44",
   "metadata": {},
   "source": [
    "# TiDB Cloud Product Qualified Leads Full Report"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b35233f5-d5c8-403a-8e98-4d1c1dcd7a16",
   "metadata": {},
   "outputs": [],
   "source": [
    "from datetime import timedelta, datetime, timezone, date\n",
    "\n",
    "begin = datetime(2022, 7, 1, tzinfo=timezone.utc)\n",
    "\n",
    "md(f'''\n",
    "> The report was generated on **{datetime.now().date()}**.\n",
    ">\n",
    "> The report ONLY includes the tenants who signed up after **{begin.date()}**.\n",
    ">\n",
    "> The report excludes TiDB internal users which syncs with the internal user flag in salesforce.\n",
    ">\n",
    "> The Product Qualified Leads (PQL) report is generated based on users' behaviors in TiDB cloud. According to the degree of interaction with TiDB cloud, the users who have highest interaction with TiDB cloud are shown in below tables. Please refer to the definitions and suggested actions as below:\n",
    "\n",
    "\n",
    "| User Classification | Definition | Suggested Actions |\n",
    "| :--- | :--- | :--- |\n",
    "| **Requesting PoC Users** | Users who submitted a PoC request through \"Apply for PoC\" entry in TiDB Cloud console.  | These users will be marked as MQL in salesforce, so the sales team just need to take action according to MQL procedure.  |\n",
    "| **Billing Capable Users** | Users who binded a credit card successfully or came from AWS / GCP marketplace.  | These users will be marked as MQL in salesforce, so the sales team just need to take action according to MQL procedure.  |\n",
    "| **Heavily-used Users with business email** | **・** Users with highest interaction with TiDB Cloud, who were identified by RDG's PLG user classification algorithm. <br>**・** Business email | As these users had business email, they are highly potential paid users. So they will be marked as MQL in salesforce, the sales team just need to take action according to MQL procedure. |\n",
    "| **Heavily-used Users with personal email** | **・** Users with highest interaction with TiDB Cloud, who were identified by RDG's PLG user classification algorithm. <br>**・** Personal email | Although these uses also had the highest interaction with TiDB Cloud, they had a lower priority than the ones with business email.  They won't be marked as MQL in salesforce, but strongly suggested to be nurtured by each region's community teams. |\n",
    "''')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "fc81590b-71f8-4099-9846-0868043bed06",
   "metadata": {},
   "outputs": [],
   "source": [
    "def set_enter_date(df_in, _class, begin, end):\n",
    "    table_list = {}\n",
    "    df = df_in.copy()\n",
    "    df.loc[:, 'Enter date'] = end\n",
    "    for i, row in df.iterrows():\n",
    "        enter_date = begin\n",
    "        while enter_date < end:\n",
    "            # Because the data of 2022-10-31 is overwrited, we have to skip it\n",
    "            if enter_date == date(2022, 10, 31):\n",
    "                enter_date += timedelta(days=1)\n",
    "                if enter_date >= end:\n",
    "                    break\n",
    "            if table_list.get(f'{_class}-{enter_date}') is None:\n",
    "                try:\n",
    "                    table = pd.read_csv(s3.get_object(Bucket=S3_BUCKET, Key=f'data/classes/{_class}-{enter_date}.csv')['Body'], low_memory=False)\n",
    "                except Exception as e:\n",
    "                    print(e)\n",
    "                    table = pd.DataFrame()\n",
    "                table_list[f'{_class}-{enter_date}'] = table\n",
    "            if row['Tenant ID'] in table_list.get(f'{_class}-{enter_date}')['Tenant ID'].values:\n",
    "                #row['Enter date'] = enter_date\n",
    "                df.loc[i, 'Enter date'] = enter_date\n",
    "                break\n",
    "            enter_date += timedelta(days=1)\n",
    "    return df\n",
    "    \n",
    "\n",
    "def get_regional(df_dict, region):\n",
    "    res_dict = {}\n",
    "    for _class, df in df_dict.items():\n",
    "        res_dict[_class] = df[df.Region==region]\n",
    "    return res_dict\n",
    "\n",
    "def get_class_data(class_name, end_date):\n",
    "    class_df = pd.DataFrame()\n",
    "    d = end_date\n",
    "    while d >= begin.date():\n",
    "        try:\n",
    "            df = pd.read_csv(\n",
    "                s3.get_object(Bucket=S3_BUCKET, Key=f\"data/classes/{class_name}-{d}.csv\")[\"Body\"],\n",
    "                low_memory=False,\n",
    "                keep_default_na=False,\n",
    "            )\n",
    "            class_df = pd.concat([class_df, df], ignore_index=True)\n",
    "        except Exception as e:\n",
    "                pass\n",
    "\n",
    "        d -= timedelta(days=90)\n",
    "    class_df = class_df.sort_values(['Signup Time'], ascending=False, ignore_index=True)\n",
    "    return class_df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "082b18ae-7797-4235-bdf5-a6549916fd72",
   "metadata": {},
   "outputs": [],
   "source": [
    "import boto3\n",
    "import pandas as pd\n",
    "pd.set_option(\"display.max_rows\", None)\n",
    "\n",
    "S3_BUCKET = \"pingcap-plg\"\n",
    "s3 = boto3.client('s3')\n",
    "\n",
    "_date = datetime.now().date() - timedelta(days=1)\n",
    "\n",
    "class_1_1 = get_class_data('class-1-1', _date)\n",
    "class_1_2 = get_class_data('class-1-2', _date)\n",
    "class_1_3 = get_class_data('class-1-3', _date)\n",
    "\n",
    "#total_users = pd.concat([class_1_1, class_1_2, class_1_3])\n",
    "\n",
    "classified_users_dict = {'class-1-1': class_1_1, 'class-1-2': class_1_2, 'class-1-3': class_1_3}\n",
    "#users = total_users[total_users.Region==\"APAC\"]\n",
    "\n",
    "#md(f'After **{begin.date()}**, there are **{len(users)}** APAC users signup')\n",
    "\n",
    "for k,v in classified_users_dict.items():\n",
    "    classified_users_dict[k] = set_enter_date(v, k, begin.date(), _date)\n",
    "    classified_users_dict[k].sort_values(['Event Types'], ascending=False, ignore_index=True)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "7e52f283",
   "metadata": {},
   "outputs": [],
   "source": [
    "areas = ['China Outbound', 'NA', 'Japan', 'EMEA', 'APAC']\n",
    "users = {}\n",
    "\n",
    "for area in areas:\n",
    "    users[area] = {}\n",
    "    regional_users_dict = get_regional(classified_users_dict, area)\n",
    "    users[area] = {\n",
    "        \"POC\": regional_users_dict['class-1-1'][regional_users_dict['class-1-1']['PoC Form Submission']=='Y'],\n",
    "        \"Billed\": regional_users_dict['class-1-1'][regional_users_dict['class-1-1']['Has Bind Card']=='Y'],\n",
    "        \"BusinessMail\": regional_users_dict['class-1-1'][(regional_users_dict['class-1-1']['Has Bind Card']=='N')  & (regional_users_dict['class-1-1']['PoC Form Submission']=='N')],\n",
    "        \"PersonalMail\": regional_users_dict['class-1-2'],\n",
    "        \"CO\": regional_users_dict['class-1-3']\n",
    "    }\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c2f0fbb8",
   "metadata": {},
   "source": [
    "### **NA** TiDB Cloud Product Qualified Leads Full Report"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ba4956f0",
   "metadata": {},
   "source": [
    "#### Requested PoC users:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "fdafacd7",
   "metadata": {},
   "outputs": [],
   "source": [
    "res = users['NA']['POC'].copy()\n",
    "res.sort_values(['Event Types'], ascending=False, ignore_index=True)\n",
    "res.drop(['Region', 'Owner', 'Event Types', 'PoC Form Submission', 'Has Bind Card'], inplace=True, axis=1)\n",
    "#res['Tenant ID'] = res['Tenant ID'].astype(str)\n",
    "#res.style.hide(axis='index')\n",
    "display(HTML(res.to_html(index=False)))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "67dd57b3",
   "metadata": {},
   "source": [
    "#### Billing capable users:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "dce69408",
   "metadata": {},
   "outputs": [],
   "source": [
    "res = users['NA']['Billed'].copy()\n",
    "res.sort_values(['Event Types'], ascending=False, ignore_index=True)\n",
    "res.drop(['Region', 'Owner', 'Event Types', 'PoC Form Submission', 'Has Bind Card'], inplace=True, axis=1)\n",
    "#res['Tenant ID'] = res['Tenant ID'].astype(str)\n",
    "#res.style.hide(axis='index')\n",
    "display(HTML(res.to_html(index=False)))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "87559ac1",
   "metadata": {},
   "source": [
    "#### Heavily-used users with business email:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "d66366c0",
   "metadata": {},
   "outputs": [],
   "source": [
    "res = users['NA']['BusinessMail'].copy()\n",
    "res.sort_values(['Event Types'], ascending=False, ignore_index=True)\n",
    "res.drop(['Region', 'Owner', 'Event Types', 'PoC Form Submission', 'Has Bind Card'], inplace=True, axis=1)\n",
    "#res['Tenant ID'] = res['Tenant ID'].astype(str)\n",
    "#res.style.hide(axis='index')\n",
    "display(HTML(res.to_html(index=False)))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c86cb313",
   "metadata": {},
   "source": [
    "#### Heavily-used users with personal email:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b99d4003",
   "metadata": {},
   "outputs": [],
   "source": [
    "res = users['NA']['PersonalMail'].copy()\n",
    "res.sort_values(['Event Types'], ascending=False, ignore_index=True)\n",
    "res.drop(['Region', 'Owner', 'Event Types', 'PoC Form Submission', 'Has Bind Card'], inplace=True, axis=1)\n",
    "#res['Tenant ID'] = res['Tenant ID'].astype(str)\n",
    "#res.style.hide(axis='index')\n",
    "display(HTML(res.to_html(index=False)))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c2f0fbb7",
   "metadata": {},
   "source": [
    "### **Japan** TiDB Cloud Product Qualified Leads Full Report"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ba4956f9",
   "metadata": {},
   "source": [
    "#### Requested PoC users:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "fdafacd6",
   "metadata": {},
   "outputs": [],
   "source": [
    "res = users['Japan']['POC'].copy()\n",
    "res.sort_values(['Event Types'], ascending=False, ignore_index=True)\n",
    "res.drop(['Region', 'Owner', 'Event Types', 'PoC Form Submission', 'Has Bind Card'], inplace=True, axis=1)\n",
    "#res['Tenant ID'] = res['Tenant ID'].astype(str)\n",
    "#res.style.hide(axis='index')\n",
    "display(HTML(res.to_html(index=False)))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "67dd57b2",
   "metadata": {},
   "source": [
    "#### Billing capable users:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "dce69407",
   "metadata": {},
   "outputs": [],
   "source": [
    "res = users['Japan']['Billed'].copy()\n",
    "res.sort_values(['Event Types'], ascending=False, ignore_index=True)\n",
    "res.drop(['Region', 'Owner', 'Event Types', 'PoC Form Submission', 'Has Bind Card'], inplace=True, axis=1)\n",
    "#res['Tenant ID'] = res['Tenant ID'].astype(str)\n",
    "#res.style.hide(axis='index')\n",
    "display(HTML(res.to_html(index=False)))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "87559ac0",
   "metadata": {},
   "source": [
    "#### Heavily-used users with business email:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "d66366c9",
   "metadata": {},
   "outputs": [],
   "source": [
    "res = users['Japan']['BusinessMail'].copy()\n",
    "res.sort_values(['Event Types'], ascending=False, ignore_index=True)\n",
    "res.drop(['Region', 'Owner', 'Event Types', 'PoC Form Submission', 'Has Bind Card'], inplace=True, axis=1)\n",
    "#res['Tenant ID'] = res['Tenant ID'].astype(str)\n",
    "#res.style.hide(axis='index')\n",
    "display(HTML(res.to_html(index=False)))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c86cb312",
   "metadata": {},
   "source": [
    "#### Heavily-used users with personal email:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b99d4002",
   "metadata": {},
   "outputs": [],
   "source": [
    "res = users['Japan']['PersonalMail'].copy()\n",
    "res.sort_values(['Event Types'], ascending=False, ignore_index=True)\n",
    "res.drop(['Region', 'Owner', 'Event Types', 'PoC Form Submission', 'Has Bind Card'], inplace=True, axis=1)\n",
    "#res['Tenant ID'] = res['Tenant ID'].astype(str)\n",
    "#res.style.hide(axis='index')\n",
    "display(HTML(res.to_html(index=False)))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c2f0fbb5",
   "metadata": {},
   "source": [
    "### **APAC** TiDB Cloud Product Qualified Leads Full Report"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ba4956f7",
   "metadata": {},
   "source": [
    "#### Requested PoC users:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "fdafacd4",
   "metadata": {},
   "outputs": [],
   "source": [
    "res = users['APAC']['POC'].copy()\n",
    "res.sort_values(['Event Types'], ascending=False, ignore_index=True)\n",
    "res.drop(['Region', 'Owner', 'Event Types', 'PoC Form Submission', 'Has Bind Card'], inplace=True, axis=1)\n",
    "#res['Tenant ID'] = res['Tenant ID'].astype(str)\n",
    "#res.style.hide(axis='index')\n",
    "display(HTML(res.to_html(index=False)))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "67dd57bf",
   "metadata": {},
   "source": [
    "#### Billing capable users:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "dce69405",
   "metadata": {},
   "outputs": [],
   "source": [
    "res = users['APAC']['Billed'].copy()\n",
    "res.sort_values(['Event Types'], ascending=False, ignore_index=True)\n",
    "res.drop(['Region', 'Owner', 'Event Types', 'PoC Form Submission', 'Has Bind Card'], inplace=True, axis=1)\n",
    "#res['Tenant ID'] = res['Tenant ID'].astype(str)\n",
    "#res.style.hide(axis='index')\n",
    "display(HTML(res.to_html(index=False)))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "87559ac8",
   "metadata": {},
   "source": [
    "#### Heavily-used users with business email:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "d66366c7",
   "metadata": {},
   "outputs": [],
   "source": [
    "res = users['APAC']['BusinessMail'].copy()\n",
    "res.sort_values(['Event Types'], ascending=False, ignore_index=True)\n",
    "res.drop(['Region', 'Owner', 'Event Types', 'PoC Form Submission', 'Has Bind Card'], inplace=True, axis=1)\n",
    "#res['Tenant ID'] = res['Tenant ID'].astype(str)\n",
    "#res.style.hide(axis='index')\n",
    "display(HTML(res.to_html(index=False)))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c86cb31b",
   "metadata": {},
   "source": [
    "#### Heavily-used users with personal email:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b99d400b",
   "metadata": {},
   "outputs": [],
   "source": [
    "res = users['APAC']['PersonalMail'].copy()\n",
    "res.sort_values(['Event Types'], ascending=False, ignore_index=True)\n",
    "res.drop(['Region', 'Owner', 'Event Types', 'PoC Form Submission', 'Has Bind Card'], inplace=True, axis=1)\n",
    "#res['Tenant ID'] = res['Tenant ID'].astype(str)\n",
    "#res.style.hide(axis='index')\n",
    "display(HTML(res.to_html(index=False)))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c2f0fbb9",
   "metadata": {},
   "source": [
    "### **China Outbound** TiDB Cloud Product Qualified Leads Full Report"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ba4956f1",
   "metadata": {},
   "source": [
    "#### Requested PoC users:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "fdafacd8",
   "metadata": {},
   "outputs": [],
   "source": [
    "res = users['China Outbound']['POC'].copy()\n",
    "res.sort_values(['Event Types'], ascending=False, ignore_index=True)\n",
    "res.drop(['Region', 'Owner', 'Event Types', 'PoC Form Submission', 'Has Bind Card'], inplace=True, axis=1)\n",
    "#res['Tenant ID'] = res['Tenant ID'].astype(str)\n",
    "#res.style.hide(axis='index')\n",
    "display(HTML(res.to_html(index=False)))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "67dd57b4",
   "metadata": {},
   "source": [
    "#### Billing capable users:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "dce69409",
   "metadata": {},
   "outputs": [],
   "source": [
    "res = users['China Outbound']['Billed'].copy()\n",
    "res.sort_values(['Event Types'], ascending=False, ignore_index=True)\n",
    "res.drop(['Region', 'Owner', 'Event Types', 'PoC Form Submission', 'Has Bind Card'], inplace=True, axis=1)\n",
    "#res['Tenant ID'] = res['Tenant ID'].astype(str)\n",
    "#res.style.hide(axis='index')\n",
    "display(HTML(res.to_html(index=False)))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "87559ac2",
   "metadata": {},
   "source": [
    "#### Heavily-used users with business email:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "d66366c1",
   "metadata": {},
   "outputs": [],
   "source": [
    "res = users['China Outbound']['BusinessMail'].copy()\n",
    "res.sort_values(['Event Types'], ascending=False, ignore_index=True)\n",
    "res.drop(['Region', 'Owner', 'Event Types', 'PoC Form Submission', 'Has Bind Card'], inplace=True, axis=1)\n",
    "#res['Tenant ID'] = res['Tenant ID'].astype(str)\n",
    "#res.style.hide(axis='index')\n",
    "display(HTML(res.to_html(index=False)))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c86cb314",
   "metadata": {},
   "source": [
    "#### Heavily-used users with personal email:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b99d4004",
   "metadata": {},
   "outputs": [],
   "source": [
    "all = pd.concat([users['China Outbound']['PersonalMail'], users['China Outbound']['CO'], users['Japan']['CO'], users['NA']['CO'], users['EMEA']['CO'], users['APAC']['CO']])\n",
    "all.sort_values(['Region'], ascending=False, ignore_index=True)\n",
    "all.drop(['Owner', 'Event Types', 'PoC Form Submission', 'Has Bind Card'], inplace=True, axis=1)\n",
    "#all['Tenant ID'] = all['Tenant ID'].astype(str)\n",
    "#all.style.hide(axis='index')\n",
    "display(HTML(all.to_html(index=False)))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c2f0fbb6",
   "metadata": {},
   "source": [
    "### **EMEA** TiDB Cloud Product Qualified Leads Full Report"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ba4956f8",
   "metadata": {},
   "source": [
    "#### Requested PoC users:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "fdafacd5",
   "metadata": {},
   "outputs": [],
   "source": [
    "res = users['EMEA']['POC'].copy()\n",
    "res.sort_values(['Event Types'], ascending=False, ignore_index=True)\n",
    "res.drop(['Region', 'Owner', 'Event Types', 'PoC Form Submission', 'Has Bind Card'], inplace=True, axis=1)\n",
    "#res['Tenant ID'] = res['Tenant ID'].astype(str)\n",
    "#res.style.hide(axis='index')\n",
    "display(HTML(res.to_html(index=False)))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "67dd57b1",
   "metadata": {},
   "source": [
    "#### Billing capable users:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "dce69406",
   "metadata": {},
   "outputs": [],
   "source": [
    "res = users['EMEA']['Billed'].copy()\n",
    "res.sort_values(['Event Types'], ascending=False, ignore_index=True)\n",
    "res.drop(['Region', 'Owner', 'Event Types', 'PoC Form Submission', 'Has Bind Card'], inplace=True, axis=1)\n",
    "#res['Tenant ID'] = res['Tenant ID'].astype(str)\n",
    "#res.style.hide(axis='index')\n",
    "display(HTML(res.to_html(index=False)))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "87559ac9",
   "metadata": {},
   "source": [
    "#### Heavily-used users with business email:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "d66366c8",
   "metadata": {},
   "outputs": [],
   "source": [
    "res = users['EMEA']['BusinessMail'].copy()\n",
    "res.sort_values(['Event Types'], ascending=False, ignore_index=True)\n",
    "res.drop(['Region', 'Owner', 'Event Types', 'PoC Form Submission', 'Has Bind Card'], inplace=True, axis=1)\n",
    "#res['Tenant ID'] = res['Tenant ID'].astype(str)\n",
    "#res.style.hide(axis='index')\n",
    "display(HTML(res.to_html(index=False)))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c86cb311",
   "metadata": {},
   "source": [
    "#### Heavily-used users with personal email:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b99d4001",
   "metadata": {},
   "outputs": [],
   "source": [
    "res = users['EMEA']['PersonalMail'].copy()\n",
    "res.sort_values(['Event Types'], ascending=False, ignore_index=True)\n",
    "res.drop(['Region', 'Owner', 'Event Types', 'PoC Form Submission', 'Has Bind Card'], inplace=True, axis=1)\n",
    "#res['Tenant ID'] = res['Tenant ID'].astype(str)\n",
    "#res.style.hide(axis='index')\n",
    "display(HTML(res.to_html(index=False)))"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "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.8.10"
  },
  "vscode": {
   "interpreter": {
    "hash": "86cd8ef8929bf5d562764b2e4cfe3ddc35d1f24790438012f6949303e0864a3c"
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
