使用pandas爬取数据并且可视化

 爬取数据:对爬取数据进行分析整理,挖掘,分析 并进行可视化展示

import requests  # 发送请求要用的模块 需要额外安装的
import parsel
import csv
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
plt.rcParams['font.family'] = 'SimSun'
#第一步:需要爬取的网站地址
url = 'https://tianqi.2345.com/'
# 发送 GET 请求
response = requests.get(url)
# 检查请求是否成功
if response.status_code == 200:
    # 获取网页内容
    html_content = response.text
    # 打印网页文本内容
    print(html_content)
else:
    print("请求失败,状态码:", response.status_code)

#
f = open('广-惠-河-深-天气.csv', mode='a', encoding='utf-8', newline='')
csv_writer = csv.writer(f)
csv_writer.writerow(['日期', '最高温度', '最低温度', '天气', '风向', '城市'])
city_list = [72049, 59287, 59293, 59493,57036]

for city in city_list:
    city_name = ''
    if city == 72049:
        city_name = '惠州'
    elif city == 59287:
        city_name = '广州'
    elif city == 59293:
        city_name = '河源'
    elif city == 59493:
        city_name = '深圳'
    # elif city== 57036:
    #     city_name='西安'
    for year in range(2023, 2024):
        for month in range(1, 13):
            url = f'https://tianqi.2345.com/Pc/GetHistory?areaInfo%5BareaId%5D={city}&areaInfo%5BareaType%5D=2&date%5Byear%5D={year}&date%5Bmonth%5D={month}'
            # 1. 发送请求
            response = requests.get(url=url)
            # 2. 获取数据
            html_data = response.json()['data']
            # 3. 解析数据
            select = parsel.Selector(html_data)
            trs = select.css('.history-table tr')  # 拿到31个tr
            for tr in trs[1:]:  # 第一个表头不要
                tds = tr.css('td::text').getall()  # 针对每个tr进行提取 取出所有的td里面的内容
                tds.append(city_name)  # 把城市追加到列表里面
                print(tds)
                # 4. 保存数据
                csv_writer.writerow(tds)
data = pd.read_csv('广-惠-河-深-天气.csv')
data[['日期','星期']] = data['日期'].str.split(' ',expand=True,n=1)
#去除多余字符
#data[['最高温度','最低温度']] = data[['最高温度','最低温度']].apply(lambda x: x.str.replace('°','').replace('', '0'))
data[['最高温度','最低温度']] = data[['最高温度','最低温度']].apply(lambda x: x.str.replace('°',''))
data.head()

# 按城市和天气分组,并计算每组的天数
grouped = data.groupby(['城市', '天气']).size().reset_index(name='天数')
# 将结果按城市分为4个DataFrame
gz_weather = grouped[grouped['城市'] == '广州']
hy_weather = grouped[grouped['城市'] == '河源']
hz_weather = grouped[grouped['城市'] == '惠州']
sz_weather = grouped[grouped['城市'] == '深圳']

#
# 定义一个函数,将原有的天气类型按照关键字划分
def classify_weather(weather):
    if '多云' in weather:
        return '多云'
    elif '晴' in weather:
        return '晴'
    elif '阴' in weather:
        return '阴'
    elif '大雨' in weather:
        return '雨'
    elif '中雨' in weather:
        return '雨'
    elif '小雨' in weather:
        return '雨'
    elif '雷阵雨' in weather:
        return '雨'
    elif '雾' in weather:
        return '雾'
    else:
        return '其他'
# 将原有的天气类型按照关键字划分,并存进新的 DataFrame 中
new_data = data[['城市', '天气']].copy()
new_data['新天气'] = new_data['天气'].apply(classify_weather)
#
# 按照城市和新天气列进行分组,并计算每一种天气的天数
count_data = new_data.groupby(['城市', '新天气'])['天气'].count().reset_index()
# 根据条件筛选出符合要求的行
df1 = count_data.loc[count_data['城市'] == '广州']
df2 = count_data.loc[count_data['城市'] == '河源']
df3 = count_data.loc[count_data['城市'] == '惠州']
df4 = count_data.loc[count_data['城市'] == '深圳']

# 将“天气”列名改为“天数”
df5 = df1.rename(columns={'天气': '天数'})
df6 = df2.rename(columns={'天气': '天数'})
df7 = df3.rename(columns={'天气': '天数'})
df8 = df4.rename(columns={'天气': '天数'})

# 输出结果
df5.to_csv('df5.csv',index=False)
df6.to_csv('df6.csv',index=False)
df7.to_csv('df7.csv',index=False)
df8.to_csv('df8.csv',index=False)

# 筛选出平均温度等于最高温度和最低温度平均值的数据
file_path = '广-惠-河-深天气.csv'  # 请将 'your_file_path.csv' 替换为你的文件路径
# 读取 CSV 文件
data1 = pd.read_csv(file_path)
# 将最高温度和最低温度列转换为字符串类型
data1['最高温度'] = data1['最高温度'].astype(str)
data1['最低温度'] = data1['最低温度'].astype(str)
# 计算平均温度并插入为新的一列
data1['平均温度'] = (data1['最高温度'].str.replace('°', '').astype(int) + data1['最低温度'].str.replace('°', '').astype(int)) / 2
# 将更新后的数据保存到新的 CSV 文件中
output_file = 'output_file.csv'  # 新的输出文件路径
data1.to_csv(output_file, index=False)

data_AB = data1[(data1['城市'] == '广州') | (data1['城市'] == '深圳') | (data1['城市'] == '河源') | (data1['城市'] == '惠州')]
data_AB.to_csv('1.CSV', index=False)
print(data_AB)
# 将日期转换为月份并赋值给新的列
data_AB[['日期','星期']] = data_AB['日期'].str.split(' ',expand=True,n=1)

data_AB['月份'] = pd.to_datetime(data_AB['日期']).dt.month
# 按照城市和月份分组,计算每组的平均气温
grouped_AB = data_AB.groupby(['城市', '月份'])['平均温度'].mean().reset_index()
# 按照城市和月份排序
grouped_AB = grouped_AB.sort_values(['城市', '月份'])
print(grouped_AB)
# # 打印结果

#
# 筛选出广州和湛江的数据
gz_data = data_AB[data_AB['城市'] == '广州']
hy_data = data_AB[data_AB['城市'] == '河源']
hz_data = data_AB[data_AB['城市'] == '惠州']
sz_data = data_AB[data_AB['城市'] == '深圳']
print("地区筛选")
# 提取日期和平均温度数据
x = gz_data['日期']
y1 = gz_data['平均温度']
y2 = hy_data['平均温度']
y3 = hz_data['平均温度']
y4 = sz_data['平均温度']
print("————————BEIGINING————————————————————————————温度获取中————————————————————————————————————————————")
#绘制折线图
plt.figure(dpi=500, figsize=(10, 5))
plt.title("广河惠深每日平均温度折线图")
plt.plot(x, y1, color='red', label='广州')
plt.plot(x, y2, color='blue', label='河源')
#plt.plot(x, y3, color='pure', label='惠州')
plt.plot(x, y4, color='yellow', label='深圳')
# 获取图的坐标信息
coordinates = plt.gca()
# 设置x轴每个刻度的间隔天数
xLocator = mpl.ticker.MultipleLocator(30)
coordinates.xaxis.set_major_locator(xLocator)
# 将日期旋转30°
plt.xticks(rotation=30)
plt.xticks(fontsize=8)
plt.ylabel("温度(℃)")
plt.xlabel("日期")
plt.legend()
plt.savefig("广河惠深每日平均温度折线图.png")
plt.rcParams['font.family'] = 'SimSun'#处理乱码
plt.show()

#绘制折线图
# plt.rcParams['font.family'] = 'SimSun'
# # 读取csv文件并转换为列表格式
# df = pd.read_csv('df5.csv')
# data_list = df[['新天气', '天数']].values.tolist()
#
# data_GZ_HZ_SZ_HY = grouped_AB[
#     (grouped_AB['城市'] == '广州') | (grouped_AB['城市'] == '惠州') | (grouped_AB['城市'] == '深圳') | (grouped_AB['城市'] == '河源')]
#
# # 绘制折线图
# fig, ax = plt.subplots()
# for city in ['广州', '惠州', '深圳', '河源']:
#     ax.plot(data_GZ_HZ_SZ_HY[data_GZ_HZ_SZ_HY['城市'] == city]['月份'],
#             data_GZ_HZ_SZ_HY[data_GZ_HZ_SZ_HY['城市'] == city]['平均温度'], label=city)
#
# # 设置图例和标题
# ax.legend()
# ax.set_title('广州、惠州、深圳、河源每月气温折线图')

# 显示图形
plt.savefig("折线图.png")
#
import matplotlib.pyplot as plt
# 创建一个画布
fig, ax = plt.subplots(figsize=(10, 5))

# 绘制广州各类天气条形图
ax.bar(df5['新天气'], df5['天数'], width=0.2, label='广州')

# 绘制惠州各类天气条形图
ax.bar(df7['新天气'], df7['天数'], width=0.2, label='惠州', alpha=0.7)

# 绘制河源各类天气条形图
ax.bar(df6['新天气'], df6['天数'], width=0.2, label='河源', alpha=0.7)

# 绘制深圳各类天气条形图
ax.bar(df8['新天气'], df8['天数'], width=0.2, label='深圳', alpha=0.7)

# 设置图例
ax.legend()

# 设置 x 轴标签和标题
ax.set_xlabel('天气类型')
ax.set_ylabel('天数')
ax.set_title('广州、惠州、河源、深圳各类天气天数对比')
#
# 显示图表
# plt.show()
# import pandas as pd
# from pyecharts.charts import Pie
# from pyecharts import options as opts
# # 读取csv文件并转换为列表格式
# df = pd.read_csv('df6.csv')
# data_list = df[['新天气', '天数']].values.tolist()
# # 生成饼图
# pie = Pie()
# pie.add("", data_list)
# pie.set_global_opts(title_opts=opts.TitleOpts(title="广州各类天气天数占比"))
# pie.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}"))
# pie.render("pie_chart.html")

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值