当前位置:   article > 正文

大数据开源框架之基于Spark的气象数据处理与分析_spark编程计算各城市的平均气温实训

spark编程计算各城市的平均气温实训

Spark配置请看:

(30条消息) 大数据开源框架环境搭建(七)——Spark完全分布式集群的安装部署_木子一个Lee的博客-CSDN博客

目录

实验说明:

实验要求:

实验步骤:

数据获取:

数据分析:

可视化:

参考代码(适用于python3):

运行结果:


实验说明:

        本次实验所采用的数据,从中央气象台官方网站(网址:http://www.nmc.cn/)爬取,主要是最近24小时各个城市的天气数据,包括时间整点、整点气温、整点降水量、风力、整点气压、相对湿度等。正常情况每个城市对应24条数据(每个整点一条)。数据规模达到2412个城市,57888条数据,有部分城市部分时间点数据存在缺失或异常。特别说明:实验所用数据均为网上爬取,没有得到中央气象台官方授权使用,使用范围仅限本次实验使用,请勿用于商业用途。 

实验要求:

1.数据获取,最后保存的各个城市最近24小时整点天气数据(passed_weather_ALL.csv)每条数据各字段含义如下所示,这里仅列出实验中使用部分:

字段 含义

字段 含义

province 城市所在省份(中文)

province 城市所在省份(中文)

city_index 城市序号(计数)

city_index 城市序号(计数)

city_name 城市名称(中文)

city_name 城市名称(中文)

city_code 城市编号

city_code 城市编号

time 时间点(整点)

time 时间点(整点)

temperature 气温

temperature 气温

rain1h 过去1小时降雨量;

rain1h 过去1小时降雨量;

2. 数据分析,主要使用Spark SQL相关知识与技术,对各个城市过去24小时累积降雨量和当日平均气温进行计算和排序;

3. 数据可视化,数据可视化使用python matplotlib库,版本号1.5.1。可使用pip命令安装。绘制过程大体如下:

第一步,应当设置字体,这里提供了黑体的字体文件simhei.tff。否则坐标轴等出现中文的地方是乱码。

第二步,设置数据(累积雨量或者日平均气温)和横轴坐标(城市名称),配置直方图。

第三步,配置横轴坐标位置,设置纵轴坐标范围

第四步,配置横纵坐标标签

第五步,配置每个条形图上方显示的数据

第六步,根据上述配置,画出直方图。。

根据上述实验任务,设计相应内容与具体执行步骤,并对相应关键步骤的执行结果给出截图。 

实验步骤:

数据获取:

思路:

首先利用urllib.request获取url的数据,然后利用json.loads变为json格式

再编写函数写入表头和数据:

利用上述函数组合,编写两个get函数获取城市和省份,导出CSV文件:

最后获取天气数据,导出passed_weather_ALL.csv

每个字段获取方式是:

city_code就是city.csv的code,province就是city.csv里边的province,city_name就是city.csv里边的city,city_index就是第几个城市(设置count变量计数,每个城市加1),

其他直接通过爬取表头获得:

在主函数里运行:

部分代码:

  1. def get_passed_weather(self,province):
  2. weather_passed_file = 'input/passed_weather_' + province + '.csv'
  3. if os.path.exists(weather_passed_file):
  4. return
  5. passed_weather = list()
  6. count = 0
  7. if province == 'ALL':
  8. print ("开始爬取过去的天气状况")
  9. for city in self.get_cities():
  10. data = self.parse_json('http://www.nmc.cn/f/rest/passed/'+city['code'])
  11. if data:
  12. count = count + 1
  13. for item in data:
  14. item['city_code'] = city['code']
  15. item['province'] = city['province']
  16. item['city_name'] = city['city']
  17. item['city_index'] = str(count)
  18. passed_weather.extend(data)
  19. if count % 50 == 0:
  20. if count == 50:
  21. self.write_header(weather_passed_file,passed_weather)
  22. else:
  23. self.write_row(weather_passed_file,passed_weather)
  24. passed_weather = list()
  25. if passed_weather:
  26. if count <= 50:
  27. self.write_header(weather_passed_file,passed_weather)
  28. else:
  29. self.write_row(weather_passed_file,passed_weather)
  30. print ("爬取过去的天气状况完毕!")
  31. else:
  32. print ("开始爬取过去的天气状况")
  33. select_city = filter(lambda x:x['province']==province,self.get_cities())
  34. for city in select_city:
  35. data = self.parse_json('http://www.nmc.cn/f/rest/passed/'+city['code'])
  36. if data:
  37. count = count + 1
  38. for item in data:
  39. item['city_index'] = str(count)
  40. item['city_code'] = city['code']
  41. item['province'] = city['province']
  42. item['city_name'] = city['city']
  43. passed_weather.extend(data)
  44. self.write_csv(weather_passed_file,passed_weather)
  45. print ("爬取过去的天气状况完毕!")
  46. def run(self,range = 'ALL'):
  47. self.get_passed_weather(range)

数据分析:

思路:

首先创建spark对象,然后使用select函数选择所需列的数据进行筛选,分组(累计降雨量按照省份、城市和城市代码分组,气温还得考虑时间date)求和、sort函数排序,

分析气温还需要进行筛选4个时刻,然后再进行分组求和排序

最后生成相应的csv或json文件,返回所需要的前20个或前10个数据。

部分代码:

  1. def passed_rain_analyse(filename): #计算各个城市过去24小时累积雨量
  2. print ("开始分析累积降雨量")
  3. #spark = SparkSession.builder.master("spark://master:7077").appName("passed_rain_analyse").getOrCreate()
  4. #spark = SparkSession.builder.master("local[4]").appName("passed_rain_analyse").getOrCreate()
  5. spark = SparkSession.builder.master("local").appName("passed_rain_analyse").getOrCreate()
  6. df = spark.read.csv(filename,header = True)
  7. df_rain = df.select(df['province'],df['city_name'],df['city_code'],df['rain1h'].cast(DecimalType(scale=1))) .filter(df['rain1h'] < 1000) #筛选数据,去除无效数据
  8. df_rain_sum = df_rain.groupBy("province","city_name","city_code") .agg(F.sum("rain1h").alias("rain24h")) .sort(F.desc("rain24h")) # 分组、求和、排序
  9. df_rain_sum.cache()
  10. df_rain_sum.coalesce(1).write.csv("file:///home/lee/lab5/passed_rain_analyse.csv")
  11. #spark.catalog.refreshTable(filename)
  12. print ("累积降雨量分析完毕!")
  13. return df_rain_sum.head(20)#前20
  14. def passed_temperature_analyse(filename):
  15. print ("开始分析气温")
  16. #spark = SparkSession.builder.master("spark://master:7077").appName("passed_temperature_analyse").getOrCreate()
  17. spark = SparkSession.builder.master("local").appName("passed_temperature_analyse").getOrCreate()
  18. #spark = SparkSession.builder.master("local[4]").appName("passed_rain_analyse").getOrCreate()
  19. df = spark.read.csv(filename,header = True)
  20. df_temperature = df.select( #选择需要的列
  21. df['province'],
  22. df['city_name'],
  23. df['city_code'],
  24. df['temperature'].cast(DecimalType(scale=1)),
  25. F.date_format(df['time'],"yyyy-MM-dd").alias("date"), #得到日期数据
  26. F.hour(df['time']).alias("hour") #得到小时数据
  27. )
  28. # 筛选四点时次
  29. #df_4point_temperature = df_temperature.filter(df_temperature['hour'].isin([2,4,6,8]))
  30. df_4point_temperature = df_temperature.filter(df_temperature['hour'].isin([2,8,14,20]))
  31. #df_4point_temperature = df_temperature.filter(df_temperature['hour'].isin([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24]))
  32. df_avg_temperature = df_4point_temperature.groupBy("province","city_name","city_code","date") .agg(F.count("temperature"),F.avg("temperature").alias("avg_temperature")) .filter("count(temperature) = 4") .sort(F.asc("avg_temperature")) .select("province","city_name","city_code","date",F.format_number('avg_temperature',1).alias("avg_temperature"))
  33. df_avg_temperature.cache()
  34. avg_temperature_list = df_avg_temperature.collect()
  35. df_avg_temperature.coalesce(1).write.json("file:///home/lee/lab5/passed_temperature.json")
  36. print ("气温分析完毕")
  37. return avg_temperature_list[0:10]#最低的10

可视化:

思路:

使用python matplotlib库进行绘图,

第一步,应当设置字体,这里提供了黑体的字体文件simhei.tff。否则坐标轴等出现中文的地方是乱码。

第二步,设置数据(累积雨量或者日平均气温)和横轴坐标(城市名称),配置直方图。

第三步,配置横轴坐标位置,设置纵轴坐标范围

第四步,配置横纵坐标标签

第五步,配置每个条形图上方显示的数据

第六步,根据上述配置,画出直方图。(见下方,按住CTRL点我去)

其他个性化代码:

直方图颜色

color=’ckrmgby’,一个七种颜色,分别对应青、黑、红、洋红、绿、蓝、黄

字体大小、颜色:

大小使用fontsize属性,颜色仍然是color属性

设置图的大小:使用figsize属性

部分代码:

  1. def draw_rain(rain_list):
  2. print ("开始绘制累积降雨量图")
  3. font = FontProperties(fname='ttf/simhei.ttf') # 设置字体
  4. name_list = []
  5. num_list = []
  6. for item in rain_list:
  7. name_list.append(item.province[0:2] + '\n' + item.city_name)
  8. num_list.append(item.rain24h)
  9. index = [i+0.25 for i in range(0,len(num_list))]
  10. plt.figure(figsize=(15,12))#设置图的大小
  11. rects=plt.bar(index, num_list, color='ckrmgby',width = 0.5)
  12. plt.xticks([i+0.25 for i in index], name_list, fontproperties = font,fontsize=15,color='r')#fontsize设置x刻度字体大小
  13. plt.ylim(ymax=(int(max(num_list)+100)/100)*20, ymin=0)#设置刻度间隔
  14. plt.yticks(fontsize=20,color='r')#fontsize设置y刻度字体大小
  15. plt.xlabel("城市",fontproperties = font,fontsize=25,color='c')#fontsize设置x坐标标签字体大小
  16. plt.ylabel("雨量",fontproperties = font,fontsize=25,color='c')#fontsize设置y坐标标签字体大小
  17. plt.title("过去24小时累计降雨量全国前20名",fontproperties = font,fontsize=30,color='b')#fontsize设置标题字体大小
  18. for rect in rects:
  19. height = rect.get_height()
  20. #fontsize设置直方图上字体大小
  21. plt.text(rect.get_x() + rect.get_width() / 2, height, str(height), ha="center", va="bottom",fontsize=15)
  22. plt.show()
  23. print ("累积降雨量图绘制完毕!")
  24. def draw_temperature(temperature_list):
  25. print ("开始绘制气温图")
  26. font = FontProperties(fname='/home/lee/lab5/ttf/simhei.ttf')
  27. name_list = []
  28. num_list = []
  29. #print(temperature_list[1])
  30. date = temperature_list[1].date
  31. for item in temperature_list:
  32. name_list.append(item.province[0:2] + '\n' + item.city_name)
  33. num_list.append(float(item.avg_temperature))
  34. index = [i+0.25 for i in range(0,len(num_list))]
  35. plt.figure(figsize=(15,12))#设置图的大小
  36. rects=plt.bar(index, num_list, color='ckrmgby',width = 0.5)
  37. plt.xticks([i+0.25 for i in index], name_list, fontproperties = font,fontsize=20,color='r')#fontsize设置x刻度字体大小
  38. plt.ylim(ymax = math.ceil(float(max(num_list)))*1.5, ymin = 0)#设置刻度间隔
  39. plt.yticks(fontsize=20,color='r')#fontsize设置y刻度字体大小
  40. plt.xlabel("城市",fontproperties = font,fontsize=25,color='c')#fontsize设置坐标标签字体大小
  41. plt.ylabel("日平均气温",fontproperties = font,fontsize=25,color='c')#fontsize设置坐标标签字体大小
  42. plt.title(date + "全国日平均气温最低前10名",fontproperties = font,fontsize=30,color='b')#fontsize设置标题字体大小
  43. for rect in rects:
  44. height = rect.get_height()
  45. #fontsize设置直方图上字体大小
  46. plt.text(rect.get_x() + rect.get_width() / 2, height+0.1, str(height), ha="center", va="bottom",fontsize=15)
  47. plt.show()
  48. print ("气温图绘制完毕!")

参考代码(适用于python3):

完整代码

  1. #Crawler类(数据获取):
  2. #!/usr/bin/env python
  3. # coding: utf-8
  4. # In[7]:
  5. import urllib.request,urllib.error
  6. import json
  7. import csv
  8. import chardet
  9. import codecs
  10. import os
  11. import time
  12. import importlib,sys
  13. importlib.reload(sys)
  14. class Crawler:
  15. def get_html(self,url):
  16. request = urllib.request.Request(url)
  17. response = urllib.request.urlopen(request)
  18. return response.read().decode()
  19. def parse_json(self,url):
  20. obj = self.get_html(url)
  21. if obj:
  22. json_obj = json.loads(obj)
  23. else:
  24. json_obj = list()
  25. return json_obj
  26. def write_csv(self,file,data):
  27. if data:
  28. print ("开始写入 " + file)
  29. with open(file,'a+',encoding='utf-8-sig') as f:#utf-8-sig 带BOM的utf-8
  30. f_csv = csv.DictWriter(f,data[0].keys())
  31. #if not os.path.exists(file):
  32. f_csv.writeheader()
  33. f_csv.writerows(data)
  34. print ("结束写入 " + file)
  35. def write_header(self,file,data):
  36. if data:
  37. print ("开始写入 " + file)
  38. with open(file,'a+',encoding='utf-8-sig') as f:
  39. f_csv = csv.DictWriter(f,data[0].keys())
  40. f_csv.writeheader()
  41. f_csv.writerows(data)
  42. print ("结束写入 " + file)
  43. def write_row(self,file,data):
  44. if data:
  45. print ("开始写入 " + file)
  46. with open(file,'a+',encoding='utf-8-sig') as f:
  47. f_csv = csv.DictWriter(f,data[0].keys())
  48. if not os.path.exists(file):
  49. f_csv.writeheader()
  50. f_csv.writerows(data)
  51. print ("结束写入 " + file)
  52. def read_csv(self,file):
  53. print ("开始读取 " + file)
  54. with open(file,'r+',encoding='utf-8-sig') as f:
  55. data = csv.DictReader(f)
  56. print ("结束读取 " + file)
  57. return list(data)
  58. def get_provinces(self):
  59. province_file = 'input/province.csv'
  60. if not os.path.exists(province_file):
  61. print ("开始爬取省份")
  62. provinces = self.parse_json('http://www.nmc.cn/f/rest/province')
  63. print ("省份爬取完毕!")
  64. self.write_csv(province_file,provinces)
  65. else:
  66. provinces = self.read_csv(province_file)
  67. return provinces
  68. def get_cities(self):
  69. city_file = 'input/city.csv'
  70. if not os.path.exists(city_file):
  71. cities = list()
  72. print ("开始爬取城市")
  73. for province in self.get_provinces():
  74. url = province['url'].split('/')[-1].split('.')[0]
  75. cities.extend(self.parse_json('http://www.nmc.cn/f/rest/province/'+url))
  76. self.write_csv(city_file,cities)
  77. print ("爬取城市完毕!")
  78. else:
  79. cities = self.read_csv(city_file)
  80. return cities
  81. def get_passed_weather(self,province):
  82. weather_passed_file = 'input/passed_weather_' + province + '.csv'
  83. if os.path.exists(weather_passed_file):
  84. return
  85. passed_weather = list()
  86. count = 0
  87. if province == 'ALL':
  88. print ("开始爬取过去的天气状况")
  89. for city in self.get_cities():
  90. data = self.parse_json('http://www.nmc.cn/f/rest/passed/'+city['code'])
  91. if data:
  92. count = count + 1
  93. for item in data:
  94. item['city_code'] = city['code']
  95. item['province'] = city['province']
  96. item['city_name'] = city['city']
  97. item['city_index'] = str(count)
  98. passed_weather.extend(data)
  99. if count % 50 == 0:
  100. if count == 50:
  101. self.write_header(weather_passed_file,passed_weather)
  102. else:
  103. self.write_row(weather_passed_file,passed_weather)
  104. passed_weather = list()
  105. if passed_weather:
  106. if count <= 50:
  107. self.write_header(weather_passed_file,passed_weather)
  108. else:
  109. self.write_row(weather_passed_file,passed_weather)
  110. print ("爬取过去的天气状况完毕!")
  111. else:
  112. print ("开始爬取过去的天气状况")
  113. select_city = filter(lambda x:x['province']==province,self.get_cities())
  114. for city in select_city:
  115. data = self.parse_json('http://www.nmc.cn/f/rest/passed/'+city['code'])
  116. if data:
  117. count = count + 1
  118. for item in data:
  119. item['city_index'] = str(count)
  120. item['city_code'] = city['code']
  121. item['province'] = city['province']
  122. item['city_name'] = city['city']
  123. passed_weather.extend(data)
  124. self.write_csv(weather_passed_file,passed_weather)
  125. print ("爬取过去的天气状况完毕!")
  126. def run(self,range = 'ALL'):
  127. self.get_passed_weather(range)
  128. if __name__ == '__main__':
  129. cr=Crawler()
  130. cr.run('ALL')
  1. #SparkSql类(分析+可视化,引入Crawler类之后也可以爬取,前提是passed_weather_ALL.csv不存在;每次运行前需要删除passed_temperature.json和passed_rain_analyse.csv这两个文件夹)
  2. import findspark
  3. findspark.init()
  4. from pyspark.sql import SparkSession
  5. from pyspark.sql import functions as F
  6. from pyspark.sql.types import DecimalType,TimestampType
  7. import matplotlib as mpl
  8. import matplotlib.pyplot as plt
  9. from matplotlib.font_manager import FontProperties
  10. import os
  11. import math
  12. from Crawler import *
  13. import importlib,sys
  14. importlib.reload(sys)
  15. def passed_rain_analyse(filename): #计算各个城市过去24小时累积雨量
  16. print ("开始分析累积降雨量")
  17. #spark = SparkSession.builder.master("spark://master:7077").appName("passed_rain_analyse").getOrCreate()
  18. #spark = SparkSession.builder.master("local[4]").appName("passed_rain_analyse").getOrCreate()
  19. spark = SparkSession.builder.master("local").appName("passed_rain_analyse").getOrCreate()
  20. df = spark.read.csv(filename,header = True)
  21. df_rain = df.select(df['province'],df['city_name'],df['city_code'],df['rain1h'].cast(DecimalType(scale=1))) .filter(df['rain1h'] < 1000) #筛选数据,去除无效数据
  22. df_rain_sum = df_rain.groupBy("province","city_name","city_code") .agg(F.sum("rain1h").alias("rain24h")) .sort(F.desc("rain24h")) # 分组、求和、排序
  23. df_rain_sum.cache()
  24. df_rain_sum.coalesce(1).write.csv("file:///home/lee/lab5/passed_rain_analyse.csv")
  25. #spark.catalog.refreshTable(filename)
  26. print ("累积降雨量分析完毕!")
  27. return df_rain_sum.head(20)#前20
  28. def passed_temperature_analyse(filename):
  29. print ("开始分析气温")
  30. #spark = SparkSession.builder.master("spark://master:7077").appName("passed_temperature_analyse").getOrCreate()
  31. spark = SparkSession.builder.master("local").appName("passed_temperature_analyse").getOrCreate()
  32. #spark = SparkSession.builder.master("local[4]").appName("passed_rain_analyse").getOrCreate()
  33. df = spark.read.csv(filename,header = True)
  34. df_temperature = df.select( #选择需要的列
  35. df['province'],
  36. df['city_name'],
  37. df['city_code'],
  38. df['temperature'].cast(DecimalType(scale=1)),
  39. F.date_format(df['time'],"yyyy-MM-dd").alias("date"), #得到日期数据
  40. F.hour(df['time']).alias("hour") #得到小时数据
  41. )
  42. # 筛选四点时次
  43. #df_4point_temperature = df_temperature.filter(df_temperature['hour'].isin([2,4,6,8]))
  44. df_4point_temperature = df_temperature.filter(df_temperature['hour'].isin([2,8,14,20]))
  45. #df_4point_temperature = df_temperature.filter(df_temperature['hour'].isin([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24]))
  46. df_avg_temperature = df_4point_temperature.groupBy("province","city_name","city_code","date") .agg(F.count("temperature"),F.avg("temperature").alias("avg_temperature")) .filter("count(temperature) = 4") .sort(F.asc("avg_temperature")) .select("province","city_name","city_code","date",F.format_number('avg_temperature',1).alias("avg_temperature"))
  47. df_avg_temperature.cache()
  48. avg_temperature_list = df_avg_temperature.collect()
  49. df_avg_temperature.coalesce(1).write.json("file:///home/lee/lab5/passed_temperature.json")
  50. print ("气温分析完毕")
  51. return avg_temperature_list[0:10]#最低的10
  52. def draw_rain(rain_list):
  53. print ("开始绘制累积降雨量图")
  54. font = FontProperties(fname='ttf/simhei.ttf') # 设置字体
  55. name_list = []
  56. num_list = []
  57. for item in rain_list:
  58. name_list.append(item.province[0:2] + '\n' + item.city_name)
  59. num_list.append(item.rain24h)
  60. index = [i+0.25 for i in range(0,len(num_list))]
  61. plt.figure(figsize=(15,12))#设置图的大小
  62. rects=plt.bar(index, num_list, color='ckrmgby',width = 0.5)
  63. plt.xticks([i+0.25 for i in index], name_list, fontproperties = font,fontsize=15,color='r')#fontsize设置x刻度字体大小
  64. plt.ylim(ymax=(int(max(num_list)+100)/100)*20, ymin=0)#设置刻度间隔
  65. plt.yticks(fontsize=20,color='r')#fontsize设置y刻度字体大小
  66. plt.xlabel("城市",fontproperties = font,fontsize=25,color='c')#fontsize设置x坐标标签字体大小
  67. plt.ylabel("雨量",fontproperties = font,fontsize=25,color='c')#fontsize设置y坐标标签字体大小
  68. plt.title("过去24小时累计降雨量全国前20名",fontproperties = font,fontsize=30,color='b')#fontsize设置标题字体大小
  69. for rect in rects:
  70. height = rect.get_height()
  71. #fontsize设置直方图上字体大小
  72. plt.text(rect.get_x() + rect.get_width() / 2, height, str(height), ha="center", va="bottom",fontsize=15)
  73. plt.show()
  74. print ("累积降雨量图绘制完毕!")
  75. def draw_temperature(temperature_list):
  76. print ("开始绘制气温图")
  77. font = FontProperties(fname='/home/lee/lab5/ttf/simhei.ttf')
  78. name_list = []
  79. num_list = []
  80. #print(temperature_list[1])
  81. date = temperature_list[1].date
  82. for item in temperature_list:
  83. name_list.append(item.province[0:2] + '\n' + item.city_name)
  84. num_list.append(float(item.avg_temperature))
  85. index = [i+0.25 for i in range(0,len(num_list))]
  86. plt.figure(figsize=(15,12))#设置图的大小
  87. rects=plt.bar(index, num_list, color='ckrmgby',width = 0.5)
  88. plt.xticks([i+0.25 for i in index], name_list, fontproperties = font,fontsize=20,color='r')#fontsize设置x刻度字体大小
  89. plt.ylim(ymax = math.ceil(float(max(num_list)))*1.5, ymin = 0)#设置刻度间隔
  90. plt.yticks(fontsize=20,color='r')#fontsize设置y刻度字体大小
  91. plt.xlabel("城市",fontproperties = font,fontsize=25,color='c')#fontsize设置坐标标签字体大小
  92. plt.ylabel("日平均气温",fontproperties = font,fontsize=25,color='c')#fontsize设置坐标标签字体大小
  93. plt.title(date + "全国日平均气温最低前10名",fontproperties = font,fontsize=30,color='b')#fontsize设置标题字体大小
  94. for rect in rects:
  95. height = rect.get_height()
  96. #fontsize设置直方图上字体大小
  97. plt.text(rect.get_x() + rect.get_width() / 2, height+0.1, str(height), ha="center", va="bottom",fontsize=15)
  98. plt.show()
  99. print ("气温图绘制完毕!")
  100. def main():
  101. sourcefile = "input/passed_weather_ALL.csv"
  102. if not os.path.exists(sourcefile):
  103. crawler = Crawler()
  104. crawler.run('ALL')
  105. rain_list = passed_rain_analyse('file:///home/lee/lab5/' + sourcefile)
  106. draw_rain(rain_list)
  107. temperature_list = passed_temperature_analyse('file:///home/lee/lab5/' + sourcefile)
  108. draw_temperature(temperature_list)
  109. if __name__ == '__main__':
  110. main()

运行结果:

数据获取:

数据分析:

数据可视化大图在下边

大图在下边:

分别对应rain.png和temperature.png

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/528639
推荐阅读
相关标签
  

闽ICP备14008679号