{
"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",
" | 0 | \n",
" 2020-01-01 | \n",
" 上海 | \n",
" 拼多多 | \n",
" 182894-455 | \n",
" 八匹马 | \n",
" 99 | \n",
" 83 | \n",
" 3351 | \n",
"
\n",
" \n",
" | 1 | \n",
" 2020-01-01 | \n",
" 上海 | \n",
" 抖音 | \n",
" 205635-402 | \n",
" 八匹马 | \n",
" 219 | \n",
" 29 | \n",
" 1016 | \n",
"
\n",
" \n",
" | 2 | \n",
" 2020-01-01 | \n",
" 上海 | \n",
" 天猫 | \n",
" 205654-021 | \n",
" 八匹马 | \n",
" 169 | \n",
" 85 | \n",
" 6320 | \n",
"
\n",
" \n",
" | 3 | \n",
" 2020-01-01 | \n",
" 上海 | \n",
" 天猫 | \n",
" 205654-519 | \n",
" 八匹马 | \n",
" 169 | \n",
" 14 | \n",
" 485 | \n",
"
\n",
" \n",
" | 4 | \n",
" 2020-01-01 | \n",
" 上海 | \n",
" 天猫 | \n",
" 377781-010 | \n",
" 皮皮虾 | \n",
" 249 | \n",
" 61 | \n",
" 2452 | \n",
"
\n",
" \n",
"
\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",
" | 0 | \n",
" 2020-01-01 | \n",
" 上海 | \n",
" 拼多多 | \n",
" 182894-455 | \n",
" 八匹马 | \n",
" 99 | \n",
" 83 | \n",
" 3351 | \n",
" 8217 | \n",
" 4866 | \n",
" 1 | \n",
"
\n",
" \n",
" | 1 | \n",
" 2020-01-01 | \n",
" 上海 | \n",
" 抖音 | \n",
" 205635-402 | \n",
" 八匹马 | \n",
" 219 | \n",
" 29 | \n",
" 1016 | \n",
" 6351 | \n",
" 5335 | \n",
" 1 | \n",
"
\n",
" \n",
" | 2 | \n",
" 2020-01-01 | \n",
" 上海 | \n",
" 天猫 | \n",
" 205654-021 | \n",
" 八匹马 | \n",
" 169 | \n",
" 85 | \n",
" 6320 | \n",
" 14365 | \n",
" 8045 | \n",
" 1 | \n",
"
\n",
" \n",
" | 3 | \n",
" 2020-01-01 | \n",
" 上海 | \n",
" 天猫 | \n",
" 205654-519 | \n",
" 八匹马 | \n",
" 169 | \n",
" 14 | \n",
" 485 | \n",
" 2366 | \n",
" 1881 | \n",
" 1 | \n",
"
\n",
" \n",
" | 4 | \n",
" 2020-01-01 | \n",
" 上海 | \n",
" 天猫 | \n",
" 377781-010 | \n",
" 皮皮虾 | \n",
" 249 | \n",
" 61 | \n",
" 2452 | \n",
" 15189 | \n",
" 12737 | \n",
" 1 | \n",
"
\n",
" \n",
"
\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",
" | 0 | \n",
" 2020-01-01 | \n",
" 上海 | \n",
" 拼多多 | \n",
" 182894-455 | \n",
" 八匹马 | \n",
" 99 | \n",
" 83 | \n",
" 3351 | \n",
" 8217 | \n",
" 4866 | \n",
" 1 | \n",
" 低端 | \n",
"
\n",
" \n",
" | 1 | \n",
" 2020-01-01 | \n",
" 上海 | \n",
" 抖音 | \n",
" 205635-402 | \n",
" 八匹马 | \n",
" 219 | \n",
" 29 | \n",
" 1016 | \n",
" 6351 | \n",
" 5335 | \n",
" 1 | \n",
" 低端 | \n",
"
\n",
" \n",
" | 2 | \n",
" 2020-01-01 | \n",
" 上海 | \n",
" 天猫 | \n",
" 205654-021 | \n",
" 八匹马 | \n",
" 169 | \n",
" 85 | \n",
" 6320 | \n",
" 14365 | \n",
" 8045 | \n",
" 1 | \n",
" 低端 | \n",
"
\n",
" \n",
" | 3 | \n",
" 2020-01-01 | \n",
" 上海 | \n",
" 天猫 | \n",
" 205654-519 | \n",
" 八匹马 | \n",
" 169 | \n",
" 14 | \n",
" 485 | \n",
" 2366 | \n",
" 1881 | \n",
" 1 | \n",
" 低端 | \n",
"
\n",
" \n",
" | 4 | \n",
" 2020-01-01 | \n",
" 上海 | \n",
" 天猫 | \n",
" 377781-010 | \n",
" 皮皮虾 | \n",
" 249 | \n",
" 61 | \n",
" 2452 | \n",
" 15189 | \n",
" 12737 | \n",
" 1 | \n",
" 低端 | \n",
"
\n",
" \n",
"
\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",
" | 1 | \n",
" 5409855 | \n",
" 3845162 | \n",
"
\n",
" \n",
" | 2 | \n",
" 4608455 | \n",
" 3190039 | \n",
"
\n",
" \n",
" | 3 | \n",
" 4164972 | \n",
" 2934584 | \n",
"
\n",
" \n",
" | 4 | \n",
" 3996770 | \n",
" 2882592 | \n",
"
\n",
" \n",
" | 5 | \n",
" 3239005 | \n",
" 2272902 | \n",
"
\n",
" \n",
" | 6 | \n",
" 2817936 | \n",
" 1897643 | \n",
"
\n",
" \n",
" | 7 | \n",
" 3501304 | \n",
" 2449313 | \n",
"
\n",
" \n",
" | 8 | \n",
" 2948189 | \n",
" 2071782 | \n",
"
\n",
" \n",
" | 9 | \n",
" 2632960 | \n",
" 1849277 | \n",
"
\n",
" \n",
" | 10 | \n",
" 2375385 | \n",
" 1671442 | \n",
"
\n",
" \n",
" | 11 | \n",
" 2385283 | \n",
" 1691646 | \n",
"
\n",
" \n",
" | 12 | \n",
" 1691973 | \n",
" 1170333 | \n",
"
\n",
" \n",
"
\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",
" | 1 | \n",
" 3845162 | \n",
" 5409855 | \n",
"
\n",
" \n",
" | 2 | \n",
" 3190039 | \n",
" 4608455 | \n",
"
\n",
" \n",
" | 3 | \n",
" 2934584 | \n",
" 4164972 | \n",
"
\n",
" \n",
" | 4 | \n",
" 2882592 | \n",
" 3996770 | \n",
"
\n",
" \n",
" | 5 | \n",
" 2272902 | \n",
" 3239005 | \n",
"
\n",
" \n",
" | 6 | \n",
" 1897643 | \n",
" 2817936 | \n",
"
\n",
" \n",
" | 7 | \n",
" 2449313 | \n",
" 3501304 | \n",
"
\n",
" \n",
" | 8 | \n",
" 2071782 | \n",
" 2948189 | \n",
"
\n",
" \n",
" | 9 | \n",
" 1849277 | \n",
" 2632960 | \n",
"
\n",
" \n",
" | 10 | \n",
" 1671442 | \n",
" 2375385 | \n",
"
\n",
" \n",
" | 11 | \n",
" 1691646 | \n",
" 2385283 | \n",
"
\n",
" \n",
" | 12 | \n",
" 1170333 | \n",
" 1691973 | \n",
"
\n",
" \n",
"
\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"
],
"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

"
],
"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",
" | 1 | \n",
" 5409855 | \n",
" ------- | \n",
" 3845162 | \n",
" ------- | \n",
"
\n",
" \n",
" | 2 | \n",
" 4608455 | \n",
" -14.81% | \n",
" 3190039 | \n",
" -17.04% | \n",
"
\n",
" \n",
" | 3 | \n",
" 4164972 | \n",
" -9.62% | \n",
" 2934584 | \n",
" -8.01% | \n",
"
\n",
" \n",
" | 4 | \n",
" 3996770 | \n",
" -4.04% | \n",
" 2882592 | \n",
" -1.77% | \n",
"
\n",
" \n",
" | 5 | \n",
" 3239005 | \n",
" -18.96% | \n",
" 2272902 | \n",
" -21.15% | \n",
"
\n",
" \n",
" | 6 | \n",
" 2817936 | \n",
" -13.00% | \n",
" 1897643 | \n",
" -16.51% | \n",
"
\n",
" \n",
" | 7 | \n",
" 3501304 | \n",
" 24.25% | \n",
" 2449313 | \n",
" 29.07% | \n",
"
\n",
" \n",
" | 8 | \n",
" 2948189 | \n",
" -15.80% | \n",
" 2071782 | \n",
" -15.41% | \n",
"
\n",
" \n",
" | 9 | \n",
" 2632960 | \n",
" -10.69% | \n",
" 1849277 | \n",
" -10.74% | \n",
"
\n",
" \n",
" | 10 | \n",
" 2375385 | \n",
" -9.78% | \n",
" 1671442 | \n",
" -9.62% | \n",
"
\n",
" \n",
" | 11 | \n",
" 2385283 | \n",
" 0.42% | \n",
" 1691646 | \n",
" 1.21% | \n",
"
\n",
" \n",
" | 12 | \n",
" 1691973 | \n",
" -29.07% | \n",
" 1170333 | \n",
" -30.82% | \n",
"
\n",
" \n",
"
\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"
],
"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"
],
"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",
" 1 | \n",
" 2 | \n",
" 3 | \n",
" 4 | \n",
" 5 | \n",
" 6 | \n",
" 7 | \n",
" 8 | \n",
" 9 | \n",
" 10 | \n",
" 11 | \n",
" 12 | \n",
"
\n",
" \n",
" | 销售区域 | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" | 上海 | \n",
" 1679125 | \n",
" 1689527 | \n",
" 1061193 | \n",
" 1082187 | \n",
" 841199 | \n",
" 785404 | \n",
" 863906 | \n",
" 734937 | \n",
" 1107693 | \n",
" 412108 | \n",
" 825169 | \n",
" 528041 | \n",
"
\n",
" \n",
" | 北京 | \n",
" 1878234 | \n",
" 1807787 | \n",
" 1360666 | \n",
" 1205989 | \n",
" 807300 | \n",
" 1216432 | \n",
" 1219083 | \n",
" 645727 | \n",
" 390077 | \n",
" 671608 | \n",
" 678668 | \n",
" 596146 | \n",
"
\n",
" \n",
" | 安徽 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 341308 | \n",
" 554155 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" | 广东 | \n",
" 0 | \n",
" 0 | \n",
" 388180 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 469390 | \n",
" 365191 | \n",
" 0 | \n",
" 395188 | \n",
" 0 | \n",
"
\n",
" \n",
" | 江苏 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 537079 | \n",
" 0 | \n",
" 0 | \n",
" 841032 | \n",
" 0 | \n",
" 0 | \n",
" 710962 | \n",
" 0 | \n",
" 215307 | \n",
"
\n",
" \n",
" | 浙江 | \n",
" 0 | \n",
" 0 | \n",
" 248354 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 439508 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" | 福建 | \n",
" 1852496 | \n",
" 1111141 | \n",
" 1106579 | \n",
" 830207 | \n",
" 1036351 | \n",
" 816100 | \n",
" 577283 | \n",
" 658627 | \n",
" 769999 | \n",
" 580707 | \n",
" 486258 | \n",
" 352479 | \n",
"
\n",
" \n",
"
\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",
" 1 | \n",
" 2 | \n",
" 3 | \n",
" 4 | \n",
" 5 | \n",
" 6 | \n",
" 7 | \n",
" 8 | \n",
" 9 | \n",
" 10 | \n",
" 11 | \n",
" 12 | \n",
" 总计 | \n",
"
\n",
" \n",
" | 销售区域 | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" | 上海 | \n",
" 1679125 | \n",
" 1689527 | \n",
" 1061193 | \n",
" 1082187 | \n",
" 841199 | \n",
" 785404 | \n",
" 863906 | \n",
" 734937 | \n",
" 1107693 | \n",
" 412108 | \n",
" 825169 | \n",
" 528041 | \n",
" 11610489 | \n",
"
\n",
" \n",
" | 北京 | \n",
" 1878234 | \n",
" 1807787 | \n",
" 1360666 | \n",
" 1205989 | \n",
" 807300 | \n",
" 1216432 | \n",
" 1219083 | \n",
" 645727 | \n",
" 390077 | \n",
" 671608 | \n",
" 678668 | \n",
" 596146 | \n",
" 12477717 | \n",
"
\n",
" \n",
" | 安徽 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 341308 | \n",
" 554155 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 895463 | \n",
"
\n",
" \n",
" | 广东 | \n",
" 0 | \n",
" 0 | \n",
" 388180 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 469390 | \n",
" 365191 | \n",
" 0 | \n",
" 395188 | \n",
" 0 | \n",
" 1617949 | \n",
"
\n",
" \n",
" | 江苏 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 537079 | \n",
" 0 | \n",
" 0 | \n",
" 841032 | \n",
" 0 | \n",
" 0 | \n",
" 710962 | \n",
" 0 | \n",
" 215307 | \n",
" 2304380 | \n",
"
\n",
" \n",
" | 浙江 | \n",
" 0 | \n",
" 0 | \n",
" 248354 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 439508 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 687862 | \n",
"
\n",
" \n",
" | 福建 | \n",
" 1852496 | \n",
" 1111141 | \n",
" 1106579 | \n",
" 830207 | \n",
" 1036351 | \n",
" 816100 | \n",
" 577283 | \n",
" 658627 | \n",
" 769999 | \n",
" 580707 | \n",
" 486258 | \n",
" 352479 | \n",
" 10178227 | \n",
"
\n",
" \n",
" | 总计 | \n",
" 5409855 | \n",
" 4608455 | \n",
" 4164972 | \n",
" 3996770 | \n",
" 3239005 | \n",
" 2817936 | \n",
" 3501304 | \n",
" 2948189 | \n",
" 2632960 | \n",
" 2375385 | \n",
" 2385283 | \n",
" 1691973 | \n",
" 39772087 | \n",
"
\n",
" \n",
"
\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",
" 1 | \n",
" 2 | \n",
" 3 | \n",
" 4 | \n",
" 5 | \n",
" 6 | \n",
" 7 | \n",
" 8 | \n",
" 9 | \n",
" 10 | \n",
" 11 | \n",
" 12 | \n",
"
\n",
" \n",
" | 价位 | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" | 高端 | \n",
" 1157 | \n",
" 897 | \n",
" 642 | \n",
" 685 | \n",
" 490 | \n",
" 378 | \n",
" 541 | \n",
" 528 | \n",
" 210 | \n",
" 113 | \n",
" 93 | \n",
" 127 | \n",
"
\n",
" \n",
" | 中端 | \n",
" 6518 | \n",
" 4963 | \n",
" 5469 | \n",
" 5155 | \n",
" 4170 | \n",
" 3679 | \n",
" 4361 | \n",
" 3680 | \n",
" 3412 | \n",
" 3104 | \n",
" 3225 | \n",
" 2048 | \n",
"
\n",
" \n",
" | 低端 | \n",
" 5220 | \n",
" 5525 | \n",
" 5127 | \n",
" 4430 | \n",
" 4625 | \n",
" 3947 | \n",
" 4184 | \n",
" 3233 | \n",
" 3618 | \n",
" 4008 | \n",
" 4199 | \n",
" 3642 | \n",
"
\n",
" \n",
"
\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",
" 1 | \n",
" 2 | \n",
" 3 | \n",
" 4 | \n",
" 5 | \n",
" 6 | \n",
" 7 | \n",
" 8 | \n",
" 9 | \n",
" 10 | \n",
" 11 | \n",
" 12 | \n",
"
\n",
" \n",
" | 价位 | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" | 高端 | \n",
" 1157 | \n",
" 897 | \n",
" 642 | \n",
" 685 | \n",
" 490 | \n",
" 378 | \n",
" 541 | \n",
" 528 | \n",
" 210 | \n",
" 113 | \n",
" 93 | \n",
" 127 | \n",
"
\n",
" \n",
" | 中端 | \n",
" 6518 | \n",
" 4963 | \n",
" 5469 | \n",
" 5155 | \n",
" 4170 | \n",
" 3679 | \n",
" 4361 | \n",
" 3680 | \n",
" 3412 | \n",
" 3104 | \n",
" 3225 | \n",
" 2048 | \n",
"
\n",
" \n",
" | 低端 | \n",
" 5220 | \n",
" 5525 | \n",
" 5127 | \n",
" 4430 | \n",
" 4625 | \n",
" 3947 | \n",
" 4184 | \n",
" 3233 | \n",
" 3618 | \n",
" 4008 | \n",
" 4199 | \n",
" 3642 | \n",
"
\n",
" \n",
"
\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",
" | A | \n",
" 2 | \n",
" 1 | \n",
" 1 | \n",
"
\n",
" \n",
" | AB | \n",
" 1 | \n",
" 1 | \n",
" 0 | \n",
"
\n",
" \n",
" | B | \n",
" 4 | \n",
" 1 | \n",
" 1 | \n",
"
\n",
" \n",
" | O | \n",
" 5 | \n",
" 0 | \n",
" 3 | \n",
"
\n",
" \n",
"
\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"
],
"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",
" | 1 | \n",
" 0.089725 | \n",
" 0.505467 | \n",
" 0.404808 | \n",
"
\n",
" \n",
" | 2 | \n",
" 0.078788 | \n",
" 0.435924 | \n",
" 0.485288 | \n",
"
\n",
" \n",
" | 3 | \n",
" 0.057128 | \n",
" 0.486652 | \n",
" 0.456220 | \n",
"
\n",
" \n",
" | 4 | \n",
" 0.066699 | \n",
" 0.501947 | \n",
" 0.431353 | \n",
"
\n",
" \n",
" | 5 | \n",
" 0.052773 | \n",
" 0.449111 | \n",
" 0.498115 | \n",
"
\n",
" \n",
" | 6 | \n",
" 0.047226 | \n",
" 0.459645 | \n",
" 0.493128 | \n",
"
\n",
" \n",
" | 7 | \n",
" 0.059542 | \n",
" 0.479969 | \n",
" 0.460489 | \n",
"
\n",
" \n",
" | 8 | \n",
" 0.070958 | \n",
" 0.494557 | \n",
" 0.434485 | \n",
"
\n",
" \n",
" | 9 | \n",
" 0.029006 | \n",
" 0.471271 | \n",
" 0.499724 | \n",
"
\n",
" \n",
" | 10 | \n",
" 0.015640 | \n",
" 0.429619 | \n",
" 0.554740 | \n",
"
\n",
" \n",
" | 11 | \n",
" 0.012372 | \n",
" 0.429028 | \n",
" 0.558601 | \n",
"
\n",
" \n",
" | 12 | \n",
" 0.021833 | \n",
" 0.352072 | \n",
" 0.626096 | \n",
"
\n",
" \n",
"
\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"
],
"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",
" company_name | \n",
" salary | \n",
" year | \n",
" edu | \n",
" job_name | \n",
" pos_count | \n",
" salary_lower | \n",
" salary_upper | \n",
" city | \n",
"
\n",
" \n",
" \n",
" \n",
" | 0 | \n",
" 软通动力集团 | \n",
" 12.5 | \n",
" 1-3年 | \n",
" 本科 | \n",
" python开发 | \n",
" 2 | \n",
" 10 | \n",
" 15 | \n",
" 成都 | \n",
"
\n",
" \n",
" | 1 | \n",
" 思湃德 | \n",
" 30.0 | \n",
" 3-5年 | \n",
" 本科 | \n",
" python | \n",
" 5 | \n",
" 20 | \n",
" 40 | \n",
" 成都 | \n",
"
\n",
" \n",
" | 2 | \n",
" 源码时代 | \n",
" 17.5 | \n",
" 3-5年 | \n",
" 大专 | \n",
" python 讲师 | \n",
" 3 | \n",
" 15 | \n",
" 20 | \n",
" 成都 | \n",
"
\n",
" \n",
" | 3 | \n",
" 三源合众 | \n",
" 8.0 | \n",
" 1年以内 | \n",
" 本科 | \n",
" python | \n",
" 1 | \n",
" 6 | \n",
" 10 | \n",
" 成都 | \n",
"
\n",
" \n",
" | 4 | \n",
" 软通动力 | \n",
" 10.5 | \n",
" 1-3年 | \n",
" 本科 | \n",
" python开发 | \n",
" 3 | \n",
" 8 | \n",
" 13 | \n",
" 成都 | \n",
"
\n",
" \n",
" | ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
"
\n",
" \n",
" | 6482 | \n",
" 公众智能 | \n",
" 9.0 | \n",
" 3-5年 | \n",
" 本科 | \n",
" 产品经理 | \n",
" 2 | \n",
" 8 | \n",
" 10 | \n",
" 西安 | \n",
"
\n",
" \n",
" | 6483 | \n",
" 微感 | \n",
" 9.0 | \n",
" 3-5年 | \n",
" 大专 | \n",
" 产品经理 | \n",
" 4 | \n",
" 8 | \n",
" 10 | \n",
" 西安 | \n",
"
\n",
" \n",
" | 6484 | \n",
" 巴斯光年 | \n",
" 15.0 | \n",
" 3-5年 | \n",
" 本科 | \n",
" 产品经理 | \n",
" 6 | \n",
" 10 | \n",
" 20 | \n",
" 西安 | \n",
"
\n",
" \n",
" | 6485 | \n",
" 西大华特科技 | \n",
" 6.5 | \n",
" 1-3年 | \n",
" 研究生 | \n",
" 产品经理(农药) | \n",
" 6 | \n",
" 5 | \n",
" 8 | \n",
" 西安 | \n",
"
\n",
" \n",
" | 6486 | \n",
" 西安纯粹科技 | \n",
" 4.5 | \n",
" 1-3年 | \n",
" 本科 | \n",
" 产品经理 | \n",
" 5 | \n",
" 3 | \n",
" 6 | \n",
" 西安 | \n",
"
\n",
" \n",
"
\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",
" pos_count | \n",
"
\n",
" \n",
" | city | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" | 上海 | \n",
" 3158 | \n",
"
\n",
" \n",
" | 深圳 | \n",
" 3061 | \n",
"
\n",
" \n",
" | 北京 | \n",
" 3009 | \n",
"
\n",
" \n",
" | 杭州 | \n",
" 2732 | \n",
"
\n",
" \n",
" | 广州 | \n",
" 2560 | \n",
"
\n",
" \n",
" | 南京 | \n",
" 2345 | \n",
"
\n",
" \n",
" | 武汉 | \n",
" 2031 | \n",
"
\n",
" \n",
" | 成都 | \n",
" 1913 | \n",
"
\n",
" \n",
" | 西安 | \n",
" 1802 | \n",
"
\n",
" \n",
"
\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",
" pos_count | \n",
"
\n",
" \n",
" | city | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" | 上海 | \n",
" 3158 | \n",
"
\n",
" \n",
" | 深圳 | \n",
" 3061 | \n",
"
\n",
" \n",
" | 北京 | \n",
" 3009 | \n",
"
\n",
" \n",
" | 杭州 | \n",
" 2732 | \n",
"
\n",
" \n",
" | 广州 | \n",
" 2560 | \n",
"
\n",
" \n",
" | 南京 | \n",
" 2345 | \n",
"
\n",
" \n",
" | 武汉 | \n",
" 2031 | \n",
"
\n",
" \n",
" | 成都 | \n",
" 1913 | \n",
"
\n",
" \n",
" | 西安 | \n",
" 1802 | \n",
"
\n",
" \n",
"
\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",
" salary | \n",
"
\n",
" \n",
" | city | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" | 北京 | \n",
" 23.6 | \n",
"
\n",
" \n",
" | 深圳 | \n",
" 20.3 | \n",
"
\n",
" \n",
" | 上海 | \n",
" 19.8 | \n",
"
\n",
" \n",
" | 杭州 | \n",
" 18.9 | \n",
"
\n",
" \n",
" | 广州 | \n",
" 14.4 | \n",
"
\n",
" \n",
" | 南京 | \n",
" 14.2 | \n",
"
\n",
" \n",
" | 成都 | \n",
" 12.6 | \n",
"
\n",
" \n",
" | 武汉 | \n",
" 11.8 | \n",
"
\n",
" \n",
" | 西安 | \n",
" 10.5 | \n",
"
\n",
" \n",
"
\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",
" salary | \n",
"
\n",
" \n",
" | city | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" | 北京 | \n",
" 23.6 | \n",
"
\n",
" \n",
" | 深圳 | \n",
" 20.3 | \n",
"
\n",
" \n",
" | 上海 | \n",
" 19.8 | \n",
"
\n",
" \n",
" | 杭州 | \n",
" 18.9 | \n",
"
\n",
" \n",
" | 广州 | \n",
" 14.4 | \n",
"
\n",
" \n",
" | 南京 | \n",
" 14.2 | \n",
"
\n",
" \n",
" | 成都 | \n",
" 12.6 | \n",
"
\n",
" \n",
" | 武汉 | \n",
" 11.8 | \n",
"
\n",
" \n",
" | 西安 | \n",
" 10.5 | \n",
"
\n",
" \n",
"
\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"
],
"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"
],
"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",
" | year | \n",
" 应届生 | \n",
" 1年以内 | \n",
" 经验不限 | \n",
" 1-3年 | \n",
" 3-5年 | \n",
" 5年以上 | \n",
"
\n",
" \n",
" | edu | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" | 学历不限 | \n",
" 9.2 | \n",
" 8.2 | \n",
" 10.9 | \n",
" 10.9 | \n",
" 16.4 | \n",
" 21.1 | \n",
"
\n",
" \n",
" | 大专 | \n",
" 7.2 | \n",
" 8.0 | \n",
" 8.4 | \n",
" 9.4 | \n",
" 14.3 | \n",
" 22.5 | \n",
"
\n",
" \n",
" | 本科 | \n",
" 7.3 | \n",
" 9.6 | \n",
" 13.0 | \n",
" 13.2 | \n",
" 20.0 | \n",
" 25.5 | \n",
"
\n",
" \n",
" | 研究生 | \n",
" 8.3 | \n",
" 12.7 | \n",
" 15.2 | \n",
" 17.1 | \n",
" 24.8 | \n",
" 30.5 | \n",
"
\n",
" \n",
"
\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"
],
"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"
],
"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
}