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