{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "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>provider</th>\n",
       "      <th>region</th>\n",
       "      <th>region_name</th>\n",
       "      <th>is_public</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>aws</td>\n",
       "      <td>ap-northeast-1</td>\n",
       "      <td>Tokyo</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>aws</td>\n",
       "      <td>ap-northeast-2</td>\n",
       "      <td>Seoul</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>aws</td>\n",
       "      <td>ap-northeast-3</td>\n",
       "      <td>Osaka</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>aws</td>\n",
       "      <td>ap-south-1</td>\n",
       "      <td>Mumbai</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>aws</td>\n",
       "      <td>ap-southeast-1</td>\n",
       "      <td>Singapore</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>aws</td>\n",
       "      <td>ap-southeast-2</td>\n",
       "      <td>Sydney</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>aws</td>\n",
       "      <td>eu-central-1</td>\n",
       "      <td>Frankfurt</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>aws</td>\n",
       "      <td>sa-east-1</td>\n",
       "      <td>São Paulo</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>aws</td>\n",
       "      <td>us-east-1</td>\n",
       "      <td>N.Virginia</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>aws</td>\n",
       "      <td>ap-southeast-3</td>\n",
       "      <td>Jakarta</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>aws</td>\n",
       "      <td>us-west-2</td>\n",
       "      <td>Oregon</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>gcp</td>\n",
       "      <td>asia-east1</td>\n",
       "      <td>Taiwan</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>gcp</td>\n",
       "      <td>asia-northeast1</td>\n",
       "      <td>Tokyo</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>gcp</td>\n",
       "      <td>asia-northeast2</td>\n",
       "      <td>Osaka</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>gcp</td>\n",
       "      <td>asia-southeast1</td>\n",
       "      <td>Singapore</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>gcp</td>\n",
       "      <td>asia-southeast2</td>\n",
       "      <td>Jakarta</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>gcp</td>\n",
       "      <td>us-central1</td>\n",
       "      <td>Iowa</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17</th>\n",
       "      <td>gcp</td>\n",
       "      <td>us-east4</td>\n",
       "      <td>N.Virginia</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>gcp</td>\n",
       "      <td>us-west1</td>\n",
       "      <td>Oregon</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   provider           region region_name  is_public\n",
       "0       aws   ap-northeast-1       Tokyo          1\n",
       "1       aws   ap-northeast-2       Seoul          1\n",
       "2       aws   ap-northeast-3       Osaka          0\n",
       "3       aws       ap-south-1      Mumbai          1\n",
       "4       aws   ap-southeast-1   Singapore          1\n",
       "5       aws   ap-southeast-2      Sydney          0\n",
       "6       aws     eu-central-1   Frankfurt          1\n",
       "7       aws        sa-east-1   São Paulo          1\n",
       "8       aws        us-east-1  N.Virginia          1\n",
       "9       aws   ap-southeast-3     Jakarta          0\n",
       "10      aws        us-west-2      Oregon          1\n",
       "11      gcp       asia-east1      Taiwan          1\n",
       "12      gcp  asia-northeast1       Tokyo          1\n",
       "13      gcp  asia-northeast2       Osaka          0\n",
       "14      gcp  asia-southeast1   Singapore          1\n",
       "15      gcp  asia-southeast2     Jakarta          1\n",
       "16      gcp      us-central1        Iowa          1\n",
       "17      gcp         us-east4  N.Virginia          1\n",
       "18      gcp         us-west1      Oregon          1"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd\n",
    "# Reorganizing the data to make each row a tuple representing a region's information\n",
    "data = [\n",
    "    (\"aws\", \"ap-northeast-1\", \"Tokyo\", 1),\n",
    "    (\"aws\", \"ap-northeast-2\", \"Seoul\", 1),\n",
    "    (\"aws\", \"ap-northeast-3\", \"Osaka\", 0),\n",
    "    (\"aws\", \"ap-south-1\", \"Mumbai\", 1),\n",
    "    (\"aws\", \"ap-southeast-1\", \"Singapore\", 1),\n",
    "    (\"aws\", \"ap-southeast-2\", \"Sydney\", 0),\n",
    "    (\"aws\", \"eu-central-1\", \"Frankfurt\", 1),\n",
    "    (\"aws\", \"sa-east-1\", \"São Paulo\", 1),\n",
    "    (\"aws\", \"us-east-1\", \"N.Virginia\", 1),\n",
    "    (\"aws\", \"ap-southeast-3\", \"Jakarta\", 0),\n",
    "    (\"aws\", \"us-west-2\", \"Oregon\", 1),\n",
    "    (\"gcp\", \"asia-east1\", \"Taiwan\", 1),\n",
    "    (\"gcp\", \"asia-northeast1\", \"Tokyo\", 1),\n",
    "    (\"gcp\", \"asia-northeast2\", \"Osaka\", 0),\n",
    "    (\"gcp\", \"asia-southeast1\", \"Singapore\", 1),\n",
    "    (\"gcp\", \"asia-southeast2\", \"Jakarta\", 1),\n",
    "    (\"gcp\", \"us-central1\", \"Iowa\", 1),\n",
    "    (\"gcp\", \"us-east4\", \"N.Virginia\", 1),\n",
    "    (\"gcp\", \"us-west1\", \"Oregon\", 1)\n",
    "]\n",
    "\n",
    "# Converting the list of tuples into a DataFrame\n",
    "region_list = pd.DataFrame(data, columns=[\"provider\", \"region\", \"region_name\", \"is_public\"])\n",
    "region_list"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Developer Tier\n",
      "Node,CPU,Cost\n",
      "tidb,Shared,Free\n",
      "tikv,Shared,Free\n",
      "tiflash,Shared,Free\n",
      "Dedicated\n",
      "Node,CPU,CPU Cost / hr,IOPS and throughput fee per hour,Storage Price / GB / hr\n",
      "\n",
      "Developer Tier\n",
      "Node,CPU,Cost\n",
      "tidb,Shared,Free\n",
      "tikv,Shared,Free\n",
      "tiflash,Shared,Free\n",
      "Dedicated\n",
      "Node,CPU,CPU Cost / hr,IOPS and throughput fee per hour,Storage Price / GB / hr\n",
      "\n",
      "Developer Tier\n",
      "Node,CPU,Cost\n",
      "tidb,Shared,Free\n",
      "tikv,Shared,Free\n",
      "tiflash,Shared,Free\n",
      "Dedicated\n",
      "Node,CPU,CPU Cost / hr,IOPS and throughput fee per hour,Storage Price / GB / hr\n",
      "\n",
      "Dedicated\n",
      "Node,CPU,CPU Cost / hr,IOPS and throughput fee per hour,Storage Price / GB / hr\n",
      "\n",
      "Dedicated\n",
      "Node,CPU,CPU Cost / hr,IOPS and throughput fee per hour,Storage Price / GB / hr\n",
      "\n",
      "Developer Tier\n",
      "Node,CPU,Cost\n",
      "tidb,Shared,Free\n",
      "tikv,Shared,Free\n",
      "tiflash,Shared,Free\n",
      "Dedicated\n",
      "Node,CPU,CPU Cost / hr,IOPS and throughput fee per hour,Storage Price / GB / hr\n",
      "\n",
      "Dedicated\n",
      "Node,CPU,CPU Cost / hr,IOPS and throughput fee per hour,Storage Price / GB / hr\n",
      "\n",
      "Dedicated\n",
      "Node,CPU,CPU Cost / hr,IOPS and throughput fee per hour,Storage Price / GB / hr\n",
      "\n",
      "Developer Tier\n",
      "Node,CPU,Cost\n",
      "tidb,Shared,Free\n",
      "tikv,Shared,Free\n",
      "tiflash,Shared,Free\n",
      "Dedicated\n",
      "Node,CPU,CPU Cost / hr,IOPS and throughput fee per hour,Storage Price / GB / hr\n",
      "\n",
      "Dedicated\n",
      "Node,CPU,CPU Cost / hr,IOPS and throughput fee per hour,Storage Price / GB / hr\n",
      "\n",
      "Dedicated\n",
      "Node,CPU,CPU Cost / hr,IOPS and throughput fee per hour,Storage Price / GB / hr\n",
      "\n",
      "Dedicated\n",
      "Node,CPU,CPU Cost / hr,IOPS and throughput fee per hour,Storage Price / GB / hr\n",
      "\n",
      "Dedicated\n",
      "Node,CPU,CPU Cost / hr,IOPS and throughput fee per hour,Storage Price / GB / hr\n",
      "\n",
      "Dedicated\n",
      "Node,CPU,CPU Cost / hr,IOPS and throughput fee per hour,Storage Price / GB / hr\n",
      "\n",
      "Dedicated\n",
      "Node,CPU,CPU Cost / hr,IOPS and throughput fee per hour,Storage Price / GB / hr\n",
      "\n",
      "Dedicated\n",
      "Node,CPU,CPU Cost / hr,IOPS and throughput fee per hour,Storage Price / GB / hr\n",
      "\n",
      "Dedicated\n",
      "Node,CPU,CPU Cost / hr,IOPS and throughput fee per hour,Storage Price / GB / hr\n",
      "\n",
      "Dedicated\n",
      "Node,CPU,CPU Cost / hr,IOPS and throughput fee per hour,Storage Price / GB / hr\n",
      "\n",
      "\n"
     ]
    }
   ],
   "source": [
    "import csv\n",
    "import io\n",
    "def read_region_data(file_path):\n",
    "    # 初始化空列表来存储处理后的行\n",
    "    processed_lines = []\n",
    "\n",
    "    # 读取文件并逐行处理\n",
    "    with open(file_path, 'r') as file:\n",
    "        for line in file:\n",
    "            # 如果遇到 \"Special\"，停止处理\n",
    "            if 'Special' in line:\n",
    "                break\n",
    "\n",
    "            # 如果行包含提供商信息（如 aws,us-east-1 或 gcp,us-west-2），保存这个信息\n",
    "            if ('aws' in line or 'gcp' in line) and ',' in line and len(line.split(',')) == 2:\n",
    "                provider_info = line.strip()\n",
    "                continue\n",
    "\n",
    "            if  line.strip() in ['Developer Tier', 'Node,CPU,Cost', 'tidb,Shared,Free', 'tikv,Shared,Free', 'tiflash,Shared,Free', 'Dedicated', '', 'Node,CPU,CPU Cost / hr,IOPS and throughput fee per hour,Storage Price / GB / hr']:\n",
    "                print(line.strip())\n",
    "                continue\n",
    "\n",
    "\n",
    "            processed_line = provider_info + ', ' + line.strip()\n",
    "            # 使用 io.StringIO 将字符串转换为类似文件的对象\n",
    "            f = io.StringIO(processed_line)\n",
    "            # 创建 csv reader\n",
    "            reader = csv.reader(f)\n",
    "            # 读取单行并拆分\n",
    "            for row in reader:\n",
    "                columns = row\n",
    "            processed_lines.append(columns)\n",
    "\n",
    "        return pd.DataFrame(processed_lines, columns=['provider', 'region', 'node_type', 'node_size', 'computer_price', 'iops_price', 'storage_price'])\n",
    "\n",
    "cluster_pricing_df = read_region_data('./price_table.csv')\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "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>provider</th>\n",
       "      <th>region</th>\n",
       "      <th>node_type</th>\n",
       "      <th>node_size</th>\n",
       "      <th>computer_price</th>\n",
       "      <th>iops_price</th>\n",
       "      <th>storage_price</th>\n",
       "      <th>region_name</th>\n",
       "      <th>is_public</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>aws</td>\n",
       "      <td>ap-northeast-1</td>\n",
       "      <td>tidb</td>\n",
       "      <td>16 vCPU, 32 GiB</td>\n",
       "      <td>1.9688</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>Tokyo</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>aws</td>\n",
       "      <td>ap-northeast-1</td>\n",
       "      <td>tidb</td>\n",
       "      <td>32 vCPU, 64 GiB</td>\n",
       "      <td>3.9376</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>Tokyo</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>aws</td>\n",
       "      <td>ap-northeast-1</td>\n",
       "      <td>tidb</td>\n",
       "      <td>4 vCPU, 16 GiB</td>\n",
       "      <td>0.5704</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>Tokyo</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>aws</td>\n",
       "      <td>ap-northeast-1</td>\n",
       "      <td>tidb</td>\n",
       "      <td>8 vCPU, 16 GiB</td>\n",
       "      <td>0.9844</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>Tokyo</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>aws</td>\n",
       "      <td>ap-northeast-1</td>\n",
       "      <td>tiflash</td>\n",
       "      <td>16 vCPU, 128 GiB</td>\n",
       "      <td>2.7968</td>\n",
       "      <td>0.134485</td>\n",
       "      <td>0.000131</td>\n",
       "      <td>Tokyo</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>182</th>\n",
       "      <td>gcp</td>\n",
       "      <td>us-west1</td>\n",
       "      <td>tiflash</td>\n",
       "      <td>8 vCPU, 64 GiB</td>\n",
       "      <td>1.2053</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000232</td>\n",
       "      <td>Oregon</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>183</th>\n",
       "      <td>gcp</td>\n",
       "      <td>us-west1</td>\n",
       "      <td>tikv</td>\n",
       "      <td>16 vCPU, 64 GiB</td>\n",
       "      <td>1.7869</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000232</td>\n",
       "      <td>Oregon</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>184</th>\n",
       "      <td>gcp</td>\n",
       "      <td>us-west1</td>\n",
       "      <td>tikv</td>\n",
       "      <td>4 vCPU, 16 GiB</td>\n",
       "      <td>0.4467</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000232</td>\n",
       "      <td>Oregon</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>185</th>\n",
       "      <td>gcp</td>\n",
       "      <td>us-west1</td>\n",
       "      <td>tikv</td>\n",
       "      <td>8 vCPU, 32 GiB</td>\n",
       "      <td>0.8934</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000232</td>\n",
       "      <td>Oregon</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>186</th>\n",
       "      <td>gcp</td>\n",
       "      <td>us-west1</td>\n",
       "      <td>tikv</td>\n",
       "      <td>8 vCPU, 64 GiB</td>\n",
       "      <td>1.2053</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000232</td>\n",
       "      <td>Oregon</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>187 rows × 9 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "    provider          region node_type         node_size  computer_price  \\\n",
       "0        aws  ap-northeast-1      tidb   16 vCPU, 32 GiB          1.9688   \n",
       "1        aws  ap-northeast-1      tidb   32 vCPU, 64 GiB          3.9376   \n",
       "2        aws  ap-northeast-1      tidb    4 vCPU, 16 GiB          0.5704   \n",
       "3        aws  ap-northeast-1      tidb    8 vCPU, 16 GiB          0.9844   \n",
       "4        aws  ap-northeast-1   tiflash  16 vCPU, 128 GiB          2.7968   \n",
       "..       ...             ...       ...               ...             ...   \n",
       "182      gcp        us-west1   tiflash    8 vCPU, 64 GiB          1.2053   \n",
       "183      gcp        us-west1      tikv   16 vCPU, 64 GiB          1.7869   \n",
       "184      gcp        us-west1      tikv    4 vCPU, 16 GiB          0.4467   \n",
       "185      gcp        us-west1      tikv    8 vCPU, 32 GiB          0.8934   \n",
       "186      gcp        us-west1      tikv    8 vCPU, 64 GiB          1.2053   \n",
       "\n",
       "     iops_price  storage_price region_name  is_public  \n",
       "0      0.000000       0.000000       Tokyo          1  \n",
       "1      0.000000       0.000000       Tokyo          1  \n",
       "2      0.000000       0.000000       Tokyo          1  \n",
       "3      0.000000       0.000000       Tokyo          1  \n",
       "4      0.134485       0.000131       Tokyo          1  \n",
       "..          ...            ...         ...        ...  \n",
       "182    0.000000       0.000232      Oregon          1  \n",
       "183    0.000000       0.000232      Oregon          1  \n",
       "184    0.000000       0.000232      Oregon          1  \n",
       "185    0.000000       0.000232      Oregon          1  \n",
       "186    0.000000       0.000232      Oregon          1  \n",
       "\n",
       "[187 rows x 9 columns]"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cluster_pricing_df['iops_price'] = cluster_pricing_df['iops_price'].replace('-', 0.000000)\n",
    "cluster_pricing_df['storage_price'] = cluster_pricing_df['storage_price'].replace('-', 0.000000)\n",
    "cluster_pricing_df['node_type'] = cluster_pricing_df['node_type'].str.strip()\n",
    "\n",
    "\n",
    "# 将 computer_price, iops_price, storage_price 转换为浮点数\n",
    "cluster_pricing_df['computer_price'] = pd.to_numeric(cluster_pricing_df['computer_price'], errors='raise')\n",
    "cluster_pricing_df['iops_price'] = pd.to_numeric(cluster_pricing_df['iops_price'], errors='raise')\n",
    "cluster_pricing_df['storage_price'] = pd.to_numeric(cluster_pricing_df['storage_price'], errors='raise')\n",
    "\n",
    "# 检查 computer_price 和 storage_price 是否相同\n",
    "assert cluster_pricing_df.groupby(['provider', 'region', 'node_type', 'node_size'])['computer_price'].nunique().max() == 1, \"Computer prices are not the same\"\n",
    "assert cluster_pricing_df.groupby(['provider', 'region', 'node_type', 'node_size'])['storage_price'].nunique().max() == 1, \"Storage prices are not the same\"\n",
    "\n",
    "# 合并行\n",
    "rdg_cluster_pricing_df = cluster_pricing_df.groupby(['provider', 'region', 'node_type', 'node_size']).agg({\n",
    "    'computer_price': 'first',  # 或者 'max', 因为这些值应该相同\n",
    "    'iops_price': 'max',\n",
    "    'storage_price': 'first'  # 或者 'max', 因为这些值应该相同\n",
    "}).reset_index()\n",
    "\n",
    "# 合并两个 DataFrame，以添加 region_name 列\n",
    "rdg_cluster_pricing_df = pd.merge(rdg_cluster_pricing_df, region_list[['provider', 'region', 'region_name', 'is_public']], on=['provider', 'region'], how='left')\n",
    "rdg_cluster_pricing_df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "ename": "OperationalError",
     "evalue": "(pymysql.err.OperationalError) (1105, 'Connections using insecure transport are prohibited. See https://docs.pingcap.com/tidbcloud/secure-connections-to-serverless-tier-clusters')\n(Background on this error at: https://sqlalche.me/e/20/e3q8)",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mOperationalError\u001b[0m                          Traceback (most recent call last)",
      "File \u001b[0;32m~/Work/miniconda3/envs/autogen/lib/python3.10/site-packages/sqlalchemy/engine/base.py:145\u001b[0m, in \u001b[0;36mConnection.__init__\u001b[0;34m(self, engine, connection, _has_events, _allow_revalidate, _allow_autobegin)\u001b[0m\n\u001b[1;32m    144\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 145\u001b[0m     \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_dbapi_connection \u001b[38;5;241m=\u001b[39m \u001b[43mengine\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mraw_connection\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    146\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m dialect\u001b[38;5;241m.\u001b[39mloaded_dbapi\u001b[38;5;241m.\u001b[39mError \u001b[38;5;28;01mas\u001b[39;00m err:\n",
      "File \u001b[0;32m~/Work/miniconda3/envs/autogen/lib/python3.10/site-packages/sqlalchemy/engine/base.py:3303\u001b[0m, in \u001b[0;36mEngine.raw_connection\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m   3282\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"Return a \"raw\" DBAPI connection from the connection pool.\u001b[39;00m\n\u001b[1;32m   3283\u001b[0m \n\u001b[1;32m   3284\u001b[0m \u001b[38;5;124;03mThe returned object is a proxied version of the DBAPI\u001b[39;00m\n\u001b[0;32m   (...)\u001b[0m\n\u001b[1;32m   3301\u001b[0m \n\u001b[1;32m   3302\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m-> 3303\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mpool\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconnect\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n",
      "File \u001b[0;32m~/Work/miniconda3/envs/autogen/lib/python3.10/site-packages/sqlalchemy/pool/base.py:449\u001b[0m, in \u001b[0;36mPool.connect\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m    442\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"Return a DBAPI connection from the pool.\u001b[39;00m\n\u001b[1;32m    443\u001b[0m \n\u001b[1;32m    444\u001b[0m \u001b[38;5;124;03mThe connection is instrumented such that when its\u001b[39;00m\n\u001b[0;32m   (...)\u001b[0m\n\u001b[1;32m    447\u001b[0m \n\u001b[1;32m    448\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m--> 449\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43m_ConnectionFairy\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_checkout\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m)\u001b[49m\n",
      "File \u001b[0;32m~/Work/miniconda3/envs/autogen/lib/python3.10/site-packages/sqlalchemy/pool/base.py:1263\u001b[0m, in \u001b[0;36m_ConnectionFairy._checkout\u001b[0;34m(cls, pool, threadconns, fairy)\u001b[0m\n\u001b[1;32m   1262\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m fairy:\n\u001b[0;32m-> 1263\u001b[0m     fairy \u001b[38;5;241m=\u001b[39m \u001b[43m_ConnectionRecord\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcheckout\u001b[49m\u001b[43m(\u001b[49m\u001b[43mpool\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m   1265\u001b[0m     \u001b[38;5;28;01mif\u001b[39;00m threadconns \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n",
      "File \u001b[0;32m~/Work/miniconda3/envs/autogen/lib/python3.10/site-packages/sqlalchemy/pool/base.py:712\u001b[0m, in \u001b[0;36m_ConnectionRecord.checkout\u001b[0;34m(cls, pool)\u001b[0m\n\u001b[1;32m    711\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m--> 712\u001b[0m     rec \u001b[38;5;241m=\u001b[39m \u001b[43mpool\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_do_get\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    714\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n",
      "File \u001b[0;32m~/Work/miniconda3/envs/autogen/lib/python3.10/site-packages/sqlalchemy/pool/impl.py:179\u001b[0m, in \u001b[0;36mQueuePool._do_get\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m    178\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m:\n\u001b[0;32m--> 179\u001b[0m     \u001b[38;5;28;01mwith\u001b[39;00m util\u001b[38;5;241m.\u001b[39msafe_reraise():\n\u001b[1;32m    180\u001b[0m         \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_dec_overflow()\n",
      "File \u001b[0;32m~/Work/miniconda3/envs/autogen/lib/python3.10/site-packages/sqlalchemy/util/langhelpers.py:146\u001b[0m, in \u001b[0;36msafe_reraise.__exit__\u001b[0;34m(self, type_, value, traceback)\u001b[0m\n\u001b[1;32m    145\u001b[0m     \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_exc_info \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m  \u001b[38;5;66;03m# remove potential circular references\u001b[39;00m\n\u001b[0;32m--> 146\u001b[0m     \u001b[38;5;28;01mraise\u001b[39;00m exc_value\u001b[38;5;241m.\u001b[39mwith_traceback(exc_tb)\n\u001b[1;32m    147\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n",
      "File \u001b[0;32m~/Work/miniconda3/envs/autogen/lib/python3.10/site-packages/sqlalchemy/pool/impl.py:177\u001b[0m, in \u001b[0;36mQueuePool._do_get\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m    176\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 177\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_create_connection\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    178\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m:\n",
      "File \u001b[0;32m~/Work/miniconda3/envs/autogen/lib/python3.10/site-packages/sqlalchemy/pool/base.py:390\u001b[0m, in \u001b[0;36mPool._create_connection\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m    388\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"Called by subclasses to create a new ConnectionRecord.\"\"\"\u001b[39;00m\n\u001b[0;32m--> 390\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43m_ConnectionRecord\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m)\u001b[49m\n",
      "File \u001b[0;32m~/Work/miniconda3/envs/autogen/lib/python3.10/site-packages/sqlalchemy/pool/base.py:674\u001b[0m, in \u001b[0;36m_ConnectionRecord.__init__\u001b[0;34m(self, pool, connect)\u001b[0m\n\u001b[1;32m    673\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m connect:\n\u001b[0;32m--> 674\u001b[0m     \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m__connect\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    675\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mfinalize_callback \u001b[38;5;241m=\u001b[39m deque()\n",
      "File \u001b[0;32m~/Work/miniconda3/envs/autogen/lib/python3.10/site-packages/sqlalchemy/pool/base.py:900\u001b[0m, in \u001b[0;36m_ConnectionRecord.__connect\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m    899\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mBaseException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[0;32m--> 900\u001b[0m     \u001b[38;5;28;01mwith\u001b[39;00m util\u001b[38;5;241m.\u001b[39msafe_reraise():\n\u001b[1;32m    901\u001b[0m         pool\u001b[38;5;241m.\u001b[39mlogger\u001b[38;5;241m.\u001b[39mdebug(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mError on connect(): \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m\"\u001b[39m, e)\n",
      "File \u001b[0;32m~/Work/miniconda3/envs/autogen/lib/python3.10/site-packages/sqlalchemy/util/langhelpers.py:146\u001b[0m, in \u001b[0;36msafe_reraise.__exit__\u001b[0;34m(self, type_, value, traceback)\u001b[0m\n\u001b[1;32m    145\u001b[0m     \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_exc_info \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m  \u001b[38;5;66;03m# remove potential circular references\u001b[39;00m\n\u001b[0;32m--> 146\u001b[0m     \u001b[38;5;28;01mraise\u001b[39;00m exc_value\u001b[38;5;241m.\u001b[39mwith_traceback(exc_tb)\n\u001b[1;32m    147\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n",
      "File \u001b[0;32m~/Work/miniconda3/envs/autogen/lib/python3.10/site-packages/sqlalchemy/pool/base.py:896\u001b[0m, in \u001b[0;36m_ConnectionRecord.__connect\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m    895\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mstarttime \u001b[38;5;241m=\u001b[39m time\u001b[38;5;241m.\u001b[39mtime()\n\u001b[0;32m--> 896\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mdbapi_connection \u001b[38;5;241m=\u001b[39m connection \u001b[38;5;241m=\u001b[39m \u001b[43mpool\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_invoke_creator\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m    897\u001b[0m pool\u001b[38;5;241m.\u001b[39mlogger\u001b[38;5;241m.\u001b[39mdebug(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mCreated new connection \u001b[39m\u001b[38;5;132;01m%r\u001b[39;00m\u001b[38;5;124m\"\u001b[39m, connection)\n",
      "File \u001b[0;32m~/Work/miniconda3/envs/autogen/lib/python3.10/site-packages/sqlalchemy/engine/create.py:643\u001b[0m, in \u001b[0;36mcreate_engine.<locals>.connect\u001b[0;34m(connection_record)\u001b[0m\n\u001b[1;32m    641\u001b[0m             \u001b[38;5;28;01mreturn\u001b[39;00m connection\n\u001b[0;32m--> 643\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mdialect\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconnect\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mcargs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mcparams\u001b[49m\u001b[43m)\u001b[49m\n",
      "File \u001b[0;32m~/Work/miniconda3/envs/autogen/lib/python3.10/site-packages/sqlalchemy/engine/default.py:616\u001b[0m, in \u001b[0;36mDefaultDialect.connect\u001b[0;34m(self, *cargs, **cparams)\u001b[0m\n\u001b[1;32m    614\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mconnect\u001b[39m(\u001b[38;5;28mself\u001b[39m, \u001b[38;5;241m*\u001b[39mcargs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mcparams):\n\u001b[1;32m    615\u001b[0m     \u001b[38;5;66;03m# inherits the docstring from interfaces.Dialect.connect\u001b[39;00m\n\u001b[0;32m--> 616\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mloaded_dbapi\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconnect\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mcargs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mcparams\u001b[49m\u001b[43m)\u001b[49m\n",
      "File \u001b[0;32m~/Work/miniconda3/envs/autogen/lib/python3.10/site-packages/pymysql/connections.py:358\u001b[0m, in \u001b[0;36mConnection.__init__\u001b[0;34m(self, user, password, host, database, unix_socket, port, charset, collation, sql_mode, read_default_file, conv, use_unicode, client_flag, cursorclass, init_command, connect_timeout, read_default_group, autocommit, local_infile, max_allowed_packet, defer_connect, auth_plugin_map, read_timeout, write_timeout, bind_address, binary_prefix, program_name, server_public_key, ssl, ssl_ca, ssl_cert, ssl_disabled, ssl_key, ssl_verify_cert, ssl_verify_identity, compress, named_pipe, passwd, db)\u001b[0m\n\u001b[1;32m    357\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m--> 358\u001b[0m     \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconnect\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n",
      "File \u001b[0;32m~/Work/miniconda3/envs/autogen/lib/python3.10/site-packages/pymysql/connections.py:664\u001b[0m, in \u001b[0;36mConnection.connect\u001b[0;34m(self, sock)\u001b[0m\n\u001b[1;32m    663\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_get_server_information()\n\u001b[0;32m--> 664\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_request_authentication\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    666\u001b[0m \u001b[38;5;66;03m# Send \"SET NAMES\" query on init for:\u001b[39;00m\n\u001b[1;32m    667\u001b[0m \u001b[38;5;66;03m# - Ensure charaset (and collation) is set to the server.\u001b[39;00m\n\u001b[1;32m    668\u001b[0m \u001b[38;5;66;03m#   - collation_id in handshake packet may be ignored.\u001b[39;00m\n\u001b[0;32m   (...)\u001b[0m\n\u001b[1;32m    677\u001b[0m \u001b[38;5;66;03m# - https://github.com/wagtail/wagtail/issues/9477\u001b[39;00m\n\u001b[1;32m    678\u001b[0m \u001b[38;5;66;03m# - https://zenn.dev/methane/articles/2023-mysql-collation (Japanese)\u001b[39;00m\n",
      "File \u001b[0;32m~/Work/miniconda3/envs/autogen/lib/python3.10/site-packages/pymysql/connections.py:954\u001b[0m, in \u001b[0;36mConnection._request_authentication\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m    953\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mwrite_packet(data)\n\u001b[0;32m--> 954\u001b[0m auth_packet \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_read_packet\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    956\u001b[0m \u001b[38;5;66;03m# if authentication method isn't accepted the first byte\u001b[39;00m\n\u001b[1;32m    957\u001b[0m \u001b[38;5;66;03m# will have the octet 254\u001b[39;00m\n",
      "File \u001b[0;32m~/Work/miniconda3/envs/autogen/lib/python3.10/site-packages/pymysql/connections.py:772\u001b[0m, in \u001b[0;36mConnection._read_packet\u001b[0;34m(self, packet_type)\u001b[0m\n\u001b[1;32m    771\u001b[0m         \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_result\u001b[38;5;241m.\u001b[39munbuffered_active \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mFalse\u001b[39;00m\n\u001b[0;32m--> 772\u001b[0m     \u001b[43mpacket\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mraise_for_error\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    773\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m packet\n",
      "File \u001b[0;32m~/Work/miniconda3/envs/autogen/lib/python3.10/site-packages/pymysql/protocol.py:221\u001b[0m, in \u001b[0;36mMysqlPacket.raise_for_error\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m    220\u001b[0m     \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124merrno =\u001b[39m\u001b[38;5;124m\"\u001b[39m, errno)\n\u001b[0;32m--> 221\u001b[0m \u001b[43merr\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mraise_mysql_exception\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_data\u001b[49m\u001b[43m)\u001b[49m\n",
      "File \u001b[0;32m~/Work/miniconda3/envs/autogen/lib/python3.10/site-packages/pymysql/err.py:143\u001b[0m, in \u001b[0;36mraise_mysql_exception\u001b[0;34m(data)\u001b[0m\n\u001b[1;32m    142\u001b[0m     errorclass \u001b[38;5;241m=\u001b[39m InternalError \u001b[38;5;28;01mif\u001b[39;00m errno \u001b[38;5;241m<\u001b[39m \u001b[38;5;241m1000\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m OperationalError\n\u001b[0;32m--> 143\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m errorclass(errno, errval)\n",
      "\u001b[0;31mOperationalError\u001b[0m: (1105, 'Connections using insecure transport are prohibited. See https://docs.pingcap.com/tidbcloud/secure-connections-to-serverless-tier-clusters')",
      "\nThe above exception was the direct cause of the following exception:\n",
      "\u001b[0;31mOperationalError\u001b[0m                          Traceback (most recent call last)",
      "Cell \u001b[0;32mIn[9], line 15\u001b[0m\n\u001b[1;32m     13\u001b[0m query \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mselect provider, region, region_name, node_type, node_size, computer_price, storage_price, iops_price, is_valid as is_public from dedicated_node_price where node_size != \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m2 vCPU, 8 GiB (Beta)\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m;\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m     14\u001b[0m \u001b[38;5;66;03m# 执行查询并将结果保存到 DataFrame\u001b[39;00m\n\u001b[0;32m---> 15\u001b[0m pc_cluster_pring_df \u001b[38;5;241m=\u001b[39m \u001b[43mpd\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mread_sql\u001b[49m\u001b[43m(\u001b[49m\u001b[43mquery\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mengine\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m     16\u001b[0m pc_cluster_pring_df\n",
      "File \u001b[0;32m~/Work/miniconda3/envs/autogen/lib/python3.10/site-packages/pandas/io/sql.py:633\u001b[0m, in \u001b[0;36mread_sql\u001b[0;34m(sql, con, index_col, coerce_float, params, parse_dates, columns, chunksize, dtype_backend, dtype)\u001b[0m\n\u001b[1;32m    630\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m dtype_backend \u001b[38;5;129;01mis\u001b[39;00m lib\u001b[38;5;241m.\u001b[39mno_default:\n\u001b[1;32m    631\u001b[0m     dtype_backend \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mnumpy\u001b[39m\u001b[38;5;124m\"\u001b[39m  \u001b[38;5;66;03m# type: ignore[assignment]\u001b[39;00m\n\u001b[0;32m--> 633\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m \u001b[43mpandasSQL_builder\u001b[49m\u001b[43m(\u001b[49m\u001b[43mcon\u001b[49m\u001b[43m)\u001b[49m \u001b[38;5;28;01mas\u001b[39;00m pandas_sql:\n\u001b[1;32m    634\u001b[0m     \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(pandas_sql, SQLiteDatabase):\n\u001b[1;32m    635\u001b[0m         \u001b[38;5;28;01mreturn\u001b[39;00m pandas_sql\u001b[38;5;241m.\u001b[39mread_query(\n\u001b[1;32m    636\u001b[0m             sql,\n\u001b[1;32m    637\u001b[0m             index_col\u001b[38;5;241m=\u001b[39mindex_col,\n\u001b[0;32m   (...)\u001b[0m\n\u001b[1;32m    643\u001b[0m             dtype\u001b[38;5;241m=\u001b[39mdtype,\n\u001b[1;32m    644\u001b[0m         )\n",
      "File \u001b[0;32m~/Work/miniconda3/envs/autogen/lib/python3.10/site-packages/pandas/io/sql.py:832\u001b[0m, in \u001b[0;36mpandasSQL_builder\u001b[0;34m(con, schema, need_transaction)\u001b[0m\n\u001b[1;32m    829\u001b[0m     \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mImportError\u001b[39;00m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mUsing URI string without sqlalchemy installed.\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m    831\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m sqlalchemy \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(con, (\u001b[38;5;28mstr\u001b[39m, sqlalchemy\u001b[38;5;241m.\u001b[39mengine\u001b[38;5;241m.\u001b[39mConnectable)):\n\u001b[0;32m--> 832\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mSQLDatabase\u001b[49m\u001b[43m(\u001b[49m\u001b[43mcon\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mschema\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mneed_transaction\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    834\u001b[0m warnings\u001b[38;5;241m.\u001b[39mwarn(\n\u001b[1;32m    835\u001b[0m     \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mpandas only supports SQLAlchemy connectable (engine/connection) or \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m    836\u001b[0m     \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdatabase string URI or sqlite3 DBAPI2 connection. Other DBAPI2 \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m   (...)\u001b[0m\n\u001b[1;32m    839\u001b[0m     stacklevel\u001b[38;5;241m=\u001b[39mfind_stack_level(),\n\u001b[1;32m    840\u001b[0m )\n\u001b[1;32m    841\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m SQLiteDatabase(con)\n",
      "File \u001b[0;32m~/Work/miniconda3/envs/autogen/lib/python3.10/site-packages/pandas/io/sql.py:1539\u001b[0m, in \u001b[0;36mSQLDatabase.__init__\u001b[0;34m(self, con, schema, need_transaction)\u001b[0m\n\u001b[1;32m   1537\u001b[0m     \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mexit_stack\u001b[38;5;241m.\u001b[39mcallback(con\u001b[38;5;241m.\u001b[39mdispose)\n\u001b[1;32m   1538\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(con, Engine):\n\u001b[0;32m-> 1539\u001b[0m     con \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mexit_stack\u001b[38;5;241m.\u001b[39menter_context(\u001b[43mcon\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconnect\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m)\n\u001b[1;32m   1540\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m need_transaction \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m con\u001b[38;5;241m.\u001b[39min_transaction():\n\u001b[1;32m   1541\u001b[0m     \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mexit_stack\u001b[38;5;241m.\u001b[39menter_context(con\u001b[38;5;241m.\u001b[39mbegin())\n",
      "File \u001b[0;32m~/Work/miniconda3/envs/autogen/lib/python3.10/site-packages/sqlalchemy/engine/base.py:3279\u001b[0m, in \u001b[0;36mEngine.connect\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m   3256\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mconnect\u001b[39m(\u001b[38;5;28mself\u001b[39m) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Connection:\n\u001b[1;32m   3257\u001b[0m \u001b[38;5;250m    \u001b[39m\u001b[38;5;124;03m\"\"\"Return a new :class:`_engine.Connection` object.\u001b[39;00m\n\u001b[1;32m   3258\u001b[0m \n\u001b[1;32m   3259\u001b[0m \u001b[38;5;124;03m    The :class:`_engine.Connection` acts as a Python context manager, so\u001b[39;00m\n\u001b[0;32m   (...)\u001b[0m\n\u001b[1;32m   3276\u001b[0m \n\u001b[1;32m   3277\u001b[0m \u001b[38;5;124;03m    \"\"\"\u001b[39;00m\n\u001b[0;32m-> 3279\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_connection_cls\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m)\u001b[49m\n",
      "File \u001b[0;32m~/Work/miniconda3/envs/autogen/lib/python3.10/site-packages/sqlalchemy/engine/base.py:147\u001b[0m, in \u001b[0;36mConnection.__init__\u001b[0;34m(self, engine, connection, _has_events, _allow_revalidate, _allow_autobegin)\u001b[0m\n\u001b[1;32m    145\u001b[0m         \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_dbapi_connection \u001b[38;5;241m=\u001b[39m engine\u001b[38;5;241m.\u001b[39mraw_connection()\n\u001b[1;32m    146\u001b[0m     \u001b[38;5;28;01mexcept\u001b[39;00m dialect\u001b[38;5;241m.\u001b[39mloaded_dbapi\u001b[38;5;241m.\u001b[39mError \u001b[38;5;28;01mas\u001b[39;00m err:\n\u001b[0;32m--> 147\u001b[0m         \u001b[43mConnection\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_handle_dbapi_exception_noconnection\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m    148\u001b[0m \u001b[43m            \u001b[49m\u001b[43merr\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdialect\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mengine\u001b[49m\n\u001b[1;32m    149\u001b[0m \u001b[43m        \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    150\u001b[0m         \u001b[38;5;28;01mraise\u001b[39;00m\n\u001b[1;32m    151\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n",
      "File \u001b[0;32m~/Work/miniconda3/envs/autogen/lib/python3.10/site-packages/sqlalchemy/engine/base.py:2443\u001b[0m, in \u001b[0;36mConnection._handle_dbapi_exception_noconnection\u001b[0;34m(cls, e, dialect, engine, is_disconnect, invalidate_pool_on_disconnect, is_pre_ping)\u001b[0m\n\u001b[1;32m   2441\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m should_wrap:\n\u001b[1;32m   2442\u001b[0m     \u001b[38;5;28;01massert\u001b[39;00m sqlalchemy_exception \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[0;32m-> 2443\u001b[0m     \u001b[38;5;28;01mraise\u001b[39;00m sqlalchemy_exception\u001b[38;5;241m.\u001b[39mwith_traceback(exc_info[\u001b[38;5;241m2\u001b[39m]) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01me\u001b[39;00m\n\u001b[1;32m   2444\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m   2445\u001b[0m     \u001b[38;5;28;01massert\u001b[39;00m exc_info[\u001b[38;5;241m1\u001b[39m] \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n",
      "File \u001b[0;32m~/Work/miniconda3/envs/autogen/lib/python3.10/site-packages/sqlalchemy/engine/base.py:145\u001b[0m, in \u001b[0;36mConnection.__init__\u001b[0;34m(self, engine, connection, _has_events, _allow_revalidate, _allow_autobegin)\u001b[0m\n\u001b[1;32m    143\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m connection \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m    144\u001b[0m     \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 145\u001b[0m         \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_dbapi_connection \u001b[38;5;241m=\u001b[39m \u001b[43mengine\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mraw_connection\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    146\u001b[0m     \u001b[38;5;28;01mexcept\u001b[39;00m dialect\u001b[38;5;241m.\u001b[39mloaded_dbapi\u001b[38;5;241m.\u001b[39mError \u001b[38;5;28;01mas\u001b[39;00m err:\n\u001b[1;32m    147\u001b[0m         Connection\u001b[38;5;241m.\u001b[39m_handle_dbapi_exception_noconnection(\n\u001b[1;32m    148\u001b[0m             err, dialect, engine\n\u001b[1;32m    149\u001b[0m         )\n",
      "File \u001b[0;32m~/Work/miniconda3/envs/autogen/lib/python3.10/site-packages/sqlalchemy/engine/base.py:3303\u001b[0m, in \u001b[0;36mEngine.raw_connection\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m   3281\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mraw_connection\u001b[39m(\u001b[38;5;28mself\u001b[39m) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m PoolProxiedConnection:\n\u001b[1;32m   3282\u001b[0m \u001b[38;5;250m    \u001b[39m\u001b[38;5;124;03m\"\"\"Return a \"raw\" DBAPI connection from the connection pool.\u001b[39;00m\n\u001b[1;32m   3283\u001b[0m \n\u001b[1;32m   3284\u001b[0m \u001b[38;5;124;03m    The returned object is a proxied version of the DBAPI\u001b[39;00m\n\u001b[0;32m   (...)\u001b[0m\n\u001b[1;32m   3301\u001b[0m \n\u001b[1;32m   3302\u001b[0m \u001b[38;5;124;03m    \"\"\"\u001b[39;00m\n\u001b[0;32m-> 3303\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mpool\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconnect\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n",
      "File \u001b[0;32m~/Work/miniconda3/envs/autogen/lib/python3.10/site-packages/sqlalchemy/pool/base.py:449\u001b[0m, in \u001b[0;36mPool.connect\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m    441\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mconnect\u001b[39m(\u001b[38;5;28mself\u001b[39m) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m PoolProxiedConnection:\n\u001b[1;32m    442\u001b[0m \u001b[38;5;250m    \u001b[39m\u001b[38;5;124;03m\"\"\"Return a DBAPI connection from the pool.\u001b[39;00m\n\u001b[1;32m    443\u001b[0m \n\u001b[1;32m    444\u001b[0m \u001b[38;5;124;03m    The connection is instrumented such that when its\u001b[39;00m\n\u001b[0;32m   (...)\u001b[0m\n\u001b[1;32m    447\u001b[0m \n\u001b[1;32m    448\u001b[0m \u001b[38;5;124;03m    \"\"\"\u001b[39;00m\n\u001b[0;32m--> 449\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43m_ConnectionFairy\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_checkout\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m)\u001b[49m\n",
      "File \u001b[0;32m~/Work/miniconda3/envs/autogen/lib/python3.10/site-packages/sqlalchemy/pool/base.py:1263\u001b[0m, in \u001b[0;36m_ConnectionFairy._checkout\u001b[0;34m(cls, pool, threadconns, fairy)\u001b[0m\n\u001b[1;32m   1255\u001b[0m \u001b[38;5;129m@classmethod\u001b[39m\n\u001b[1;32m   1256\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_checkout\u001b[39m(\n\u001b[1;32m   1257\u001b[0m     \u001b[38;5;28mcls\u001b[39m,\n\u001b[0;32m   (...)\u001b[0m\n\u001b[1;32m   1260\u001b[0m     fairy: Optional[_ConnectionFairy] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[1;32m   1261\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m _ConnectionFairy:\n\u001b[1;32m   1262\u001b[0m     \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m fairy:\n\u001b[0;32m-> 1263\u001b[0m         fairy \u001b[38;5;241m=\u001b[39m \u001b[43m_ConnectionRecord\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcheckout\u001b[49m\u001b[43m(\u001b[49m\u001b[43mpool\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m   1265\u001b[0m         \u001b[38;5;28;01mif\u001b[39;00m threadconns \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m   1266\u001b[0m             threadconns\u001b[38;5;241m.\u001b[39mcurrent \u001b[38;5;241m=\u001b[39m weakref\u001b[38;5;241m.\u001b[39mref(fairy)\n",
      "File \u001b[0;32m~/Work/miniconda3/envs/autogen/lib/python3.10/site-packages/sqlalchemy/pool/base.py:712\u001b[0m, in \u001b[0;36m_ConnectionRecord.checkout\u001b[0;34m(cls, pool)\u001b[0m\n\u001b[1;32m    710\u001b[0m     rec \u001b[38;5;241m=\u001b[39m cast(_ConnectionRecord, pool\u001b[38;5;241m.\u001b[39m_do_get())\n\u001b[1;32m    711\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m--> 712\u001b[0m     rec \u001b[38;5;241m=\u001b[39m \u001b[43mpool\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_do_get\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    714\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m    715\u001b[0m     dbapi_connection \u001b[38;5;241m=\u001b[39m rec\u001b[38;5;241m.\u001b[39mget_connection()\n",
      "File \u001b[0;32m~/Work/miniconda3/envs/autogen/lib/python3.10/site-packages/sqlalchemy/pool/impl.py:179\u001b[0m, in \u001b[0;36mQueuePool._do_get\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m    177\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_create_connection()\n\u001b[1;32m    178\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m:\n\u001b[0;32m--> 179\u001b[0m     \u001b[38;5;28;01mwith\u001b[39;00m util\u001b[38;5;241m.\u001b[39msafe_reraise():\n\u001b[1;32m    180\u001b[0m         \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_dec_overflow()\n\u001b[1;32m    181\u001b[0m     \u001b[38;5;28;01mraise\u001b[39;00m\n",
      "File \u001b[0;32m~/Work/miniconda3/envs/autogen/lib/python3.10/site-packages/sqlalchemy/util/langhelpers.py:146\u001b[0m, in \u001b[0;36msafe_reraise.__exit__\u001b[0;34m(self, type_, value, traceback)\u001b[0m\n\u001b[1;32m    144\u001b[0m     \u001b[38;5;28;01massert\u001b[39;00m exc_value \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m    145\u001b[0m     \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_exc_info \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m  \u001b[38;5;66;03m# remove potential circular references\u001b[39;00m\n\u001b[0;32m--> 146\u001b[0m     \u001b[38;5;28;01mraise\u001b[39;00m exc_value\u001b[38;5;241m.\u001b[39mwith_traceback(exc_tb)\n\u001b[1;32m    147\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m    148\u001b[0m     \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_exc_info \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m  \u001b[38;5;66;03m# remove potential circular references\u001b[39;00m\n",
      "File \u001b[0;32m~/Work/miniconda3/envs/autogen/lib/python3.10/site-packages/sqlalchemy/pool/impl.py:177\u001b[0m, in \u001b[0;36mQueuePool._do_get\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m    175\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_inc_overflow():\n\u001b[1;32m    176\u001b[0m     \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 177\u001b[0m         \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_create_connection\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    178\u001b[0m     \u001b[38;5;28;01mexcept\u001b[39;00m:\n\u001b[1;32m    179\u001b[0m         \u001b[38;5;28;01mwith\u001b[39;00m util\u001b[38;5;241m.\u001b[39msafe_reraise():\n",
      "File \u001b[0;32m~/Work/miniconda3/envs/autogen/lib/python3.10/site-packages/sqlalchemy/pool/base.py:390\u001b[0m, in \u001b[0;36mPool._create_connection\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m    387\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_create_connection\u001b[39m(\u001b[38;5;28mself\u001b[39m) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m ConnectionPoolEntry:\n\u001b[1;32m    388\u001b[0m \u001b[38;5;250m    \u001b[39m\u001b[38;5;124;03m\"\"\"Called by subclasses to create a new ConnectionRecord.\"\"\"\u001b[39;00m\n\u001b[0;32m--> 390\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43m_ConnectionRecord\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m)\u001b[49m\n",
      "File \u001b[0;32m~/Work/miniconda3/envs/autogen/lib/python3.10/site-packages/sqlalchemy/pool/base.py:674\u001b[0m, in \u001b[0;36m_ConnectionRecord.__init__\u001b[0;34m(self, pool, connect)\u001b[0m\n\u001b[1;32m    672\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m__pool \u001b[38;5;241m=\u001b[39m pool\n\u001b[1;32m    673\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m connect:\n\u001b[0;32m--> 674\u001b[0m     \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m__connect\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    675\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mfinalize_callback \u001b[38;5;241m=\u001b[39m deque()\n",
      "File \u001b[0;32m~/Work/miniconda3/envs/autogen/lib/python3.10/site-packages/sqlalchemy/pool/base.py:900\u001b[0m, in \u001b[0;36m_ConnectionRecord.__connect\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m    898\u001b[0m     \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mfresh \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mTrue\u001b[39;00m\n\u001b[1;32m    899\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mBaseException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[0;32m--> 900\u001b[0m     \u001b[38;5;28;01mwith\u001b[39;00m util\u001b[38;5;241m.\u001b[39msafe_reraise():\n\u001b[1;32m    901\u001b[0m         pool\u001b[38;5;241m.\u001b[39mlogger\u001b[38;5;241m.\u001b[39mdebug(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mError on connect(): \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m\"\u001b[39m, e)\n\u001b[1;32m    902\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m    903\u001b[0m     \u001b[38;5;66;03m# in SQLAlchemy 1.4 the first_connect event is not used by\u001b[39;00m\n\u001b[1;32m    904\u001b[0m     \u001b[38;5;66;03m# the engine, so this will usually not be set\u001b[39;00m\n",
      "File \u001b[0;32m~/Work/miniconda3/envs/autogen/lib/python3.10/site-packages/sqlalchemy/util/langhelpers.py:146\u001b[0m, in \u001b[0;36msafe_reraise.__exit__\u001b[0;34m(self, type_, value, traceback)\u001b[0m\n\u001b[1;32m    144\u001b[0m     \u001b[38;5;28;01massert\u001b[39;00m exc_value \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m    145\u001b[0m     \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_exc_info \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m  \u001b[38;5;66;03m# remove potential circular references\u001b[39;00m\n\u001b[0;32m--> 146\u001b[0m     \u001b[38;5;28;01mraise\u001b[39;00m exc_value\u001b[38;5;241m.\u001b[39mwith_traceback(exc_tb)\n\u001b[1;32m    147\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m    148\u001b[0m     \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_exc_info \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m  \u001b[38;5;66;03m# remove potential circular references\u001b[39;00m\n",
      "File \u001b[0;32m~/Work/miniconda3/envs/autogen/lib/python3.10/site-packages/sqlalchemy/pool/base.py:896\u001b[0m, in \u001b[0;36m_ConnectionRecord.__connect\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m    894\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m    895\u001b[0m     \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mstarttime \u001b[38;5;241m=\u001b[39m time\u001b[38;5;241m.\u001b[39mtime()\n\u001b[0;32m--> 896\u001b[0m     \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mdbapi_connection \u001b[38;5;241m=\u001b[39m connection \u001b[38;5;241m=\u001b[39m \u001b[43mpool\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_invoke_creator\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m    897\u001b[0m     pool\u001b[38;5;241m.\u001b[39mlogger\u001b[38;5;241m.\u001b[39mdebug(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mCreated new connection \u001b[39m\u001b[38;5;132;01m%r\u001b[39;00m\u001b[38;5;124m\"\u001b[39m, connection)\n\u001b[1;32m    898\u001b[0m     \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mfresh \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mTrue\u001b[39;00m\n",
      "File \u001b[0;32m~/Work/miniconda3/envs/autogen/lib/python3.10/site-packages/sqlalchemy/engine/create.py:643\u001b[0m, in \u001b[0;36mcreate_engine.<locals>.connect\u001b[0;34m(connection_record)\u001b[0m\n\u001b[1;32m    640\u001b[0m         \u001b[38;5;28;01mif\u001b[39;00m connection \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m    641\u001b[0m             \u001b[38;5;28;01mreturn\u001b[39;00m connection\n\u001b[0;32m--> 643\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mdialect\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconnect\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mcargs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mcparams\u001b[49m\u001b[43m)\u001b[49m\n",
      "File \u001b[0;32m~/Work/miniconda3/envs/autogen/lib/python3.10/site-packages/sqlalchemy/engine/default.py:616\u001b[0m, in \u001b[0;36mDefaultDialect.connect\u001b[0;34m(self, *cargs, **cparams)\u001b[0m\n\u001b[1;32m    614\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mconnect\u001b[39m(\u001b[38;5;28mself\u001b[39m, \u001b[38;5;241m*\u001b[39mcargs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mcparams):\n\u001b[1;32m    615\u001b[0m     \u001b[38;5;66;03m# inherits the docstring from interfaces.Dialect.connect\u001b[39;00m\n\u001b[0;32m--> 616\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mloaded_dbapi\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconnect\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mcargs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mcparams\u001b[49m\u001b[43m)\u001b[49m\n",
      "File \u001b[0;32m~/Work/miniconda3/envs/autogen/lib/python3.10/site-packages/pymysql/connections.py:358\u001b[0m, in \u001b[0;36mConnection.__init__\u001b[0;34m(self, user, password, host, database, unix_socket, port, charset, collation, sql_mode, read_default_file, conv, use_unicode, client_flag, cursorclass, init_command, connect_timeout, read_default_group, autocommit, local_infile, max_allowed_packet, defer_connect, auth_plugin_map, read_timeout, write_timeout, bind_address, binary_prefix, program_name, server_public_key, ssl, ssl_ca, ssl_cert, ssl_disabled, ssl_key, ssl_verify_cert, ssl_verify_identity, compress, named_pipe, passwd, db)\u001b[0m\n\u001b[1;32m    356\u001b[0m     \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_sock \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m    357\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m--> 358\u001b[0m     \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconnect\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n",
      "File \u001b[0;32m~/Work/miniconda3/envs/autogen/lib/python3.10/site-packages/pymysql/connections.py:664\u001b[0m, in \u001b[0;36mConnection.connect\u001b[0;34m(self, sock)\u001b[0m\n\u001b[1;32m    661\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_next_seq_id \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m0\u001b[39m\n\u001b[1;32m    663\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_get_server_information()\n\u001b[0;32m--> 664\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_request_authentication\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    666\u001b[0m \u001b[38;5;66;03m# Send \"SET NAMES\" query on init for:\u001b[39;00m\n\u001b[1;32m    667\u001b[0m \u001b[38;5;66;03m# - Ensure charaset (and collation) is set to the server.\u001b[39;00m\n\u001b[1;32m    668\u001b[0m \u001b[38;5;66;03m#   - collation_id in handshake packet may be ignored.\u001b[39;00m\n\u001b[0;32m   (...)\u001b[0m\n\u001b[1;32m    677\u001b[0m \u001b[38;5;66;03m# - https://github.com/wagtail/wagtail/issues/9477\u001b[39;00m\n\u001b[1;32m    678\u001b[0m \u001b[38;5;66;03m# - https://zenn.dev/methane/articles/2023-mysql-collation (Japanese)\u001b[39;00m\n\u001b[1;32m    679\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mset_character_set(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcharset, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcollation)\n",
      "File \u001b[0;32m~/Work/miniconda3/envs/autogen/lib/python3.10/site-packages/pymysql/connections.py:954\u001b[0m, in \u001b[0;36mConnection._request_authentication\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m    951\u001b[0m     data \u001b[38;5;241m+\u001b[39m\u001b[38;5;241m=\u001b[39m _lenenc_int(\u001b[38;5;28mlen\u001b[39m(connect_attrs)) \u001b[38;5;241m+\u001b[39m connect_attrs\n\u001b[1;32m    953\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mwrite_packet(data)\n\u001b[0;32m--> 954\u001b[0m auth_packet \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_read_packet\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    956\u001b[0m \u001b[38;5;66;03m# if authentication method isn't accepted the first byte\u001b[39;00m\n\u001b[1;32m    957\u001b[0m \u001b[38;5;66;03m# will have the octet 254\u001b[39;00m\n\u001b[1;32m    958\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m auth_packet\u001b[38;5;241m.\u001b[39mis_auth_switch_request():\n",
      "File \u001b[0;32m~/Work/miniconda3/envs/autogen/lib/python3.10/site-packages/pymysql/connections.py:772\u001b[0m, in \u001b[0;36mConnection._read_packet\u001b[0;34m(self, packet_type)\u001b[0m\n\u001b[1;32m    770\u001b[0m     \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_result \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_result\u001b[38;5;241m.\u001b[39munbuffered_active \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mTrue\u001b[39;00m:\n\u001b[1;32m    771\u001b[0m         \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_result\u001b[38;5;241m.\u001b[39munbuffered_active \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mFalse\u001b[39;00m\n\u001b[0;32m--> 772\u001b[0m     \u001b[43mpacket\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mraise_for_error\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    773\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m packet\n",
      "File \u001b[0;32m~/Work/miniconda3/envs/autogen/lib/python3.10/site-packages/pymysql/protocol.py:221\u001b[0m, in \u001b[0;36mMysqlPacket.raise_for_error\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m    219\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m DEBUG:\n\u001b[1;32m    220\u001b[0m     \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124merrno =\u001b[39m\u001b[38;5;124m\"\u001b[39m, errno)\n\u001b[0;32m--> 221\u001b[0m \u001b[43merr\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mraise_mysql_exception\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_data\u001b[49m\u001b[43m)\u001b[49m\n",
      "File \u001b[0;32m~/Work/miniconda3/envs/autogen/lib/python3.10/site-packages/pymysql/err.py:143\u001b[0m, in \u001b[0;36mraise_mysql_exception\u001b[0;34m(data)\u001b[0m\n\u001b[1;32m    141\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m errorclass \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m    142\u001b[0m     errorclass \u001b[38;5;241m=\u001b[39m InternalError \u001b[38;5;28;01mif\u001b[39;00m errno \u001b[38;5;241m<\u001b[39m \u001b[38;5;241m1000\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m OperationalError\n\u001b[0;32m--> 143\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m errorclass(errno, errval)\n",
      "\u001b[0;31mOperationalError\u001b[0m: (pymysql.err.OperationalError) (1105, 'Connections using insecure transport are prohibited. See https://docs.pingcap.com/tidbcloud/secure-connections-to-serverless-tier-clusters')\n(Background on this error at: https://sqlalche.me/e/20/e3q8)"
     ]
    }
   ],
   "source": [
    "from sqlalchemy import create_engine\n",
    "\n",
    "# 数据库参数\n",
    "username = 'VrZ2gT88Be1w1tS.root'\n",
    "password = 'RptuDt6C0D16Uy6s'  # 或者从安全的地方获取密码\n",
    "host = 'gateway01.ap-northeast-1.prod.aws.tidbcloud.com'\n",
    "port = 4000\n",
    "database = 'tidbcloud'\n",
    "ssl_ca = '/etc/ssl/cert.pem'\n",
    "# 创建数据库连接\n",
    "engine = create_engine(f\"mysql+pymysql://{username}:{password}@{host}:{port}/{database}?ssl_ca={ssl_ca}&ssl_verify_cert=true\")\n",
    "# SQL 查询\n",
    "query = \"select provider, region, region_name, node_type, node_size, computer_price, storage_price, iops_price, is_valid as is_public from dedicated_node_price where node_size != '2 vCPU, 8 GiB (Beta)';\"\n",
    "# 执行查询并将结果保存到 DataFrame\n",
    "pc_cluster_pring_df = pd.read_sql(query, engine)\n",
    "pc_cluster_pring_df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "只在 rdg_cluster_pricing_df 中：\n"
     ]
    },
    {
     "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>provider</th>\n",
       "      <th>region</th>\n",
       "      <th>region_name</th>\n",
       "      <th>node_type</th>\n",
       "      <th>node_size</th>\n",
       "      <th>is_public</th>\n",
       "      <th>computer_price</th>\n",
       "      <th>storage_price</th>\n",
       "      <th>iops_price</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "Empty DataFrame\n",
       "Columns: [provider, region, region_name, node_type, node_size, is_public, computer_price, storage_price, iops_price]\n",
       "Index: []"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 重命名带有 _x 后缀的列\n",
    "rename_columns = {\n",
    "    'computer_price_x': 'computer_price',\n",
    "    'storage_price_x': 'storage_price',\n",
    "    'iops_price_x': 'iops_price'\n",
    "}\n",
    "\n",
    "# 只在 pc_cluster_pring_df 中存在的组合\n",
    "only_in_pc = pc_cluster_pring_df.merge(rdg_cluster_pricing_df, on=['provider', 'region',  'region_name', 'node_type', 'node_size', 'is_public'], how='left', indicator=True)\n",
    "only_in_pc = only_in_pc[only_in_pc['_merge'] == 'left_only']\n",
    "only_in_pc = only_in_pc.rename(columns=rename_columns)\n",
    "\n",
    "\n",
    "# 只在 rdg_cluster_pricing_df 中存在的组合\n",
    "only_in_rdg = rdg_cluster_pricing_df.merge(pc_cluster_pring_df, on=['provider', 'region', 'region_name', 'node_type', 'node_size', 'is_public'], how='left', indicator=True)\n",
    "only_in_rdg = only_in_rdg[only_in_rdg['_merge'] == 'left_only']\n",
    "only_in_rdg = only_in_rdg.rename(columns=rename_columns)\n",
    "\n",
    "print(\"\\n只在 rdg_cluster_pricing_df 中：\")\n",
    "only_in_rdg[['provider', 'region', 'region_name', 'node_type', 'node_size', 'is_public', 'computer_price', 'storage_price', 'iops_price']]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "只在 pc_cluster_pring_df 中：\n"
     ]
    },
    {
     "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>provider</th>\n",
       "      <th>region</th>\n",
       "      <th>region_name</th>\n",
       "      <th>node_type</th>\n",
       "      <th>node_size</th>\n",
       "      <th>is_public</th>\n",
       "      <th>computer_price</th>\n",
       "      <th>storage_price</th>\n",
       "      <th>iops_price</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>72</th>\n",
       "      <td>gcp</td>\n",
       "      <td>us-east4</td>\n",
       "      <td>N.Virginia</td>\n",
       "      <td>tidb</td>\n",
       "      <td>4 vCPU, 16 GiB</td>\n",
       "      <td>0</td>\n",
       "      <td>0.5031</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>73</th>\n",
       "      <td>gcp</td>\n",
       "      <td>us-east4</td>\n",
       "      <td>N.Virginia</td>\n",
       "      <td>tidb</td>\n",
       "      <td>8 vCPU, 32 GiB</td>\n",
       "      <td>0</td>\n",
       "      <td>1.0062</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>74</th>\n",
       "      <td>gcp</td>\n",
       "      <td>us-east4</td>\n",
       "      <td>N.Virginia</td>\n",
       "      <td>tidb</td>\n",
       "      <td>16 vCPU, 32 GiB</td>\n",
       "      <td>0</td>\n",
       "      <td>1.7435</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75</th>\n",
       "      <td>gcp</td>\n",
       "      <td>us-east4</td>\n",
       "      <td>N.Virginia</td>\n",
       "      <td>tikv</td>\n",
       "      <td>4 vCPU, 16 GiB</td>\n",
       "      <td>0</td>\n",
       "      <td>0.5031</td>\n",
       "      <td>0.000256</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>76</th>\n",
       "      <td>gcp</td>\n",
       "      <td>us-east4</td>\n",
       "      <td>N.Virginia</td>\n",
       "      <td>tikv</td>\n",
       "      <td>8 vCPU, 64 GiB</td>\n",
       "      <td>0</td>\n",
       "      <td>1.3574</td>\n",
       "      <td>0.000256</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>77</th>\n",
       "      <td>gcp</td>\n",
       "      <td>us-east4</td>\n",
       "      <td>N.Virginia</td>\n",
       "      <td>tikv</td>\n",
       "      <td>8 vCPU, 32 GiB</td>\n",
       "      <td>0</td>\n",
       "      <td>1.0062</td>\n",
       "      <td>0.000256</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>78</th>\n",
       "      <td>gcp</td>\n",
       "      <td>us-east4</td>\n",
       "      <td>N.Virginia</td>\n",
       "      <td>tikv</td>\n",
       "      <td>16 vCPU, 64 GiB</td>\n",
       "      <td>0</td>\n",
       "      <td>2.0125</td>\n",
       "      <td>0.000256</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>79</th>\n",
       "      <td>gcp</td>\n",
       "      <td>us-east4</td>\n",
       "      <td>N.Virginia</td>\n",
       "      <td>tiflash</td>\n",
       "      <td>8 vCPU, 64 GiB</td>\n",
       "      <td>0</td>\n",
       "      <td>1.3574</td>\n",
       "      <td>0.000256</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>80</th>\n",
       "      <td>gcp</td>\n",
       "      <td>us-east4</td>\n",
       "      <td>N.Virginia</td>\n",
       "      <td>tiflash</td>\n",
       "      <td>16 vCPU, 128 GiB</td>\n",
       "      <td>0</td>\n",
       "      <td>2.7148</td>\n",
       "      <td>0.000256</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   provider    region region_name node_type         node_size  is_public  \\\n",
       "72      gcp  us-east4  N.Virginia      tidb    4 vCPU, 16 GiB          0   \n",
       "73      gcp  us-east4  N.Virginia      tidb    8 vCPU, 32 GiB          0   \n",
       "74      gcp  us-east4  N.Virginia      tidb   16 vCPU, 32 GiB          0   \n",
       "75      gcp  us-east4  N.Virginia      tikv    4 vCPU, 16 GiB          0   \n",
       "76      gcp  us-east4  N.Virginia      tikv    8 vCPU, 64 GiB          0   \n",
       "77      gcp  us-east4  N.Virginia      tikv    8 vCPU, 32 GiB          0   \n",
       "78      gcp  us-east4  N.Virginia      tikv   16 vCPU, 64 GiB          0   \n",
       "79      gcp  us-east4  N.Virginia   tiflash    8 vCPU, 64 GiB          0   \n",
       "80      gcp  us-east4  N.Virginia   tiflash  16 vCPU, 128 GiB          0   \n",
       "\n",
       "    computer_price  storage_price  iops_price  \n",
       "72          0.5031       0.000000         0.0  \n",
       "73          1.0062       0.000000         0.0  \n",
       "74          1.7435       0.000000         0.0  \n",
       "75          0.5031       0.000256         0.0  \n",
       "76          1.3574       0.000256         0.0  \n",
       "77          1.0062       0.000256         0.0  \n",
       "78          2.0125       0.000256         0.0  \n",
       "79          1.3574       0.000256         0.0  \n",
       "80          2.7148       0.000256         0.0  "
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 打印结果\n",
    "print(\"只在 pc_cluster_pring_df 中：\")\n",
    "only_in_pc[['provider', 'region', 'region_name', 'node_type', 'node_size', 'is_public', 'computer_price', 'storage_price', 'iops_price']]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "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>provider</th>\n",
       "      <th>region</th>\n",
       "      <th>region_name</th>\n",
       "      <th>node_type</th>\n",
       "      <th>node_size</th>\n",
       "      <th>is_public</th>\n",
       "      <th>computer_price_error</th>\n",
       "      <th>iops_price_error</th>\n",
       "      <th>storage_price_error</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>aws</td>\n",
       "      <td>ap-northeast-1</td>\n",
       "      <td>Tokyo</td>\n",
       "      <td>tiflash</td>\n",
       "      <td>8 vCPU, 64 GiB</td>\n",
       "      <td>1</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000585</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>aws</td>\n",
       "      <td>ap-northeast-1</td>\n",
       "      <td>Tokyo</td>\n",
       "      <td>tikv</td>\n",
       "      <td>4 vCPU, 16 GiB</td>\n",
       "      <td>1</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000325</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>aws</td>\n",
       "      <td>ap-northeast-1</td>\n",
       "      <td>Tokyo</td>\n",
       "      <td>tikv</td>\n",
       "      <td>8 vCPU, 32 GiB</td>\n",
       "      <td>1</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000585</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>aws</td>\n",
       "      <td>ap-northeast-1</td>\n",
       "      <td>Tokyo</td>\n",
       "      <td>tikv</td>\n",
       "      <td>8 vCPU, 64 GiB</td>\n",
       "      <td>1</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000585</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>aws</td>\n",
       "      <td>ap-northeast-2</td>\n",
       "      <td>Seoul</td>\n",
       "      <td>tiflash</td>\n",
       "      <td>8 vCPU, 64 GiB</td>\n",
       "      <td>1</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000558</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>21</th>\n",
       "      <td>aws</td>\n",
       "      <td>ap-northeast-2</td>\n",
       "      <td>Seoul</td>\n",
       "      <td>tikv</td>\n",
       "      <td>4 vCPU, 16 GiB</td>\n",
       "      <td>1</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000310</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>22</th>\n",
       "      <td>aws</td>\n",
       "      <td>ap-northeast-2</td>\n",
       "      <td>Seoul</td>\n",
       "      <td>tikv</td>\n",
       "      <td>8 vCPU, 32 GiB</td>\n",
       "      <td>1</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000558</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>23</th>\n",
       "      <td>aws</td>\n",
       "      <td>ap-northeast-2</td>\n",
       "      <td>Seoul</td>\n",
       "      <td>tikv</td>\n",
       "      <td>8 vCPU, 64 GiB</td>\n",
       "      <td>1</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000558</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>33</th>\n",
       "      <td>aws</td>\n",
       "      <td>ap-south-1</td>\n",
       "      <td>Mumbai</td>\n",
       "      <td>tikv</td>\n",
       "      <td>4 vCPU, 16 GiB</td>\n",
       "      <td>1</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000315</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>42</th>\n",
       "      <td>aws</td>\n",
       "      <td>ap-southeast-1</td>\n",
       "      <td>Singapore</td>\n",
       "      <td>tiflash</td>\n",
       "      <td>8 vCPU, 64 GiB</td>\n",
       "      <td>1</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000585</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>45</th>\n",
       "      <td>aws</td>\n",
       "      <td>ap-southeast-1</td>\n",
       "      <td>Singapore</td>\n",
       "      <td>tikv</td>\n",
       "      <td>4 vCPU, 16 GiB</td>\n",
       "      <td>1</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000325</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>46</th>\n",
       "      <td>aws</td>\n",
       "      <td>ap-southeast-1</td>\n",
       "      <td>Singapore</td>\n",
       "      <td>tikv</td>\n",
       "      <td>8 vCPU, 32 GiB</td>\n",
       "      <td>1</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000585</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>47</th>\n",
       "      <td>aws</td>\n",
       "      <td>ap-southeast-1</td>\n",
       "      <td>Singapore</td>\n",
       "      <td>tikv</td>\n",
       "      <td>8 vCPU, 64 GiB</td>\n",
       "      <td>1</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000585</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>74</th>\n",
       "      <td>aws</td>\n",
       "      <td>eu-central-1</td>\n",
       "      <td>Frankfurt</td>\n",
       "      <td>tiflash</td>\n",
       "      <td>8 vCPU, 64 GiB</td>\n",
       "      <td>1</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000585</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>77</th>\n",
       "      <td>aws</td>\n",
       "      <td>eu-central-1</td>\n",
       "      <td>Frankfurt</td>\n",
       "      <td>tikv</td>\n",
       "      <td>4 vCPU, 16 GiB</td>\n",
       "      <td>1</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000325</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>78</th>\n",
       "      <td>aws</td>\n",
       "      <td>eu-central-1</td>\n",
       "      <td>Frankfurt</td>\n",
       "      <td>tikv</td>\n",
       "      <td>8 vCPU, 32 GiB</td>\n",
       "      <td>1</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000585</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>79</th>\n",
       "      <td>aws</td>\n",
       "      <td>eu-central-1</td>\n",
       "      <td>Frankfurt</td>\n",
       "      <td>tikv</td>\n",
       "      <td>8 vCPU, 64 GiB</td>\n",
       "      <td>1</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000585</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>97</th>\n",
       "      <td>aws</td>\n",
       "      <td>us-east-1</td>\n",
       "      <td>N.Virginia</td>\n",
       "      <td>tiflash</td>\n",
       "      <td>8 vCPU, 64 GiB</td>\n",
       "      <td>1</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000486</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>100</th>\n",
       "      <td>aws</td>\n",
       "      <td>us-east-1</td>\n",
       "      <td>N.Virginia</td>\n",
       "      <td>tikv</td>\n",
       "      <td>4 vCPU, 16 GiB</td>\n",
       "      <td>1</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000270</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>101</th>\n",
       "      <td>aws</td>\n",
       "      <td>us-east-1</td>\n",
       "      <td>N.Virginia</td>\n",
       "      <td>tikv</td>\n",
       "      <td>8 vCPU, 32 GiB</td>\n",
       "      <td>1</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000486</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>102</th>\n",
       "      <td>aws</td>\n",
       "      <td>us-east-1</td>\n",
       "      <td>N.Virginia</td>\n",
       "      <td>tikv</td>\n",
       "      <td>8 vCPU, 64 GiB</td>\n",
       "      <td>1</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000486</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>109</th>\n",
       "      <td>aws</td>\n",
       "      <td>us-west-2</td>\n",
       "      <td>Oregon</td>\n",
       "      <td>tiflash</td>\n",
       "      <td>8 vCPU, 64 GiB</td>\n",
       "      <td>1</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000486</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>112</th>\n",
       "      <td>aws</td>\n",
       "      <td>us-west-2</td>\n",
       "      <td>Oregon</td>\n",
       "      <td>tikv</td>\n",
       "      <td>4 vCPU, 16 GiB</td>\n",
       "      <td>1</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000270</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>113</th>\n",
       "      <td>aws</td>\n",
       "      <td>us-west-2</td>\n",
       "      <td>Oregon</td>\n",
       "      <td>tikv</td>\n",
       "      <td>8 vCPU, 32 GiB</td>\n",
       "      <td>1</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000486</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>114</th>\n",
       "      <td>aws</td>\n",
       "      <td>us-west-2</td>\n",
       "      <td>Oregon</td>\n",
       "      <td>tikv</td>\n",
       "      <td>8 vCPU, 64 GiB</td>\n",
       "      <td>1</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000486</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    provider          region region_name node_type       node_size  is_public  \\\n",
       "6        aws  ap-northeast-1       Tokyo   tiflash  8 vCPU, 64 GiB          1   \n",
       "9        aws  ap-northeast-1       Tokyo      tikv  4 vCPU, 16 GiB          1   \n",
       "10       aws  ap-northeast-1       Tokyo      tikv  8 vCPU, 32 GiB          1   \n",
       "11       aws  ap-northeast-1       Tokyo      tikv  8 vCPU, 64 GiB          1   \n",
       "18       aws  ap-northeast-2       Seoul   tiflash  8 vCPU, 64 GiB          1   \n",
       "21       aws  ap-northeast-2       Seoul      tikv  4 vCPU, 16 GiB          1   \n",
       "22       aws  ap-northeast-2       Seoul      tikv  8 vCPU, 32 GiB          1   \n",
       "23       aws  ap-northeast-2       Seoul      tikv  8 vCPU, 64 GiB          1   \n",
       "33       aws      ap-south-1      Mumbai      tikv  4 vCPU, 16 GiB          1   \n",
       "42       aws  ap-southeast-1   Singapore   tiflash  8 vCPU, 64 GiB          1   \n",
       "45       aws  ap-southeast-1   Singapore      tikv  4 vCPU, 16 GiB          1   \n",
       "46       aws  ap-southeast-1   Singapore      tikv  8 vCPU, 32 GiB          1   \n",
       "47       aws  ap-southeast-1   Singapore      tikv  8 vCPU, 64 GiB          1   \n",
       "74       aws    eu-central-1   Frankfurt   tiflash  8 vCPU, 64 GiB          1   \n",
       "77       aws    eu-central-1   Frankfurt      tikv  4 vCPU, 16 GiB          1   \n",
       "78       aws    eu-central-1   Frankfurt      tikv  8 vCPU, 32 GiB          1   \n",
       "79       aws    eu-central-1   Frankfurt      tikv  8 vCPU, 64 GiB          1   \n",
       "97       aws       us-east-1  N.Virginia   tiflash  8 vCPU, 64 GiB          1   \n",
       "100      aws       us-east-1  N.Virginia      tikv  4 vCPU, 16 GiB          1   \n",
       "101      aws       us-east-1  N.Virginia      tikv  8 vCPU, 32 GiB          1   \n",
       "102      aws       us-east-1  N.Virginia      tikv  8 vCPU, 64 GiB          1   \n",
       "109      aws       us-west-2      Oregon   tiflash  8 vCPU, 64 GiB          1   \n",
       "112      aws       us-west-2      Oregon      tikv  4 vCPU, 16 GiB          1   \n",
       "113      aws       us-west-2      Oregon      tikv  8 vCPU, 32 GiB          1   \n",
       "114      aws       us-west-2      Oregon      tikv  8 vCPU, 64 GiB          1   \n",
       "\n",
       "     computer_price_error  iops_price_error  storage_price_error  \n",
       "6                     0.0          0.000585                  0.0  \n",
       "9                     0.0          0.000325                  0.0  \n",
       "10                    0.0          0.000585                  0.0  \n",
       "11                    0.0          0.000585                  0.0  \n",
       "18                    0.0          0.000558                  0.0  \n",
       "21                    0.0          0.000310                  0.0  \n",
       "22                    0.0          0.000558                  0.0  \n",
       "23                    0.0          0.000558                  0.0  \n",
       "33                    0.0          0.000315                  0.0  \n",
       "42                    0.0          0.000585                  0.0  \n",
       "45                    0.0          0.000325                  0.0  \n",
       "46                    0.0          0.000585                  0.0  \n",
       "47                    0.0          0.000585                  0.0  \n",
       "74                    0.0          0.000585                  0.0  \n",
       "77                    0.0          0.000325                  0.0  \n",
       "78                    0.0          0.000585                  0.0  \n",
       "79                    0.0          0.000585                  0.0  \n",
       "97                    0.0          0.000486                  0.0  \n",
       "100                   0.0          0.000270                  0.0  \n",
       "101                   0.0          0.000486                  0.0  \n",
       "102                   0.0          0.000486                  0.0  \n",
       "109                   0.0          0.000486                  0.0  \n",
       "112                   0.0          0.000270                  0.0  \n",
       "113                   0.0          0.000486                  0.0  \n",
       "114                   0.0          0.000486                  0.0  "
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 合并 DataFrame\n",
    "cluster_pricing_error_df = pd.merge(rdg_cluster_pricing_df, pc_cluster_pring_df, on=['provider', 'region',  'region_name', 'node_type', 'node_size', 'is_public'], suffixes=('_rdg', '_pc'))\n",
    "\n",
    "# 计算价格误差\n",
    "cluster_pricing_error_df['computer_price_error'] = abs(cluster_pricing_error_df['computer_price_rdg'] - cluster_pricing_error_df['computer_price_pc'])\n",
    "cluster_pricing_error_df['iops_price_error'] = abs(cluster_pricing_error_df['iops_price_rdg'] - cluster_pricing_error_df['iops_price_pc'])\n",
    "cluster_pricing_error_df['storage_price_error'] = abs(cluster_pricing_error_df['storage_price_rdg'] - cluster_pricing_error_df['storage_price_pc'])\n",
    "\n",
    "cluster_pricing_error_filtered_df = cluster_pricing_error_df[(cluster_pricing_error_df['computer_price_error'] != 0) | (cluster_pricing_error_df['iops_price_error'] != 0) | (cluster_pricing_error_df['storage_price_error'] != 0)]\n",
    "\n",
    "# 选择相关列\n",
    "columns_to_display = ['provider', 'region',  'region_name', 'node_type', 'node_size', 'is_public', 'computer_price_error', 'iops_price_error', 'storage_price_error']\n",
    "cluster_pricing_error_result_df = cluster_pricing_error_filtered_df[columns_to_display]\n",
    "\n",
    "# 打印结果\n",
    "cluster_pricing_error_result_df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "from decimal import Decimal\n",
    "# 选定的列\n",
    "columns = ['provider', 'region', 'region_name', 'node_type', 'node_size', 'computer_price', 'storage_price', 'iops_price']\n",
    "\n",
    "# 目标数据库表名\n",
    "table_name = 'dedicated_node_price'\n",
    "\n",
    "def format_value(value):\n",
    "    if isinstance(value, str):\n",
    "        return f\"'{value}'\"\n",
    "    elif isinstance(value, (int, float, Decimal)):\n",
    "        return str(value)\n",
    "    else:\n",
    "        return f\"'{str(value)}'\"\n",
    "\n",
    "# 构建 SQL 插入语句\n",
    "sql_statements = []\n",
    "for index, row in only_in_rdg[columns].iterrows():\n",
    "    values = [format_value(row[col]) for col in columns]\n",
    "    values.append('0')  # 假设你想要添加的额外值是数值 0\n",
    "    values_str = ', '.join(values)\n",
    "    sql = f\"INSERT INTO {table_name} ({', '.join(columns + ['is_valid'])}) VALUES ({values_str});\"\n",
    "    sql_statements.append(sql)\n",
    "\n",
    "# 打印 SQL 语句\n",
    "for sql in sql_statements:\n",
    "    print(sql)\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "autogen",
   "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.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
