自制网页并爬取,处理异常值(第十九节课内容总结)
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>呼和浩特2025年每月平均气温</title><style>table {width: 100%;border-collapse: collapse;margin: 20px 0;}th, td {border: 1px solid #000;padding: 8px;text-align: center;}th {background-color: #f2f2f2;}</style>
</head>
<body><h1>呼和浩特2025年每月平均气温</h1><table><thead><tr><th>月份</th><th>高温 (℃)</th><th>低温 (℃)</th><th>空气</th><th>能见度 (km)</th><th>风速 (km/h)</th><th>总降雨 (mm)</th></tr></thead><tbody><tr><td>2024年08月</td><td>27</td><td>16</td><td>34 优</td><td>14.6</td><td>9.1</td><td>160.7</td></tr><tr><td>2024年09月</td><td>21</td><td>11</td><td>33 优</td><td>16.1</td><td>9.1</td><td>148.4</td></tr><tr><td>2024年10月</td><td>15</td><td>3</td><td>49 优</td><td>16.1</td><td>8.7</td><td>34.5</td></tr><tr><td>2024年11月</td><td>7</td><td>-3</td><td>62 优</td><td>14.6</td><td>7.9</td><td>2.2</td></tr><tr><td>2024年12月</td><td>-3</td><td>-14</td><td>60 优</td><td>22.5</td><td>6.1</td><td>0</td></tr><tr><td>2025年01月</td><td>-3</td><td>-15</td><td>76 优</td><td>20</td><td>6.6</td><td>0</td></tr><tr><td>2025年02月</td><td>-1</td><td>-14</td><td>59 优</td><td>25.5</td><td>8.4</td><td>0</td></tr><tr><td>2025年03月</td><td>10</td><td>-3</td><td>80 优</td><td>39.8</td><td>12.6</td><td>3.3</td></tr><tr><td>2025年04月</td><td>18</td><td>4</td><td>51 优</td><td>48.4</td><td>13.9</td><td>12.9</td></tr><tr><td>2025年05月</td><td>24</td><td>8</td><td>45 优</td><td>43.2</td><td>14</td><td>188</td></tr><tr><td>2025年06月</td><td>30</td><td>14</td><td>36 优</td><td>41.8</td><td>10.6</td><td>148</td></tr><tr><td>2025年07月</td><td>30</td><td>18</td><td>33 优</td><td>22.4</td><td>9.3</td><td>995.9</td></tr></tbody></table>
</body>
</html>
自制一个网页,可以方便爬取
获取网页url进行爬取,并把爬取到的内容保存为csv文件
因为要处理异常值,没有异常值,那就制造一点异常值
#删除包含空字段的行
import pandas as pd
df = pd.read_csv("TQ.csv")
new_df = df.dropna()
print(new_df.to_string())
#用指定内容来替换一些空字段
import pandas as pd
df = pd.read_csv("TQ.csv")
df.fillna("暂无分数信息", inplace = True)
print(df.to_string())
import pandas as pd# 读取CSV文件
df = pd.read_csv("TQ.csv")
print("原始数据:")
print(df.to_string())# 计算风速的均值并填充空值
mean_wind_speed = df["风速 (km/h)"].mean()
print("风速的均值为:", mean_wind_speed)
df["风速 (km/h)"].fillna(mean_wind_speed, inplace=True)
print("\n")
print("更改后数据:")
# 计算能见度的均值并填充空值
mean_visibility = df["能见度 (km)"].mean()
print("能见度的均值为:", mean_visibility)
df["能见度 (km)"].fillna(mean_visibility, inplace=True)# 打印处理后的数据
print(df.to_string())
import pandas as pd# 读取CSV文件
df = pd.read_csv("TQ.csv")
print("原始数据:")
print(df.to_string())
print("\n")
print("更改后数据:")
# 计算风速的中位数并填充空值
median_wind_speed = df["风速 (km/h)"].median()
print("风速的中位数为:", median_wind_speed)
df["风速 (km/h)"].fillna(median_wind_speed, inplace=True)# 计算能见度的中位数并填充空值
median_visibility = df["能见度 (km)"].median()
print("能见度的中位数为:", median_visibility)
df["能见度 (km)"].fillna(median_visibility, inplace=True)# 打印处理后的数据
print(df.to_string())
4种处理异常值的方法见上
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import font_manager as fmplt.rcParams['font.sans-serif'] = ['SimHei'] # 设置默认字体为黑体
plt.rcParams['axes.unicode_minus'] = False # 解决负号'-'显示为方块的问题# 读取CSV文件
df = pd.read_csv("TQ.csv")# 绘制散点图
plt.figure(figsize=(10, 6))
plt.scatter(df['月份'], df['高温 (℃)'], color='red', label='高温')
plt.scatter(df['月份'], df['低温 (℃)'], color='blue', label='低温')
plt.title('呼和浩特2024年8月到2025年8月的月平均温度图', fontproperties=font_prop)
plt.xlabel('月份', fontproperties=font_prop)
plt.ylabel('温度 (℃)', fontproperties=font_prop)
plt.legend(prop=font_prop)
plt.xticks(rotation=45, fontproperties=font_prop)
plt.tight_layout()
plt.show()
绘制散点图
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import font_manager as fmplt.rcParams['font.sans-serif'] = ['SimHei'] # 设置默认字体为黑体
plt.rcParams['axes.unicode_minus'] = False # 解决负号'-'显示为方块的问题# 读取CSV文件
df = pd.read_csv("TQ.csv")# 将月份转换为时间格式
df['月份'] = pd.to_datetime(df['月份'], format='%Y年%m月')# 绘制折线图
plt.figure(figsize=(10, 6))
plt.plot(df['月份'], df['风速 (km/h)'].fillna(0), marker='o', color='green', label='风速')
plt.plot(df['月份'], df['能见度 (km)'].fillna(0), marker='s', color='purple', label='能见度')# 设置图表标题和标签
plt.title('呼和浩特2024年8月到2025年8月的风速和能见度折线图', fontproperties=font_prop)
plt.xlabel('时间', fontproperties=font_prop)
plt.ylabel('值', fontproperties=font_prop)# 设置图例
plt.legend(prop=font_prop)# 旋转x轴的日期标签,以便它们不会重叠
plt.xticks(rotation=45)# 优化x轴的日期显示
plt.gcf().autofmt_xdate()# 显示图表
plt.tight_layout()
plt.show()
绘制折线图
import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import font_manager as fm# 设置中文字体,这里使用的是微软雅黑字体
font_path = 'C:\\Windows\\Fonts\\msyh.ttc' # 请根据实际情况修改字体路径
font_prop = fm.FontProperties(fname=font_path)# 读取CSV文件
df = pd.read_csv("TQ.csv")# 绘制核密度估计图
plt.figure(figsize=(8, 6))
sns.kdeplot(data=df['高温 (℃)'], shade=True, color='blue')# 设置图表标题和标签
plt.title('高温的核密度估计图', fontproperties=font_prop)
plt.xlabel('温度 (℃)', fontproperties=font_prop)
plt.ylabel('密度', fontproperties=font_prop)# 显示图表
plt.show()
绘制核密度图
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt# 读取CSV文件
df = pd.read_csv("TQ.csv")# 绘制热力图
plt.figure(figsize=(10, 8))
sns.heatmap(df.pivot("月份", "空气", "总降雨 (mm)"), annot=True, fmt=".1f", cmap="YlGnBu")
plt.title('总降雨热力图')
plt.xlabel('空气等级')
plt.ylabel('月份')
plt.show()
绘制热力图
import pandas as pd
import matplotlib.pyplot as plt# 读取CSV文件
df = pd.read_csv("TQ.csv")# 绘制高温的直方图
plt.figure(figsize=(10, 6))
plt.hist(df['高温 (℃)'], bins=10, color='red', alpha=0.7, label='高温 (℃)')
plt.title('高温分布直方图')
plt.xlabel('温度 (℃)')
plt.ylabel('频率')
plt.legend()
plt.grid(True)
plt.show()# 绘制低温的直方图
plt.figure(figsize=(10, 6))
plt.hist(df['低温 (℃)'], bins=10, color='blue', alpha=0.7, label='低温 (℃)')
plt.title('低温分布直方图')
plt.xlabel('温度 (℃)')
plt.ylabel('频率')
plt.legend()
plt.grid(True)
plt.show()# 绘制总降雨量的直方图,总降雨量为空的用0填充
df['总降雨 (mm)'].fillna(0, inplace=True)
plt.figure(figsize=(10, 6))
plt.hist(df['总降雨 (mm)'], bins=10, color='purple', alpha=0.7, label='总降雨量 (mm)')
plt.title('总降雨量分布直方图')
plt.xlabel('总降雨量 (mm)')
plt.ylabel('频率')
plt.legend()
plt.grid(True)
plt.show()