以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:
【解题思路】:使用Python编写爬虫,从指定网站抓取保定市2021年1月1日至今的天气数据,然后进行数据分析和可视化。
引自免费微信小程序:皆我百晓生
首先,让我们按照步骤逐步完成这个任务。我们将分为以下几个部分:爬虫、数据处理、数据分析和可视化。
1. 爬虫
使用Python的requests
库来获取网页源码,然后使用BeautifulSoup库进行解析。这里是一个简单的爬虫脚本示例:
import requests
from bs4 import BeautifulSoup
import pandas as pd
url = "http://www.tianqihoubao.com/lishi/baoding.html"
response = requests.get(url)
soup = BeautifulSoup(response.text, 'lxml')
table = soup.find('table', attrs={'class': 'tab_bj'})
rows = table.find_all('tr')
data = []
for row in rows[1:]: # 忽略表头行
cols = row.find_all('td')
cols = [ele.text.strip() for ele in cols]
data.append(cols)
df = pd.DataFrame(data, columns=['日期', '夜间天气', '夜间最低气温', '夜间最高气温', '夜间风力', '夜间风向',
'白天天气', '白天最低气温', '白天最高气温', '白天风力', '白天风向'])
df.to_excel('baoding_weather_data.xlsx', index=False)
这段代码会下载指定网页的数据并将其保存为一个名为"baoding_weather_data.xlsx"的Excel文件。
2. 数据处理
现在我们有了Excel文件,可以继续进行数据处理。首先加载数据,然后进行描述性分析和其他所需分析。
import pandas as pd
# 加载数据
df = pd.read_excel('baoding_weather_data.xlsx')
# 描述性分析
print(df.describe())
# 日最高气温、最低气温和平均气温趋势分析
daily_max_temp = df.filter(regex='最高气温').astype(float)
daily_min_temp = df.filter(regex='最低气温').astype(float)
daily_avg_temp = (daily_max_temp + daily_min_temp) / 2
monthly_max_temp = daily_max_temp.resample('M').mean()
monthly_min_temp = daily_min_temp.resample('M').mean()
monthly_avg_temp = daily_avg_temp.resample('M').mean()
# 天气种类统计分析
weather_counts = df['夜间天气'].value_counts() + df['白天天气'].value_counts()
# 气温风力天气统计
wind_temp_stats = df.groupby(['夜间风力', '夜间最低气温']).size().reset_index(name='counts')
# 月份与3级及以上风的关联性分析
strong_winds = df[df['夜间风力'] >= '3级']
months_with_strong_winds = strong_winds['日期'].dt.month.value_counts()
# 旅游季节推荐
tourism_season = df[(df['夜间最低气温'] > 10) & (df['夜间最高气温'] < 30) & (df['夜间风力'] <= '2级')].groupby('月份').size().reset_index(name='counts')
best_tourism_month = tourism_season.loc[tourism_season['counts'].idxmax(), '月份']
print("最适合旅游的月份是:", best_tourism_month)
3. 数据分析与可视化
现在我们可以创建所需的图表。这里使用matplotlib库绘制图表。
import matplotlib.pyplot as plt
import seaborn as sns
# 设置图形风格
sns.set(style="whitegrid")
# 日最高气温趋势
plt.figure(figsize=(12, 6))
sns.lineplot(data=daily_max_temp, x='日期', y='夜间最高气温', label='夜间')
sns.lineplot(data=daily_max_temp, x='日期', y='白天最高气温', label='白天')
plt.title('日最高气温趋势')
plt.xlabel('日期')
plt.ylabel('温度(℃)')
plt.legend()
plt.show()
# 日最低气温趋势
plt.figure(figsize=(12, 6))
sns.lineplot(data=daily_min_temp, x='日期', y='夜间最低气温', label='夜间')
sns.lineplot(data=daily_min_temp, x='日期', y='白天最低气温', label='白天')
plt.title('日最低气温趋势')
plt.xlabel('日期')
plt.ylabel('温度(℃)')
plt.legend()
plt.show()
# 月平均气温趋势
plt.figure(figsize=(12, 6))
sns.lineplot(data=monthly_avg_temp, x=monthly_avg_temp.index, y='夜间最低气温', label='夜间')
sns.lineplot(data=monthly_avg_temp, x=monthly_avg_temp.index, y='白天最低气温', label='白天')
plt.title('月平均气温趋势')
plt.xlabel('月份')
plt.ylabel('温度(℃)')
plt.legend()
plt.show()
# 天气种类统计
plt.figure(figsize=(8, 6))
sns.countplot(weather_counts.index)
plt.title('天气种类统计')
plt.xlabel('天气类型')
plt.ylabel('次数')
plt.xticks(rotation=90)
plt.show()
plt.show(block=False)
这个脚本将生成四张图表:日最高气温趋势、日最低气温趋势、月平均气温趋势和天气种类统计。根据这些图表,您可以进行进一步的解读和分析。
确保已经安装了所有必要的库,例如requests、beautifulsoup4、pandas、numpy、seaborn和matplotlib。如果有任何缺失的库,可以通过pip install命令进行安装。此外,由于网页结构可能会改变,因此在实际运行爬虫时可能需要调整解析HTML的部分代码。