Use Python to collect weather data and do visual analysis [with source code]

Knowledge points:

  • Dynamic data capture
  • requestsSend requests
  • Structured + unstructured data analysis

Development environment:

  • Python 3.8 to run the code
  • pycharm 2021.2 assists typing code
  • requests

If installing python third-party modules:

  1. win + R, enter cmd and click OK, enter the installation command pip install module name (pip install requests) and press Enter
  2. Click Terminal (terminal) in pycharm to enter the installation command

Code:

  1. send request
  2. retrieve data
  3. Analytical data
  4. save data

Source code. Click to receive

import requests     # 第三方模块 提前安装  发送请求 (Python里面浏览器)  爆红是因为你没有安装模块
# 如果安装了 但还是爆红是因为什么呢? 解释器在pycharm里面配置的不对
import parsel
import csv
# 翻译插件

with open('天气.csv', mode='a', encoding='utf-8', newline='') as f:
    csv_writer = csv.writer(f)
    csv_writer.writerow(["日期", "最高温度", "最低温度", "天气", "风向", "城市"])
city_list = [54511, 58362, 59287, 59493]
for city in city_list:
    for year in range(2011, 2022):
        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. Send request

response = requests.get(url=url)
# <Response [200]>: 请求成功

2. Get data

# json数据传输格式
json_data = response.json()
# 字典类型数据

3. Parse the data

 # 结构化数据解析
 html_data = json_data['data']
 selector = parsel.Selector(html_data)
 # 正则 css xpath json字典数据解析
 tr_list = selector.css('.history-table tr')
 # tr_list[1:] 从列表的第二个元素开始取
 for tr in tr_list[1:]:
    # <X>fhwaeuifhwiuf</X>
    td = tr.css('td::text').getall()
    if td[2] == '°':
        td[2] = td[1]
    if city == 54511:
        td.append("北京")
    elif city == 58362:
        td.append("上海")
    elif city == 59287:
        td.append("广州")
    elif city == 59493:
        td.append("深圳")
    print(td)
    # 文件名 写入方式 追加写入  编码方式 utf-8  数据空行
    with open('天气.csv', mode='a', encoding='utf-8', newline='') as f:
        csv_writer = csv.writer(f)
        csv_writer.writerow(td)

data analysis code

import package

Source code. Click to receive

import pandas as pd
import datetime
from pyecharts import options as opts
from pyecharts.charts import *
from pyecharts.commons.utils import JsCode

read data

data = pd.read_csv('天气.csv')
data

data preview

data.sample(5)

data.info()

Split day/week

data[['日期','星期']] = data['日期'].str.split(' ',expand=True,n=1)
data

remove redundant characters

data[['最高温度','最低温度']] = data[['最高温度','最低温度']].apply(lambda x: x.str.replace('°',''))
data.head()

Calculate snow weather

data.loc[data['天气'].str.contains('雪'),'下雪吗']='是'
data.fillna('否',inplace=True)

split datetime

data['日期'] = pd.to_datetime(data['日期'])
data[['最高温度','最低温度']] = data[['最高温度','最低温度']].astype('int')

data['年份'] = data['日期'].dt.year
data['月份'] = data['日期'].dt.month
data['日'] = data['日期'].dt.day
# 预览
data.sample(5)

The time of first snow in each city

s_data = data[data['下雪吗']=='是']
s_data[(s_data['月份']>=9)].groupby('年份').first().reset_index()

Distribution of snow weather in each city

s_data.groupby(['城市','年份'])['日期'].count().to_frame('下雪天数').reset_index()

make a pivot table

data_bj = data[(data['年份'] == 2021) & (data['城市'] == '北京')]
data_bj = data_bj.groupby(['月份','天气'], as_index=False)['日期'].count()

data_pivot =  pd.pivot(data_bj,
                values='日期',
                index='月份',
                columns='天气')
data_pivot = data_pivot.astype('float')
# 按照 索引年月倒序排序
data_pivot.sort_index(ascending=False,inplace=True)
# 资料、解答、教程可加Q :261823976免费领      
data_pivot
python学习交流Q群:770699889 ### 源码领取

Distribution of weather heat map in October 2021 in Beijing, Shanghai, Guangzhou and Shenzhen

import matplotlib.pyplot as plt
import matplotlib.colors as mcolors
import seaborn as sns

#设置全局默认字体 为 雅黑
plt.rcParams['font.family'] = ['Microsoft YaHei'] 
# 设置全局轴标签字典大小
plt.rcParams["axes.labelsize"] = 14  
# 设置背景
sns.set_style("darkgrid",{
    
    "font.family":['Microsoft YaHei', 'SimHei']})  
# 设置画布长宽 和 dpi
plt.figure(figsize=(18,8),dpi=100)
# 自定义色卡
cmap = mcolors.LinearSegmentedColormap.from_list("n",['#95B359','#D3CF63','#E0991D','#D96161','#A257D0','#7B1216']) 
# 绘制热力图

ax = sns.heatmap(data_pivot, cmap=cmap, vmax=30, 
                 annot=True, # 热力图上显示数值
                 linewidths=0.5,
                ) 
# 将x轴刻度放在最上面
ax.xaxis.set_ticks_position('top') 
plt.title('北京最近10个月天气分布',fontsize=16) #图片标题文本和字体大小
plt.show()

data_gz= data[(data['年份'] == 2021) & (data['城市'] == '广州')]
data_gz = data_gz.groupby(['月份','天气'], as_index=False)['日期'].count()
data_sz= data[(data['年份'] == 2021) & (data['城市'] == '深圳')]
data_sz = data_sz.groupby(['月份','天气'], as_index=False)['日期'].count()
data_sh= data[(data['年份'] == 2021) & (data['城市'] == '上海')]
data_sh = data_sh.groupby(['月份','天气'], as_index=False)['日期'].count()

python学习交流Q群:770699889 ### 源码领取
data_pivot_sz =  pd.pivot(data_sz,
                values='日期',
                index='月份',
                columns='天气')
data_pivot_sz = data_pivot_sz.astype('float')
# 按照 索引年月倒序排序
data_pivot_sz.sort_index(ascending=False,inplace=True)

#设置全局默认字体 为 雅黑
plt.rcParams['font.family'] = ['Microsoft YaHei'] 
# 设置全局轴标签字典大小
plt.rcParams["axes.labelsize"] = 14  
# 设置背景
sns.set_style("darkgrid",{
    
    "font.family":['Microsoft YaHei', 'SimHei']})  
# 设置画布长宽 和 dpi
plt.figure(figsize=(18,8),dpi=100)
# 自定义色卡
cmap = mcolors.LinearSegmentedColormap.from_list("n",['#95B359','#D3CF63','#E0991D','#D96161','#A257D0','#7B1216']) 
# 绘制热力图

ax_sz = sns.heatmap(data_pivot_sz, cmap=cmap, vmax=31, 
                 annot=True, # 热力图上显示数值
                 linewidths=0.5,
                ) 
# 将x轴刻度放在最上面
ax_sz.xaxis.set_ticks_position('top') 
plt.title('深圳最近10个月天气分布',fontsize=16) #图片标题文本和字体大小
plt.show()

data_pivot_gz =  pd.pivot(data_gz,
                values='日期',
                index='月份',
                columns='天气')
data_pivot_gz = data_pivot_gz.astype('float')
# 按照 索引年月倒序排序
data_pivot_gz.sort_index(ascending=False,inplace=True)

#设置全局默认字体 为 雅黑
plt.rcParams['font.family'] = ['Microsoft YaHei'] 
# 设置全局轴标签字典大小
plt.rcParams["axes.labelsize"] = 14  
# 设置背景
sns.set_style("darkgrid",{
    
    "font.family":['Microsoft YaHei', 'SimHei']})  
# 设置画布长宽 和 dpi
plt.figure(figsize=(18,8),dpi=100)
# 自定义色卡
cmap = mcolors.LinearSegmentedColormap.from_list("n",['#95B359','#D3CF63','#E0991D','#D96161','#A257D0','#7B1216']) 
# 绘制热力图

ax_sz = sns.heatmap(data_pivot_gz, cmap=cmap, vmax=31, 
                 annot=True, # 热力图上显示数值
                 linewidths=0.5,
                ) 
# 将x轴刻度放在最上面
ax_sz.xaxis.set_ticks_position('top') 
plt.title('广州最近10个月天气分布',fontsize=16) #图片标题文本和字体大小
plt.show()
# 资料、解答、教程可加Q :261823976免费领      
data_pivot_sh =  pd.pivot(data_sh,
                values='日期',
                index='月份',
                columns='天气')
data_pivot_sh = data_pivot_sh.astype('float')
# 按照 索引年月倒序排序
data_pivot_sh.sort_index(ascending=False,inplace=True)

#设置全局默认字体 为 雅黑
plt.rcParams['font.family'] = ['Microsoft YaHei'] 
# 设置全局轴标签字典大小
plt.rcParams["axes.labelsize"] = 14  
# 设置背景
sns.set_style("darkgrid",{
    
    "font.family":['Microsoft YaHei', 'SimHei']})  
# 设置画布长宽 和 dpi
plt.figure(figsize=(18,8),dpi=100)
# 自定义色卡
cmap = mcolors.LinearSegmentedColormap.from_list("n",['#95B359','#D3CF63','#E0991D','#D96161','#A257D0','#7B1216']) 
# 绘制热力图

ax_sz = sns.heatmap(data_pivot_sh, cmap=cmap, vmax=31, 
                 annot=True, # 热力图上显示数值
                 linewidths=0.5,
                ) 
# 将x轴刻度放在最上面
ax_sz.xaxis.set_ticks_position('top') 
plt.title('上海最近10个月天气分布',fontsize=16) #图片标题文本和字体大小
plt.show()

data_bj = data[(data['城市']=='北京') & (data['年份'] == 2021)]
data_bj['日期'] = pd.to_datetime(data_bj.日期,format="%Y年%m月%d日")
data_bj = data_bj.sort_values(by='日期',ascending=True)

Daily maximum and minimum temperature changes in Beijing in 2021

python学习交流Q群:770699889 ### 源码领取
color0 = ['#FF76A2','#24ACE6']
color_js0 = """new echarts.graphic.LinearGradient(0, 1, 0, 0,
    [{offset: 0, color: '#FFC0CB'}, {offset: 1, color: '#ed1941'}], false)"""
color_js1 = """new echarts.graphic.LinearGradient(0, 1, 0, 0,
    [{offset: 0, color: '#FFFFFF'}, {offset: 1, color: '#009ad6'}], false)"""

tl = Timeline()
for i in range(0,len(data_bj)):
    coordy_high = list(data_bj['最高温度'])[i]
    coordx = list(data_bj['日期'])[i]
    coordy_low = list(data_bj['最低温度'])[i]
    x_max = list(data_bj['日期'])[i]+datetime.timedelta(days=10)
    y_max = int(max(list(data_bj['最高温度'])[0:i+1]))+3
    y_min = int(min(list(data_bj['最低温度'])[0:i+1]))-3
    title_date = list(data_bj['日期'])[i].strftime('%Y-%m-%d')
    c = (
        Line(
            init_opts=opts.InitOpts(
            theme='dark',
            #设置动画
            animation_opts=opts.AnimationOpts(animation_delay_update=800),#(animation_delay=1000, animation_easing="elasticOut"),
            #设置宽度、高度
            width='1500px',
            height='900px', )
        )
        .add_xaxis(list(data_bj['日期'])[0:i])
        .add_yaxis(
            series_name="",
            y_axis=list(data_bj['最高温度'])[0:i], is_smooth=True,is_symbol_show=False,
            linestyle_opts={
    
    
                   'normal': {
    
    
                       'width': 3,
                       'shadowColor': 'rgba(0, 0, 0, 0.5)',
                       'shadowBlur': 5,
                       'shadowOffsetY': 10,
                       'shadowOffsetX': 10,
                       'curve': 0.5,
                       'color': JsCode(color_js0)
                   }
               },
            itemstyle_opts={
    
    
            "normal": {
    
    
                "color": JsCode(
                    """new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
                offset: 0,
                color: '#ed1941'
            }, {
                offset: 1,
                color: '#009ad6'
            }], false)"""
                ),
                "barBorderRadius": [45, 45, 45, 45],
                "shadowColor": "rgb(0, 160, 221)",
            }
        },

        )
        .add_yaxis(
            series_name="",
            y_axis=list(data_bj['最低温度'])[0:i], is_smooth=True,is_symbol_show=False,
#             linestyle_opts=opts.LineStyleOpts(color=color0[1],width=3),
            itemstyle_opts=opts.ItemStyleOpts(color=JsCode(color_js1)),
            linestyle_opts={
    
    
                   'normal': {
    
    
                       'width': 3,
                       'shadowColor': 'rgba(0, 0, 0, 0.5)',
                       'shadowBlur': 5,
                       'shadowOffsetY': 10,
                       'shadowOffsetX': 10,
                       'curve': 0.5,
                       'color': JsCode(color_js1)
                   }
               },
        )
        .set_global_opts(
            title_opts=opts.TitleOpts("北京2021年每日最高最低温度变化\n\n{}".format(title_date),pos_left=330,padding=[30,20]),
            xaxis_opts=opts.AxisOpts(type_="time",max_=x_max),#, interval=10,min_=i-5,split_number=20,axistick_opts=opts.AxisTickOpts(length=2500),axisline_opts=opts.AxisLineOpts(linestyle_opts=opts.LineStyleOpts(color="grey"))
            yaxis_opts=opts.AxisOpts(min_=y_min,max_=y_max),#坐标轴颜色,axisline_opts=opts.AxisLineOpts(linestyle_opts=opts.LineStyleOpts(color="grey"))
        )
    )
    tl.add(c, "{}".format(list(data_bj['日期'])[i]))
    tl.add_schema(
        axis_type='time',
        play_interval=100,  # 表示播放的速度
        pos_bottom="-29px",
        is_loop_play=False, # 是否循环播放
        width="780px",
        pos_left='30px',
        is_auto_play=True,  # 是否自动播放。
        is_timeline_show=False)
tl.render_notebook()
# 资料、解答、教程可加Q :261823976免费领      
data_10 = data[(data['年份'] == 2021) & ( data['月份'] == 10)]
data_10.head()

Changes in daily maximum temperature in October in Beijing, Shanghai, Guangzhou and Shenzhen

# 背景色
background_color_js = (
    "new echarts.graphic.LinearGradient(0, 0, 0, 1, "
    "[{offset: 0, color: '#c86589'}, {offset: 1, color: '#06a7ff'}], false)"
)

# 线条样式
linestyle_dic = {
    
     'normal': {
    
    
                    'width': 4,  
                    'shadowColor': '#696969', 
                    'shadowBlur': 10,  
                    'shadowOffsetY': 10,  
                    'shadowOffsetX': 10,  
                    }
                }
    
timeline = Timeline(init_opts=opts.InitOpts(bg_color=JsCode(background_color_js),
                                            width='980px',height='600px'))


bj, gz, sh, sz= [], [], [], []
all_max = []
x_data = data_10[data_10['城市'] == '北京']['日'].tolist()
for d_time in range(len(x_data)):
    bj.append(data_10[(data_10['日'] == x_data[d_time]) & (data_10['城市']=='北京')]["最高温度"].values.tolist()[0])
    gz.append(data_10[(data_10['日'] == x_data[d_time]) & (data_10['城市']=='广州')]["最高温度"].values.tolist()[0])
    sh.append(data_10[(data_10['日'] == x_data[d_time]) & (data_10['城市']=='上海')]["最高温度"].values.tolist()[0])
    sz.append(data_10[(data_10['日'] == x_data[d_time]) & (data_10['城市']=='深圳')]["最高温度"].values.tolist()[0])
    
    line = (
        Line(init_opts=opts.InitOpts(bg_color=JsCode(background_color_js),
                                     width='980px',height='600px'))
        .add_xaxis(
            x_data,
                  )
        
        .add_yaxis(
            '北京',
            bj,
            symbol_size=5,
            is_smooth=True,
            is_hover_animation=True,
            label_opts=opts.LabelOpts(is_show=False),
        )
  
        .add_yaxis(
            '广州',
            gz,
            symbol_size=5,
            is_smooth=True,
            is_hover_animation=True,
            label_opts=opts.LabelOpts(is_show=False),
        )
 
        .add_yaxis(
            '上海',
            sh,
            symbol_size=5,
            is_smooth=True,
            is_hover_animation=True,
            label_opts=opts.LabelOpts(is_show=False),
            
        )
 
        .add_yaxis(
            '深圳',
            sz,
            symbol_size=5,
            is_smooth=True,
            is_hover_animation=True,
            label_opts=opts.LabelOpts(is_show=False),
            
        )
        
        .set_series_opts(linestyle_opts=linestyle_dic)
        .set_global_opts(
            title_opts=opts.TitleOpts(
                title='北上广深10月份最高气温变化趋势',
                pos_left='center',
                pos_top='2%',
                title_textstyle_opts=opts.TextStyleOpts(color='#DC143C', font_size=20)),
            
            tooltip_opts=opts.TooltipOpts(
                trigger="axis",
                axis_pointer_type="cross",
                background_color="rgba(245, 245, 245, 0.8)",
                border_width=1,
                border_color="#ccc",
                textstyle_opts=opts.TextStyleOpts(color="#000"),
        ),
            xaxis_opts=opts.AxisOpts(
#                 axislabel_opts=opts.LabelOpts(font_size=14, color='red'),
#                 axisline_opts=opts.AxisLineOpts(is_show=True,
#                 linestyle_opts=opts.LineStyleOpts(width=2, color='#DB7093'))
                is_show = False
            ),
                
# 资料、解答、教程可加Q :261823976免费领         
            yaxis_opts=opts.AxisOpts(
                name='最高气温',            
                is_scale=True,
#                 min_= int(min([gz[d_time],sh[d_time],sz[d_time],bj[d_time]])) - 10,
                max_= int(max([gz[d_time],sh[d_time],sz[d_time],bj[d_time]])) + 10,
                name_textstyle_opts=opts.TextStyleOpts(font_size=16,font_weight='bold',color='#5470c6'),
                axislabel_opts=opts.LabelOpts(font_size=13,color='#5470c6'),
                splitline_opts=opts.SplitLineOpts(is_show=True, 
                                                  linestyle_opts=opts.LineStyleOpts(type_='dashed')),
                axisline_opts=opts.AxisLineOpts(is_show=True,
                                        linestyle_opts=opts.LineStyleOpts(width=2, color='#5470c6'))
            ),
            legend_opts=opts.LegendOpts(is_show=True, pos_right='1%', pos_top='2%',
                                        legend_icon='roundRect',orient = 'vertical'),
        ))
    
    timeline.add(line, '{}'.format(x_data[d_time]))

timeline.add_schema(
    play_interval=1000,          # 轮播速度
    is_timeline_show=True,      # 是否显示 timeline 组件
    is_auto_play=True,          # 是否自动播放
    pos_left="0",
    pos_right="0"
)
timeline.render_notebook()

Effect display (part)

Source code. Click to receive

insert image description here
insert image description here
insert image description here
insert image description here
insert image description here
insert image description here

at last

Today's sharing ends here

If you have any questions about the article, or have other questions about python, you can leave a message in the comment area or private message me

If you think the article I shared is good, you can follow me, or give the article a thumbs up (/≧▽≦)/

Guess you like

Origin blog.csdn.net/weixin_72934044/article/details/128110777