{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "cell-00",
   "metadata": {},
   "source": [
    "数据科学岗位薪资预测分析（Spark）"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cell-01",
   "metadata": {},
   "source": [
    "启用spark"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "cell-02",
   "metadata": {},
   "outputs": [],
   "source": [
    "from pyspark.sql import SparkSession\n",
    "from pyspark import SparkConf"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "cell-03",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Setting default log level to \"WARN\".\n",
      "To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).\n",
      "26/06/01 00:23:25 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable\n",
      "26/06/01 00:23:29 WARN Client: Neither spark.yarn.jars nor spark.yarn.archive is set, falling back to uploading libraries under SPARK_HOME.\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "            <div>\n",
       "                <p><b>SparkSession - in-memory</b></p>\n",
       "                \n",
       "        <div>\n",
       "            <p><b>SparkContext</b></p>\n",
       "\n",
       "            <p><a href=\"http://master:4040\">Spark UI</a></p>\n",
       "\n",
       "            <dl>\n",
       "              <dt>Version</dt>\n",
       "                <dd><code>v3.5.8</code></dd>\n",
       "              <dt>Master</dt>\n",
       "                <dd><code>yarn</code></dd>\n",
       "              <dt>AppName</dt>\n",
       "                <dd><code>Data Science Salary Analysis</code></dd>\n",
       "            </dl>\n",
       "        </div>\n",
       "        \n",
       "            </div>\n",
       "        "
      ],
      "text/plain": [
       "<pyspark.sql.session.SparkSession at 0x7f362013bd70>"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "conf = SparkConf().setAppName(\"Data Science Salary Analysis\").setMaster(\"yarn\")\n",
    "spark = SparkSession.builder.config(conf=conf).getOrCreate()\n",
    "spark"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cell-04",
   "metadata": {},
   "source": [
    "数据准备"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "cell-05",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "put: `ds_salaries.csv': No such file or directory\n"
     ]
    }
   ],
   "source": [
    "!hdfs dfs -mkdir -p /user/mqmrx/dssal && hdfs dfs -put -f ds_salaries.csv /user/mqmrx/dssal/"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "cell-06",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "                                                                                "
     ]
    },
    {
     "data": {
      "text/plain": [
       "DataFrame[work_year: int, experience_level: string, employment_type: string, job_title: string, salary: int, salary_currency: string, salary_in_usd: int, employee_residence: string, remote_ratio: int, company_location: string, company_size: string]"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "file = '/user/mqmrx/dssal/ds_salaries.csv'\n",
    "df = spark.read.csv(file, header=True, inferSchema=True)\n",
    "df.createOrReplaceTempView('salary')\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "cell-07",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "root\n",
      " |-- work_year: integer (nullable = true)\n",
      " |-- experience_level: string (nullable = true)\n",
      " |-- employment_type: string (nullable = true)\n",
      " |-- job_title: string (nullable = true)\n",
      " |-- salary: integer (nullable = true)\n",
      " |-- salary_currency: string (nullable = true)\n",
      " |-- salary_in_usd: integer (nullable = true)\n",
      " |-- employee_residence: string (nullable = true)\n",
      " |-- remote_ratio: integer (nullable = true)\n",
      " |-- company_location: string (nullable = true)\n",
      " |-- company_size: string (nullable = true)\n",
      "\n"
     ]
    }
   ],
   "source": [
    "df.printSchema()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "cell-08",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "                                                                                "
     ]
    },
    {
     "data": {
      "text/plain": [
       "3755"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.count()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cell-09",
   "metadata": {},
   "source": [
    "数据清洗"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "cell-10",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "DataFrame[work_year: int, experience_level: string, employment_type: string, job_title: string, salary_in_usd: int, employee_residence: string, remote_ratio: int, company_location: string, company_size: string]"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 删除与目标共线的两列（salary、salary_currency），避免数据泄露\n",
    "df = spark.sql('''\n",
    "select work_year, experience_level, employment_type, job_title,\n",
    "       salary_in_usd, employee_residence, remote_ratio,\n",
    "       company_location, company_size\n",
    "from salary\n",
    "''')\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "cell-11",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "                                                                                "
     ]
    },
    {
     "data": {
      "text/plain": [
       "DataFrame[work_year: int, experience_level: string, employment_type: string, job_title: string, salary_in_usd: int, employee_residence: string, remote_ratio: int, company_location: string, company_size: string]"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from pyspark.sql import functions as F\n",
    "from pyspark.sql.functions import col\n",
    "\n",
    "# 长尾类别只保留出现最多的前 10 个，其余归为 Other\n",
    "def reduce_long_tail(df, name, top_n=10):\n",
    "    top = [r[name] for r in df.groupBy(name).count()\n",
    "           .orderBy(F.desc('count')).limit(top_n).collect()]\n",
    "    return df.withColumn(name, F.when(col(name).isin(top), col(name)).otherwise(F.lit('Other')))\n",
    "\n",
    "for c in ['job_title', 'employee_residence', 'company_location']:\n",
    "    df = reduce_long_tail(df, c)\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "cell-12",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "                                                                                "
     ]
    }
   ],
   "source": [
    "path = '/user/mqmrx/dssal/salary_clean'\n",
    "df.write.parquet(path, mode='overwrite')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cell-13",
   "metadata": {},
   "source": [
    "读入HDFS已清洗数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "cell-14",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "DataFrame[work_year: int, experience_level: string, employment_type: string, job_title: string, salary_in_usd: int, employee_residence: string, remote_ratio: int, company_location: string, company_size: string]"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df2 = spark.read.parquet(path)\n",
    "df2.createOrReplaceTempView('salary_clean')\n",
    "df2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "cell-15",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3755"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df2.count()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cell-16",
   "metadata": {},
   "source": [
    "数据可视化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "cell-17",
   "metadata": {},
   "outputs": [],
   "source": [
    "from matplotlib import pyplot as plt\n",
    "plt.rcParams['font.sans-serif'] = ['WenQuanYi Micro Hei', 'SimHei', 'Microsoft YaHei']\n",
    "plt.rcParams['axes.unicode_minus'] = False"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "cell-18",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjEAAAF1CAYAAAAZTrsTAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjUsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvWftoOwAAAAlwSFlzAAAPYQAAD2EBqD+naQAATkFJREFUeJzt3X98T/X///Hba7PNzDZsMzYyjA2LwjS/lpIfKb8iKeW3CFF+VNu7dwiJJin9Ir95v0t+JEk/5EdCIyRtxnqXDC82sx8om+11vn/47ny8bNjYzOv9vl8vl3N575znOc/X47zOe3bvnOc5x2IYhoGIiIiIg3Eq7QJEREREboRCjIiIiDgkhRgRERFxSAoxIiIi4pAUYkRERMQhKcSIiIiIQ1KIEREREYekECMiIiIOSSFGRG5IWloaf/75Z4n1/9tvv5GWlnbd9U6dOlXg8r/++otz585dd/svvviCbdu2Fbm+knbq1CkOHDhQ6PX//vtv+vXrx8GDB2/qc19++WWCg4PzLa9WrRoffPDBTfUtUtwUYkQcTJs2bbBYLEWeFi1adMPb9+7dO18dc+fOpU2bNthsNgCsVisJCQkFTlcGjaCgoHyfcf78ebP94sWLPPjggzzxxBPX/C7Wrl1L1apV2bBhA8eOHePYsWMkJycDMH78eGrVqsWff/5pth07doysrCy7Pl555RXWrFkDwAcffHDV76BNmzb5Pn/OnDlF/i5feumlfP0EBwebxyfPe++9R+fOna+5/5f74IMP+Ne//oWvr2+htwFYtGiRXX1Tp07lP//5T766jx8/zjPPPGO37KuvvirSZ4kUN4teOyDiWI4ePcpff/2Vb/n58+d58MEHeeCBB3jllVfytVetWhVvb2/atGlDrVq1eOGFFwr1eS+88ALlypXj448/Npfl5uYSEhLC0KFDGT9+PABPPvkky5cvL7CPUaNGMXv2bHM+JSWF3NxcAH799Vc6depEdna22T5hwgRef/11LBYLmzdvpnnz5vn6PHToEC1btiQ1NdVueZMmTfjnP/9J9+7dKeiftw0bNtCxY0ezj9DQULZu3UpkZCTp6el8/vnnDBgwgLi4OHOb0aNHU7lyZZYuXWrXV3p6OidPnsz3GXPmzGHLli2sXLkyX5uPjw9+fn52y4KDg3n55Zfp37+/uaxevXp4e3vz5JNP5uujWrVqdOvWzZzPysqiZs2aWK3WfOsWJCQkhISEBAAyMjLstps9ezZffvklX3/9td02bdq04ZlnnuGxxx4zl1WvXh0PD49CfaZISShT2gWISNHccccdBS4fMmQIFy9e5K233qJy5crX7KNSpUqEhoYW6vO8vLzIycmxW/bvf/+btLQ0Bg8ezOrVq0lMTGTZsmUsW7bMbr0vvviCrl270q9fP7vlp0+fZvTo0XzzzTccOHCAihUrmm3fffcdU6dOJSYmhqNHj9K1a1e+//57u3p3795N586dadGiBStXrmTDhg08+eSTrF69Gk9PTyIjI3nhhRd4/fXXmTVrFrNnz+bAgQN4enra1fHhhx9Ss2ZNWrduzcyZM3nooYfw8fGhbNmy5ufl5OSwa9cu3n777XzfTYUKFdixYwf79+8nKirKXO7r62vXB8D999/Pww8/zJgxY677nX/99df8/vvvPP744/z00092bT/88AN33HGHXYiJjo7mzJkzbNu2ze5MzCeffML777/Pli1b7Ppwc3Mzf/b29sbb2xuAjRs3kp6ezq+//prvuyoorImUOkNEHN7KlSsNwGjbtq1hGIZhs9muuu69995rjB071tiwYYMBXHPavHmz0adPH+Oxxx4zt09NTTUCAgKMRYsWGX/99ZdRvXp1Izo6Ot/n/Pzzz4aPj48xevTofG1ff/21UbFiRcMwDGP58uVGSEiIYRiGsW/fPsPb29u4//77DZvNZly8eNG4//77jSpVqhh79+41tz99+rQxb948Izc311y2ceNGIyMjw1izZo3x+uuv233e2bNn89WQnJxslC9f3pgzZ45x4MABw2KxGHv27DE+/vhjo1KlSuZ6mzZtMgDjxIkTBX6f77zzjuHk5GT88ssv5rIJEyYYTZo0Mefj4uIMwFiwYIHdtvfee2++7/yrr74y7rrrLqNfv36GYRjGX3/9ZbdN3759zeNsGIaxevVqAzCioqLy1fb+++8bgYGBBdZ9uWPHjhlJSUnGggULjDJlyhiHDx82kpKSjKSkJCM7O9vYu3ev8eWXXxpz5841XnjhBaNDhw7GQw89dN1+RUqazsSIOLg9e/bQt29fnJwuDXFLTEzkwQcf5O2336ZTp05X3a5169bXHQR6xx138NFHH9ktmz59OqmpqXz++efExMSQm5vLiy++aLYbhsHSpUsZPnw4devWJSYm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2WefAZeeh1KmTBl27drFQw89xKRJk7DZbMTFxTF48GC6dOlCp06d6NixI66urqxatcouCDZs2JA//vijwM9766232LRpE59//nmB7ZffBn3+/Hmys7N54403GDp0KIcPH2bHjh3MnDmTvXv34ubmRq9evdi2bRtVq1bl3LlzdsE1LCzMfKbNU089xVNPPZXv8wr6/0m/fv3MB+z5+vraPW8nb+yRh4cHx48fJzc3N994HpHbgUKMiAOpUKECBw4csLt75nrKlCnDypUr7cZRXO7PP/8sVBjK06lTJzp16mT+l/vGjRtxdnZm9OjR5h+6KlWq4OzsfNWBwxs2bOCVV17hwIED7N69m7S0NCpXrkyzZs3Iysri0KFD3HHHHeZZnrvvvpuAgAC7Pj755BPS09N5//33GThwoN2Zmjz79++nd+/e5vNTLn/2ybJly6hQoYL5XV68eJHNmzfz119/ERkZSWhoKCNHjqRLly7Url2bpk2b0rVrV3N7V1fXq16mqVChwjXb8zz22GN89tlnWCwWWrduzUcffUSNGjXYs2cP9erV46WXXqJjx47mZTiAM2fO2A18XrduXb6nEF/+HRX0nBjALpR8+umnTJkyhbFjx/LQQw/x/fffM336dF577TV+++03gHwDlkVuBwoxIg6mKAEmz+W3BF/uySef5IEHHiiwrUqVKgUuf+utt1i/fj27d+8mIyODGjVqMHLkyELXYhgGQ4YMISgoiJ9++okGDRqQlJREzZo18fT0pFq1avz+++/MmDGDgIAAGjZsyKhRo/L1U6NGDbKzs/nuu+/YsWMH69evtxvPAZgDT4ODg/PtT8WKFfnpp5/YunUr3377LfHx8XTu3JmaNWua4WvKlCksXbqUH374gZUrVxYp7BXG3XffTffu3enUqZNdCHvkkUfy3Y6d59ixY3bhqGbNmlft39/fnzJlylzzLrTMzExeeOEFGjdubN4tVbduXWw2GzExMdSuXZvKlSsrxMhtSSFG5H9YhQoVChxTk5mZSUJCAh4eHvz+++92zw05ffo0ubm5jB8/ng4dOtC0aVOSk5PNx9jDpae75ubm2i0rV64cd9xxBxaLhS1bthAcHExiYiL/+te/yMzMpFmzZiQkJLBkyRLz8s/333/PsWPHuPvuu0lISCAwMNDubEqdOnX48ccfGTRoECdPnsTHx4fPPvuM4OBgPDw82LRpE0CBZ6EaN25MfHw8FStWpGvXrvTv35/hw4czYcIE4NI4mj59+nDx4kWaNm1K3759+fvvvwt8DcCNKswdS1988QUVK1bE29ubLVu2cO7cuQJfw3Cj4uPjqVOnDk8//TS//PILcCkoL1++nDNnztC8eXOGDRtWbJ8nUqxu3XP1RKQkPfTQQ3ZPcr2avCf2XktKSopRsWJFw8nJyahWrZqxZcuWa64/evTo6z7999577823XYsWLQw3NzdjzJgxhmEY1+3j008/vWYdNpvNiIiIMKpUqWI4Ozsbnp6expNPPlngulu2bDF27txp5OTkGIZhGH369DF8fX2NM2fOGB999JFRvnx5o169ekZCQoLx119/Gd27dzcAY+DAgdeswTDyP7H3ZnTq1Mnw8fExypQpY1SoUMGYOXNmobct7BN7DcMwunfvbjg7OxstWrQwl23evNlo27atcf78eXPZ7NmzjQEDBhR+B0RKkF4AKfI/5uTJk7i5udm9r0jgs88+48KFC/Tu3ZvNmzeza9cuxowZY94ybhgGb731FnfddRf33XdfKVcrIqC3WIuIiIiD0nNiRERExCEpxIiIiIhDUogRERERh6RbrEuAzWbjxIkTeHp6FvtzJURERP6bGYbB2bNnCQgIwMnp2udaFGJKwIkTJ/I9dEtEREQKLykpiWrVql1zHYWYEpD3MK6kpKQCH4UuIiIiBcvMzKR69ep2D7a8GoWYEpB3CcnLy0shRkRE5AYUZjhGqQ/sXb58OU2aNKFcuXI0aNCANWvWmG3r168nNDSUsmXL0qJFC+Lj48223Nxcnn/+eSpVqoS3tzcjRowgOzvbbE9MTCQyMhJ3d3fq1KnD6tWr7T53wYIFBAUF4e7uTseOHTl+/LjZdv78efr27Yunpyd+fn5MnDix5L4AERERuSGlGmLOnDnD22+/TXR0NIcOHaJ///707t2b33//nSNHjtCzZ0/zfR7h4eE8/PDDZlCJiYlh1apVrF27lo0bN7J161YmTZoEXBpY261bN2rUqMG+ffuIjo6mT58+ZgjauXMnw4YNY+rUqezduxdvb2969epl1jVu3DgOHDjA1q1bWbFiBXPnzmXevHm3/gsSERGRqyvNdx4UpFKlSsby5cuNadOmGfXr1zeXZ2VlGR4eHsZnn31mGIZhhISEGDNmzDDbly9fbvj4+Bi5ubnGzp07DYvFYpw8edJsb9eunfHcc88ZhmEYQ4cONTp16mS2HT9+3ACMn3/+2bh48aJRvnx5Y8WKFWb71KlTjbvuuqvQ+5CRkWEARkZGRtG/ABERkf9hRfkbWuqXky73999/k5mZSdWqVUlISLB7U6urqyvh4eHExcVhs9lITEy0a2/ZsiWpqamcPHmShIQEatWqhb+/v117XFwcQL6+AwICCAoKIi4ujmPHjuV7S2zLli2Jj4/HuMobGrKyssjMzLSbREREpGTdViFmzpw51KxZk8jISFJSUvK9oM7X1xer1Upqaio2m82u3dfXFwCr1XrNbYFrtqekpADk6zs7O5szZ84UWPe0adPw9vY2J91eLSIiUvJumxDz448/MmnSJBYtWoSzszNwafDu5bKzs7HZbOb85e15Y2Xy2ouybVH7vlJUVBQZGRnmlJSUdJ29FRERkZt1W9xifejQITp37sycOXNo0aIFAP7+/qSnp9utl5aWxt13342Pjw/Ozs527WlpaQD4+flddVs/P79r9p23LUB6erp5e3RaWhpOTk74+PgUWL+bmxtubm43susiIiJyg0r9TMzx48dp3749L7zwAv379zeXh4WFERsba85fvHiRffv2ERISgpOTE/Xr17drj42NxcPDg8DAQMLCwjhy5AinTp2yaw8JCSmwb6vVSlJSEiEhIQQGBlKhQoV8fQcHB1/38cciIiJyC5X8OOOrS01NNerXr28MGzbMSElJMaf09HTDarUa5cuXN15//XXj8OHDxjPPPGNUrlzZOHv2rGEYhjFnzhzD39/f+OGHH4yffvrJqFOnjvHMM8+YfYeHhxu9evUyDh06ZMydO9coU6aMsXPnTsMwDOPnn382XF1djUWLFhkJCQlG9+7djQYNGhi5ubmGYRjGuHHjjHr16hn79u0zNm/ebPj6+hrTp08v9H7p7iQREZEbU5S/oaUaYhYtWmQA+aZ7773XMAzD2LRpk9GgQQPD1dXVaNKkibF7925zW5vNZkRFRRmVKlUyPD09jf79+xvnz5832//880+jbdu2hpubmxEUFGQsXrzY7rM//vhjo2bNmoabm5vRpk0b47fffjPbLly4YAwZMsTw9PQ0KlWqZIwbN87Iyckp9H4pxIiIiNyYovwNtRjGVe4blhuWmZmJt7c3GRkZeu2AiIhIERTlb6gGeYiIiIhDui3uThIRESkJ4R/+Vtol/NfbPTS41D5bZ2JERETEISnEiIiIiENSiBERERGHpBAjIiIiDkkhRkRERBySQoyIiIg4JIUYERERcUgKMSIiIuKQFGJERETEISnEiIiIiENSiBERERGHpBAjIiIiDkkhRkRERBySQoyIiIg4JIUYERERcUgKMSIiIuKQFGJERETEISnEiIiIiENSiBERERGHpBAjIiIiDkkhRkRERBySQoyIiIg4JIUYERERcUgKMSIiIuKQbosQY7VaadWqFW3atDGXtWnTBovFkm8aMGAAABs2bMjXNmfOHHP7xMREIiMjcXd3p06dOqxevdruMxcsWEBQUBDu7u507NiR48ePm23nz5+nb9++eHp64ufnx8SJE0t0/0VERKToSj3EbN++naZNm+Li4mK3fO3ataSkpNhNdevWpVWrVgCcPHmSZs2a2bUPHjwYAJvNRrdu3ahRowb79u0jOjqaPn36EB8fD8DOnTsZNmwYU6dOZe/evXh7e9OrVy/zs8eNG8eBAwfYunUrK1asYO7cucybN+8WfSMiIiJSGGVKu4DY2Fhmz57NuXPnWLRokbnc29vbbr0tW7aQnJzM448/Dlw6e1O7dm18fX3z9blr1y4OHjzIpk2b8Pf3JzQ0lH//+9/MmzePWbNmsXjxYtq1a0efPn0AmDVrFoGBgezfv58GDRqwbNkyFixYQOPGjQEYOXIk7733HkOGDCmhb0FERESKqtTPxIwZM4aePXted7133nmH/v37U65cOQCSk5P5+uuvqVKlCnXr1mXs2LGcP38egISEBGrVqoW/v7+5fcuWLYmLizPbmzdvbrYFBAQQFBREXFwcx44d49y5c3btLVu2JD4+HsMwimWfRURE5OaV+pmYwjh69Ciff/65GUIAXn75ZXr27Im/vz/x8fE899xzpKSksGTJElJSUqhYsaJdH76+vlitVoBrtqekpADYtfv6+pKdnc2ZM2fw8fHJV19WVhZZWVnmfGZm5s3vtIiIiFyTQ4SY9957j/vuu4+6deuay3x9fc3xMXXq1AGgZ8+e5tiV3Nxcuz6ys7Ox2WzmfFHas7OzAezaLzdt2jQmTZpU5P0SERGRG1fql5Ou58KFC3z00UcMHz78muvVrVuXnJwcUlJS8Pf3Jz093a49LS0NPz8/gGu2512Curw9LS0NJyenAs/C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",
      "text/plain": [
       "<Figure size 600x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "sql = '''select experience_level, round(avg(salary_in_usd)) as avg_salary\n",
    "         from salary_clean group by experience_level order by avg_salary'''\n",
    "d1 = spark.sql(sql).toPandas()\n",
    "plt.figure(figsize=(6, 4))\n",
    "plt.bar(d1['experience_level'], d1['avg_salary'], color='#3498db')\n",
    "plt.title('不同经验等级平均年薪')\n",
    "plt.ylabel('平均年薪（美元）')\n",
    "plt.savefig('fig_exp_salary.png', dpi=150, bbox_inches='tight')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "cell-19",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAhoAAAGJCAYAAADMo5pWAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjUsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvWftoOwAAAAlwSFlzAAAPYQAAD2EBqD+naQAAOIZJREFUeJzt3XtYVlWix/HfC3JHQARvxDOiBoqUWuIpzNt40nK8lVaTmdLVRsdSp5rR43XMS4qnbGyymtTyOGkOk1pkM2mmk1M4GY4XlCxBUVEBQYQQkHedPzq8xzdAwdi8KN/P8+wn91r7svbW5Odaa+9tM8YYAQAAWMDN1Q0AAADXL4IGAACwDEEDAABYhqABAAAsQ9AAAACWIWgAAADLEDQAAIBlCBoAAMAyBA0ANfLtt9/KZrPp888/dyqfPn26brvttloda//+/SorK7uqdpw+fdppPTs7W99//32tjnHkyBF9+eWX4n2FgPVsvBkUQHVsNttV7ffAAw9o7dq1eu+997Rx40bNmTNHHTp0kCSdOXNGbdu21W9/+1s98MADlfYNDAxU69atqzzupk2b9Nhjj+no0aPy9fWVJMXFxemWW27RsmXLaty+UaNGaffu3Tp06NBVXyOAmmni6gYAaLgOHjzo+PWxY8c0cOBArVmzRrfccoujfOnSpfriiy+0du1aR1lAQIAkqWnTpvr6668VExOjd999V/fcc4+mTJmi4uJizZ49W7Nnz650zvj4eK1cubJSeW5urn71q19pzJgxjpAhSffdd59+85vf6K677tLgwYMr7Xfo0KFKx1m/fr2efvpppaWlVXvtISEhCgkJqbYeQA0ZALiCc+fOmaFDh5pdu3aZixcv1mrfCxcumPnz55v8/Hzz4osvGknm448/NsYYM3DgQDN69GhjjDHJycnG3d3dUXep8vJyM3DgQNOhQwdz/vx5pzq73W769+9vAgICzMGDB53qysrKjKSrWmbNmlWr6wRQNYZOAFQrLy9PRUVFMsaoS5cu+t3vfqdRo0ZJkvz9/VVUVKRvvvlGp06dUnp6ulJTU/XVV19p48aNioqKqnS8BQsWyBijadOm6fjx4+rYsaM8PT31ySefaPv27Tp27JhefvnlSvs988wzWr58ub744gun3pQK2dnZ6t69u4wx2r59uyIiIqq8nh07dqhv37767//+b02aNElPPfWUjh8/rg8//PCn3SgA1SJoAKjW448/rrfeeqvKugkTJqhJkyZasWKFYmJi1KZNG0VERKhr1676+c9/7jTPYsuWLfrggw+0dOlSSVJmZqbuu+8+FRUVadiwYVqyZInmzJmjiRMnysfHx+k8U6dO1cKFC/XOO+/o4Ycfrrate/fuVd++feXv769Nmzapa9euTvUlJSXq0qWLjDHat2+fPD09CRpAfXBdZwqAa8GKFStMixYtHOutWrUy69evN8YY88wzz5gRI0ZUud+3335rZsyYYSIjI42bm5t54IEHzKZNm8xDDz1kvLy8zF133WVOnz5tjDFmw4YNJiwszISEhJinnnrKZGRkGGOMmTx5spFkFi1aVKO2Jicnm2bNmpmwsLBKQzzTp083kszbb79tMjMzTWZmphk9erTp37+/Y71iKSoqqvV9AlA1JoMCqNbJkyd144036syZM/rqq6907tw5nT59WpGRkcrJyZH0w+TKHz/yGhoaqkOHDmnp0qUaNWqUNmzYoE6dOumPf/yj3Nzc9Pe//129e/d2bD9s2DANHDhQK1as0EcffaQWLVpIkoYPH66IiAh16tSpRk+HvP322/ryyy+1d+9eubu7O8q/+OILLVq0SJI0duzYSvuFh4c7rb/55pt6/PHHa3iXAFwOQycAqhUUFKRz585VWTdw4EB16NBBb7zxhnx9fWW323X+/HkFBARo5MiRevPNN1VcXKz169frkUceqdH5tm3bpr59+1Yq//7773Xs2DFJP8zz2LFjhzZv3uyoz8vLU1xcnFavXq3Ro0c77Xvs2DH16NFDPj4+ysjIUEZGhpo3by5JmjRpkk6cOKH169c7tm/fvr3mzZtH0ADqCD0aAKqVn5/v+HX37t31y1/+Us8++6yj7LHHHtN9992nNWvWKCMjQxEREUpLS1OrVq0kSX5+fpKk4OBgHThwwLHf4cOH5e3t7ehJ+P7779W+fftq2+Hr66uOHTtKkvbt26dOnTo51qUf5nxIkoeHh9N+RUVFGjp0qMLCwrRw4UINGDBAfn5+8vf3lyQ1adJE7u7ujnXp6t8dAqBqvBkUQLWeffZZ2Ww22Ww27d69W88995xj/S9/+YvOnj2rwMDAKx7HZrOpVatWjmXRokVKSEhwrFcMlVzJ7t27tWfPHvXv39+pvKioSJLk7e3tVJ6VlSVPT0999NFHatq0aQ2vGkBdokcDQLWmT5+ub775RmPGjNHcuXM1dOhQlZWVKTw8XL/4xS80Z84cde/evVbHTEtL08cff6x169bVar+ysjJNnDhRfn5+GjNmjFNdRc/LpT0TktShQwclJyfLZrMpPT29VucDUDfo0QBQrddee027du1S//795eHhocDAQHXp0kX/9V//pdTUVKWmpqpbt241Pt6ZM2d03333qUePHho+fLi2bt2qwsJC2Ww2BQYGqkmTqv/tk5OToyFDhuiLL77QH/7wB4WGhjrVHz9+XJKq7BmpyVDI6dOn9dlnn2nXrl3Kz8+v1DMC4OoRNABUqaSkRLt379Zbb72l48ePKzc3Vx4eHnrwwQe1b98+LV26VG3bttWAAQMue5z4+Hjt27dPixcvVufOnSVJiYmJ+uabbzRs2DAFBwdr8ODBmj17tuN7KBWKior00ksvKSoqSjt27NDKlSsVHx8vSTLG6KWXXtJbb72lJUuWyNPT87LzPC7H3d1djz76qHr37q3OnTtr4MCBV3UcAFVw8eO1ABq4xMRE4+npaYKCgsyuXbuMMcYUFhaafv36mR07dji2O378uGnfvr3Jzs52lD399NMmOjraSDItWrQwv//9701xcbGjvri42Hz44Yfm0UcfNf7+/sbNzc08//zzjvr09HQTHh5u7rvvPnPkyJFKbevRo4fx8PAwQUFBZunSpZe9jtLSUpOVlWXsdrujbNy4ceYXv/hF7W8KgBrj8VYAllm7dq2++eYb9e7dW7169XJ6t8WPFRYWat26derQoYP69OnjKC8rK6v0NAmAawdBAwAAWIY5GgAAwDIEDQAAYBmCBgAAsEyjfWGX3W7XyZMn1bRpU145DABALRhjdP78ebVp00Zubpfvs2i0QePkyZOVvtgIAABqLjMzUzfccMNlt2m0QaPiuweZmZkKCAhwcWsAALh2FBQUKDw8vEbfEGq0QaNiuCQgIICgAQDAVajJ1AMmgwIAAMsQNAAAgGUIGgAAwDIEDQAAYBmCBgAAsAxBAwAAWIagAQAALEPQAAAAliFoAAAAyxA0AACAZQgaAADAMgQNwAXK7aZOtwOAhqrRflQNcCV3N5tmbD2l9PyyareJCPLQ3P6t6rFVAFD3CBqAi6Tnlyktp8TVzQAASzF0AgAALEPQAAAAliFoAAAAyxA0AACAZQgaAADAMgQNAABgGYIGAACwDEEDAABYhqABXAGvCweAq8ebQYEr4HXhAHD1CBpADfC6cAC4OgydAAAAy7g0aBQXF2vmzJmKjIyUt7e32rVrp0WLFjnqk5KS1LFjR3l7eysuLk6pqamOuvLyck2ePFnBwcEKDAzUhAkTVFpa6orLAAAA1XBp0Dh79qyOHz+u5cuX6/Dhw1q8eLFmzpypDRs2KCMjQyNHjtSTTz6pvXv3KjY2VoMHD3aEiYSEBCUmJmrjxo3asmWLtm/frjlz5rjycgAAwI+4NGiEhYVpxYoV+vnPf67w8HCNGDFCnTp10sGDB7V27Vq1a9dOU6ZMUWRkpBYvXqwzZ85o8+bNkqSVK1dq4sSJ6tWrl2JjYzVt2jS9/vrrstvtrrwkAABwiQYzR6O8vFx//vOfdfToUY0YMUKHDh3S7bff7qj39PRUbGysDhw4ILvdrsOHDzvV9+zZU7m5uTp16lSVxy8pKVFBQYHTAgAArNUggkb79u3l7e2t6dOnKzExUZGRkcrOzlazZs2ctgsJCVFWVpZyc3Nlt9ud6kNCQiRJWVlZVZ5jwYIFCgwMdCzh4eHWXRAAAJDUQILGZ599pt27d+v555/XyJEjlZiYKOmHXo5LlZaWOg2NXFpfMXejuqGTqVOn6ty5c44lMzOzri8DAAD8SIN4j0Z4eLjCw8N188036+TJk1q4cKFuuukm5efnO22Xl5enbt26qXnz5nJ3d3eqz8vLkySFhoZWeQ4vLy95eXlZdQkAAKAKDaJH41J2u10eHh6KiYlRcnKyo7ysrEwpKSmKioqSm5uboqOjneqTk5Pl5+ensLAwVzQbAABUwaVB46OPPtKKFSuUmpqqY8eO6b333tOrr76qBx98UKNGjdKxY8f04osv6vDhw3rmmWfk6+urIUOGSJLGjRunJUuWaOfOndq9e7dmzZqlMWPGyMPDw5WXBAAALuHSoZOgoCDNnTtXkyZN0oULF9S2bVvNnTtXEyZMkM1m06ZNmzRx4kTNnDlTN910k5KSkuTv7y9JGj9+vE6cOKGhQ4eqrKxMI0aMUEJCgisvBwAA/IhLg0ZcXJy++OKLauv79eun/fv3V1lns9k0f/58zZ8/36rmAQCAn6jBzdEAAADXD4IGUAea+7ir3G5c3QwAaHAaxOOtwLWuqZeb3N1smrH1lNLzyy67bVy4j8b3CKmnlgGAaxE0gDqUnl+mtJySy27TNognowA0HgydAAAAyxA0AACAZQgaAADAMgQNAABgGYIGAACwDEEDAABYhqABAAAsQ9AAAACWIWgAAADLEDQAAIBlCBoAAMAyBA0AAGAZggYAALAMQQMAAFiGoAEAACxD0AAAAJYhaAAAAMsQNAAAgGUIGgAAwDIEDQAAYBmCBgAAsAxBAwAAWIagAQAALEPQAAAAliFoAAAAyxA0AACAZQgaAADAMgQNAABgGYIGAACwDEEDAABYhqABAAAs4/KgsWbNGt16663y9fVV586d9f777zvqWrZsKZvN5li6d+/uqCsvL9fkyZMVHByswMBATZgwQaWlpa64BAAAUA2XBo2zZ8/qlVde0bRp05SWlqb4+Hj98pe/1JEjR1ReXq6cnBwlJycrOztb2dnZ2rp1q2PfhIQEJSYmauPGjdqyZYu2b9+uOXPmuPBqYJVyu6nT7QAA9aeJK08eHBys5ORkx/pzzz2nhQsX6ssvv5S3t7eMMerSpYu8vLwq7bty5UpNnDhRvXr1kiRNmzZNTz/9tObOnSs3N5d31KAOubvZNGPrKaXnl1W7TUSQh+b2b1WPrQIA1IRLg8aPFRcXq6CgQK1bt9aZM2dks9nUsWNHlZSUqEuXLlq4cKG6dOkiu92uw4cP6/bbb3fs27NnT+Xm5urUqVNq06ZNpWOXlJSopKTEsV5QUFAv14S6kZ5fprSckitvCABoUBrUP/2XLVumiIgI9e7dW127dtW2bdv08ccfa8OGDQoICFD//v115swZ5ebmym63q1mzZo59Q0JCJElZWVlVHnvBggUKDAx0LOHh4fVyTagfzX3cazV0wjALANSPBtOj8eWXX2rOnDn6+9//Lnd3d0lS7969HfWrV69WeHi4PvjgAw0dOlTSDxNCK1RMBLXb7VUef+rUqZoyZYpjvaCggLBxHWnq5VajIRaJYRYAqE8NImikpaVpyJAhWrZsmeLi4qrcxtPTU23btlVWVpaaN28ud3d35efnO+rz8vIkSaGhoVXu7+XlVeVcD1xfGGIBgIbF5UMnJ06c0IABA/T8888rPj6+2u1KS0t15MgRdejQQW5uboqOjnaaSJqcnCw/Pz+FhYXVQ6sBAEBNuLRH4+zZsxowYIAGDRqkRx55RDk5OZIkDw8P7dixQ+fOndMdd9yhkpISzZs3T35+fho2bJgkady4cZo7d67i4uLk7e2tWbNmacyYMfLw8HDlJQEAgEu4tEfjgw8+UGpqqpYvX67Q0FDHMmzYMAUEBGjRokWKiopSr169VFhYqG3btsnHx0eSNH78eD366KMaOnSo+vXrp549eyohIcGVlwMAAH7EpT0aY8eO1dixY6ut37t3b7V1NptN8+fP1/z5861oGgAAqAMun6MBAACuXwQNAABgGYIGAACwDEEDAABYhqABAAAsQ9AAAACWIWgAAADLEDQAAIBlCBpodGr7SXkAwNVrEF9vBepTbT4pHxfuo/E9QuqpZQBw/SFooNGqySfl2wbxkT4A+CkYOgEAAJYhaAAAAMsQNAAAgGUIGgAAwDIEDQAAYBmCBgAAsAxBAwAAWIagAQAALEPQAAAAliFoAAAAyxA0AACAZQgaAADAMgQNAABgGYIGAACwDEEDAABYhqABAAAsQ9AAAACWIWgAAADLEDQAAIBlCBoAAMAyBA0AAGAZggYAALAMQQMAAFjG5UFjzZo1uvXWW+Xr66vOnTvr/fffd9QlJSWpY8eO8vb2VlxcnFJTUx115eXlmjx5soKDgxUYGKgJEyaotLTUFZcAAACq4dKgcfbsWb3yyiuaNm2a0tLSFB8fr1/+8pc6cuSIMjIyNHLkSD355JPau3evYmNjNXjwYEeYSEhIUGJiojZu3KgtW7Zo+/btmjNnjisvBwAA/IhLg0ZwcLCSk5M1YsQIhYeH67nnnpO/v7++/PJLrV27Vu3atdOUKVMUGRmpxYsX68yZM9q8ebMkaeXKlZo4caJ69eql2NhYTZs2Ta+//rrsdrsrLwkAAFzC5UMnlyouLlZBQYFat26tQ4cO6fbbb3fUeXp6KjY2VgcOHJDdbtfhw4ed6nv27Knc3FydOnWqymOXlJSooKDAaQEAANZqUEFj2bJlioiIUO/evZWdna1mzZo51YeEhCgrK0u5ubmy2+1O9SEhIZKkrKysKo+9YMECBQYGOpbw8HDrLgQAAEhqQEHjyy+/1Jw5c7Rq1Sq5u7tL+mHC56VKS0udhkYura+Yu1Hd0MnUqVN17tw5x5KZmVnXlwAAAH6kiasbIElpaWkaMmSIli1bpri4OElSy5YtlZ+f77RdXl6eunXrpubNm8vd3d2pPi8vT5IUGhpa5Tm8vLzk5eVlSfsBAEDVXN6jceLECQ0YMEDPP/+84uPjHeUxMTFKTk52rJeVlSklJUVRUVFyc3NTdHS0U31ycrL8/PwUFhZWn80HAACX4fLHWwcMGKBBgwbpkUceUU5OjnJycnTu3DmNGjVKx44d04svvqjDhw/rmWeeka+vr4YMGSJJGjdunJYsWaKdO3dq9+7dmjVrlsaMGSMPDw9XXhIAALiES4dOPvjgA6Wmpio1NVXLly93lPfp00efffaZNm3apIkTJ2rmzJm66aablJSUJH9/f0nS+PHjdeLECQ0dOlRlZWUaMWKEEhISXHUpAACgCi4NGmPHjtXYsWOrre/Xr5/2799fZZ3NZtP8+fM1f/58q5oHAAB+IpfP0QAAANcvggbQyJTbjSXbAkBVGsTjrQDqj7ubTTO2nlJ6ftllt4sI8tDc/q3qqVUArlcEDaARSs8vU1pOiaubAaARYOgEdaqmXe10yQNA41DrHo0nn3xSy5cvl5tb1RmluLhYw4cP1+zZs50+eobGoSbd8nTJA0DjUeug8ac//UnvvvuuwsPD1alTJ3Xv3l2DBg1Sly5dVFpaqgceeEBHjhxR+/btrWgvrgF0ywMAKlzVHI2UlBQdPXpUKSkp+vzzzzV37lx16tRJ3t7eunDhgrZv364WLVrUdVsBAMA1psZzNJKSkpSZmSmbzaaf/exn6t+/v5599lm9+uqrGj16tPbs2aPdu3erT58+atOmjZVtBgAA14gaB41ly5YpOjpaxhhNmjRJy5cv16BBgxQZGamioiLt2bNH27dv15///Gf9+te/trLNAKrABFsADVGNh042b96s8vJybdmyRSkpKVq6dKnS0tL08MMPa9WqVbLZbJKkLVu26LbbblNcXJxGjRplWcMBOKvJRNy4cB+N7xFSj60C0NjVOGgsWbJEgwcP1oMPPqizZ8/q1ltvVX5+vpo0aaLPPvtMt912m3x8fBQTE6OEhATHV1YB1J8rTcRtG8TXjQHUrxoPnURGRuq9996TJO3YsUPz5s3TzTffrHvuuUd33nmnbrzxRr3//vv6+uuv9fzzz6uwsNCyRgMAgGtDjXs09u3bJzc3N5WUlGjHjh3q37+/9u/fr4iICDVr1kwbNmzQ6NGjde7cOc2cOVOtW7e2st0AAOAaUOMejbKyMl28eFHl5eWaPXu2Tp48qYsXL6p9+/YqKytTVFSUpk+frtOnTysiIsLKNgMAgGtEjYPGfffdpxtuuEG+vr56+eWX9eGHH6pjx4766quvVFRUpJtuukmzZs3StGnTNGnSJJWU8MImAAAauxoHjcTERPn6+soYo1//+td6/vnnNXz4cAUFBSkoKEiJiYmKjY3V3Llz1atXL61bt87KdgMAgGtAjedozJgxQ5IUGBgoSZo4caLuvvtueXl5admyZbr11lu1du1ax7bG8Ew/AACNXa1fQT5o0CDHrzt06CBJeuCBByRJxhjZbDZ16tSpjpoHwFWa+7ir3G7k7mar0fa12RZA41HroPH73/9e06dPr/T11r/+9a969tlnlZycrNDQ0DprIK4/tf0BBtdo6uVWo5eASXyRF0D1ah005syZo9/97nfy9PR0lH399dd69NFHNWnSJEIGrqg2P8B4k6Xr8TVeAD9FrYPGj+debN++XcOHD9cjjzyi8PDwOmsYrn81+QHGmywB4NpW46dOKlR80+TixYuaPn26Bg8erHnz5mnhwoV68skn67yBQGNVMcQEANeyq+rRWLNmjV544QW1bt1au3btUqdOnVRSUsKTJkAdYogJwPWgxkHjo48+cvz6qaeeUnx8vIYNG6b09HSlp6ertLRUNptNmzdvljHG6ekUAFePISYA17IaB41Zs2Y5fl1eXq5//etfSklJcfRiVPx35syZstlsBA0AAFDzoPGvf/1LkuTm5qYOHTqoqKhICxYs0L333itJunDhgvz8/BzbAQAAXNVk0D179mj69OkaP3687r33XuXm5jomiQIAAFSoddCQfujVePjhh7Vv3z6Vl5erW7duSk1NVXR0dF23DwAAXMOuKmhUCA0N1caNGzVq1Cj1799f77zzTl21CwAAXAd+8gu7JGnhwoVq1qyZBg8erK+//lotW7ask8YBAIBrW62Dht1ur7L8wQcfVKdOnQgZAADAoVZDJwUFBQoODnasjxkzRuXl5ZKkiIgI3XXXXXXbOgAAcE2rcdAYNGiQUlNTVVxc7Chbs2aNI2jwVtDrF6/BBgBcrRoPnfTv31+DBw92eozVGONYt9lsPOJ6neI12ACAq1XjHo3f/OY3+vzzz3XhwgW1aNFCLVq0kM1mU1hYmFq0aCFJCgsLU2hoqGO9prKysnTHHXeob9++TuUtW7Z0BBibzabu3bs76srLyzV58mQFBwcrMDBQEyZMUGlpaa3Oi5qreA325ZaT5y+6upkA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3rW4//8vMDCwRttds4+3RkdHyxij3bt3O8qSk5MVFRXlwlYBAIBLXbNBIyQkRPfee6+ee+45paamasOGDVq9erUee+wxVzcNAAD8n2t26ESS3njjDT3xxBPq3r27AgMDNXv2bN1///31cm4vLy/NmjWr0nAMrMe9dx3uvetw712L+3/1bMbU5NkUAACA2rtmh04AAEDDR9AAAACWIWgAAADLEDQAAIBlCBpXgc/T115WVpbuuOMO9e3b16k8KSlJHTt2lLe3t+Li4pSamuqoKy8v1+TJkxUcHKzAwEBNmDBBpaWljvrDhw+rd+/e8vHx0Y033qi//vWvTsdesWKF2rZtKx8fH9111106ceKEo66oqEhjxoxR06ZNFRoaqtmzZ1ty3a62Zs0a3XrrrfL19VXnzp31/vvvO+q499YpLi7WzJkzFRkZKW9vb7Vr106LFi1y1HPv60dpaaliY2PVtm1bRxn33gV+8kdHGqG77rrLDBgwwOzbt89s2LDB+Pv7m7/97W+ublaD9fnnn5s2bdqYvn37mj59+jjK09PTjbe3t1myZIlJS0szTz/9tImIiDAlJSXGGGMWLlxowsPDzY4dO8yuXbtM586dzbRp04wxxpSXl5vo6GgzevRoc/DgQbNixQrj7e1tDhw4YIwx5p///Kfx8PAw//M//2NSU1PN/fffb+Li4hznfuqpp0zXrl3N7t27zaeffmpat25t3njjjfq7KfUgNzfX9OjRw/zlL38xx44dM4sWLTKenp7mu+++495b7Pjx4+aRRx4xW7duNceOHTN/+ctfjJeXl3n//fe59/VoypQpJi4uzvzsZz8zxvB3jqsQNGrp5MmTRpLZtWuXo+yJJ54ww4cPd2GrGrYlS5aY9evXm5UrVzoFjQULFpjo6GjHeklJifHz8zMbNmwwxhgTFRVlFi1a5Khfs2aNad68uSkvLzdffPGFsdls5tSpU476O++800yaNMkYY8y4cePMoEGDHHUnTpwwksyePXtMWVmZ8ff3N++9956jft68eaZr1651fu0NTXBwsFmzZg333gW6du1q5s+fz72vJx999JHp2LGj+fDDDx1Bg3vvGgyd1FJ1n6c/cOCAC1vVsE2ZMkUjR46sVH7o0CHdfvvtjnVPT0/FxsbqwIEDstvtOnz4sFN9z549lZubq1OnTunQoUNq166dWrZs6VRf8fvw42O3adNGbdu21YEDB3T8+HEVFhZWOnZqamrNPnl8jSou/uEz3a1bt+be16Py8nL9+c9/1tGjRzVixAjufT3IysrSuHHjtHbtWvn5+TnKufeuQdCopezsbAUEBDg+5Cb98Dr0rKwsF7bq2pSdna1mzZo5lVXcy9zcXNntdqf6kJAQST/8JXK5fa907OzsbEmqdOzS0lKdPXu27i6wgVm2bJkiIiLUu3dv7n09ad++vby9vTV9+nQlJiYqMjKSe28xu92uhx9+WL/73e/UpUsXpzruvWtc068gd5XafJ4el3ele3lpfcWkrIr62uxb22Nfb7788kvNmTNHf//73+Xu7i6Je18fPvvsM+Xl5emf//ynRo4cqTfeeEMS995KCxcuVEBAgMaPH19lPfe+/hE0aqm2n6dH9Vq2bKn8/Hynsry8PHXr1k3NmzeXu7u7U31eXp4kKTQ0tNp9K34fLldf0fWZn5/v+NxzXl6e3Nzc1Lx587q7wAYiLS1NQ4YM0bJlyxQXFyeJe19fwsPDFR4erptvvlknT57UwoULddNNN3HvLfTmm28qIyNDNpvNqdxms8lmszkNfUjc+/rA0Ekt8Xn6uhMTE6Pk5GTHellZmVJSUhQVFSU3NzdFR0c71ScnJ8vPz09hYWGKiYlRRkaGTp8+7VRf8fvw42NnZWUpMzNTUVFRCgsLU1BQUKVjd+jQwWlI7Hpw4sQJDRgwQM8//7zi4+Md5dz7+me32+Xh4cG9t1hSUpJSUlIcy5w5c9S6dWulpKQoISGBe+8KLp2Keo0aOXKk6dOnjzlw4IB5//33jY+Pj1m3bp2rm9Xg/fipk6ysLOPv728WLlxovvnmG/OrX/3KtGjRwpw/f94YY8yyZctMy5Ytzeeff26++uorc+ONN5pf/epXjv1jY2PN/fffb9LS0swbb7xhmjRpYr744gtjjDF79uwxnp6eZtWqVebQoUPmnnvuMZ07dzbl5eXGGGOeffZZ06lTJ5OSkmK2bdtmQkJCzIsvvlh/N6Me5ObmmujoaPPUU0+Z7Oxsx5Kfn8+9t1hSUpJ56623zIEDB8zRo0fNunXrTFBQkHnllVe49/Vs5cqVjqdOuPeuQdC4CmfPnjUjRowwPj4+plWrVo3mD8tP9eOgYYwxn376qencubPx9PQ0t956q/nXv/7lqLPb7Wbq1KkmODjYNG3a1MTHx5uioiJH/dGjR03//v2Nl5eXadu2rXn77bedjr127VoTERFhvLy8TN++fc23337rqLtw4YJ54oknTNOmTU1wcLB59tlnzcWLF625cBdZtWqVkVRpqfg94N5bZ+fOnea2224zTZs2NR4eHubGG280f/jDH4zdbjfGcO/r06VBwxjuvSvwmXgAAGCZRjA4BAAAXIWgAQAALEPQAAAAliFoAAAAyxA0AACAZQgaAADAMgQNAABgGYIGAACwDEEDgLZs2aJjx465uhkArkMEDaCRy8nJ0T333KP09PQrbrtjxw55e3s7FpvN5rTu4eEhd3d3x3pISEidtfOll15SUlKSU9mePXv02GOP6cKFC5W2v3jxoi5cuHDF5cef9gZQtwgaQCM3f/58FRYWqm/fvo5PaVe1rFq1Sr1793b8gE5PT1fPnj2VlZXlKPvkk080b948x3pOTs4Vz//111+re/fuWrt2bZX1JSUlunDhgoKCgvTQQw/pyJEjunDhgoqKivToo48qPDzcsd2lXnjhBfn4+FxxWbx4cZXnfffdd9W9e3d9/fXXtbyjAC7Ft06ARuzDDz/UsGHDtGnTJvXv399R3qVLF/3hD39Q7969HWUVvRUVevbsqcmTJ2vkyJGOstLSUp0+fVpHjhzRv//9b7Vv316/+MUvqj1/SkqK7rzzTn3yySfq1q1bldt4e3tXChFVcXd318WLF6+4XW18/fXXGjBggLZs2aKuXbvW6bGBxqKJqxsAwDW+//57xcfHa/LkyZXCgM1mk6enp7y9vSvtFxUVpdzcXBUWFmrs2LF66qmnJEmrV6/WPffco6ioKIWFhSkyMlLt27ev9vylpaUaMWKEFi1aVG3IkKSioiKVlZU51ktKShQUFKRvv/1WYWFhjvImTer+r7NbbrlFixYt0r333qtDhw7J09Ozzs8BXO8YOgEaKV9fX33yySdq1apVpWGStLQ09evXz6ns1KlTkqS0tDQ1adJEe/bsUU5OjoqLi3X8+HH5+Pioa9eu+ve//62PPvpIL7/88mV7M9auXauysjKNHTv2su1csGCB01BHUFCQJKlDhw5O5c8++6xjn1WrVl12GOjHS3XDNpI0duxYlZaWat26dbW4uwAqEDSARqyiJ+HBBx9UcXGxY4mMjNTf/vY3p7JWrVo59uvatatSU1O1e/duRUdHO3o+SktLdfz4ccdy8uTJas/93nvvafjw4U7DMVWZPn26jDGOpbi4WJKUmZnpVP7yyy879nn44Yed2u7p6anvvvtOxcXFmjVrlh5//HGn+vvvv7/a87u7u2v48OEEDeAqETQAyM3NrdLTJBVDJxWLJO3fv18hISH66quv9NBDD+muu+5Senq6QkJClJqaqtTUVN1xxx3q2rWroqKidOedd1Z7zu+++04RERGXbdfOnTvVpEkTp8Xf31/u7u5q27Ztpbp33nlHkpyefCkvL1dpaalCQkLk7e2tJk2aONV7e3vLze3yfxVGREToyJEjtbyrACSCBtCoXbhwQRcvXpTdbnd65NMYo9LS0kqPgsbExCgnJ0c5OTkaO3asXnjhBcd6mzZt9B//8R/KyMhQQkKChgwZogMHDlz23Fea89CzZ09dvHjRaSkqKtJtt92mU6dOVaobM2ZMpWMcOHBAQUFBCggIuOr75OXlVeUjtACujMmgQCN18eJF+fj4ONbfffddp/qBAwdW2qesrEyxsbHKzMxUUVGR3N3dNXfuXEVHR+uhhx5Ss2bNanz+iIgIHT169LLbPPbYY3r77bcrlZeXlzsN5VTo06ePtm7d6lS2fv16xcXFVXuOgwcPqrCwULGxsdVuk5GRccXeFwBVo0cDaKSaNGniNMfh0iUqKkrbtm2rVN6kSRONGTNGDz30kKNH47bbbtOMGTO0a9cudejQocbnv/vuu7V58+bLbvPWW2859VgkJibKz89Pa9euVfv27fXCCy+opKTEUf/jkLFz504tW7ZMEyZMqPYcn3zyiWbMmHHZdmzevFl33313ja8NwP8jaACosfT0dK1fv14TJ07U999/L5vNpsWLFysvL0/r16/XPffcU+NjPf7448rMzNRHH31U7TZ2u12HDh3S8uXL1atXLz3++ONavXq1HnjgAW3fvl2fffaZoqOjtXjxYh08eFAVrwUqLCzUggUL9J//+Z+aOnWqBg0a5DimzWZTbm6usrOzlZGRoffff/+yASkpKUnHjx/X448/XuNrA3AJAwA/EhUVZbZt21Zt/Y033mi8vb3Np59+aowx5q9//at54oknHPXvvfeeGT9+/BXPs2HDBtOiRQuTkZFRZf3ixYtNYGCgGTBggHn99dfN+fPnK23zySefmKFDhxofHx8zbdo0Y4wxEyZMMJ06dTJJSUmVtv/b3/5mgoKCjCTj4+NjunTpYlJTU6s8f3p6ugkNDTUbNmy44rUAqBpvBgXgUomJiZo7d65efvll9e3b16nu4sWLcnd3l81mu+JxiouLZbfb5efnp+LiYsfTM1dr27Ztmjx5smbMmKERI0Zc9XGAxo6gAcDliouLVVhYqNDQUFc3xSE7O1v+/v5OE2YB1B5BAwAAWIbJoAAAwDIEDQAAYBmCBgAAsAxBAwAAWIagAQAALEPQAAAAliFoAAAAyxA0AACAZQgaAADAMv8L6YmEuKtuDNgAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 600x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "salary = spark.sql('select salary_in_usd from salary_clean').toPandas()['salary_in_usd']\n",
    "plt.figure(figsize=(6, 4))\n",
    "plt.hist(salary, bins=40, color='#3498db', edgecolor='white')\n",
    "plt.title('薪资分布')\n",
    "plt.xlabel('年薪（美元）')\n",
    "plt.ylabel('样本数')\n",
    "plt.savefig('fig_salary_dist.png', dpi=150, bbox_inches='tight')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cell-20",
   "metadata": {},
   "source": [
    "特征工程"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "cell-21",
   "metadata": {},
   "outputs": [],
   "source": [
    "from pyspark.ml import Pipeline\n",
    "from pyspark.ml.feature import StringIndexer, OneHotEncoder, VectorAssembler\n",
    "\n",
    "cat_cols = ['experience_level', 'employment_type', 'job_title',\n",
    "            'employee_residence', 'company_location', 'company_size']\n",
    "num_cols = ['work_year', 'remote_ratio']\n",
    "\n",
    "indexers = [StringIndexer(inputCol=c, outputCol=c+'_idx', handleInvalid='keep') for c in cat_cols]\n",
    "encoders = [OneHotEncoder(inputCol=c+'_idx', outputCol=c+'_oh') for c in cat_cols]\n",
    "assembler = VectorAssembler(inputCols=[c+'_oh' for c in cat_cols] + num_cols, outputCol='features')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "cell-22",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "                                                                                "
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "+-------------+------------------------------------------------------------+\n",
      "|salary_in_usd|                                                    features|\n",
      "+-------------+------------------------------------------------------------+\n",
      "|        85847|(46,[0,4,11,23,34,42,44,45],[1.0,1.0,1.0,1.0,1.0,1.0,2023...|\n",
      "|        30000|(46,[1,6,11,19,30,43,44,45],[1.0,1.0,1.0,1.0,1.0,1.0,2023...|\n",
      "|        25500|(46,[1,6,11,19,30,43,44,45],[1.0,1.0,1.0,1.0,1.0,1.0,2023...|\n",
      "+-------------+------------------------------------------------------------+\n",
      "only showing top 3 rows\n",
      "\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "                                                                                "
     ]
    }
   ],
   "source": [
    "prep = Pipeline(stages=indexers + encoders + [assembler])\n",
    "prep_model = prep.fit(df2)\n",
    "data = prep_model.transform(df2).select('salary_in_usd', 'features')\n",
    "data.show(3, truncate=60)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cell-23",
   "metadata": {},
   "source": [
    "拆分样本"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "cell-24",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "                                                                                "
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "3059 696\n"
     ]
    }
   ],
   "source": [
    "train, test = data.randomSplit([0.8, 0.2], seed=42)\n",
    "train.cache()\n",
    "test.cache()\n",
    "print(train.count(), test.count())"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cell-25",
   "metadata": {},
   "source": [
    "初步测试"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "cell-26",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "26/06/01 00:24:54 WARN InstanceBuilder: Failed to load implementation from:dev.ludovic.netlib.blas.JNIBLAS\n",
      "26/06/01 00:24:54 WARN InstanceBuilder: Failed to load implementation from:dev.ludovic.netlib.lapack.JNILAPACK\n",
      "                                                                                "
     ]
    }
   ],
   "source": [
    "from pyspark.ml.regression import LinearRegression, GBTRegressor\n",
    "\n",
    "lr = LinearRegression(featuresCol='features', labelCol='salary_in_usd', maxIter=50, regParam=0.1)\n",
    "lr_model = lr.fit(train)\n",
    "lr_pred = lr_model.transform(test)\n",
    "\n",
    "gbt = GBTRegressor(featuresCol='features', labelCol='salary_in_usd', maxIter=20, maxDepth=5, seed=42)\n",
    "gbt_model = gbt.fit(train)\n",
    "gbt_pred = gbt_model.transform(test)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cell-27",
   "metadata": {},
   "source": [
    "模型评估"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "cell-28",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "LR   RMSE=47316.74  MAE=35373.67  R2=0.4152\n",
      "GBT  RMSE=47682.41  MAE=35649.70  R2=0.4061\n"
     ]
    }
   ],
   "source": [
    "from pyspark.ml.evaluation import RegressionEvaluator\n",
    "\n",
    "def evaluate(pred, name):\n",
    "    rmse = RegressionEvaluator(labelCol='salary_in_usd', metricName='rmse').evaluate(pred)\n",
    "    mae = RegressionEvaluator(labelCol='salary_in_usd', metricName='mae').evaluate(pred)\n",
    "    r2 = RegressionEvaluator(labelCol='salary_in_usd', metricName='r2').evaluate(pred)\n",
    "    print('%s  RMSE=%.2f  MAE=%.2f  R2=%.4f' % (name, rmse, mae, r2))\n",
    "\n",
    "evaluate(lr_pred, 'LR ')\n",
    "evaluate(gbt_pred, 'GBT')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cell-29",
   "metadata": {},
   "source": [
    "改进点"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "cell-30",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "best maxIter: 50  best maxDepth: 3\n",
      "GBT-tuned  RMSE=47012.99  MAE=35406.00  R2=0.4226\n"
     ]
    }
   ],
   "source": [
    "from pyspark.ml.tuning import ParamGridBuilder, TrainValidationSplit\n",
    "\n",
    "gbt2 = GBTRegressor(featuresCol='features', labelCol='salary_in_usd', seed=42)\n",
    "grid = (ParamGridBuilder()\n",
    "        .addGrid(gbt2.maxIter, [20, 50])\n",
    "        .addGrid(gbt2.maxDepth, [3, 5, 7])\n",
    "        .build())\n",
    "evaluator = RegressionEvaluator(labelCol='salary_in_usd', metricName='rmse')\n",
    "tvs = TrainValidationSplit(estimator=gbt2, estimatorParamMaps=grid,\n",
    "                           evaluator=evaluator, trainRatio=0.8, seed=42)\n",
    "tvs_model = tvs.fit(train)\n",
    "best = tvs_model.bestModel\n",
    "best_pred = tvs_model.transform(test)\n",
    "print('best maxIter:', best.getMaxIter(), ' best maxDepth:', best.getMaxDepth())\n",
    "evaluate(best_pred, 'GBT-tuned')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "cell-31",
   "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>feature</th>\n",
       "      <th>importance</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>employee_residence=US</td>\n",
       "      <td>0.188529</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>experience_level=EX</td>\n",
       "      <td>0.086182</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>experience_level=EN</td>\n",
       "      <td>0.066488</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>44</th>\n",
       "      <td>work_year</td>\n",
       "      <td>0.063276</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17</th>\n",
       "      <td>job_title=Data Science Manager</td>\n",
       "      <td>0.052003</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>job_title=Research Scientist</td>\n",
       "      <td>0.046112</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>job_title=Data Analyst</td>\n",
       "      <td>0.043782</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>job_title=Other</td>\n",
       "      <td>0.041814</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>job_title=Data Engineer</td>\n",
       "      <td>0.041441</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>experience_level=MI</td>\n",
       "      <td>0.037247</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>job_title=Machine Learning Engineer</td>\n",
       "      <td>0.030656</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>experience_level=SE</td>\n",
       "      <td>0.030240</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>45</th>\n",
       "      <td>remote_ratio</td>\n",
       "      <td>0.029878</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>32</th>\n",
       "      <td>company_location=GB</td>\n",
       "      <td>0.026188</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>job_title=Applied Scientist</td>\n",
       "      <td>0.020778</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                feature  importance\n",
       "19                employee_residence=US    0.188529\n",
       "3                   experience_level=EX    0.086182\n",
       "2                   experience_level=EN    0.066488\n",
       "44                            work_year    0.063276\n",
       "17       job_title=Data Science Manager    0.052003\n",
       "15         job_title=Research Scientist    0.046112\n",
       "10               job_title=Data Analyst    0.043782\n",
       "11                      job_title=Other    0.041814\n",
       "8               job_title=Data Engineer    0.041441\n",
       "1                   experience_level=MI    0.037247\n",
       "12  job_title=Machine Learning Engineer    0.030656\n",
       "0                   experience_level=SE    0.030240\n",
       "45                         remote_ratio    0.029878\n",
       "32                  company_location=GB    0.026188\n",
       "16          job_title=Applied Scientist    0.020778"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd\n",
    "\n",
    "# 还原 OneHot 之后的特征名\n",
    "names = []\n",
    "for c, idx in zip(cat_cols, prep_model.stages[:len(cat_cols)]):\n",
    "    names += ['%s=%s' % (c, l) for l in idx.labels]\n",
    "names += num_cols\n",
    "\n",
    "imp = best.featureImportances.toArray()\n",
    "imp_df = pd.DataFrame({'feature': names, 'importance': imp}).sort_values('importance', ascending=False)\n",
    "imp_df.head(15)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "cell-32",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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Gu8FSURERGV7R+fn5+ONN96Q+ya7ijCQJWoAWVlZ4jcqERERUe3dvn0bZmZmVeZhIEvUAMr3ibx9+zb09fUbuTdERETKQyqVwtzcvNo9lwEGskQNonw5gb6+PgNZIiKiOqjJ0jw+7EVERERESomBLBEREREpJQayRERERKSUGMgSERERkVJiIEtERERESomBLBEREREpJQayRERERKSUGMgSERERkVJiIEtERERESomBLBEREREpJQayRERERKSUGMgSERERkVJSbewOEDVlXVcfh4qmTmN3g4iIqEGkLPVs1PY5I0tERERESomBLBEREREpJQayRERERKSUGMgSERERkVJiIEtERERESomBLBEREREpJQay9cTKygrbt29v7G40urS0NEgkEty4caOxu0JERERNHANZqpXo6Gg4ODg0djdeSHx8PCQSCYqKiuTSQ0JC0KpVK/E8MzMTI0eORIsWLWBgYIAuXbrg6NGjL7u7REREVAl+IQLVypAhQzBgwIDG7sZL8eGHH0JdXR0JCQlo1qwZEhMTYWdn19jdIiIiov9fk56RlUqlGDNmDHR0dGBra4stW7YAKJt58/DwwPr162FsbIzmzZtj2bJl+Ouvv9C5c2doa2ujd+/euH37tliXlZUVwsLC0LNnT+jq6sLDwwP//fdfpW2fOXMGb7/9NjQ0NGBra4s9e/YAAP766y+oqKjgf//7n5j3+vXrkEgkuHnzJgBg+/btMDMzQ4sWLTBu3Dg8ePBAzPvff/9h8ODB0NLSQvv27bF///5q70OfPn0QFhaGsWPHQkNDA4cPHwYAnD59Gp06dYKOjg569+6Nf/75RywTGRkJR0dHaGlpwd7eHiEhIeK9s7CwEPPl5eVh1KhRMDQ0hIODA06dOqXQfnBwMExNTdGyZUt88sknePz4MQDgxo0b0NTURFxcHBwcHKCrqwsvLy/k5OSIZbOysjBixAgYGxvD0NAQCxYsqLbe+nLu3Dl8/PHHcHBwgJ2dHcaOHQtra+t6bYOIiIjqrkkHsnPnzsWjR49w8eJFbNy4EfPmzcOvv/4KoCyIu3TpEs6dO4cvvvgCwcHBGDduHNauXYu///4bDx48wNKlS+Xqmz9/PoKCgvDXX39BXV0dEydOrLDd3NxcDB06FF5eXkhNTcWqVaswdepUJCYmonPnzrC2thaDSQCIiorCW2+9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DcePH6/1PaiOr68vfvvtN3zzzTe4desWfv/9d1y7du2F6h0xYgQuX76M3377DUOHDlW4bmZmhmbNmuGXX37B9evXMWPGjEp3pahIdfc4JCQEPj4+iImJQUxMjNyymNmzZyM4OBinTp1CdnY2Tp06hRMnTtS4bSIiImocdQ5k9fT0cPLkScTGxqJdu3ZYuHAhQkJC4OrqKubp2LEjfHx84OHhgXHjxsHPzw9jx46tst7evXtj6NChcHd3h5+fn8J1dXV1LF++HIsXL8Zbb71VYR3h4eEwMTFBnz59YGdnh3Xr1tVo/9dySUlJMDExQbdu3fDtt98iKChIbreFRYsWQUVFBY6OjggKCsLOnTvlys+ZMweZmZmwtrbG8ePHq83/rAcPHmDq1KmwsbFBjx49kJ2djV9//VXcNioqKgpqampwdXVFt27dcPr06Xq/B126dMGBAwewbds2ODg44IMPPkBubu4L1WtoaAhPT08MHDgQOjo6Ctdbt26NtWvXwt/fHy4uLmjbti1GjRpVo/4C1b8mpqam2LVrFzw8PODg4IBWrVrhjz/+AAAsWLAAvr6+8PX1haWlJaZOnVqrWXMiIiJqHBKhlrvoW1lZISAgQHyim+hV99133+Hnn3/G3r17YWhoiMePH2POnDnIy8vDTz/91CBtSqVSGBgYwD4gEiqaioE7NR0pSz0buwtERE1K+e/QvLw86OvrV5m31jOygiDIPe1eF6GhodDV1VU4qtpjlqiuDh06hBEjRsDQ0BAAoKWlBTs7u1p97TARERG9emq8CPH+/fvIysrCnTt3YGNj80KNDhs2DG5ubgrp1e3lSlQXtra22Lt3L/r27QtdXV38+eefWLduncK3mREREZFyqXEgu2vXLixduhTe3t7o3bv3CzVaPgNL9DIsXboU06dPR8+ePVFcXAxra2ssWbIEH374YWN3jYiIiF5ArdfIElH1uEb29cE1skRE9atB18gSEREREb0KGMgSERERkVKq8zd7EVH1EgP7V/uxCBEREdUNZ2SJiIiISCkxkCUiIiIipcRAloiIiIiUEgNZIiIiIlJKDGSJiIiISClx1wKiBtR19XF+IYKS4BcbEBEpH87IEhEREZFSYiBLREREREqJgSwRERERKSUGskRERESklBjIEhEREZFSUupANj4+HhKJBEVFRQ3elq+vL8aMGdPg7SgL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bm6N3RUiIiJ6AXzYqxL3799HVlYW7ty5Axsbmxeqa9iwYRUGTdXt5Ur1Ky8vDw8ePMDy5csxefJk8UE6IiIiUk6cka3Erl270L17d3h7e6N3794vVJeurm6d9nKl+rV48WI4OTmJXx9MREREyo1rZIkaANfIvtq4RpaI6NXFNbJERERE1OQxkCUiIiIipcSHvYgaUGJg/2o/FiEiIqK64YwsERERESklBrJEREREpJQYyBIRERGRUmIgS0RERERKiYEsERERESkl7lpA1IC6rj7OL0RoZPzyAyKiposzskRERESklBjIEhEREZFSYiBLREREREqJgSwRERERKSUGskRERESklBjIvmbi4+MhkUhQVFTU4G35+vpizJgxDd5OdaysrLB9+/bG7gYRERHVMwayTYSzszP27t3bYPWXlJTAzs5OLq1Hjx7Ys2ePeO7p6Ym0tLQG60NGRgbGjBkDY2NjaGpqomPHjvj222+r7ScRERE1TdxHtok4f/481NXVG6z+Y8eOIT8/Xy7tt99+E9t88OABTp061WDtZ2dnw9XVFV27dsXx48dhbGyM33//HdOnT8edO3ewZMmSSvtJRERETRNnZJsIe3t78ePzM2fO4O2334aGhgZsbW3lZk3LRUREwNzcHKampli0aBFkMlmldUdHR2PkyJG4e/cuJBIJBgwYINdmVlYWnJycUFxcDEdHR6iqVvz30X///YfBgwdDS0sL7du3x/79+2s8vlWrVsHY2BiHDh3Cm2++iTZt2sDb2xs//vgjPv/8c9y9e7fSfgLA3bt34eHhAW1tbbz55ptITEwUr5WWlmLGjBkwMDCAubk5goOD8fTpUwBlSzE6dOiAuLg4WFhYwMXFpcZ9JiIioobFQLaJyc3NxdChQ+Hl5YXU1FSsWrUKU6dOlQvcACAyMhJxcXEICwvD9u3bERoaWmmd/fr1w7p162BqaoqcnBxERkbKXW/ZsiWio6MBAAkJCbh7926F9fj6+sLCwgIpKSkICAiAt7c3Ll++DADo1KkTDA0NFY6wsDAAZbO/H374IZo1k/8n6+XlBQMDAxw9erTKfm7ZsgWzZs3CP//8gzfeeAPTp08Xr61ZswZJSUlISEhAeHg4tm7diu+++068fuPGDXz55Zc4dOgQYmJiKr1PRERE9HJxaUETExoaihYtWmDp0qUAgLZt2yImJgYb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",
      "text/plain": [
       "<Figure size 700x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "top = imp_df.head(10)\n",
    "plt.figure(figsize=(7, 4))\n",
    "plt.barh(top['feature'][::-1], top['importance'][::-1], color='#2980b9')\n",
    "plt.title('GBT Top10 重要特征')\n",
    "plt.tight_layout()\n",
    "plt.savefig('fig_importance.png', dpi=150, bbox_inches='tight')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "cell-33",
   "metadata": {},
   "outputs": [],
   "source": [
    "spark.stop()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
