0


学习笔记-大数据基础实训(python语言+可视化)

实训指导书

一、实训目的

利用python从指定接口爬取广东省各个地市的气象数据,存储并进行数据分析和可视化

二、****实训任务列表

给定以下3个接口:

1.http://www.nmc.cn/f/rest/province ,用于获取全国各省份数据

2.http://www.nmc.cn/f/rest/province/省份编码,用于获取某个省份的城市数据

3.http://www.nmc.cn/f/rest/passed/城市编号,用于获取某城市最近24小时天气数据

示例:省份编码需从接口1,例如广东省编码为ABC,城市编码利用省份编码从接口2获取,如广州市编号为123456,气象数据利用城市编码从接口3获取

  1. 利用python编程从以上3个接口爬取数据,在本地存储为csv文件,csv文件包括:省份数据(provice.csv)、地市数据(city.csv)、广东省各地市气象数据(weather.csv),同时将3个csv文件数据存入mysql数据库中

  2. 从数据库读取数据,求各个城市过去24小时的温度(temperature)、湿度(humidity)、气压(pressure)、风速(windSpeed)、最大值、最小值、平均值、众数

  3. 计算广州,深圳,佛山三个城市下午13:00温度(temperature)、湿度(humidity)、气压(pressure)、风速(windSpeed)的平均值

  4. 分别求各个城市过去24小时的温度(temperature)、湿度(humidity)、气压(pressure)、风速(windSpeed)的top10,用matplotlib进行画图,使用展示的图类型为4种

  5. 利用线性回归模型作图,显示温度和湿度二者之间的关联

  6. 加分项:利用地图进行展示

一.利用python编程从以上3个接口爬取数据

接口:http://www.nmc.cn/f/rest/province

数据格式如下:

爬取(provice.py)省份数据生成(provice.csv)

  1. # -*- coding: utf-8 -*-
  2. import csv
  3. import json
  4. import requests
  5. #全国各省的数据
  6. url = "http://www.nmc.cn/f/rest/province"
  7. strhtml = requests.get(url) #获取响应结果,构造一个向服务器请求资源的Request对象
  8. province = json.loads(strhtml.text) #json.loads 用于解码 JSON 数据,返回 Python 字段的数据类型
  9. #mode='w'打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
  10. fo = open('province.csv', 'w', newline='', encoding='utf-8-sig')
  11. header = ['code', 'name', 'url']
  12. writer = csv.DictWriter(fo, header)
  13. writer.writeheader()#写入表头
  14. writer.writerows(province)
  15. fo.close()

province.csv表的数据如下:

  1. ![](https://img-blog.csdnimg.cn/54c89ecdc4e14d37a3599139d1137486.png)

我所在地是广东,所以我选择 广东省的城市数据(AGD)

接口:http://www.nmc.cn/f/rest/province/AGD

数据格式如下:

爬取(city.py)城市数据生成(city.csv)

  1. # -*- coding: utf-8 -*-
  2. import csv
  3. import json
  4. import requests
  5. #广东省的城市数据(AGD)
  6. url = 'http://www.nmc.cn/f/rest/province/AGD'
  7. strhtml = requests.get(url)
  8. city = json.loads(strhtml.text)
  9. fo = open('city.csv', 'w', newline='', encoding='utf-8-sig')
  10. header = ['code', 'province', 'city','url']
  11. writer = csv.DictWriter(fo, header)
  12. writer.writeheader()
  13. writer.writerows(city)
  14. fo.close()

city表的数据格式如下:

爬取(weather.py)广东省各地市气象数据生成(weather.csv)

  1. import urllib.request
  2. import csv
  3. import pandas as pd
  4. #广东省的城市数据(AGD)
  5. url = 'http://www.nmc.cn/f/rest/province/AGD'
  6. strhtml = urllib.request.urlopen(url) #获取响应结果
  7. GDweather = strhtml.read().decode('utf-8') #进行转码并设置为变量“str”的值
  8. GDweather = eval(GDweather) #将字符串转换为代码执行
  9. for i in range(len(GDweather)):
  10. weather = GDweather[i]
  11. page = weather["code"] # 获取城市编号
  12. city = weather["city"] # 获取城市名
  13. province = weather["province"] # 获取省份
  14. url = "http://www.nmc.cn/f/rest/passed/" + page # 拿到省内具体城市气候数据
  15. strhtml = urllib.request.urlopen(url)
  16. cityweather = strhtml.read().decode('utf-8')
  17. cityweather = eval(cityweather)
  18. weather = []
  19. for i in range(len(cityweather)):
  20. GD = cityweather[i]
  21. new_code = {"code":page}
  22. new_city = {"city":city}
  23. new_provice = {"province": province}
  24. GD.update(new_code) #字典覆盖
  25. GD.update(new_city)
  26. GD.update(new_provice)
  27. weather.append(GD) #往weather = [] 这个空数组中添加从GD中取得的元素
  28. # mode='a+'表示在已有数据基础上添加新数据,并不覆盖已有数据
  29. with open("weather.csv", "a", encoding='utf-8-sig', newline="") as fo:
  30. header = ["code", "province", "city", "rain1h", "rain24h", "rain12h", "rain6h",
  31. "temperature", "tempDiff", "humidity", "pressure",
  32. "windDirection", "windSpeed", "time"]
  33. writer = csv.DictWriter(fo, header)
  34. writer.writeheader()
  35. writer.writerows(weather)
  36. fo.close()
  37. # 数据处理,将weather.csv表,去除重复表头
  38. frame=pd.read_csv('F:\大数据基础实训\weather.csv',engine='python')
  39. data = frame.drop_duplicates(subset=['code','province','city','rain1h','rain24h',
  40. 'rain12h','rain6h','temperature','tempDiff',
  41. 'humidity','pressure','windDirection',
  42. 'windSpeed','time'], keep = False, inplace=False)
  43. data.to_csv('F:\大数据基础实训\weather.csv', encoding='utf8')

weather表的数据格式如下:

将生成的3个csv文件中的数据分别存入到mysql中

需要先在Navicat中建数据库,我给这个数据库起名为bigdata,然后先在数据库中建3个表,每个表都要有一个和csv文件对应的表头,格式如下:

​​​​​​

注意:

在weather.csv中的第一列是序号,所以在sql中建weather表的时候也要给第一列起个名,我给它起名为 序号

代码如下:
  1. import csv
  2. import pymysql
  3. def read_csv(file_path):
  4. with open(file_path, 'r', encoding='utf-8') as f:
  5. reader = csv.reader(f)
  6. content = list(reader)[1:]
  7. return content
  8. def insert_data(table_name, data):
  9. # 与数据库建立连接
  10. conn = pymysql.connect(host='localhost', user='root', password='123456', database='bigdata', charset='utf8')
  11. cursor = conn.cursor() # 创建游标对象
  12. # 组装插入数据的SQL语句
  13. sql = "insert into {} values".format(table_name) + str(tuple(data))
  14. cursor.execute(sql) # 执行插入数据的SQL语句
  15. conn.commit() # 提交数据
  16. cursor.close() # 关闭游标
  17. conn.close() # 关闭数据库连接
  18. # 读取并插入Province表数据
  19. province_data = read_csv('F:\大数据基础实训\province.csv')
  20. for data in province_data:
  21. insert_data('province', data)
  22. # 读取并插入City表数据
  23. city_data = read_csv('city.csv')
  24. for data in city_data:
  25. insert_data('city', data)
  26. # 读取并插入Weather表数据
  27. weather_data = read_csv('weather.csv')
  28. for data in weather_data:
  29. insert_data('weather', data)

** 存入数据库成功!! **

如下:

二.从数据库读取数据,求各个城市过去24小时的温度(temperature)、湿度(humidity)、气压(pressure)、风速(windSpeed)、最大值、最小值、平均值、众数

从数据库读取数据各个城市过去24小时的温度(temperature)、湿度(humidity)、气压(pressure)、风速(windSpeed)的最大值、最小值、平均值 。

  1. import pymysql
  2. import csv
  3. #打开数据库连接
  4. db = pymysql.connect(host='localhost',user='root',password='123456',database='bigdata',charset='utf8')
  5. # print("从数据库读取数据,求各个城市过去24小时的温度(temperature)、湿度(humidity)、气压(pressure)、风速(windSpeed)、最大值、最小值、平均值")
  6. cursor = db.cursor() #使用cursor()方法创建一个游标对象cursor
  7. cursor.execute("SELECT "
  8. "city,"
  9. "AVG(temperature) as 温度平均值,"
  10. "MAX(temperature) as 温度最大值,"
  11. "MIN(temperature) as 温度最小值,"
  12. "AVG(humidity) as 湿度平均值,"
  13. "MAX(humidity) as 湿度最大值,"
  14. "MIN(humidity) as 湿度最小值,"
  15. "AVG(pressure) as 气压平均值,"
  16. "MAX(pressure) as 气压最大值,"
  17. "MIN(pressure) as 气压最小值,"
  18. "AVG(windSpeed) as 风速平均值,"
  19. "MAX(windSpeed) as 风速最大值,"
  20. "MIN(windSpeed) as 风速最小值 FROM weather GROUP BY city") #使用 execute()方法执行SQL查询
  21. data = cursor.fetchall() #使用fetchall()方法获取所有的数据,以元组形式返回
  22. #关闭数据库连接
  23. db.close()
  24. with open("max-min-avg.csv", "w+", newline="", encoding='utf-8-sig') as file:
  25. header = ('城市', '温度平均值', '温度最大值', '温度最小值', '湿度平均值',
  26. '湿度最大值', ' 湿度最小值', '气压平均值', '气压最大值',
  27. '气压最小值', '风速平均值', '风速最大值', '风速最小值')
  28. pen = csv.writer(file)
  29. pen.writerow(header)
  30. # 遍历data中的每一行,并且转换为列表格式 (默认 tuple)
  31. for i in data:
  32. a = list(i)
  33. pen.writerow(a)
max-min-avg.csv表数据如下:

从数据库读取数据,广东省各个城市过去24小时的温度(temperature)、湿度(humidity)、气压(pressure)、风速(windSpeed)的众数。
代码如下:
  1. import pymysql
  2. conn = pymysql.connect(host='localhost', user='root', passwd='123456', db='bigdata', port=3306, charset='utf8')
  3. cursor = conn.cursor()
  4. sql = "SELECT city, temperature, humidity, pressure, windSpeed FROM weather WHERE time >= DATE_SUB(NOW(), INTERVAL 1 DAY)"
  5. cursor.execute(sql)
  6. rows = cursor.fetchall()
  7. from statistics import mode
  8. cities = {}
  9. for row in rows:
  10. city, temperature, humidity, pressure, windSpeed = row
  11. if city not in cities:
  12. cities[city] = {}
  13. cities[city]['temperature'] = cities[city].get('temperature', []) + [temperature]
  14. cities[city]['humidity'] = cities[city].get('humidity', []) + [humidity]
  15. cities[city]['pressure'] = cities[city].get('pressure', []) + [pressure]
  16. cities[city]['windSpeed'] = cities[city].get('windSpeed', []) + [windSpeed]
  17. result = []
  18. for city in cities:
  19. temperature_mode = mode(cities[city]['temperature'])
  20. humidity_mode = mode(cities[city]['humidity'])
  21. pressure_mode = mode(cities[city]['pressure'])
  22. windSpeed_mode = mode(cities[city]['windSpeed'])
  23. result.append([city, temperature_mode, humidity_mode, pressure_mode, windSpeed_mode])
  24. import csv
  25. with open('zhongshu.csv', 'w', newline='') as f:
  26. writer = csv.writer(f)
  27. writer.writerow(['城市', '温度众数', '湿度众数', '气压众数', '风速众数'])
  28. writer.writerows(result)
zhongshu.csv的数据如下:

三. 计算广州,深圳,佛山三个城市下午13:00温度(temperature)、湿度(humidity)、气压(pressure)、风速(windSpeed)的平均值

代码如下:

  1. import pymysql
  2. import csv
  3. #打开数据库连接
  4. db = pymysql.connect(host='localhost',user='root',password='123456',database='bigdata',charset='utf8')
  5. # 计算广州,深圳,佛山三个城市下午14:00温度(temperature)、湿度(humidity)、气压(pressure)、风速(windSpeed)的平均值
  6. sor = db.cursor()
  7. sor.execute("SELECT "
  8. "AVG(temperature) as 平均温度,"
  9. "AVG(humidity) as 平均湿度,"
  10. "AVG(pressure) as 平均气压,"
  11. "AVG(windSpeed) as 平均风速 "
  12. "FROM weather where city in('广州','深圳','佛山') and time = '2023-6-25 13:00'")
  13. data = sor.fetchall()
  14. print(data)
  15. # 关闭数据库连接
  16. db.close()

运行结果如下:

四. 分别求各个城市过去24小时的温度(temperature)、湿度(humidity)、气压(pressure)、风速(windSpeed)的top10,用matplotlib进行画图,使用展示的图类型为4种

1.先求不同指标的top10,存为csv文件。代码如下:

  1. import pymysql
  2. import csv
  3. db = pymysql.connect(host='localhost', user='root', password='123456', database='bigdata', charset='utf8')
  4. data = {
  5. '温度': 'temperature',
  6. '湿度': 'humidity',
  7. '气压': 'pressure',
  8. '风速': 'windSpeed'
  9. }
  10. for key, value in data.items():
  11. cursor = db.cursor()
  12. cursor.execute(f"SELECT city, {value} FROM weather GROUP BY city ORDER BY {value}+0 DESC LIMIT 10;")
  13. result = cursor.fetchall()
  14. with open(f"top10-{value}.csv", "a+", newline="", encoding='utf-8-sig') as file:
  15. header = ('city', value)
  16. pen = csv.writer(file)
  17. pen.writerow(header)
  18. for i in result:
  19. a = list(i)
  20. pen.writerow(a)
  21. db.close()

csv文件,分别为(如下图):

2.用matplotlib进行画图,使用展示的图类型为4种。(这里我用折线图、柱状图,饼图,散点图)。

  • ** 用各个城市过去24小时的温度的top10,作柱状图,代码如下:**
  1. import pandas as pd
  2. import matplotlib.pyplot as plt
  3. #如遇中文显示问题可加入以下代码
  4. from pylab import mpl
  5. mpl.rcParams['font.sans-serif'] = ['Microsoft YaHei'] # 指定默认字体['SimHei']
  6. mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
  7. #最方便的写法
  8. frame = pd.read_csv('F:/大数据基础实训/top10-temperature.csv', engine='python')
  9. fig, ax = plt.subplots(figsize=(7,4), dpi=100)
  10. x = frame['city']
  11. y = frame['temperature'] #直接拿
  12. # 柱状图 0.5是柱子的大小,edgecolor是柱子周边的颜色
  13. bar = plt.bar(x, y, 0.5,color='skyblue', edgecolor='gray')
  14. # 设置标题,y=1.05表示标题距离图上边框的距离
  15. ax.set_title('各个城市过去24小时温度(temperature)的top10',fontsize=14,y=1.05)
  16. # 设置Y坐标轴标题,字体颜色的深浅值越大颜色越深alpha = 0.4,rotation=300可以调整Y坐标的角度
  17. ax.set_ylabel("温度",fontsize = 10,alpha = 0.4,rotation=360)
  18. ax.yaxis.set_label_coords(-0.02,1.05) #温度的位置
  19. # 设置Y轴区间
  20. ax.set_ylim(25,40)
  21. # 设置X坐标轴标题
  22. ax.set_xlabel("城市",fontsize = 9,color = 'black',alpha = 0.4,rotation=360)
  23. ax.set_xlim(-1,10)
  24. # 显示数据标签
  25. plt.bar_label(bar, label_type='edge')
  26. # 边框隐藏
  27. ax.spines['top'].set_visible(False)
  28. ax.spines['right'].set_visible(False)
  29. # ax.spines['bottom'].set_visible(False)
  30. # ax.spines['left'].set_visible(False)
  31. plt.show()

运行结果如下:

  • 用各个城市过去24小时的湿度的top10,作折线图,代码如下:
  1. import matplotlib.pyplot as plt
  2. import pandas as pd
  3. #如遇中文显示问题可加入以下代码
  4. from pylab import mpl
  5. mpl.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体
  6. mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
  7. frame = pd.read_csv('F:/大数据基础实训/top10-humidity.csv', engine='python')
  8. #准备绘制数据
  9. fig, ax = plt.subplots(figsize=(8,4), dpi=100)
  10. x = frame['city']
  11. y = frame['humidity'] #直接拿
  12. # "g" 表示红色,marksize用来设置'D'菱形的大小
  13. plt.plot(x, y, "g", marker='D', markersize=3, label="湿度")
  14. #绘制坐标轴标签
  15. plt.xlabel("城市")
  16. plt.ylabel("humidity")
  17. plt.title("各个城市过去24小时湿度(humidity)的top10",y=1.02)
  18. # plt.xlim((-1,10))#坐标轴设定
  19. #显示图例
  20. plt.legend(loc="upper right")
  21. #调用 text()在图像上绘制注释文本
  22. #x1、y1表示文本所处坐标位置,ha参数控制水平对齐方式, va控制垂直对齐方式,str(y1)表示要绘制的文本
  23. for x1, y1 in zip(x, y):
  24. plt.text(x1, y1, str(y1), ha='center', va='bottom', fontsize=7)
  25. plt.show()

运行结果如下:

  • 用各个城市过去24小时的气压的top10,作散点图,代码如下:
  1. # coding=utf-8
  2. import pandas as pd
  3. import matplotlib.pyplot as plt
  4. from pylab import mpl
  5. mpl.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体,解决中文乱码
  6. mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
  7. frame = pd.read_csv('F:/大数据基础实训/top10-pressure.csv', engine='python')
  8. fig, ax = plt.subplots(figsize=(9,4), dpi=100)
  9. city = frame['city']
  10. pressure = frame['pressure']
  11. plt.xlabel("城市",fontsize = 12,color = 'black',alpha = 0.4,rotation=360)
  12. plt.ylabel("pressure",fontsize = 12,color = 'black',alpha = 0.5,rotation=360)
  13. ax.yaxis.set_label_coords(-0.02,1.05)
  14. ax.set_ylim(980,1050)
  15. # 设置标题,y=1.05表示标题距离图上边框的距离
  16. ax.set_title('各个城市过去24小时气压(pressure)的top10',fontsize=14,y=1.05)
  17. plt.scatter(city,pressure)
  18. plt.show()

运行结果如下:

  • 用各个城市过去24小时的风速的top10,作饼图,代码如下:
  1. import pandas as pd
  2. import matplotlib.pyplot as plt
  3. from pylab import mpl
  4. mpl.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体
  5. mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
  6. frame = pd.read_csv('F:/大数据基础实训/top10-windSpeed.csv', engine='python')
  7. y = frame['city']
  8. x = frame['windSpeed']
  9. explode = (0.1, 0, 0, 0,0,0,0,0,0,0) #它指定偏移每个楔形的半径的分数
  10. colors = ['r', 'g', 'skyblue', 'c', 'pink', 'yellow', 'aquamarine',"#377eb8","#4daf4a","#984ea3"]
  11. fig,ax1 = plt.subplots() #返回一个包含figure和axes对象的元组,将元组分解为fig和ax两个变量。
  12. #绘制饼状图,labels数据对应标签,autopct用于指定每个扇形块标注文本的样式,比如:定义百分数精度,shadow阴影,startangle起始角度
  13. ax1.pie(x, explode=explode,colors = colors,
  14. labels=y, autopct='% 1.5f %%',
  15. shadow=True, startangle=90)
  16. ax1.axis('equal')#让圆更像圆
  17. ax1.set_title('各个城市过去24小时风速(windSpeed)的top10') #标题
  18. plt.show()

运行结果如下:

五. 利用线性回归模型作图,显示温度和湿度二者之间的关联

我先查看了温度和湿度的相关性,然后再进行的线性回归模型的绘画,代码如下:

  1. import pandas as pd
  2. import seaborn as sns
  3. import matplotlib.pyplot as plt
  4. from pylab import mpl
  5. from sklearn.preprocessing import MinMaxScaler
  6. from sklearn.linear_model import LinearRegression as LR
  7. from sklearn.model_selection import train_test_split
  8. mpl.rcParams['font.sans-serif'] = ['Microsoft YaHei']
  9. mpl.rcParams['axes.unicode_minus'] = False
  10. GDweather = pd.read_csv("F:\大数据基础实训\weather.csv")
  11. # 数据集中不同变量之间的相关性
  12. print(GDweather.corr(numeric_only=True))
  13. # 检查相关性
  14. data_set = GDweather.iloc[:,[8,10]]
  15. print(data_set.corr())
  16. fig, ax = plt.subplots(figsize=(14,4), dpi=100)
  17. ax.set_title('温度和湿度关系图',fontsize=14,y=1.05)
  18. # 绘制温度和湿度的关系图
  19. sns.regplot(x=data_set["temperature"], y=data_set["humidity"],data=data_set)
  20. plt.show()
  21. # 数据预处理
  22. data = GDweather[['temperature', 'humidity']]
  23. # 数据缩放
  24. scaler = MinMaxScaler()
  25. data = scaler.fit_transform(data)
  26. print(data)
  27. #数据集划分为训练集和测试集
  28. x = data[:, 0].reshape(-1, 1)
  29. y = data[:, 1].reshape(-1, 1)
  30. x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.2)
  31. #模型初始化
  32. lr=LR()
  33. #模型训练
  34. lr.fit(x_train,y_train)
  35. # 模型预测
  36. y_train_pred = lr.predict(x_train)
  37. y_test_pred = lr.predict(x_test)
  38. #分别计算误差,确定是否过拟合;评估模型的泛化能力
  39. from sklearn import metrics as ms
  40. train_err = ms.mean_squared_error(y_train,y_train_pred)
  41. test_err = ms.mean_absolute_error(y_test,y_test_pred)
  42. print("训练集均方误差:",train_err)
  43. print("测试集平均绝对误差:",test_err)
  44. # 性能评估 决定系数
  45. predict_score = lr.score(x_test,y_test)
  46. print('得分::{:.2f}'.format(predict_score))
  47. # 绘制关系图
  48. import matplotlib.pyplot as plt
  49. plt.scatter(x_test, y_test)
  50. plt.plot(x_test, y_test_pred, color='red', linewidth=2)
  51. plt.xlabel('temperature')
  52. plt.ylabel('humidity')
  53. plt.title('温度和湿度回归图',fontsize=14,y=1.05)
  54. plt.show()

运行出来的图如下:

​​

6. 加分项:利用地图进行展示

我这里是选择了爬取中国各省市的气候情况,对数据进行预处理后,将其提取各省气温的平均值进行可视化。

全国各省市天气的爬取代码如下:
  1. import urllib.request
  2. import csv
  3. url = "http://www.nmc.cn/f/rest/province" #全国各省的数据
  4. strhtml = urllib.request.urlopen(url)#获取响应结果
  5. data = strhtml.read().decode('utf-8')
  6. data = eval(data)
  7. for i in range(len(data)):#循环爬取全国数据
  8. try: #抛出异常
  9. pro = data[i]
  10. print(pro)
  11. page = pro["code"] # 获取省份编号
  12. # 全国各个省份
  13. url = "http://www.nmc.cn/f/rest/province/" + page # 按照省份编号code循环获取地市数据
  14. strhtml = urllib.request.urlopen(url)
  15. allc = strhtml.read().decode('utf-8')
  16. allc = eval(allc) # 得到全国各省市
  17. city = []
  18. for i in range(len(allc)): # len(allc)表示一个省内市的个数
  19. citys = allc[i] # c 里面是各省市的数据
  20. pages = citys["code"] # 获取城市编号
  21. province = citys["province"] # 获取省份
  22. city = citys["city"] # 获取城市名
  23. url = "http://www.nmc.cn/f/rest/passed/" + pages # 拿到省内具体城市气候数据
  24. strhtml = urllib.request.urlopen(url)
  25. weathers = strhtml.read().decode('utf-8')
  26. weathers = eval(weathers) # 得到全国各省市天气数据
  27. weather = [] # 空数组
  28. for i in range(len(weathers)): # 循环爬取
  29. weath = weathers[i]
  30. code = {"code":pages}
  31. provi = {"province": province}
  32. city1 = {"city": city}
  33. weath.update(code)
  34. weath.update(provi)
  35. weath.update(city1)
  36. weather.append(weath)
  37. # mode='a+'表示在已有数据基础上添加新数据,并不覆盖已有数据
  38. with open("China-Weather.csv", "a+", encoding='utf-8-sig', newline="") as fo:
  39. header = ["code","province", "city", "rain1h", "rain24h", "rain12h", "rain6h",
  40. "temperature", "tempDiff", "humidity", "pressure",
  41. "windDirection", "windSpeed", "time"]
  42. writer = csv.DictWriter(fo, header)
  43. writer.writeheader()
  44. writer.writerows(weather)
  45. fo.close()
  46. print(weather)
  47. except Exception as emmm:
  48. pass
  49. continue

代码中有一个抛出异常值处理,有一些地方爬取数据是会报错,直接跳过。爬取到的数据格式如下:

通过上图,将 数据进行预处理,去除重复的表头,删除不要的列(保留省份,城市,温度),代码如下:

  1. # 处理China-Weather.csv表,去除重复表头
  2. import pandas as pd
  3. frame = pd.read_csv('F:\大数据基础实训\China-Weather.csv', engine='python')
  4. df = frame.drop_duplicates(subset=['code','province','city','rain1h','rain24h',
  5. 'rain12h','rain6h','temperature','tempDiff',
  6. 'humidity','pressure','windDirection',
  7. 'windSpeed','time'], keep=False, inplace=False)
  8. #删除不要的列
  9. df = df.drop(['code','rain1h','rain24h','rain12h','rain6h','tempDiff',
  10. 'humidity','pressure','windDirection',
  11. 'windSpeed','time'], axis = 1) # 按列名称
  12. # 写为China-weather1
  13. df.to_csv('F:\大数据基础实训\China-Weather1.csv',index=False)

处理完的数据如下:

数据可视化,先通过省份来求温度的平均值,最后进行数据可视化,代码如下:

  1. import pandas as pd #pandas是强大的数据处理库
  2. from pyecharts.charts import Map
  3. from pyecharts import options as opts
  4. from pyecharts.globals import ThemeType #引入主题
  5. Map(init_opts=opts.InitOpts(width="1000px", height="600px",theme = ThemeType.DARK)) #添加主题ThemeType.DARK
  6. data = pd.read_csv('F:\大数据基础实训\China-Weather1.csv', encoding='gbk')
  7. # 使用groupby按照省份分组
  8. data = data.groupby('province')
  9. # 计算每个分组temperature平均值,使用unstack()将第一级索引转换为列
  10. mean_temperature = data.temperature.mean()
  11. mean_temperature.to_csv('F:\大数据基础实训\province-temperature.csv', encoding='gbk')
  12. data = pd.read_csv('F:\大数据基础实训\province-temperature.csv', encoding='gbk')
  13. province = list(data["province"])
  14. temperature = list(data["temperature"])
  15. list = [list(z) for z in zip(province,temperature)]
  16. China = (
  17. Map(init_opts=opts.InitOpts(width="1200px", height="800px",theme = ThemeType.DARK)) #添加主题ThemeType.DARK
  18. .set_global_opts(
  19. title_opts=opts.TitleOpts(title="各省平均温度分布图 单位:℃"),
  20. visualmap_opts=opts.VisualMapOpts(
  21. min_=10,
  22. max_=40,
  23. range_text = ['temperature 颜色区间:', ''], #分区间
  24. is_piecewise=True, #定义图例为分段型,默认为连续的图例
  25. pos_top= "middle", #分段位置
  26. pos_left="top left",
  27. orient="vertical",
  28. split_number=10 #分成10个区间
  29. )
  30. )
  31. .add("temperature",list,maptype="china")
  32. .render("temperature.html")
  33. )

可视化结果如下:

​​​​​

数据可视化,先通过全国各城市来求温度的平均值,最后进行数据可视化,代码如下:

  1. import pandas as pd
  2. from pyecharts import options as opts
  3. from pyecharts.charts import Geo
  4. from pyecharts.globals import ChartType
  5. data = pd.read_csv('F:\大数据基础实训\China-Weather.csv', encoding='gbk')
  6. # 使用groupby按照城市分组
  7. data = data.groupby('city')
  8. # 计算每个分组温度平均值,使用unstack()将第一级索引转换为列
  9. mean_temperature = data.temperature.mean()
  10. mean_temperature.to_csv('F:\大数据基础实训\city-temperature.csv', encoding='gbk')
  11. data = pd.read_csv('F:\大数据基础实训\city-temperature.csv', encoding='gbk')
  12. c = (
  13. Geo(is_ignore_nonexistent_coord=True, init_opts=opts.InitOpts(width="1280px", height="800px", theme='dark')) # 图表大小, 主题风格
  14. .add_schema(maptype="china", # 地图
  15. itemstyle_opts=opts.ItemStyleOpts(color="#28527a", # 背景颜色
  16. border_color="#9ba4b4")) # 边框颜色, 可在 https://colorhunt.co/选择颜色
  17. .add(
  18. "", # 系列名称, 可不设置
  19. [(i, j) for i, j in zip(data['city'], data['temperature'])], # 数据
  20. type_=ChartType.EFFECT_SCATTER, # 涟漪散点
  21. effect_opts=opts.EffectOpts(symbol_size=1), # 标记大小
  22. )
  23. .set_series_opts(label_opts=opts.LabelOpts(is_show=False)) # 不显示标签
  24. .set_global_opts(title_opts=opts.TitleOpts(title="全国城市气温", # 图表标题
  25. pos_left='center', # 标题位置
  26. subtitle='更新日期:2023-6-26', # 副标题
  27. subtitle_link='http://tianqi.2345.com/air-rank.html'), # 副标题链接
  28. visualmap_opts=opts.VisualMapOpts(max_=200,
  29. range_text=['temperature', ''], # 上下的名称
  30. split_number=4, # 如果是连续数据, 分成几段
  31. pos_left='5%', # pos_right
  32. pos_top='40%', # pos_bottom
  33. is_piecewise=True, # 是否为分段显示
  34. pieces=[{"min":10 , "max": 11.9, "color": "blue",'label': '温凉'},
  35. {"min":12, "max":13.9, "color": "lightblue",'label': '微温凉'},
  36. {"min":14 , "max":15.9 , "color": "green",'label': '温和'},
  37. {"min": 16, "max": 17.9, "color": "lightgreen",'label': '微温和'},
  38. {"min": 18, "max": 19.9, "color": "yellow",'label': '温和'},
  39. {"min": 20, "max":21.9 , "color": "orange",'label': '暖'},
  40. {"min": 22, "max": 24.9, "color": "darkorange",'label': '热'},
  41. {"min": 25, "max": 27.9, "color": "red",'label': '炎热'},
  42. {"min": 28, "max": 29.9, "color": "crimson",'label': '暑热'},
  43. {"min": 30, "max": 34.9, "color": "purple",'label': '酷热'},
  44. {"min": 35, "max": 39.9, "color": "pink",'label': '奇热'},
  45. {"min": 40, "max": 44.9, "color": "brown",'label': '极热'}
  46. ])))
  47. c.render('F:\大数据基础实训\city_tem.html')

可视化结果如下:

标签: 学习 笔记 big data

本文转载自: https://blog.csdn.net/weixin_64255870/article/details/131259563
版权归原作者 人间过客o>_<o 所有, 如有侵权,请联系我们删除。

“学习笔记-大数据基础实训(python语言+可视化)”的评论:

还没有评论