【机器学习和数据分析与可视化课程设计】基于天气预报的数据分析与可视化课程设计(Python实现)

您所在的位置:网站首页 天气预报内容 【机器学习和数据分析与可视化课程设计】基于天气预报的数据分析与可视化课程设计(Python实现)

【机器学习和数据分析与可视化课程设计】基于天气预报的数据分析与可视化课程设计(Python实现)

2023-07-28 08:11| 来源: 网络整理| 查看: 265

前言 天气预报我们每天都会关注,天气情况会影响到我们日常的增减衣物、出行安排等。每天的气温、相对湿度、降水量以及风向风速是关注的焦点。数据可视化方面,使用matplotlib、numpy、pandas、scikit-learn库对数据进行预处理、可视化处理。得到了一天内温度变化曲线、相对湿度变化曲线图、温湿度相关性、降水量变化图、以及风向雷达图等。机器学习方面,使用最为经典的线性回归方法,对天气数据进行分析,对天气数据预测,然后通过平均绝对值误差(Mean Absolute Error),表示预测值和观测值之间绝对误差的平均值进行约束和优化,最后使用皮尔逊相关系数进行分析与评价。

总的来说,本课程设计涉及到numpy库、pandas库、matplotlib库、sklearn库、以及文件存取的具体应用.可移植性强、界面美观、初具小型系统雏形,是一份结合数据分析、数据可视化与机器学习学习的课程设计。希望读者喜欢~

本课程设计项目特色在于: (1)精心配色,可视化效果更佳。 (2)多文件结构,文件之间的层次更加清晰。 (3)路径地址采用相对路径,可移植性高。 (4)增加了主菜单,方便选择调用需要执行的功能。 (5)增加动态效果,对“XX变化图”增加了运行时动态生成的效果,对“变化”的感知将更加深刻,具体原理见chart.py文件。 (6)通过scikit-learn库中的LinearRegression()来分析温度-相对湿度的线性回归方程,以及使用相关系数衡量相关性。

考虑到有一部分读者想与笔者有进一步交流,可以添加我的微信:StarsForMoon,添加请说明来意(如CSDN)。感谢您对我的支持!😃 一、主要文件结构

说明:

① dataset文件夹:存放天气数据的csv文件。

② main.py:调用dataset中的数据和src中的源代码,得出可视化图片,然后保存于result文件夹,它是程序运行入口。

③ result文件夹:存放运行完成后的可视化图片。

④ src文件夹:存放数据分析与可视化的源代码。

⑤ 执行main.py后,XX变化图的可视化将会是一个动态变化图展示,所有保存的可视化图片都是静态的.png图片。

二、具体文件细节

(1)main.py源代码:

#main.py是启动程序,负责启动和调用相应的功能,并导入数据集 def main(): #数据分析与可视化实现 key=1 print("\n请选择你所需要的分析: \n0、温度变化图\n1、相对湿度变化图\n2、温度与相对湿度分析图\n3、降雨量变化图\n4、风向雷达图") #多功能数据分析与可视化的选择 #try-except结构避免用户输入不正确或恶意输入 while 1: try: i=int(input('输入需要查看的图表(输入-1退出):')) break except: print("输入有误,请重新输入") print("\n请选择你所需要的分析: \n0、温度变化图\n1、相对湿度变化图\n2、温度与相对湿度分析图\n3、降雨量变化图\n4、风向雷达图") #选择对应功能后,调用对应函数 #while循环实现多次查看不同的功能 while key==1: if(i==-1): key=0 break while i!=-1: if i==0: dataprocess.temperature(data)#温度变化曲线 break elif i==1: dataprocess.humidity(data)#湿度变化曲线 break elif i==2: dataprocess.relevance(data)#温湿度相关性分析 break elif i==3: dataprocess.rainfall(data)#降雨量曲线图 break elif i==4: dataprocess.wind(data)#风级风向雷达图 break elif i==-1: key=0 print("正在退出......") break else: print("输入有误请重新输入") break if(key==0): break print("\n请选择你所需要的分析: \n0、温度变化图\n1、相对湿度变化图\n2、温度与相对湿度分析图\n3、降雨量变化图\n4、风向雷达图") i = int(input('输入需要查看的图表(输入-1退出):')) print("\n退出成功,欢迎下次使用!") #启动入口 if __name__=="__main__": main()

(2)dataset文件夹内部: 存有一个天气数据的csv文件,通过爬虫代码获取自己地区当前天气数据。 weather1.csv

(3)src文件夹内部: 内有两个.py文件,dataprocess.py是数据分析处理文件,chart.py是数据可视化文件,main函数会先调用处理文件后再可视化文件。

(4)dataprocess.py代码(使用Numpy、Pandas进行数据处理的文件,此处就不展示了):

dataprocess.py程序是数据处理程序 负责对来自对数据集进行数据分析和处理,以便于提供给chart.py程序进行可视化

(5)chart.py源代码:

chart.py程序是调用matplotlib中的库函数进行可视化 数据的接收自dataprocess.py程序,然后进行可视化 分别有温度变化折线图、相对湿度变化折线图、降水量变化柱状图、风向雷达图、以及结合机器学习线性回归生成的温湿度相关性分析图。 特色:运行过程中,所有变化图都会动态生成,非常酷炫!

#温度变化图 def temdiagram(tems,hours,temave,temmin,tem_minhour,temmax,tem_maxhour): x = []#以时间为x坐标 y = []#以温度为y坐标 plt.figure(1,figsize=(16,10))#定义图片大小和序号 #制作数据变化的动画效果 for i in range(0, 24): x.append(i) y.append(tems[hours.index(i)]) # 每迭代一次,将i放入y中画出来 plt.clf() # 清除键 plt.plot(x, y, color='#7FFFD4', label='温度') plt.legend() plt.pause(0.15)#暂停0.15s便可以得到动画效果 #定义图片标题,x轴和y轴坐标名称 plt.title('重庆市主城区一天温度变化曲线图') plt.xlabel('时间/h') plt.ylabel('摄氏度/℃') plt.scatter(x, y, color='#7FFFD4') # 点出每个时刻的温度点 # 画出平均温度虚线 plt.plot([0, 24], [temave, temave], color='#5595F9', linestyle='--', label='平均温度') plt.text(tem_maxhour + 0.15, temmax - 0.25, str(temmax) + '℃', ha='center', va='bottom', fontsize=10.5, color='#9370DB') # 标出最高温度 plt.text(tem_minhour + 0.15, temmin - 0.20, str(temmin) + '℃', ha='center', va='bottom', fontsize=10.5, color='#9370DB') # 标出最低温度 plt.xticks(x) plt.savefig(savepath+'\温度变化图.png', dpi=800)#保存图片到指定文件夹 plt.show() plt.close()

温度变化图 温度变化图

#相对湿度变化图 def humdiagram(hours,hums,humave,hummax,hum_maxhour,hummin,hum_minhour): x = []#时间为x坐标 y = []#湿度为y坐标 plt.figure(2, figsize=(16, 10))#定义图片大小和序号 #制作数据变化的动画效果 for i in range(0, 24): x.append(i) y.append(hums[hours.index(i)]) # 每迭代一次,将i放入y中画出来 plt.cla() # 清除键 plt.plot(x, y, color='#7FFFD4', label='相对湿度') # 相对湿度曲线 plt.legend() plt.pause(0.15)#暂停0.15s便可以得到动画效果 #定义图片标题,x轴和y轴坐标名称 plt.title('重庆市主城区一天相对湿度变化曲线图') plt.xlabel('时间/h') plt.ylabel('百分比/%') plt.scatter(x, y, color='#7FFFD4') # 点出每个时刻的相对湿度 # 画出平均相对湿度虚线 plt.plot([0, 24], [humave, humave], color='#5595F9', linestyle='--', label='平均相对湿度') plt.text(hum_maxhour + 0.15, hummax + 0.15, str(hummax) + '%', ha='center', va='bottom', fontsize=10.5, color='#9370DB') # 标出最高相对湿度 plt.text(hum_minhour + 0.15, hummin - 0.95, str(hummin) + '%', ha='center', va='bottom', fontsize=10.5, color='#9370DB') # 标出最低相对湿度 plt.xticks(x) plt.savefig(savepath+'\相对湿度变化图.png', dpi=800)#保存图片到指定文件夹 plt.show() plt.close()

相对湿度变化图 相对湿度变化图

#降雨量曲线图 def rainfalldiagram(hours,rainfall,rainfallavg,rainfallmax,hour_rainfallmax,rainfallmin,hour_rainfallmin): x = []#时间为x坐标 y = []#降雨量为y坐标 plt.figure(3, figsize=(16, 10))#定义图片大小和序号 #制作数据变化的动画效果 for i in range(0, 24): x.append(i) y.append(rainfall[hours.index(i)]) # 每迭代一次,将i放入y中画出来 plt.cla() # 清除键 plt.bar(x, y, color='#7FFFD4', width=0.7,label='降水量') plt.legend() plt.pause(0.15)#暂停0.15s便可以得到动画效果 #定义图片标题,x轴和y轴坐标名称 plt.title('重庆市主城区一天降水量变化柱状图') plt.xlabel('时间/h') plt.ylabel('降水量/mm') # 画出平均降水量虚线 plt.plot([0, 24], [rainfallavg, rainfallavg], color='#5595F9', linestyle='--', label='平均降水量') plt.text(hour_rainfallmax, rainfallmax + 0.01, str(rainfallmax) + 'mm', ha='center', va='bottom', fontsize=10.5, color='#9370DB') # 标出最高降水量 plt.text(hour_rainfallmin, rainfallmin + 0.01, str(rainfallmin) + 'mm', ha='center', va='bottom', fontsize=10.5, color='#9370DB') # 标出最低降水量 plt.xticks(x) plt.savefig(savepath+'\降水量变化图.png', dpi=800)#保存图片到指定文件夹 plt.show() plt.close()

降水量柱状图 降水量变化图

#风向雷达图 def windradar(temp): plt.figure(4, figsize=(16, 10))#定义图片大小和序号 N = 8 #定义分为八个方向 theta = np.linspace(0.0, 2 * np.pi, N, endpoint=False)#将0-2pi分为8块 radii = np.array(temp)#半径为该方向的平均风级大小 width = np.pi / 4 #每一块为pi/4大小 colors = plt.cm.viridis(np.random.rand(N))#随机八块的颜色 labels=['东风','东北风','北风','西北风','西风','西南风','南风','东南风']#用于对八块进行贴标签 plt.subplot(projection='polar') #定义图片标题 plt.title('重庆市主城区一天风级图') plt.bar(theta, radii, width=width, color=colors,alpha=0.3, bottom=0.0)#绘制极坐标图 #对每一块贴上对应的标签 for angle,radius,label in zip(theta,radii,labels): plt.text(angle,radius,label,ha='center',va='bottom',fontsize=14.5,color='black') plt.savefig(savepath+'\风向雷达图.png', dpi=800)#保存图片到指定文件夹 plt.show() plt.close()

风向雷达图 风向雷达图

#皮尔逊相关系数函数 def coefficient(var1,var2): aavg = sum(var1)/len(var1)#变量1的平均值 bavg = sum(var2)/len(var2)#变量2的平均值 covab = sum([(x - aavg)*(y - bavg) for x,y in zip(var1,var2)])#变量1和变量2的协方差 asd= math.sqrt(sum([(i - aavg)**2 for i in var1]))#变量1的标准差 bsd= math.sqrt(sum([(j - bavg)**2 for j in var2]))#变量2的标准差 raletive_coe = covab/(asd*bsd) #变量1和2的皮尔逊相关系数 return round(raletive_coe,4) #温湿度相关性分析 def relevancediagram(tems,hums,x,w,b,f): plt.figure(5, figsize=(16, 10))#定义图片大小和序号 #定义图片标题,x轴和y轴坐标名称 plt.title("温湿度相关性分析图") plt.xlabel("温度/℃") plt.ylabel("相对湿度/%") plt.scatter(tems, hums, color='#7FFFD4')#绘制散点图 plt.plot(x, f)#绘制线性回归拟合曲线 #标出线性回归方程和皮尔逊相关系数 plt.text(20.1, 95.0, '线性回归方程:\nY=' + str(round(w, 3)) + 'X+' + str(round(b, 3)), fontdict={'size': '10', 'color': '#02082D'}) if (coefficient(tems, hums) 'size': '15', 'color': '#5595F9'}) elif (coefficient(tems, hums) > 0): plt.text(20, 77.5, "相关系数为:" + str(coefficient(tems, hums)) + ',温湿度线性正相关', fontdict={'size': '15', 'color': '#5595F9'}) plt.savefig(savepath+'\温湿度相关性分析图.png', dpi=800)#保存图片到指定文件夹 plt.show() plt.close()

温湿度相关性分析图(此处结合了机器学习线性回归) 温湿度相关性分析图

(6)src文件夹内部是存放的运行结果,即可视化图片。 result文件夹内部

最后,觉得做得还不错的话请三连支持一下吧~要是点一点关注那就更好了!



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3