diff --git a/data_analysis/Ch4.ipynb b/data_analysis/Ch4.ipynb
index 06b148d..cfa0f50 100644
--- a/data_analysis/Ch4.ipynb
+++ b/data_analysis/Ch4.ipynb
@@ -825,6 +825,10 @@
}
],
"source": [
+ "#使用代理服务器发送请求\n",
+ "headers = {\n",
+ " \"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36\"\n",
+ "}\n",
"httpproxy_handler=urllib.request.ProxyHandler({\"http\":\"124.88.67.81:80\"})\n",
"nullproxy_handler=urllib.request.ProxyHandler({})\n",
"proxy_switch=True\n",
@@ -836,7 +840,7 @@
" opener=urllib.request.build_opener(nullproxy_handler)\n",
"request=urllib.request.Request(\"https://www.bilibili.com/\", headers=headers)\n",
"response=opener.open(request)\n",
- "print(response.read())\n"
+ "print(response.read())"
]
},
{
@@ -2760,4 +2764,4 @@
},
"nbformat": 4,
"nbformat_minor": 5
-}
+}
\ No newline at end of file
diff --git a/data_analysis/Ch5.ipynb b/data_analysis/Ch5.ipynb
index 13c0d1a..062c1fb 100644
--- a/data_analysis/Ch5.ipynb
+++ b/data_analysis/Ch5.ipynb
@@ -370,8 +370,9 @@
}
],
"source": [
- "pair.match(\"718ak\").group(1)\n",
- "#报错是因为没有成对的字符,无法引用第一个捕获的字符。"
+ "m = pair.match(\"718ak\")\n",
+ "print(m.group(1) if m else None) # 没有成对的字符时返回None,避免AttributeError\n",
+ "#原写法 pair.match(\"718ak\").group(1) 会报错,因为没有成对的字符,match()返回None,调用None.group(1)报AttributeError"
]
},
{
@@ -1118,10 +1119,12 @@
}
],
"source": [
- "#有些标签的属性名称是不能使用的\n",
+ "#有些标签的属性名称是不能使用的(如带连字符的属性名data-foo),需要用attrs参数传入字典\n",
"data_soup=BeautifulSoup('
foo!
','lxml')\n",
- "data_soup.find_all(data-foo=\"value\")\n",
- "#报错,可匹配的结果\n",
+ "#错误写法:data_soup.find_all(data-foo=\"value\") # SyntaxError: data-foo不是合法的Python标识符\n",
+ "#正确写法:使用attrs参数传入字典\n",
+ "result = data_soup.find_all(attrs={'data-foo': 'value'})\n",
+ "print(result)\n",
"#[foo!
]"
]
},
@@ -1849,4 +1852,4 @@
},
"nbformat": 4,
"nbformat_minor": 5
-}
+}
\ No newline at end of file
diff --git a/pandas/ch3.ipynb b/pandas/ch3.ipynb
index a530e0d..b7dc348 100644
--- a/pandas/ch3.ipynb
+++ b/pandas/ch3.ipynb
@@ -154,10 +154,8 @@
"metadata": {},
"outputs": [],
"source": [
- "#使用循环方式完成数据清洗\n",
- "for i in range(df.shape[0]):\n",
- " for j in df.columns:\n",
- " df.loc[i, j] = str(df.loc[i, j]).replace(' ', '')\n",
+ "#使用向量化方式完成数据清洗(比循环方式快100-1000倍)\n",
+ "df = df.map(lambda x: str(x).replace(' ', ''))\n",
"df"
]
},
@@ -179,8 +177,8 @@
"metadata": {},
"outputs": [],
"source": [
- "#applymap函数完成数据清洗\n",
- "df = df.applymap(lambda x:str(x).replace(' ',''))\n",
+ "#map函数完成数据清洗(pandas 2.x中applymap已弃用,改用map)\n",
+ "df = df.map(lambda x:str(x).replace(' ',''))\n",
"df"
]
},
@@ -268,11 +266,13 @@
"metadata": {},
"outputs": [],
"source": [
- "#按行(axis=1)的实现计算毛利率,计算结果后添加”%”,并存储在【销售毛利率】列\n",
+ "#按行(axis=1)的实现计算毛利率,计算结果后添加\"%\",并存储在【销售毛利率】列\n",
"def func_01(row):\n",
" row['销售毛利率']=format(row['销售毛利']/row['销售收入'],'2%')#format()格式化函数\n",
" return row\n",
- "data[['销售收入','销售成本','销售毛利']].apply(func_01,axis=1)"
+ "#需要对完整的data应用func_01,并将结果赋值回data,才能保存新增的【销售毛利率】列\n",
+ "data=data.apply(func_01,axis=1)\n",
+ "data"
]
},
{
@@ -282,8 +282,8 @@
"metadata": {},
"outputs": [],
"source": [
- "#将DataFrame中销售收入,销售成本和销售毛利统一保留一位小数显示\n",
- "data[['销售收入','销售成本','销售毛利']].applymap(lambda x:\"%.1f\"%x)"
+ "#将DataFrame中销售收入,销售成本和销售毛利统一保留一位小数显示(pandas 2.x中applymap已弃用,改用map)\n",
+ "data[['销售收入','销售成本','销售毛利']].map(lambda x:\"%.1f\"%x)"
]
},
{
@@ -458,4 +458,4 @@
},
"nbformat": 4,
"nbformat_minor": 5
-}
+}
\ No newline at end of file