{ "cells": [ { "cell_type": "markdown", "id": "97982f4b-b3d0-47fe-b6e8-a1a327d03d93", "metadata": {}, "source": [ "## 深入浅出pandas-2" ] }, { "cell_type": "code", "execution_count": 1, "id": "834d7d19-4015-4048-a1a6-2b8c756f0115", "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "\n", "plt.rcParams['font.sans-serif'].insert(0, 'SimHei')\n", "plt.rcParams['axes.unicode_minus'] = False" ] }, { "cell_type": "code", "execution_count": 2, "id": "56becc00-f1c7-4f81-86d1-7f7b23fd65d4", "metadata": {}, "outputs": [], "source": [ "%config InlineBackend.figure_format = 'svg'" ] }, { "cell_type": "markdown", "id": "c81bfe94-906c-4e13-b321-0e6c397aea46", "metadata": {}, "source": [ "### 数据透视\n", "\n", "1. 数据聚合(指标统计)\n", "2. 排序和头部值\n", "3. 透视表和交叉表" ] }, { "cell_type": "code", "execution_count": 3, "id": "7836ce8b-1e1d-40e5-b01c-c228ebf60928", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
销售日期销售区域销售渠道销售订单品牌售价销售数量直接成本
02020-01-01上海拼多多182894-455八匹马99833351
12020-01-01上海抖音205635-402八匹马219291016
22020-01-01上海天猫205654-021八匹马169856320
32020-01-01上海天猫205654-519八匹马16914485
42020-01-01上海天猫377781-010皮皮虾249612452
\n", "
" ], "text/plain": [ " 销售日期 销售区域 销售渠道 销售订单 品牌 售价 销售数量 直接成本\n", "0 2020-01-01 上海 拼多多 182894-455 八匹马 99 83 3351\n", "1 2020-01-01 上海 抖音 205635-402 八匹马 219 29 1016\n", "2 2020-01-01 上海 天猫 205654-021 八匹马 169 85 6320\n", "3 2020-01-01 上海 天猫 205654-519 八匹马 169 14 485\n", "4 2020-01-01 上海 天猫 377781-010 皮皮虾 249 61 2452" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sales_df = pd.read_excel('res/2020年销售数据.xlsx', sheet_name='data')\n", "sales_df.head(5)" ] }, { "cell_type": "code", "execution_count": 4, "id": "ca3b2020-9470-4e49-a3ca-066dc9a437b3", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "RangeIndex: 1945 entries, 0 to 1944\n", "Data columns (total 8 columns):\n", " # Column Non-Null Count Dtype \n", "--- ------ -------------- ----- \n", " 0 销售日期 1945 non-null datetime64[ns]\n", " 1 销售区域 1945 non-null object \n", " 2 销售渠道 1945 non-null object \n", " 3 销售订单 1945 non-null object \n", " 4 品牌 1945 non-null object \n", " 5 售价 1945 non-null int64 \n", " 6 销售数量 1945 non-null int64 \n", " 7 直接成本 1945 non-null int64 \n", "dtypes: datetime64[ns](1), int64(3), object(4)\n", "memory usage: 121.7+ KB\n" ] } ], "source": [ "sales_df.info()" ] }, { "cell_type": "code", "execution_count": 5, "id": "224ae45b-172a-48bc-8df0-7d6c7099529a", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
销售日期销售区域销售渠道销售订单品牌售价销售数量直接成本销售额毛利润月份
02020-01-01上海拼多多182894-455八匹马99833351821748661
12020-01-01上海抖音205635-402八匹马219291016635153351
22020-01-01上海天猫205654-021八匹马1698563201436580451
32020-01-01上海天猫205654-519八匹马16914485236618811
42020-01-01上海天猫377781-010皮皮虾24961245215189127371
\n", "
" ], "text/plain": [ " 销售日期 销售区域 销售渠道 销售订单 品牌 售价 销售数量 直接成本 销售额 毛利润 月份\n", "0 2020-01-01 上海 拼多多 182894-455 八匹马 99 83 3351 8217 4866 1\n", "1 2020-01-01 上海 抖音 205635-402 八匹马 219 29 1016 6351 5335 1\n", "2 2020-01-01 上海 天猫 205654-021 八匹马 169 85 6320 14365 8045 1\n", "3 2020-01-01 上海 天猫 205654-519 八匹马 169 14 485 2366 1881 1\n", "4 2020-01-01 上海 天猫 377781-010 皮皮虾 249 61 2452 15189 12737 1" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 添加销售额、毛利润、月份列\n", "sales_df['销售额'] = sales_df.售价 * sales_df.销售数量\n", "sales_df['毛利润'] = sales_df.销售额 - sales_df.直接成本\n", "sales_df['月份'] = sales_df.销售日期.dt.month\n", "sales_df.head(5)" ] }, { "cell_type": "code", "execution_count": 6, "id": "c8878bfd-64de-4a6a-9ae3-36e9af40d45e", "metadata": {}, "outputs": [], "source": [ "def make_tag(price):\n", " if price < 300:\n", " return '低端'\n", " elif price < 800:\n", " return '中端'\n", " return '高端'" ] }, { "cell_type": "code", "execution_count": 7, "id": "4cba4262-b952-4fce-9b07-fed9c5f2a2e3", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
销售日期销售区域销售渠道销售订单品牌售价销售数量直接成本销售额毛利润月份价位
02020-01-01上海拼多多182894-455八匹马99833351821748661低端
12020-01-01上海抖音205635-402八匹马219291016635153351低端
22020-01-01上海天猫205654-021八匹马1698563201436580451低端
32020-01-01上海天猫205654-519八匹马16914485236618811低端
42020-01-01上海天猫377781-010皮皮虾24961245215189127371低端
\n", "
" ], "text/plain": [ " 销售日期 销售区域 销售渠道 销售订单 品牌 售价 销售数量 直接成本 销售额 毛利润 月份 价位\n", "0 2020-01-01 上海 拼多多 182894-455 八匹马 99 83 3351 8217 4866 1 低端\n", "1 2020-01-01 上海 抖音 205635-402 八匹马 219 29 1016 6351 5335 1 低端\n", "2 2020-01-01 上海 天猫 205654-021 八匹马 169 85 6320 14365 8045 1 低端\n", "3 2020-01-01 上海 天猫 205654-519 八匹马 169 14 485 2366 1881 1 低端\n", "4 2020-01-01 上海 天猫 377781-010 皮皮虾 249 61 2452 15189 12737 1 低端" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 根据商品的价格添加价位标签\n", "sales_df['价位'] = sales_df.售价.apply(make_tag)\n", "sales_df.head(5)" ] }, { "cell_type": "code", "execution_count": 8, "id": "b2a2b472-55fc-4d35-8530-445e8ffbf800", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "销售额: 39772087元\n", "毛利润: 27926715元\n", "销售数量: 107403件\n", "毛利率: 70.22%\n" ] } ], "source": [ "# 统计北极星指标\n", "GMV, profit, quantity = sales_df[['销售额', '毛利润', '销售数量']].sum()\n", "print(f'销售额: {GMV}元')\n", "print(f'毛利润: {profit}元')\n", "print(f'销售数量: {quantity}件')\n", "print(f'毛利率: {profit / GMV:.2%}')" ] }, { "cell_type": "code", "execution_count": 9, "id": "5b6ac225-6834-462f-a5b7-8be8297b66d0", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
销售额毛利润
月份
154098553845162
246084553190039
341649722934584
439967702882592
532390052272902
628179361897643
735013042449313
829481892071782
926329601849277
1023753851671442
1123852831691646
1216919731170333
\n", "
" ], "text/plain": [ " 销售额 毛利润\n", "月份 \n", "1 5409855 3845162\n", "2 4608455 3190039\n", "3 4164972 2934584\n", "4 3996770 2882592\n", "5 3239005 2272902\n", "6 2817936 1897643\n", "7 3501304 2449313\n", "8 2948189 2071782\n", "9 2632960 1849277\n", "10 2375385 1671442\n", "11 2385283 1691646\n", "12 1691973 1170333" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 统计每个月的销售额和毛利润\n", "temp1 = sales_df.groupby('月份')[['销售额', '毛利润']].agg('sum')\n", "temp1" ] }, { "cell_type": "code", "execution_count": 10, "id": "a8f179a1-c270-458d-be84-b862ca2c143d", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
毛利润销售额
月份
138451625409855
231900394608455
329345844164972
428825923996770
522729023239005
618976432817936
724493133501304
820717822948189
918492772632960
1016714422375385
1116916462385283
1211703331691973
\n", "
" ], "text/plain": [ " 毛利润 销售额\n", "月份 \n", "1 3845162 5409855\n", "2 3190039 4608455\n", "3 2934584 4164972\n", "4 2882592 3996770\n", "5 2272902 3239005\n", "6 1897643 2817936\n", "7 2449313 3501304\n", "8 2071782 2948189\n", "9 1849277 2632960\n", "10 1671442 2375385\n", "11 1691646 2385283\n", "12 1170333 1691973" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 使用透视表统计每个月的销售额和毛利润\n", "pd.pivot_table(\n", " sales_df,\n", " index='月份',\n", " values=['销售额', '毛利润'],\n", " aggfunc='sum'\n", ")" ] }, { "cell_type": "code", "execution_count": 11, "id": "3a3cb912-c47f-4d47-8bd4-ffc9eb171cba", "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", " \n", " \n", " \n", " \n", " 2025-03-04T16:36:14.818907\n", " image/svg+xml\n", " \n", " \n", " Matplotlib v3.9.4, https://matplotlib.org/\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n" ], "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# 绘制折线图\n", "temp1.plot(\n", " kind='line',\n", " figsize=(10, 5),\n", " y=['销售额', '毛利润'], # 放到纵轴上的数据\n", " xlabel='', # 横轴的标签\n", " ylabel='销售额和毛利润', # 纵轴的标签\n", " marker='^', # 标记点符号\n", ")\n", "# plt.fill_between(np.arange(1, 13), temp1.销售额, where=temp1.销售额 >= 3e6, facecolor='red', alpha=0.25)\n", "# plt.fill_between(np.arange(1, 13), temp1.销售额, where=temp1.销售额 < 3e6, facecolor='green', alpha=0.25)\n", "# 定制纵轴的取值范围\n", "plt.ylim(0, 6e6)\n", "# 定制横轴的刻度\n", "plt.xticks(np.arange(1, 13), labels=[f'{x}月' for x in range(1, 13)])\n", "# 定制标题\n", "plt.title('2020年月度销售额和毛利润', fontdict={'fontsize': 22, 'color': 'navy'})\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 12, "id": "389db27d-2b11-47ea-a8c6-660fcc39b863", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAgAAAABACAYAAABsv8+/AAAAF3RFWHRUaXRsZQBSZFlsQnVfciBjb2xvcm1hcHXhWH4AAAAddEVYdERlc2NyaXB0aW9uAFJkWWxCdV9yIGNvbG9ybWFwXJ+/VwAAADB0RVh0QXV0aG9yAE1hdHBsb3RsaWIgdjMuOS40LCBodHRwczovL21hdHBsb3RsaWIub3JnCkKp9QAAADJ0RVh0U29mdHdhcmUATWF0cGxvdGxpYiB2My45LjQsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmck5DbSAAACDElEQVR4nO3WQZKcIACGUcATZZOb5rhKFtGekoTWmPTqf29DIYh2V8/UV799/9FLKaW0WkoppR7jcp6Xpb1dP+altX9afz3v7r7Je7U2G3/tb8M50/3LcF+b3Dd97vn95vvG8/bnvb6OYb3++b7lYn28vtw8d/8Yr/X79+37j/V6PqdNrz/bt3z6/P17qGU7j/U8b3V9u1739fZ4/ZjfO+frvc7r5Rj7Pm7D/Lex39w3ntcv1ifP+cv36tuw/3LsH97/7L7+2r+P6/D51vH6eX7c19dtmH/m3Kv923r+XH3YP7u+Tfe9P2+bPefivOl923h+eTY+/fn853OOP6/93xkAkEQAAEAgAQAAgQQAAAQSAAAQSAAAQCABAACBBAAABBIAABBIAABAIAEAAIEEAAAEEgAAEEgAAEAgAQAAgQQAAAQSAAAQSAAAQCABAACBBAAABBIAABBIAABAIAEAAIEEAAAEEgAAEEgAAEAgAQAAgQQAAAQSAAAQSAAAQCABAACBBAAABBIAABBIAABAIAEAAIEEAAAEEgAAEEgAAEAgAQAAgQQAAAQSAAAQSAAAQCABAACBBAAABBIAABBIAABAIAEAAIEEAAAEEgAAEEgAAEAgAQAAgQQAAAQSAAAQSAAAQCABAACBBAAABBIAABBIAABAIAEAAIEEAAAEEgAAEEgAAEAgAQAAgX4C40o+WRoAarYAAAAASUVORK5CYII=", "text/html": [ "
RdYlBu_r
\"RdYlBu_r
under
bad
over
" ], "text/plain": [ "" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "plt.cm.RdYlBu_r" ] }, { "cell_type": "code", "execution_count": 13, "id": "621a2487-2d15-450d-9f69-df8089616bd9", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
 销售额销售额月环比毛利润毛利润月环比
月份    
15409855-------3845162-------
24608455-14.81%3190039-17.04%
34164972-9.62%2934584-8.01%
43996770-4.04%2882592-1.77%
53239005-18.96%2272902-21.15%
62817936-13.00%1897643-16.51%
7350130424.25%244931329.07%
82948189-15.80%2071782-15.41%
92632960-10.69%1849277-10.74%
102375385-9.78%1671442-9.62%
1123852830.42%16916461.21%
121691973-29.07%1170333-30.82%
\n" ], "text/plain": [ "" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 计算月环比\n", "temp1['销售额月环比'] = temp1.销售额.pct_change()\n", "temp1['毛利润月环比'] = temp1.毛利润.pct_change()\n", "# 索引重排序\n", "temp1 = temp1.reindex(columns=['销售额', '销售额月环比', '毛利润', '毛利润月环比'])\n", "# 渲染输出\n", "temp1.style.format(\n", " formatter={\n", " '销售额月环比': '{:.2%}',\n", " '毛利润月环比': '{:.2%}'\n", " },\n", " na_rep='-------'\n", ").background_gradient(\n", " 'RdYlBu_r',\n", " subset=['销售额月环比', '毛利润月环比']\n", ")" ] }, { "cell_type": "code", "execution_count": 14, "id": "6b158aea-fe6e-4938-a4f8-4b880c6f23d0", "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", " \n", " \n", " \n", " \n", " 2025-03-04T16:36:14.935644\n", " image/svg+xml\n", " \n", " \n", " Matplotlib v3.9.4, https://matplotlib.org/\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n" ], "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# 绘制横线图\n", "mu = temp1.销售额.mean()\n", "temp1['diff'] = temp1.销售额 - mu\n", "temp1['colors'] = temp1.销售额.map(lambda x: 'green' if x > mu else 'red')\n", "\n", "plt.figure(figsize=(8, 6), dpi=200)\n", "plt.hlines(y=temp1.index, xmin=0, xmax=temp1['diff'], color=temp1.colors, alpha=0.6, linewidth=6)\n", "plt.yticks(np.arange(1, 13), labels=[f'{x}月' for x in np.arange(1, 13)])\n", "# 定制网格线\n", "plt.grid(linestyle='--', linewidth=0.4, alpha=0.5)\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 15, "id": "810936a1-f6c5-43e9-9eda-b9fe8014ba9f", "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", " \n", " \n", " \n", " \n", " 2025-03-04T16:36:15.010463\n", " image/svg+xml\n", " \n", " \n", " Matplotlib v3.9.4, https://matplotlib.org/\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n" ], "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# 各品牌对销售额贡献占比\n", "temp2 = sales_df.groupby('品牌')['销售额'].sum()\n", "temp2.plot(\n", " kind='pie',\n", " ylabel='',\n", " autopct='%.2f%%', # 自动计算并显示百分比\n", " pctdistance=0.82, # 百分比标签到圆心的距离\n", " wedgeprops=dict(width=0.35, edgecolor='w'), # 定制环状饼图\n", " explode=[0.1, 0, 0, 0, 0], # 分离饼图\n", ")\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 16, "id": "1465d545-14e8-435d-9b12-651df3bab9ea", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
月份123456789101112
销售区域
上海16791251689527106119310821878411997854048639067349371107693412108825169528041
北京187823418077871360666120598980730012164321219083645727390077671608678668596146
安徽0003413085541550000000
广东00388180000046939036519103951880
江苏00053707900841032007109620215307
浙江0024835400004395080000
福建1852496111114111065798302071036351816100577283658627769999580707486258352479
\n", "
" ], "text/plain": [ "月份 1 2 3 4 5 6 7 8 \\\n", "销售区域 \n", "上海 1679125 1689527 1061193 1082187 841199 785404 863906 734937 \n", "北京 1878234 1807787 1360666 1205989 807300 1216432 1219083 645727 \n", "安徽 0 0 0 341308 554155 0 0 0 \n", "广东 0 0 388180 0 0 0 0 469390 \n", "江苏 0 0 0 537079 0 0 841032 0 \n", "浙江 0 0 248354 0 0 0 0 439508 \n", "福建 1852496 1111141 1106579 830207 1036351 816100 577283 658627 \n", "\n", "月份 9 10 11 12 \n", "销售区域 \n", "上海 1107693 412108 825169 528041 \n", "北京 390077 671608 678668 596146 \n", "安徽 0 0 0 0 \n", "广东 365191 0 395188 0 \n", "江苏 0 710962 0 215307 \n", "浙江 0 0 0 0 \n", "福建 769999 580707 486258 352479 " ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 各销售区域每个月的销售额\n", "temp3 = sales_df.groupby(['销售区域', '月份'], as_index=False)[['销售额']].sum()\n", "# pivot - 将行旋转到列上(窄表 ----> 宽表)\n", "# melt - 将列旋转到行上(宽表 ----> 窄表)\n", "temp3.pivot(index='销售区域', columns='月份', values='销售额').fillna(0).astype('i8')" ] }, { "cell_type": "code", "execution_count": 17, "id": "1adf23bb-7120-416c-846e-1098aac2e1f4", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
月份123456789101112总计
销售区域
上海1679125168952710611931082187841199785404863906734937110769341210882516952804111610489
北京18782341807787136066612059898073001216432121908364572739007767160867866859614612477717
安徽0003413085541550000000895463
广东003881800000469390365191039518801617949
江苏000537079008410320071096202153072304380
浙江0024835400004395080000687862
福建185249611111411106579830207103635181610057728365862776999958070748625835247910178227
总计54098554608455416497239967703239005281793635013042948189263296023753852385283169197339772087
\n", "
" ], "text/plain": [ "月份 1 2 3 4 5 6 7 8 \\\n", "销售区域 \n", "上海 1679125 1689527 1061193 1082187 841199 785404 863906 734937 \n", "北京 1878234 1807787 1360666 1205989 807300 1216432 1219083 645727 \n", "安徽 0 0 0 341308 554155 0 0 0 \n", "广东 0 0 388180 0 0 0 0 469390 \n", "江苏 0 0 0 537079 0 0 841032 0 \n", "浙江 0 0 248354 0 0 0 0 439508 \n", "福建 1852496 1111141 1106579 830207 1036351 816100 577283 658627 \n", "总计 5409855 4608455 4164972 3996770 3239005 2817936 3501304 2948189 \n", "\n", "月份 9 10 11 12 总计 \n", "销售区域 \n", "上海 1107693 412108 825169 528041 11610489 \n", "北京 390077 671608 678668 596146 12477717 \n", "安徽 0 0 0 0 895463 \n", "广东 365191 0 395188 0 1617949 \n", "江苏 0 710962 0 215307 2304380 \n", "浙江 0 0 0 0 687862 \n", "福建 769999 580707 486258 352479 10178227 \n", "总计 2632960 2375385 2385283 1691973 39772087 " ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 创建透视表\n", "pd.pivot_table(\n", " sales_df,\n", " index='销售区域',\n", " columns='月份',\n", " values='销售额',\n", " aggfunc='sum',\n", " fill_value=0,\n", " margins=True,\n", " margins_name='总计'\n", ")" ] }, { "cell_type": "code", "execution_count": 18, "id": "fdf54c9a-64c3-453d-bc5b-533fce7b25ed", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "RangeIndex: 1945 entries, 0 to 1944\n", "Data columns (total 12 columns):\n", " # Column Non-Null Count Dtype \n", "--- ------ -------------- ----- \n", " 0 销售日期 1945 non-null datetime64[ns]\n", " 1 销售区域 1945 non-null object \n", " 2 销售渠道 1945 non-null object \n", " 3 销售订单 1945 non-null object \n", " 4 品牌 1945 non-null object \n", " 5 售价 1945 non-null int64 \n", " 6 销售数量 1945 non-null int64 \n", " 7 直接成本 1945 non-null int64 \n", " 8 销售额 1945 non-null int64 \n", " 9 毛利润 1945 non-null int64 \n", " 10 月份 1945 non-null int32 \n", " 11 价位 1945 non-null category \n", "dtypes: category(1), datetime64[ns](1), int32(1), int64(5), object(4)\n", "memory usage: 161.7+ KB\n" ] } ], "source": [ "# 将价位字段处理成category类型并指定排序的顺序\n", "sales_df['价位'] = sales_df.价位.astype('category').cat.reorder_categories(['高端', '中端', '低端'])\n", "sales_df.info()" ] }, { "cell_type": "code", "execution_count": 19, "id": "6e706575-3260-4b37-99fe-696db4f6fe7b", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
月份123456789101112
价位
高端115789764268549037854152821011393127
中端651849635469515541703679436136803412310432252048
低端522055255127443046253947418432333618400841993642
\n", "
" ], "text/plain": [ "月份 1 2 3 4 5 6 7 8 9 10 11 12\n", "价位 \n", "高端 1157 897 642 685 490 378 541 528 210 113 93 127\n", "中端 6518 4963 5469 5155 4170 3679 4361 3680 3412 3104 3225 2048\n", "低端 5220 5525 5127 4430 4625 3947 4184 3233 3618 4008 4199 3642" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 统计每个月各种价位产品的销量\n", "temp4 = sales_df.pivot_table(\n", " index='价位',\n", " columns='月份',\n", " values='销售数量',\n", " observed=False,\n", " fill_value=0,\n", " aggfunc='sum'\n", ")\n", "temp4" ] }, { "cell_type": "code", "execution_count": 20, "id": "12527025-64f5-4a0a-9bf5-6bdbc4b6f93b", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
月份123456789101112
价位
高端115789764268549037854152821011393127
中端651849635469515541703679436136803412310432252048
低端522055255127443046253947418432333618400841993642
\n", "
" ], "text/plain": [ "月份 1 2 3 4 5 6 7 8 9 10 11 12\n", "价位 \n", "高端 1157 897 642 685 490 378 541 528 210 113 93 127\n", "中端 6518 4963 5469 5155 4170 3679 4361 3680 3412 3104 3225 2048\n", "低端 5220 5525 5127 4430 4625 3947 4184 3233 3618 4008 4199 3642" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 交叉表\n", "pd.crosstab(\n", " index=sales_df.价位,\n", " columns=sales_df.月份,\n", " values=sales_df.销售数量,\n", " aggfunc='sum'\n", ")" ] }, { "cell_type": "code", "execution_count": 21, "id": "d99ecd49-2669-493c-ae04-974afa71dc4d", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
人格𝛂𝛃𝛄
血型
A211
AB110
B411
O503
\n", "
" ], "text/plain": [ "人格 𝛂 𝛃 𝛄\n", "血型 \n", "A 2 1 1\n", "AB 1 1 0\n", "B 4 1 1\n", "O 5 0 3" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "blood_types = np.array(['B', 'A', 'O', 'O', 'AB', 'B', 'O', 'B', 'AB', 'A', 'A', 'O', 'B', 'O', 'O', 'O', 'O', 'A', 'B', 'B'])\n", "personality_types = np.array(['𝛃', '𝛂', '𝛂', '𝛂', '𝛃', '𝛂', '𝛄', '𝛄', '𝛂', '𝛄', '𝛃', '𝛂', '𝛂', '𝛂', '𝛄', '𝛄', '𝛂', '𝛂', '𝛂', '𝛂'])\n", "\n", "# 创建交叉表\n", "pd.crosstab(\n", " index=blood_types,\n", " columns=personality_types,\n", " rownames=['血型'],\n", " colnames=['人格'],\n", ")" ] }, { "cell_type": "code", "execution_count": 22, "id": "3cba2e9e-8335-4081-a253-5ab6d08d8559", "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", " \n", " \n", " \n", " \n", " 2025-03-04T16:36:15.175043\n", " image/svg+xml\n", " \n", " \n", " Matplotlib v3.9.4, https://matplotlib.org/\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n" ], "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# 绘制堆叠柱状图\n", "temp4.T.plot(\n", " figsize=(10, 4),\n", " kind='bar',\n", " width=0.6,\n", " xlabel='',\n", " ylabel='销售数量',\n", " stacked=True\n", ")\n", "plt.xticks(rotation=0)\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 23, "id": "9eba1698-d8a5-4b66-b617-fc68072a670e", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
价位高端中端低端
月份
10.0897250.5054670.404808
20.0787880.4359240.485288
30.0571280.4866520.456220
40.0666990.5019470.431353
50.0527730.4491110.498115
60.0472260.4596450.493128
70.0595420.4799690.460489
80.0709580.4945570.434485
90.0290060.4712710.499724
100.0156400.4296190.554740
110.0123720.4290280.558601
120.0218330.3520720.626096
\n", "
" ], "text/plain": [ "价位 高端 中端 低端\n", "月份 \n", "1 0.089725 0.505467 0.404808\n", "2 0.078788 0.435924 0.485288\n", "3 0.057128 0.486652 0.456220\n", "4 0.066699 0.501947 0.431353\n", "5 0.052773 0.449111 0.498115\n", "6 0.047226 0.459645 0.493128\n", "7 0.059542 0.479969 0.460489\n", "8 0.070958 0.494557 0.434485\n", "9 0.029006 0.471271 0.499724\n", "10 0.015640 0.429619 0.554740\n", "11 0.012372 0.429028 0.558601\n", "12 0.021833 0.352072 0.626096" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 让每一项数据除以对应月份的销售数量之和\n", "temp5 = temp4.T.divide(temp4.sum(), axis=0)\n", "temp5" ] }, { "cell_type": "code", "execution_count": 24, "id": "1ce2e80e-0af9-4162-a46d-b5d357a9362d", "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", " \n", " \n", " \n", " \n", " 2025-03-04T16:36:15.270110\n", " image/svg+xml\n", " \n", " \n", " Matplotlib v3.9.4, https://matplotlib.org/\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n" ], "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# 绘制百分比堆叠柱状图\n", "temp5.plot(\n", " figsize=(10, 4),\n", " kind='bar',\n", " width=0.6,\n", " xlabel='',\n", " ylabel='销量占比',\n", " stacked=True\n", ")\n", "plt.xticks(rotation=0)\n", "plt.yticks(np.linspace(0, 1, 6), labels=[f'{x:.0%}' for x in np.linspace(0, 1, 6)])\n", "plt.legend(loc='lower center')\n", "\n", "for i in temp5.index:\n", " y1, y2, y3 = temp5.loc[i]\n", " plt.text(i - 1, y2 / 2 + y1, f'{y2:.2%}', ha='center', va='center', fontdict={'size': 8})\n", " plt.text(i - 1, y3 / 2 + y2 + y1, f'{y3:.2%}', ha='center', va='center', fontdict={'size': 8})\n", "\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "82ac6b37-302e-4913-a973-4a7f4e6daf1d", "metadata": {}, "source": [ "### 作业:招聘岗位数据分析\n", "\n", "1. 统计出城市、招聘信息、招聘岗位的数量和平均月薪。\n", "2. 统计每个城市的岗位数量从高到低排序。\n", "3. 统计每个城市的平均薪资从高到低排序。\n", "4. 统计招聘岗位对学历要求的占比。\n", "5. 统计招聘岗位对工作年限的要求占比。\n", "6. 分析薪资跟学历和工作年限的关系。" ] }, { "cell_type": "code", "execution_count": 25, "id": "91e8b171-7568-4da1-8170-5d13fc8945bc", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
company_namesalaryyearedujob_namepos_countsalary_lowersalary_uppercity
0软通动力集团12.51-3年本科python开发21015成都
1思湃德30.03-5年本科python52040成都
2源码时代17.53-5年大专python 讲师31520成都
3三源合众8.01年以内本科python1610成都
4软通动力10.51-3年本科python开发3813成都
..............................
6482公众智能9.03-5年本科产品经理2810西安
6483微感9.03-5年大专产品经理4810西安
6484巴斯光年15.03-5年本科产品经理61020西安
6485西大华特科技6.51-3年研究生产品经理(农药)658西安
6486西安纯粹科技4.51-3年本科产品经理536西安
\n", "

6487 rows × 9 columns

\n", "
" ], "text/plain": [ " company_name salary year edu job_name pos_count salary_lower \\\n", "0 软通动力集团 12.5 1-3年 本科 python开发 2 10 \n", "1 思湃德 30.0 3-5年 本科 python 5 20 \n", "2 源码时代 17.5 3-5年 大专 python 讲师 3 15 \n", "3 三源合众 8.0 1年以内 本科 python 1 6 \n", "4 软通动力 10.5 1-3年 本科 python开发 3 8 \n", "... ... ... ... ... ... ... ... \n", "6482 公众智能 9.0 3-5年 本科 产品经理 2 8 \n", "6483 微感 9.0 3-5年 大专 产品经理 4 8 \n", "6484 巴斯光年 15.0 3-5年 本科 产品经理 6 10 \n", "6485 西大华特科技 6.5 1-3年 研究生 产品经理(农药) 6 5 \n", "6486 西安纯粹科技 4.5 1-3年 本科 产品经理 5 3 \n", "\n", " salary_upper city \n", "0 15 成都 \n", "1 40 成都 \n", "2 20 成都 \n", "3 10 成都 \n", "4 13 成都 \n", "... ... ... \n", "6482 10 西安 \n", "6483 10 西安 \n", "6484 20 西安 \n", "6485 8 西安 \n", "6486 6 西安 \n", "\n", "[6487 rows x 9 columns]" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "jobs_df = pd.read_csv('res/cleaned_jobs.csv')\n", "jobs_df" ] }, { "cell_type": "code", "execution_count": 26, "id": "7cadf547-f7aa-494b-beeb-678f5a09e967", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "城市数量: 9\n", "信息数量: 6487\n", "岗位数量: 22611\n", "平均薪资: 17.0\n" ] } ], "source": [ "# 统计北极星指标\n", "city_count = jobs_df['city'].nunique()\n", "info_count = jobs_df['company_name'].count()\n", "post_count = jobs_df['pos_count'].sum()\n", "salary_avg = jobs_df['salary'].mean().round(1)\n", "print(f'城市数量: {city_count}')\n", "print(f'信息数量: {info_count}')\n", "print(f'岗位数量: {post_count}')\n", "print(f'平均薪资: {salary_avg}')" ] }, { "cell_type": "code", "execution_count": 27, "id": "cb9fc057-df56-4f01-a08e-ab3427dca467", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
pos_count
city
上海3158
深圳3061
北京3009
杭州2732
广州2560
南京2345
武汉2031
成都1913
西安1802
\n", "
" ], "text/plain": [ " pos_count\n", "city \n", "上海 3158\n", "深圳 3061\n", "北京 3009\n", "杭州 2732\n", "广州 2560\n", "南京 2345\n", "武汉 2031\n", "成都 1913\n", "西安 1802" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 统计每个城市的岗位数量从高到低排序\n", "jobs_df.groupby('city')[['pos_count']].sum().sort_values(by='pos_count', ascending=False)" ] }, { "cell_type": "code", "execution_count": 28, "id": "430af08e-2ce2-4f4f-9d64-df2d09c7c9f3", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
pos_count
city
上海3158
深圳3061
北京3009
杭州2732
广州2560
南京2345
武汉2031
成都1913
西安1802
\n", "
" ], "text/plain": [ " pos_count\n", "city \n", "上海 3158\n", "深圳 3061\n", "北京 3009\n", "杭州 2732\n", "广州 2560\n", "南京 2345\n", "武汉 2031\n", "成都 1913\n", "西安 1802" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.pivot_table(\n", " jobs_df,\n", " index='city',\n", " values='pos_count',\n", " aggfunc='sum'\n", ").sort_values(by='pos_count', ascending=False)" ] }, { "cell_type": "code", "execution_count": 29, "id": "bcd4aeca-bb90-42e6-b45c-6cdea2c76271", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
salary
city
北京23.6
深圳20.3
上海19.8
杭州18.9
广州14.4
南京14.2
成都12.6
武汉11.8
西安10.5
\n", "
" ], "text/plain": [ " salary\n", "city \n", "北京 23.6\n", "深圳 20.3\n", "上海 19.8\n", "杭州 18.9\n", "广州 14.4\n", "南京 14.2\n", "成都 12.6\n", "武汉 11.8\n", "西安 10.5" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "jobs_df.groupby('city')[['salary']].mean().round(1).sort_values(by='salary', ascending=False)" ] }, { "cell_type": "code", "execution_count": 30, "id": "6e93f5c8-da3e-4064-ac77-748eb3167504", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
salary
city
北京23.6
深圳20.3
上海19.8
杭州18.9
广州14.4
南京14.2
成都12.6
武汉11.8
西安10.5
\n", "
" ], "text/plain": [ " salary\n", "city \n", "北京 23.6\n", "深圳 20.3\n", "上海 19.8\n", "杭州 18.9\n", "广州 14.4\n", "南京 14.2\n", "成都 12.6\n", "武汉 11.8\n", "西安 10.5" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 统计每个城市的平均薪资从高到低排序\n", "pd.pivot_table(\n", " jobs_df,\n", " index='city',\n", " values='salary',\n", " aggfunc='mean'\n", ").round(1).sort_values(by='salary', ascending=False)" ] }, { "cell_type": "code", "execution_count": 31, "id": "7ae067bf-2981-49f2-a224-28a5223dc21f", "metadata": {}, "outputs": [], "source": [ "jobs_df['edu'] = jobs_df.edu.astype('category').cat.reorder_categories(['学历不限', '大专', '本科', '研究生'])" ] }, { "cell_type": "code", "execution_count": 32, "id": "a87fab8f-18af-4c0b-9546-63d79778b4d8", "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", " \n", " \n", " \n", " \n", " 2025-03-04T16:36:15.390011\n", " image/svg+xml\n", " \n", " \n", " Matplotlib v3.9.4, https://matplotlib.org/\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n" ], "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# 统计招聘岗位对学历要求占比\n", "pd.pivot_table(\n", " jobs_df,\n", " index='edu',\n", " values='pos_count',\n", " aggfunc='sum',\n", " observed=True\n", ").plot(\n", " kind='pie',\n", " ylabel='',\n", " subplots=True,\n", " legend=False,\n", " autopct='%.2f%%',\n", " pctdistance=0.85,\n", " wedgeprops={'width': 0.35}\n", ")\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 33, "id": "15202818-48a8-40bb-8701-47bc1b481f80", "metadata": {}, "outputs": [], "source": [ "jobs_df['year'] = jobs_df.year.astype('category').cat.reorder_categories(['应届生', '1年以内', '经验不限', '1-3年', '3-5年', '5年以上'])" ] }, { "cell_type": "code", "execution_count": 34, "id": "6d965229-36d5-4c38-850c-3300726f208a", "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", " \n", " \n", " \n", " \n", " 2025-03-04T16:36:15.510875\n", " image/svg+xml\n", " \n", " \n", " Matplotlib v3.9.4, https://matplotlib.org/\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n" ], "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# 统计招聘岗位对工作年限要求绘制饼图\n", "pd.pivot_table(\n", " jobs_df,\n", " index='year',\n", " values='pos_count',\n", " aggfunc='sum',\n", " observed=True\n", ").plot(\n", " kind='pie',\n", " y='pos_count',\n", " ylabel='',\n", " legend=False,\n", " autopct='%.2f%%',\n", " pctdistance=0.85,\n", " wedgeprops={'width': 0.35}\n", ")\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 35, "id": "9c7ab419-0bc4-428f-be9b-6d4d617b6663", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
year应届生1年以内经验不限1-3年3-5年5年以上
edu
学历不限9.28.210.910.916.421.1
大专7.28.08.49.414.322.5
本科7.39.613.013.220.025.5
研究生8.312.715.217.124.830.5
\n", "
" ], "text/plain": [ "year 应届生 1年以内 经验不限 1-3年 3-5年 5年以上\n", "edu \n", "学历不限 9.2 8.2 10.9 10.9 16.4 21.1\n", "大专 7.2 8.0 8.4 9.4 14.3 22.5\n", "本科 7.3 9.6 13.0 13.2 20.0 25.5\n", "研究生 8.3 12.7 15.2 17.1 24.8 30.5" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 统计不同学历和工作年限平均薪资\n", "temp6 = pd.pivot_table(\n", " jobs_df,\n", " index='edu',\n", " columns='year',\n", " values='salary',\n", " observed=False,\n", " fill_value=0\n", ").round(1)\n", "temp6" ] }, { "cell_type": "code", "execution_count": 36, "id": "d8492b17-5ae8-47f0-a058-ab303a6087a9", "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", " \n", " \n", " \n", " \n", " 2025-03-04T16:36:15.588137\n", " image/svg+xml\n", " \n", " \n", " Matplotlib v3.9.4, https://matplotlib.org/\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n" ], "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# 绘制热力图\n", "plt.imshow(temp6, cmap='Reds')\n", "plt.xticks(np.arange(6), labels=temp6.columns)\n", "plt.yticks(np.arange(4), labels=temp6.index)\n", "\n", "for i in range(temp6.index.size):\n", " for j in range(temp6.columns.size):\n", " value = temp6.iat[i, j]\n", " color = 'w' if value > salary_avg else 'k'\n", " plt.text(j, i, value, ha='center', va='center', color=color)\n", "\n", "# 定制颜色条\n", "plt.colorbar()\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 37, "id": "a3eb8cd0-fe07-43a4-9514-8a38c08ca081", "metadata": {}, "outputs": [], "source": [ "# %pip install seaborn" ] }, { "cell_type": "code", "execution_count": 38, "id": "f6287994-0865-432a-9932-92b05b5bf7e8", "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", " \n", " \n", " \n", " \n", " 2025-03-04T16:36:16.112018\n", " image/svg+xml\n", " \n", " \n", " Matplotlib v3.9.4, https://matplotlib.org/\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n" ], "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import seaborn as sns\n", "\n", "sns.heatmap(temp6, cmap='Reds', annot=True)\n", "plt.xlabel('')\n", "plt.ylabel('')\n", "plt.yticks(rotation=0)\n", "plt.show()" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.13" } }, "nbformat": 4, "nbformat_minor": 5 }