0


大数据技术原理与应用之可视化实训

《大数据技术原理与应用》实训报告

2020/2021 学年第一学期

目录


2 功能要求………………………………………………………………………………….. 4

1 总体设计………………………………………………………………………………….. 4

2主要函数设计……………………………………………………………………………… 5

第一部分 实训题目与要求

1 问题提出

1.1实训任务1

对2017南京某几个月的天气分析,并能够使用合适的图例展示相关的数据

1.2实训任务2

利用爬虫技术爬取天气预报网并对爬取出来的数据进行可视化分析

2功能要求

2.1实训任务1

  1. 五月份南京最高温最大值、最低温最小值和最大温差及对应的日期。
  2. 五月份不同天气对应的天数和雨天的百分比。
  3. 五月份不同风向对应的天数和出现最多的风向。
  4. 五月份风力超过3级的天数。
  5. 绘制五月份南京高温、低温(柱状)及温差(折线)示意图,并标注温差最大的点。
  6. 绘制五月份南京天气情况分布饼图。
  7. 作柱状图比较5月、6月、7月三个月的最高温度和最低温度。

2.2实训任务2

从天气后报网(http://www.tianqihoubao.com/)爬取自己家乡所属城市过去一个月每天的最高温度和最低温度,并绘制一个月内最高温度和最低温度的走势比较图。

第二部分 设计实训题目功能

1 总体设计

1.1实训任务1

在对天气数据的分析过程中,需要有些python基础,需要用到的库有csv库,numpy库以及matplotlib库。

首先是先对给出的天气数据进行分析,根据任务需求进行程序代码的编写分析完天气数据,根据分析后的数据进行绘图。

1.2实训任务2

爬虫需有html,js以及css基础以及会一些爬虫相关库和绘图库的使用。首先获取url网站源码,将获取到的网页进行分析将抓取到的数据以csv文件保存在本地上,之后根据所需要的数据需求进行编写程序代码最后对文件数据进行分析绘图。

2主要函数设计

2.1实训任务1

对2017南京某几个月的天气分析,并能够使用合适的图例展示相关的数据

  1. 五月份南京最高温最大值、最低温最小值和最大温差及对应的日期。
  2. 五月份不同天气对应的天数和雨天的百分比。
  3. 五月份不同风向对应的天数和出现最多的风向。
  4. 五月份风力超过3级的天数。
  5. 绘制五月份南京高温、低温(柱状)及温差(折线)示意图,并标注温差最大的点。
  6. 绘制五月份南京天气情况分布饼图。
  7. 作柱状图比较5月、6月、7月三个月的最高温度和最低温度。

设计思路:

数据分析-绘制图形

已知给出2017年五月,六月,七月三个月的天气情况的csv文件,首先要先用到csv库,进行对csv文件读取,然后开始对数据进行分析处理。分析小任务1到6都是分析五月份的数据,所以说前面6个小任务首先就是要把五月这其中的一个月单 独取出来放在一个集合中,从csv文件中的数据分析中,可以知道每列分别代表着日期,最高温,最低温,天气,风向,风力,所对应的下标就分别为[0],[1] ,[2],[3],[4],[5],之后进行程序代码的编写,分别计算出相应结果。数据分析之后就进行绘图,利用matplotlib库进行绘 制对应的图形,最后以plt.show()将图形展示出来结束程序。

南京天气csv文件如下:

绘制出的图形如下

2.2实训任务2

**从天气后报网(http://www.tianqihoubao.com/)爬取自己家乡所属城市过去一个月每天的最高温度和最低温度,并 绘制一个月内最高温度和最低温度的走势比较图。 **

设计思路:

爬虫(获取数据-解析数据-保存数据) 绘图(分析数据-进行绘图)

先分析任务要求,这次任务是为了爬取天气后报网中所在家乡城市的过去一个月天气情况。我的家乡在江西上饶,首先要先进入网站,地址url为: “http://www.tianqihoubao.com/" ,进入http://www.tianqihoubao.com/这个网站,然后选择要爬取的城市,选择江西[1]上饶,然后再选择2020年12月的天气历史情况

具体步骤如下操作

进入天气后报官网

进入我所在的地区--江西上饶的12月历史天气网址

获取并分析网站源码

通过对html代码分析发现,过去一个月的天气情况都是在“tr”元素之中

注:完整程序请参见附录A。

3 问题与改进

3.1实训任务1

问题:python基础没有学扎实牢固,写的代码过于繁琐冗余,没有进行好的算法处理导致一个简单的任务需要用到许多步骤 以及代码才能完成,代码书写规范也有欠缺,变量命名不规范,不会命名的都以中文拼音进行命名有损代码美观性以及 可读性。

改进: 实训结束后加强对python基础的学习,将基础学好,也养成一个规范书写代码的好习惯

3.2实训任务2

问题:前端知识尚欠缺,要用到的HTML,JavaScript以及CSS都没有进行较为深入的学习,还有需要用的到爬虫库也没有 学习,导致在完成任务2过程中出现了许许多多大大小小的改进: 简要学习前端(HTML,JavaScript,CSS)的一些知识内容,了解常用的一些爬虫框架以及相关库的使用。

第三部分 实训效果

一、实训任务1

  1. 五月份南京最高温最大值、最低温最小值和最大温差及对应的日期。

  1. 五月份不同天气对应的天数和雨天的百分比。

3. 五月份不同风向对应的天数和出现最多的风向。

  1. 五月份风力超过3级的天数。

  1. 绘制五月份南京高温、低温(柱状)及温差(折线)示意图,并标注温差最大的点。

法一: ⮚ 出现的问题:y轴的刻度问题

法二:

6.绘制五月份南京天气情况分布饼图。

7.作柱状图比较5月、6月、7月三个月的最高温度和最低温度。

二、实训任务2

从天气后报网(http://www.tianqihoubao.com/)爬取自己家乡所属城市过去一个月每天的最高温度和最低温度, 并绘制一个月内最高温度和最低温度的走势比较图。

第四部分 实训总结

1 结束语

    通过这次的实训周的学习,收获了许多。这周的实训任务是对天气情况进行数据可视化操作,这不乏就用到了python语言。鉴于此前学过Java语言和自学了python语言自然就得心应手,也更能检验自己之前学的如何,以及将所学的运用到项目开发实践中。之后还有个扩展题,是运用到了爬虫技术,先爬取网页上的天气数据,将网页上爬取出来的数据进行可视化分析,这也就增加了一些难度。经过对爬虫的初步学习了解,大致能够了解爬虫的一些原理,并能够爬取部分一些简单的网页。总结一下这次的实训,收获如下:

    通过对python的再学习,更发现了python语言的优势。除了简单易读,python最大的特点就是具有丰富强大的库,因此常常被人称为“胶水语言”。比如,读取csv文件用到csv库,对数据可视化需要用到的库就有matplotlib库,对数据处理分析用到numpy库等,对于爬虫,就有用到requests库,也知道了r equests主要是构造网络请求,获取网页内容,后续的解析、存储都要另行解决。scrapy 是框架,可以说是爬虫的打包方案,除了上述构造请求、拿内容、解析、存储外,还可以做分布式爬虫,挂代理,等等一大堆功能。BeautifulSoup是一个解析库,它也可以很好地从URL中获取内容,并且可以毫无麻烦地解析它们中的某些部分。它只会提取您给出的URL的内容,然后停止。它不会抓取,除非您手动将其放入具有特定条件的无限循环中。

    这次实训不仅检验了我此前对专业知识学习的能力,也巩固了学的知识并能够学以致用,还找出了学习过程中以及开发中出现的问题。比如说Python基础没有学的深入,对一些函数,字典等基础理解不够透彻,导致在编写程序代码中遇到各种大大小小的问题,即使如此,通过老师的指导,百度及CSDN的查找和自我的思考,最终基本都解决了出现的问题,并加深了印象。

    结束了这次的实训周的学习,完成了本次的实训任务,到这里就结束啦,总的来说,比较顺利的完成了这次的实训任务,学习到了很多专业上的新知识,积累了项目开发的经验和提高自身编写代码的能力,通过之前的理论真正的运用到现在的实操上,编写开发出真正有用的程序。这次实训结束之后,我也领悟到了“学以致用”,“学无止境”的含义,在今后的学习中不断加强自我学习能力,提高自己的专业能力,继续努力,不断提升自己!

附录A 程序清单

所需要的nanjing_weather.csv文件在:南京的天气情况的数据文件-Python文档类资源-CSDN下载

任务一:

1)五月份南京最高温最大值、最低温最小值和最大温差及对应的日期。代码如下:

# -*- codeing utf-8 -*-
# @Time : 2020/12/30 10:20
# @Author : 小刘
# @File : 第一题.py # @Software : PyCharm
import csv 
import numpy as np
#读取CSV中气象数据
#title=['日期','最高温度','最低温度','天气','风向','风力'] 
weather_nj=[]
with open("nanjing_weather.csv","r") as file:
    reader=csv.reader(file)     
    for row in reader:         
        weather_nj.append(row)
#    print(weather_nj)
#切片五月的温度列表、天气列表和风列表
#temps=[[item[0],item[1],item[2],str(eval(item[1])-eval(item[2]))] for item in weather_nj if item[0][5]=='5']
temps=[]
for item in weather_nj:     
    if item[0][5]=='5':     #判断是否为5,即五月份    
        temp=[item[0],item[1],item[2],str(eval(item[1])-eval(item[2]))]         
        temps.append(temp)
#print(temps)#打印时间,最高温,最低温,日温差
##五月的最高温集合
highs = []  #创建一个列表
for row in temps:
    high = int(row[1])  #将列表中的字符串 转换成数值型
    highs.append(high)            #获得第二行的 的数据, 即每天的最高温度 
    max = np.max(highs)
#print(temps[0])
print("五月份南京最热温度是:%d℃"%max)
#五月的最低温集合
shorts = [] 
for row in temps:
    short = int((row[2]))     
    shorts.append(short)
min = np.min(shorts)
print("五月份南京最低温度是:%d℃"%min)
#温差
temp = [] 
for row in temps:     
    t = int(int(row[1])-int(row[2]))     
    temp.append(t)
max1=np.max(temp) 
print("五月份南京的最大温差为:%d℃"%max1)
#最高气温最大值和最低气温最小值的日期
date = [] 
for row in temps:     
    date = row[0]
    #date.append(d)     
    if int(row[1])==max:
        print("日期:%s"%date,"最高气温:%d℃"%max)
    elif int(row[2])==min:         
        print("日期:%s"%date,"最低气温:%d℃"%min)
#五月份南京最大温差所对应的日期
date = [] 
for row in temps:     
    date = row [0]     
    if int (int(row[1])-int(row[2])) == max1:         
        print("日期:%s"%date,"温差最大:%d℃"%max1)

运行结果如下

2)五月份不同天气对应的天数和雨天的百分比。代码如下:

# -*- codeing utf-8 -*-
# @Time : 2020/12/30 10:26
# @Author : 小刘
# @File : 第二题.py
# @Software : PyCharm
#引入包
import csv
nj=[] 
with open("nanjing_weather.csv",'r') as file:
    reader=csv.reader(file)      
    for row in reader:         
        nj.append(row)
#weather列表将筛选出五月的存放进来
weather=[] 
for item in(nj):
    if item[0][5]=='5':
        temp=[item[0],item[1],item[2],item[3]]      
        weather.append(temp)
cloudy = 0  #多云 
shower = 0  #阵雨 
overcast = 0  #阴天 
sun = 0  #晴
thundershower = 0  #雷阵雨 
lightrain = 0   #小到中雨
#遍历列表,if判断天气,如果true,则累加
for i in range(len(weather)):     
    if weather[i][3] =='晴':
        sun+=1     
    elif weather[i][3] =='多云':
        cloudy+=1     
    elif weather[i][3] =='阵雨':
        shower+=1     
    elif weather[i][3] =='阴':
        overcast+=1     
    elif weather[i][3] =='雷阵雨':
        thundershower+=1     
    elif weather[i][3] =='小到中雨':         
        lightrain+=1
w=[('多云',cloudy),('阵雨',shower),('阴',overcast),('晴',sun),('雷阵雨',thundershower),('小到中雨',lightrain)]
rain = shower+thundershower+lightrain   #雨天的天数 
sum=rain+cloudy+overcast+sun    #总天数
a=round((rain/sum)*100,2)       #round方法保留小数后两位 
print("南京五月份的天气情况为:\n",w,"\n其中,雨天出现的比例为:%s%%"%a)

运行结果如下

3)五月份不同风向对应的天数和出现最多的风向。代码如下:

# -*- codeing utf-8 -*-
# @Time : 2020/12/30 13:54
# @Author : 小刘
# @File : 第三题.py
# @Software : PyCharm 
import csv
import numpy as np
nj=[]
with open("nanjing_weather.csv",'r') as file:
    reader=csv.reader(file)   
    for row in reader:      
        nj.append(row)
#weather列表将筛选出五月的存放进来
weather=[] 
for item in(nj):
    if item[0][5]=='5':
        temp=[item[0],item[1],item[2],item[3],item[4],item[5]]     
        weather.append(temp)
#初始化风向次数
SouthWind = 0   #南风
SouthEast = 0   #东南风
EastWind  = 0   #东风
NorthWest = 0   #西北风
NorthWind = 0   #北风
WestWind  = 0   #西风
NorthEast = 0   #东北风
SouthWest = 0   #西南风
#遍历列表,if判断风向,如果true,则累加风向次数
for i in range(len(weather)):   
    if weather[i][4] =='南风':
        SouthWind += 1    
    elif weather[i][4] =='东南风':
        SouthEast += 1    
    elif weather[i][4] =='东风':
        EastWind += 1
    elif weather[i][4] =='西北风':
        NorthWest += 1   
    elif weather[i][4] =='北风':
        NorthWind += 1    
    elif weather[i][4] =='西风':
        WestWind += 1    
    elif weather[i][4] == '东北风':
        NorthEast += 1   
    elif weather[i][4] == '西南风':
        SouthWest += 1
a=[('南风',SouthWind),('东南风',SouthEast),('东风',EastWind),('西北风',NorthWest),('北风',NorthWind),('西风',WestWind),('东北风',NorthEast),('西南风',SouthWest)] 
print("南京五月的刮风情况为:\n",a,"\n",('即:南风%d天'%SouthWind),('东南风%d天'%SouthEast),('东风%d天'%EastWind),('西北风%d天'%NorthWest),('北风%d天'%NorthWind),('西风%d天'%WestWind),('东北风%d天'%NorthEast),('西南风%d天'%SouthWest))
#求最多风向的次数以及对应的风向
windly = [] 
for i in a:
    w = int(i[1])    
    windly.append(w) 
    m = np.max(windly)
    for i in a:
        if i[1]==m:
            wind=i
print("南京五月份刮得最多的风是%s,一共刮了%d天。"%(wind[0],wind[1]))

运行结果如下

4)五月份风力超过3级的天数。代码如下:

# -*- codeing utf-8 -*-
# @Time : 2020/12/30 15:25
# @Author : 小刘
# @File : 第四题.py
# @Software : PyCharm import csv
#列表存放csv文件中的
nj=[]
with open("nanjing_weather.csv",'r') as file:
    reader=csv.reader(file)    
    for row in reader:    
        nj.append(row)
#weather列表将筛选出五月的存放进来
weather=[]
for item in nj:
    if item[0][5]=='5':
        temp=[item[0],item[1],item[2],item[3],item[4],item[5]]   
        weather.append(temp)
#定义一个空列表,遍历weather,将遍历后超过数字超过3的进行累加,计算风力超过三级的
WindPower=0
for item in weather:    
    if item[5][0]>'3':
        WindPower+=1
print('南京五月份共有%d天风力超过3级'%WindPower)

运行结果:

5)绘制五月份南京高温、低温(柱状)及温差(折线)示意图,并标注温差最大的点。代码如下:

# -*- codeing utf-8 -*-
# @Time : 2020/12/31 16:02
# @Author : 小刘
# @File : 第五题.py
# @Software : PyCharm
import csv
import matplotlib
import numpy as np
import matplotlib.pyplot as plt
#读取CSV中气象数据
#title=['日期','最高温度','最低温度','天气','风向','风力'] 
weather_nj=[]
with open("nanjing_weather.csv","r") as file:
    reader=csv.reader(file)    
    for row in reader:      
        weather_nj.append(row)
#    print(weather_nj)
#切片五月的温度列表、天气列表和风列表
#temps=[[item[0],item[1],item[2],str(eval(item[1])-eval(item[2]))] for item in weather_nj if item[0][5]=='5']
temps=[]
for item in weather_nj:    
    if item[0][5]=='5':        
        temp=[item[0],item[1],item[2],str(eval(item[1])-eval(item[2]))]  
        temps.append(temp)
#print(temps)
##五月的最高温集合
highs = []  #创建一个列表
for row in temps:
    high = int(row[1])  #将列表中的字符串 转换成数值型
    highs.append(high)            #获得第二行的 的数据, 即每天的最高温度 max = np.max(highs)
#print(temps[0])
print("五月份南京最热温度是:%d℃"%max)
#五月的最低温集合
shorts = [] 
for row in temps:
    short = int((row[2])) 
    shorts.append(short)
min = np.min(shorts)
print("五月份南京最低温度是:%d℃"%min)
#温差
temp = [] 
for row in temps:  
    t = int(int(row[1])-int(row[2]))  
    temp.append(t)
max1=np.max(temp)
print("五月份南京的最大温差为:%d℃"%max1)
#最高气温最大值和最低气温最小值的日期
date = []
for row in temps:   
    date = row[0]
    #date.append(d)  
    if int(row[1])==max:
        print("日期:%s"%date,"最高气温:%d℃"%max)
    elif int(row[2])==min:      
        print("日期:%s"%date,"最低气温:%d℃"%min)
#五月份南京最大温差所对应的日期
date = []
for row in temps:    
    date = row [0]   
    if int (int(row[1])-int(row[2])) == max1:   
        print("日期:%s"%date,"温差最大:%d℃"%max1)
matplotlib.rcParams['font.sans-serif'] = ['SimHei']#字体 fig=plt.figure(dpi=128,figsize=(10,5))  #设置窗口大小 
x =np.arange(1,32) 
y2=highs
y1=shorts
wencha=temp
bar_width = 0.4
plt.bar(x , height=y1, label='低温', color='lightblue', alpha=0.8, width=bar_width,zorder=0) 
plt.bar(x - bar_width, height=y2, label='高温', color='red', alpha=0.3, width=bar_width,zorder=0) 
plt.plot(x,wencha,label='温差',zorder=0)
#标注
plt.scatter(26,14,s=50,color="red",label='最大温差',zorder=1)
plt.plot([26,0], [14,14],'g--',[26,26], [14,0], 'g--', lw=2)
plt.annotate("温差最大为:14",color="red",xy=(26,14),xycoords='data',xytext=(+30,-30),textcoords='offset points',fontsize=16,arrowprops=dict(arrowstyle="->",connectionstyle='arc3,rad=0.9'))
plt.annotate("",color="black",xy=(28,14),xycoords='data',xytext=(+30,-30),textcoords='offset points',fontsize=10,arrowprops=dict(arrowstyle="->",connectionstyle='arc3,rad=0.9'))
plt.scatter(28,14,s=50,color="red",label='最大温差',zorder=1)
plt.plot([28,26], [14,14],'g--',[28,28], [14,0], 'g--', lw=2)
plt.title("南京五月份高低气温及温差示意图")
# 为两条坐标轴设置名称
plt.xlabel("日期/日") 
plt.ylabel("温度/摄氏度")
# 显示图例
plt.xlim(0,32) 
plt.legend() 
plt.show()

运行结果如下:

6)绘制五月份南京天气情况分布饼图。代码如下:

# -*- codeing utf-8 -*-
# @Time : 2020/12/30 20:51
# @Author : 小刘
# @File : 第六题.py
# @Software : PyCharm
#引入包
import matplotlib.pyplot as plt
import csv 
nj=[] 
with open("nanjing_weather.csv",'r') as file:
    reader=csv.reader(file)      
    for row in reader:         
        nj.append(row)
#weather列表将筛选出五月的存放进来
weather=[]
for item in(nj): 
    if item[0][5]=='5':
        temp=[item[0],item[1],item[2],item[3]]  
        weather.append(temp)
#定义并初始化各天气情况
cloudy = 0#多云 
shower = 0#阵雨 
overcast = 0#阴天
sun = 0#晴
thundershower = 0#雷阵雨
lightrain = 0#小到中雨
#遍历列表,if判断天气,如果true,则累加
for i in range(len(weather)):    
    if weather[i][3] =='多云':
        cloudy+=1    
    elif weather[i][3] =='阵雨':
        shower+=1     
    elif weather[i][3] == '晴':    
        sun += 1     
    elif weather[i][3] =='阴':
        overcast+=1    
    elif weather[i][3] =='雷阵雨':
        thundershower+=1     
    elif weather[i][3] =='小到中雨':   
        lightrain+=1
#将得到的天气出现的次数放进集合w中
w=[]
w=[('多云',cloudy),('阵雨',shower),('阴',overcast),('晴',sun),('雷阵雨',thundershower),('小到中雨',lightrain)]
rain = shower+thundershower+lightrain   #雨天的天数 
sum=rain+cloudy+overcast+sun    #总天数
a=round((rain/sum)*100,2)       #round方法保留小数后两位 
print("南京五月份的天气情况为:\n",w,"\n其中,雨天出现的比例为:%s%%"%a)
#计算五月份各天气情况的占比
cloudy = (cloudy/sum)*100 
shower = (shower/sum)*100 
sun = (sun/sum)*100 
overcast = (overcast/sum)*100
thundershower = (thundershower/sum)*100
lightrain = (lightrain/sum)*100
#开始画饼图
plt.rcParams['font.sans-serif']=['SimHei']#正常显示中文汉字 
plt.rcParams['figure.figsize'] = [12,8] #图的大小 
plt.rcParams['legend.fontsize'] = 15     #右下角图例大小 
labels='多云','阵雨','阴','晴','雷阵雨','小到中雨'  #每部分的标签名 
sizes=[cloudy,shower,sun,overcast,thundershower,lightrain]   #占比大小
explode=(0.1,0.1,0.1,0.1,0.1,0.1)   #分割出第二个分片,0表不分割,数值表示分割多少
fig1,ax1=plt.subplots()  #建立主画布,并在其上绘制子图 
ax1.pie(sizes,explode=explode,labels=labels,autopct='%1.2f%%', shadow=True,startangle=90,textprops={"fontsize":12,"color":"k"})  
#绘制饼状图,%1.2f%%保留百分比后的两位小数                
#textprops={"fontsize":12,"color":"k"}设置饼的字体和颜色 
ax1.axis('equal')    #等轴绘制,保证饼图绘制出来以后是圆形
plt.title("南京五月份天气情况分布图",size=20)#标题,标题大小为20
plt.legend(loc='lower right')#图例,放在右下方 
plt.show()  #显示绘制的图

运行结果如下:

7)作柱状图比较5月、6月、7月三个月的最高温度和最低温度。代码如下:

# -*- codeing utf-8 -*-
# @Time : 2020/12/29 20:12
# @Author : 小刘
# @File : 7.py
# @Software : PyCharm
#引入库
import csv 
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"]=["SimHei"]#显示中文标签 
plt.rcParams["axes.unicode_minus"]=False
#创建weather_nj的集合
weather_nj = []
#打开csv文件并读取,"r"表示只读,as将文件取个别名,便于写代码
with open("nanjing_weather.csv","r") as file:
    reader = csv.reader(file) 
    for i in reader:
        weather_nj.append(i)
       # print(i)        #打印遍历后的天气情况
#==========================================================
print("五月的气温:")
#创建temps集合,用于存放索引切片后的数组集合数据,切片五月份的天气情况(日期,最高温,最低温,天气,风向,风级)
temps = []                      #创建空列表temps
for item in weather_nj:         #遍历
    if item[0][5] == "5":       #五月份
        temp = [item[0],item[1],item[2],str(eval(item[1])-eval(item[2]))]#eval去引号,并将最高温和最低温相减得到温差值,即得到temp[3]为温差
        temps.append(temp)      #获得temp数据
#        print(temp)             #打印temp
#创建一个hights集合,用于存放最高气温数据 highs = []              #创建空列表hights
for h in temps:         #遍历temps列表
    Max = int(h[1])     #将第二列列表类型转换为int数值类型并存放在Max
    highs.append(Max)   #获得第二列的数据,即最高气温
max = np.max(highs)     #得到最高气温中的最大值 
#print(max)              #打印最高气温的最大值
#创建一个lows集合,用于存放最低气温数据 
lows = []               #创建空列表lows
for l in temps:         #遍历temps
    Min = int(l[2])     #将第三列列表类型转换为int数值类型  
    lows.append(Min)    #获得第三列数据,即最低气温
min = np.min(lows)      #得到最低气温的最小值
#print(min)              #打印最低气温的最小值
#根据最高气温和最低气温的最值来求出对应的日期
for row in temps:   
    date = row[0]    
    if int(row[1])== max:
        print("最高温度:",date,max)    
    elif int(row[2])==min:      
        print("最低温度:",date,min)
#==========================================================
print("六月的气温:")
#创建temps集合,用于存放索引切片后的数组集合数据,切片五月份的天气情况(日期,最高温,最低温,天气,风向,风级)
temps = []                      #创建空列表temps 
for item in weather_nj:         #遍历
    if item[0][5] == "6":       #五月份
        temp = [item[0],item[1],item[2],str(eval(item[1])-eval(item[2]))]#eval去引号,并将最高温和最低温相减得到温差值,即得到temp[3]为温差
        temps.append(temp)      #获得temp数据
#        print(temp)             #打印temp
#创建一个hights集合,用于存放最高气温数据
highs = []              #创建空列表hights
for h in temps:         #遍历temps列表
    Max = int(h[1])     #将第二列列表类型转换为int数值类型并存放在Max  
    highs.append(Max)   #获得第二列的数据,即最高气温
max = np.max(highs)     #得到最高气温中的最大值 
#print(max)              #打印最高气温的最大值
#创建一个lows集合,用于存放最低气温数据
lows = []               #创建空列表lows
for l in temps:         #遍历temps
    Min = int(l[2])     #将第三列列表类型转换为int数值类型
    lows.append(Min)    #获得第三列数据,即最低气温
min = np.min(lows)      #得到最低气温的最小值
#print(min)              #打印最低气温的最小值
#根据最高气温和最低气温的最值来求出对应的日期
for row in temps:    
    date = row[0]    
    if int(row[1])== max:
        print("最高温度:",date,max)  
    elif int(row[2])==min:     
        print("最低温度:",date,min)
#==========================================================
print("七月的气温:")
#创建temps集合,用于存放索引切片后的数组集合数据,切片五月份的天气情况(日期,最高温,最低温,天气,风向,风级)
temps = []                      #创建空列表temps 
for item in weather_nj:         #遍历  
    if item[0][5] == "7":       #五月份
        temp = [item[0],item[1],item[2],str(eval(item[1])-eval(item[2]))]#eval去引号,并将最高温和最低温相减得到温差值,即得到temp[3]为温差
        temps.append(temp)      #获得temp数据
#        print(temp)             #打印temp
#创建一个hights集合,用于存放最高气温数据 
highs = []              #创建空列表hights 
for h in temps:         #遍历temps列表
    Max = int(h[1])     #将第二列列表类型转换为int数值类型并存放在Max     
    highs.append(Max)   #获得第二列的数据,即最高气温
max = np.max(highs)     #得到最高气温中的最大值 
#print(max)              #打印最高气温的最大值
#创建一个lows集合,用于存放最低气温数据
lows = []               #创建空列表lows 
for l in temps:         #遍历temps
    Min = int(l[2])     #将第三列列表类型转换为int数值类型   
    lows.append(Min)    #获得第三列数据,即最低气温
min = np.min(lows)      #得到最低气温的最小值
#print(min)              #打印最低气温的最小值
#根据最高气温和最低气温的最值来求出对应的日期
for row in temps:     
    date = row[0]   
    if int(row[1])== max:
        print("最高温度:",date,max)    
    elif int(row[2])==min:   
        print("最低温度:",date,min)
#==========================================================
x0=[5,6,7] 
x1=[5,6,7]
x2 = [5,6,7] 
x1=[i - 0.2 for i in x1] 
x2=[i + 0.4 for i in x1]
y1=[14,18,23]
y2=[34,33,40]
plt.bar(x1 ,y1,width=0.3,alpha=0.3) 
plt.bar(x2,y2,width=0.3,alpha=0.3)
#最低温度标注
plt.text(x1[0], y1[0], y1[0], ha='center', va='bottom', fontsize=10)#设置标注
plt.text(x1[1], y1[1], y1[1], ha='center', va='bottom', fontsize=10)#设置标注 
plt.text(x1[2], y1[2], y1[2], ha='center', va='bottom', fontsize=10)#设置标注
#最大温度标注
plt.text(x2[0], y2[0], y2[0], ha='center', va='bottom', fontsize=10)#设置标注
plt.text(x2[1], y2[1], y2[1], ha='center', va='bottom', fontsize=10)#设置标注 
plt.text(x2[2], y2[2], y2[2], ha='center', va='bottom', fontsize=10)#设置标注
#标题
plt.title("五,六,七三个月的最高温和最低温比较",size=20) 
plt.xlabel("月份/月",size=18)#size设置字体大小 
plt.ylabel("温度/℃",size=18)
#设置x刻度名称
tick_label = ["五月","六月","七月"]
plt.xticks(x0, tick_label,size=10)
#结束画图,将图显示出来
plt.show()

运行结果如下:

任务二:

爬取家乡2020年12月一整月的天气预报情况

# -*- codeing utf-8 -*-
# @Time : 2020/12/31 18:57
# @Author : 小刘
# @File : 上饶天气.py
# @Software : PyCharm
#爬取网页进行获取数据,网址:http://www.tianqihoubao.com/lishi/shangrao/month/202012.html
#源码分析
#导入所需要的库
import requests
from bs4 import BeautifulSoup 
import pandas as pd
def get_data(url):
    resp = requests.get(url)     
    html = resp.content.decode('gbk')
    soup = BeautifulSoup(html,'html.parser')   
    tr_list = soup.find_all('tr')
    dates,condition,temp =[],[],[]    
    for data in tr_list[1:]:
        sub_data = data.text.split()    #删除空格  
        dates.append(sub_data[0])
        condition.append(''.join(sub_data[1:3]))       
        temp.append(''.join(sub_data[3:6]))
    _data = pd.DataFrame()
    _data['日期'] = dates
    _data['天气状况'] = condition
    _data['气温'] = temp
    _data = _data.drop_duplicates()   # 去重
    return _data
# city = input("请输入要查询的城市拼音:")
# year = input("请输入要查询的年份")
# month = input("请输入要查询的月份:")
# print(f"{city}{year}年{month}月的历史天气情况:")
# url = f'http://www.tianqihoubao.com/lishi/{city}/month/{year}+{month}.html'
url = 'http://www.tianqihoubao.com/lishi/shangrao/month/202012.html'
data_1_month = get_data(url)
#data_2_month = get_data('http://www.tianqihoubao.com/lishi/shangrao/mouth/202010.html')
#data_3_month = get_data('http://www.tianqihoubao.com/lishi/shangrao/mouth/202011.html')
data = pd.concat([data_1_month]).reset_index()
data.index += 1 
#print("序号",end="") 
print("***上饶的2020年12月天气情况***\n",data) 
data.to_csv('shangrao.csv',index=False,encoding='utf-8')   # 保存文件

运行结果如下:

可视化代码:

# -*- codeing utf-8 -*-
# @Time : 2021/1/1 12:47
# @Author : 小刘
# @File : 天气可视化.py
# @Software : PyCharm
#引入包
import csv
import matplotlib 
import numpy as np 
import matplotlib.pyplot as plt
#读取CSV中气象数据
weather_sr=[]
with open("shangrao.csv","r",encoding="utf-8") as file:
    next(file)  #跳过第一行     
    reader=csv.reader(file)    
    for row in reader:       
        weather_sr.append(row)
print(weather_sr)
#将最高温和最低温筛选出来
weather=[] 
for item in(weather_sr):   
    temp=item[3]     
    weather.append(temp)
print(weather)
#温度
h,l = [],[]
for i in weather:
    h.append(int(i.split('℃')[0]))
    l.append(int(i.split('℃')[1][1:]))
print(h)
#日期
date = np.arange(1,len(h)+1,1)
#开始绘图
plt.figure(dpi=128,figsize=(10,6))  #设置窗口大小
#画出l1,l2折线图
l1,=plt.plot(date,h,color='red',label="最高温度",alpha=0.5) 
l2,=plt.plot(date,l,color='lightblue',label="最低温度")
#x轴和y轴的取值范围
plt.xlim(0,32)
plt.ylim(-10,20)
#显示中文标签
plt.rcParams["font.sans-serif"]=["SimHei"] 
plt.rcParams["axes.unicode_minus"]=False
#标注最高温
for i in range(0,len(h)):
    plt.text(date[i], h[i], h[i], ha='center', va='bottom', fontsize=10)
#标注最低温
for j in range(0,len(l)):
    plt.text(date[j], l[j], l[j], ha='center', va='bottom', fontsize=10)
plt.title("上饶12月的天气最高温和最低温的趋势图",size=14)
plt.xlabel("日期/日",size=14) 
plt.ylabel("温度/摄氏度",size=14)
#plt.legend(l1,"最高温度")
#plt.legend(l2,"最低温度") 
plt.legend()
plt.show()

运行结果:

参考文献

标签: p2p linq 蓝桥杯

本文转载自: https://blog.csdn.net/weixin_45971950/article/details/123025960
版权归原作者 bug智造 所有, 如有侵权,请联系我们删除。

“大数据技术原理与应用之可视化实训”的评论:

还没有评论