空气质量分析系统
时间:2022-10-08 04:00:00
空气质量分析系统
2017年京东万象空气质量
这是一个50多米的数据文件,里面有360个csv共300多天的文件
打开kettle清理数据
读取文件夹下的所有内容csv文件
下一步是输入csv文件,记住格式等。,否则以后的计算会出错。这个字段是按顺序来的,不调整顺序,否则就不对了
下一步选择所有字段,可以筛选不必要的字段并调整格式
下一个是按字段排序,这样顺序就不会混乱,没有排序就不能求平均,因为求平均是要靠在一起的
下一步是分组求均,
、
下一步是除前重复的值,应该是求均后所以的值变成平均值
除了平均值,你还可以输出这个。你必须检查一下。否则,它将是一个旧版本,并且非常慢。以下内容将选择您想要导出的字段,也可以修改字段格式
然后输出excel文件长传到数据库
选择文件,调整字段格式
以下是上传到数据库的数据库nactive在里面建一个表格,字段是第一个date选择,然后获得字段,母亲必须执行sql语句,否则表中没有这些列名就无法上传
最后就是用pythcahrm制作软件的具体思路是使用tkinter(听特儿)框架和matplotlib(买炮勒),还有numpy处理数据。首先连接数据库,使用sql语句select * from cxl.tq where date between ‘2017-01-01’ and '2017-01-31\ 读取每月的数据,放入12个列表中,然后通过循环对每个成分进行分类和使用if语句对比,分类后删除不是数字的行和列,要求平均,然后将删除的拼接回来。然后做系统,用tkinter设置各种按钮、选者框和三个窗口aqi排名,和一年的折线图变化,也显示数据,然后设置这些按钮的功能,使用折线图和排名matplotlib,再次处理以前处理过的数据,并将其放入相应的列表以达到显示的目的。数据库是使用的tkintr创建表格中的函数,再将处理的数据放进去。搜索每个城市查看排名和变化折线图还有一年的数据,非常方便。搜索每个城市查看排名和变化折线图还有一年的数据,非常方便。然后美化系统,设置颜色等使其符合2022年的审美。
代码如下
import tkinter as tk#导入tk的包 import tkinter.messagebox#导入图片包 from tkinter import messagebox import pandas as pd import pymysql from matplotlib.figure import Figure import matplotlib.pyplot as plt from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg,NavigationToolbar2Tk from tkinter import * from tkinter.ttk import * from tkinter import ttk import numpy as np plt.rcParams['font.sans-serif']=['SimHei图布字体 def sql():#创建一个sql主要负责连接mysql,处理数据,为画布提供数据 global e2, d1, d2, d3, d4, d6, d7, d8 ,k1,AQI,PM2,PM10,SO2,NO2,CO,O3,SO2,sp1,sp2,sp3,sp,spp,AQI声明这些变量很方便将来调用这些变量 k1=0 #创建这些列表,便将来拼接,然后删除大量拼接 AQI=月份type北京, '天津', 石家庄, '唐山', 秦皇岛, '邯郸', '保定', 张家口, '承德', '廊坊', '沧州', '衡水', '邢台', '太原', 呼和浩特, '沈阳', '大连', '长春', 哈尔滨, '上海', '南京', '苏州', '南通', 连云港, '徐州', '扬州', '无锡', '常州', '镇江', '泰州', '淮安', '盐城', '宿迁', '杭州', '宁波', '温州', '绍兴', '湖州', '嘉兴', '台州', '舟山', '金华', '衢州', '丽水', '合肥', '福州', '厦门', '南昌', '济南', '青岛', '郑州', '武汉', '长沙', '广州', '深圳', '珠海', '佛山', '中山', '江门', '东莞', '惠州', '肇庆', '南宁', '海口', '重庆', '成都', '贵阳', '昆明', '拉萨', '西安', '兰州', '西宁', '银川', 乌鲁木齐, '湘潭', '株洲', '包头', 鄂尔多斯, '营口', '盘锦', '泉州', '莱芜', '临沂', '德州', '聊城', '滨州', '淄博', '枣庄', '烟台', '潍坊', '济宁', '泰安', '日照', '威海', '东营', '韶关', '汕头', '湛江', '茂名', '梅州', '汕尾', '阳江', '清远', '潮州', '云浮', '玉溪', '菏泽', '大同', '长治', '临汾', '阳泉', '赤峰', '鞍山', '抚顺', '本溪', '锦州', '吉林', 齐齐哈尔, 牡丹江, '大庆', '芜湖', 马鞍山, '九江', '洛阳', '安阳', '开封', '焦作', 平顶山, 三门峡, '宜昌', '荆州', '岳阳', '常德', 张家界, '桂林', '北海', '柳州', '三亚', '绵阳', '宜宾', 攀枝花, '泸州', '自贡', '德阳', '南充', '遵义', '曲靖', '咸阳', '铜川', '延安', '宝鸡', '渭南', '金昌', 嘉峪关, 石嘴山, '克拉玛依', 库尔勒, '寿光', '章丘', '即墨', '胶南', '胶州', '莱西', '平度', '蓬莱', '招远', '莱州', '荣成', '文登', '乳山', '吴江', '昆山', '常熟', 张家港, '太仓', '句容', '江阴', '宜兴', '金坛', '溧阳', '海门', '临安', '富阳', '义乌', '诸暨', 瓦房店, '信阳', '周口', '漳州', '晋城', '朔州', '晋中', '运城', '忻州', '吕梁', '乌海', '通辽', 呼伦贝尔, 巴彦淖尔, 乌兰察布, 兴安盟, 锡林郭勒盟, 阿拉善盟, '阜新', '铁岭', '四平', '辽源', '通化', '白山', '松原', '白城', 延边州, '鸡西', '鹤岗', 双鸭山, '伊春', 佳木斯, 七台河, '黑河', '绥化', 大兴安岭地区, '蚌埠', '淮南', '淮北', '铜陵', '安庆', '黄山', '滁州', '阜阳', '宿州', '六安', '亳州', '池州', '宣城', '莆田', '三明', '南平', '龙岩', '宁德', 景德镇, '萍乡', '新余', '鹰潭', '赣州', '吉安', '宜春', '抚州', '上饶', '鹤壁', '新乡', '濮阳', '许昌', '漯河', '南阳', '商丘', 驻马店, '黄石', '十堰', '鄂州', '荆门', '孝感', '黄冈', '咸宁', '随州', 恩施州, '衡阳', '邵阳', '益阳', '郴州', '永州', '怀化', '娄底', 湘西州, '梧州', '防城港', '钦州', '贵港', '玉林', '百色', '贺州', '河池', '来宾', '崇左', '广元', '遂宁', '内江', '乐山', '眉山', '广安', '达州', '雅安', '巴中', '资阳', 阿坝州, 甘孜州, 凉山州, 六盘水, '安顺', 铜仁地区, '毕节', 黔西南州, 黔东南州, 黔南州, '保山', '昭通', '丽江', '临沧', 楚雄州, 红河州, 文山州, 西双版纳州, 大理州, 德宏州, 怒江州, 迪庆州, 昌都地区, 山南地区, 日喀则地区, 那曲地区, 阿里地区, 林芝地区, '汉中', '榆林', '安康', '商洛', '白银', '天水', '武威', '张掖', '平凉', '酒泉', '庆阳', '定西', '陇南', 临夏, 甘南州, 海东地区, 海北州, 黄南州, 海南州, 果洛州, 玉树州, 海西州, '吴忠', '中卫', '固原', 吐鲁番地区, 哈密地区, 昌吉州, '博州', 阿克苏地区, 喀什地区, 和田地区, 伊犁哈萨克州, 塔城地区, '阿勒泰地区', 石河子, 五家渠, '克州', '普洱', '襄阳', '葫芦岛', '河源', '揭阳', '辽阳', '朝阳', '丹东'] sp=[88.87, 82.67, 111.34, 93.43, 68.44, 106.45, 108.38, 61.8, 63.27, 86.73, 84.27, 89.29, 105.07, 101.22, 73.01, 57.54, 65.55, 46.12, 45.8, 56.94, 53.47, 51.64, 53.94, 50.79, 83.2, 61.01, 56.49, 49.51, 73.84, 59.26, 63.68, 57.88, 64.31, 57.14, 48.51, 51.39, 74.73, 71.55, 57.81, 50.85, 49.97, 58.84, 55.38, 49.63, 58.37, 51.14, 46.41, 55.13, 82.57, 69.21, 77.81, 58.64, 59.75, 62.25, 45.86, 43.19, 65.77, 54.37, 64.78, 62.35, 50.63, 65.91, 44.51, 27.59, 42.63, 52.11, 41.43, 40.49, 40.64, 70.93, 71.02, 52.02, 71.04, 69.91, 60.38, 63.38, 72.35, 67.67, 71.58, 65.26, 55.79, 78.92, 70.68, 83.93, 84.18, 87.32, 82.12, 73.61, 68.81, 1.72, 73.42, 73.8, 64.77, 68.57, 81.24, 60.83, 52.61, 36.39, 37.0, 49.01, 43.16, 42.35, 64.77, 53.68, 58.16, 42.23, 84.7, 68.84, 84.63, 87.82, 103.77, 58.05, 57.42, 50.97, 49.19, 65.06, 43.1, 43.8, 44.83, 36.17, 58.1, 63.31, 55.95, 77.01, 89.58, 78.78, 88.91, 72.43, 70.27, 54.73, 58.83, 55.84, 64.46, 50.62, 57.64, 32.8, 53.54, 26.21, 44.56, 54.73, 46.36, 51.86, 64.75, 48.47, 49.13, 39.92, 42.17, 75.88, 64.04, 69.8, 62.39, 72.77, 60.34, 64.33, 79.62, 56.44, 100.0, 77.64, 81.85, 66.0, 72.31, 70.08, 69.22, 72.99, 73.3, 63.95, 65.54, 63.17, 63.51, 53.78, 57.15, 57.62, 57.8, 59.7, 57.5, 67.17, 61.04, 61.21, 52.98, 52.15, 45.21, 61.36, 56.62, 52.61, 8.37, 60.92, 58.85, 63.76, 63.22, 97.05, 82.07, 91.04, 77.46, 83.36, 78.17, 84.06, 50.45, 33.27, 71.97, 61.92, 34.73, 47.7, 67.96, 63.7, 55.29, 54.02, 44.14, 47.6, 53.89, 42.14, 41.73, 34.78, 44.9, 37.23, 35.98, 25.3, 34.11, 46.98, 32.19, 36.95, 28.74, 60.85, 68.52, 72.87, 61.52, 56.0, 38.26, 63.49, 62.59, 67.47, 55.53, 69.12, 61.26, 53.53, 55.83, 46.07, 44.7, 47.13, 46.79, 49.06, 63.46, 65.41, 49.25, 62.64, 66.38, 69.85, 53.82, 61.54, 82.54, 81.72, 76.43, 70.31, 65.58, 61.17, 72.74, 62.6, 63.7, 44.72, 56.63, 62.99, 48.51, 60.17, 59.37, 48.03, 43.87, 61.46, 67.96, 54.93, 84.69, 57.04, 58.87, 59.29, 47.73, 57.23, 39.39, 41.54, 58.0, 53.53, 49.98, 60.6, 46.0, 52.65, 42.08, 32.48, 46.7, 41.81, 44.17, 47.06, 38.45, 42.59, 47.99, 31.11, 47.95, 21.7, 41.84, 31.92, 51.54, 42.09, 50.18, 54.31, 28.35, 39.02, 41.82, 31.58, 49.09, 29.05, 28.59, 31.6, 37.87, 34.31, 29.87, 32.89, 35.6, 32.98, 33.58, 0.0, 0.0, 0.0, 62.28, 58.55, 0.0, 45.2, 67.47, 38.38, 43.28, 67.47, 46.51, 63.66, 51.01, 59.43, 72.61, 59.44, 55.25, 35.81, 43.09, 41.93, 57.58, 48.26, 37.25, 39.01, 47.25, 36.7, 49.35, 72.0, 66.94, 63.85, 101.74, 69.96, 54.5, 61.25, 108.34, 145.17, 184.41, 74.41, 46.91, 34.32, 59.43, 65.95, 112.0, 25.6, 65.53, 68.04, 47.03, 55.24, 58.62, 71.58, 46.9]
spp=['北京', '天津', '石家庄', '唐山', '秦皇岛', '邯郸', '保定', '张家口', '承德', '廊坊', '沧州', '衡水', '邢台', '太原', '呼和浩特', '沈阳', '大连', '长春', '哈尔滨', '上海', '南京', '苏州', '南通', '连云港', '徐州', '扬州', '无锡', '常州', '镇江', '泰州', '淮安', '盐城', '宿迁', '杭州', '宁波', '温州', '绍兴', '湖州', '嘉兴', '台州', '舟山', '金华', '衢州', '丽水', '合肥', '福州', '厦门', '南昌', '济南', '青岛', '郑州', '武汉', '长沙', '广州', '深圳', '珠海', '佛山', '中山', '江门', '东莞', '惠州', '肇庆', '南宁', '海口', '重庆', '成都', '贵阳', '昆明', '拉萨', '西安', '兰州', '西宁', '银川', '乌鲁木齐', '湘潭', '株洲', '包头', '鄂尔多斯', '营口', '盘锦', '泉州', '莱芜', '临沂', '德州', '聊城', '滨州', '淄博', '枣庄', '烟台', '潍坊', '济宁', '泰安', '日照', '威海', '东营', '韶关', '汕头', '湛江', '茂名', '梅州', '汕尾', '阳江', '清远', '潮州', '云浮', '玉溪', '菏泽', '大同', '长治', '临汾', '阳泉', '赤峰', '鞍山', '抚顺', '本溪', '锦州', '吉林', '齐齐哈尔', '牡丹江', '大庆', '芜湖', '马鞍山', '九江', '洛阳', '安阳', '开封', '焦作', '平顶山', '三门峡', '宜昌', '荆州', '岳阳', '常德', '张家界', '桂林', '北海', '柳州', '三亚', '绵阳', '宜宾', '攀枝花', '泸州', '自贡', '德阳', '南充', '遵义', '曲靖', '咸阳', '铜川', '延安', '宝鸡', '渭南', '金昌', '嘉峪关', '石嘴山', '克拉玛依', '库尔勒', '寿光', '章丘', '即墨', '胶南', '胶州', '莱西', '平度', '蓬莱', '招远', '莱州', '荣成', '文登', '乳山', '吴江', '昆山', '常熟', '张家港', '太仓', '句容', '江阴', '宜兴', '金坛', '溧阳', '海门', '临安', '富阳', '义乌', '诸暨', '瓦房店', '信阳', '周口', '漳州', '晋城', '朔州', '晋中', '运城', '忻州', '吕梁', '乌海', '通辽', '呼伦贝尔', '巴彦淖尔', '乌兰察布', '兴安盟', '锡林郭勒盟', '阿拉善盟', '阜新', '铁岭', '四平', '辽源', '通化', '白山', '松原', '白城', '延边州', '鸡西', '鹤岗', '双鸭山', '伊春', '佳木斯', '七台河', '黑河', '绥化', '大兴安岭地区', '蚌埠', '淮南', '淮北', '铜陵', '安庆', '黄山', '滁州', '阜阳', '宿州', '六安', '亳州', '池州', '宣城', '莆田', '三明', '南平', '龙岩', '宁德', '景德镇', '萍乡', '新余', '鹰潭', '赣州', '吉安', '宜春', '抚州', '上饶', '鹤壁', '新乡', '濮阳', '许昌', '漯河', '南阳', '商丘', '驻马店', '黄石', '十堰', '鄂州', '荆门', '孝感', '黄冈', '咸宁', '随州', '恩施州', '衡阳', '邵阳', '益阳', '郴州', '永州', '怀化', '娄底', '湘西州', '梧州', '防城港', '钦州', '贵港', '玉林', '百色', '贺州', '河池', '来宾', '崇左', '广元', '遂宁', '内江', '乐山', '眉山', '广安', '达州', '雅安', '巴中', '资阳', '阿坝州', '甘孜州', '凉山州', '六盘水', '安顺', '铜仁地区', '毕节', '黔西南州', '黔东南州', '黔南州', '保山', '昭通', '丽江', '临沧', '楚雄州', '红河州', '文山州', '西双版纳州', '大理州', '德宏州', '怒江州', '迪庆州', '昌都地区', '山南地区', '日喀则地区', '那曲地区', '阿里地区', '林芝地区', '汉中', '榆林', '安康', '商洛', '白银', '天水', '武威', '张掖', '平凉', '酒泉', '庆阳', '定西', '陇南', '临夏州', '甘南州', '海东地区', '海北州', '黄南州', '海南州', '果洛州', '玉树州', '海西州', '吴忠', '中卫', '固原', '吐鲁番地区', '哈密地区', '昌吉州', '博州', '阿克苏地区', '喀什地区', '和田地区', '伊犁哈萨克州', '塔城地区', '阿勒泰地区', '石河子', '五家渠', '克州', '普洱', '襄阳', '葫芦岛', '河源', '揭阳', '辽阳', '朝阳', '丹东']
AQI1=AQI
PM2=AQI
PM10=AQI
SO2=AQI
NO2=AQI
CO=AQI
O3=AQI
conn=pymysql.Connect(host='localhost',#连接数据库
password='123456',
user='root',
database='cxl',
port=3306,
charset='utf8mb4')
df1 = pd.read_sql('select * from cxl.tq where date between \'2017-01-01\' and \'2017-01-31\' ',con=conn)#读取数据库里某月的值,分变放到各个dataframe里
df2 = pd.read_sql('select * from cxl.tq where date between \'2017-02-01\' and \'2017-02-28\' ', con=conn)
df3 = pd.read_sql('select * from cxl.tq where date between \'2017-03-01\' and \'2017-03-31\' ', con=conn)
df4 = pd.read_sql('select * from cxl.tq where date between \'2017-04-01\' and \'2017-04-30\' ', con=conn)
df5 = pd.read_sql('select * from cxl.tq where date between \'2017-05-01\' and \'2017-05-31\' ', con=conn)
df6 = pd.read_sql('select * from cxl.tq where date between \'2017-06-01\' and \'2017-06-30\' ', con=conn)
df7 = pd.read_sql('select * from cxl.tq where date between \'2017-07-01\' and \'2017-07-31\' ', con=conn)
df8 = pd.read_sql('select * from cxl.tq where date between \'2017-08-01\' and \'2017-08-31\' ', con=conn)
df9 = pd.read_sql('select * from cxl.tq where date between \'2017-09-01\' and \'2017-09-30\' ', con=conn)
df10 = pd.read_sql('select * from cxl.tq where date between \'2017-10-01\' and \'2017-10-31\' ', con=conn)
df11 = pd.read_sql('select * from cxl.tq where date between \'2017-11-01\' and \'2017-11-25\' ', con=conn)
s1 = np.array(df1)#将dataframe转为列表
s2 = np.array(df2)
s3 = np.array(df3)
s4 = np.array(df4)
s5 = np.array(df5)
s6 = np.array(df6)
s7 = np.array(df7)
s8 = np.array(df8)
s9 = np.array(df9)
s10 = np.array(df10)
s11 = np.array(df11)
# print(s1)
list1=[s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11]#把这些列表一起放在新的列表里
for i1 in list1:#循环读取这些列表,达到处理每个月的目的
sc1, sc2, sc3, sc4, sc5, sc6, sc7 = s1[0], s1[0], s1[0], s1[0], s1[0], s1[0], s1[0]
for i2 in i1:#再套用一个循环处理每天的
sh = i2[1] # AQI等,赋值给sh,和字段做对比,如果相等就与sc列表按行拼接,就放在第二行
if "AQI" == sh:
sc1 = np.vstack((sc1, i2))#按行拼接,1的化的就是按列拼接
if "PM2.5_24h" == sh:
sc2 = np.vstack((sc2, i2))
if "PM10_24h" == sh:
sc3 = np.vstack((sc3, i2))
if "SO2_24h" == sh:
sc4 = np.vstack((sc4, i2))
if "NO2_24h" == sh:
sc5 = np.vstack((sc5, i2))
if "CO_24h" == sh:
sc6 = np.vstack((sc6, i2))
if "O3_24h" == sh:
sc7 = np.vstack((sc7, i2))
# print(sc1)
sc1 = np.delete(sc1, 0, axis=0) # 删掉第一行
sc1 = np.delete(sc1, 0, axis=1) # 把这些多余的列行删掉,方便求每月的平均值
sc1 = np.delete(sc1, 0, axis=1)
sc1[pd.isna(sc1)] = 0#填缺空值
sc1 = np.mean(sc1, axis=0)#按列求均
sc2 = np.delete(sc2, 0, axis=0) # 删掉第一行
sc2 = np.delete(sc2, 0, axis=1)
sc2 = np.delete(sc2, 0, axis=1)
sc2[pd.isna(sc2)] = 0
sc2 = np.mean(sc2, axis=0)
sc3 = np.delete(sc3, 0, axis=0) # 删掉第一行
sc3 = np.delete(sc3, 0, axis=1)
sc3 = np.delete(sc3, 0, axis=1)
sc3[pd.isna(sc3)] = 0
sc3 = np.mean(sc3, axis=0)
sc4 = np.delete(sc4, 0, axis=0) # 删掉第一行
sc4 = np.delete(sc4, 0, axis=1)
sc4 = np.delete(sc4, 0, axis=1)
sc4[pd.isna(sc4)] = 0
sc4 = np.mean(sc4, axis=0)
sc5 = np.delete(sc5, 0, axis=0) # 删掉第一行
sc5 = np.delete(sc5, 0, axis=1)
sc5 = np.delete(sc5, 0, axis=1)
sc5[pd.isna(sc5)] = 0
sc5 = np.mean(sc5, axis=0)
sc6 = np.delete(sc6, 0, axis=0) # 删掉第一行
sc6 = np.delete(sc6, 0, axis=1)
sc6 = np.delete(sc6, 0, axis=1)
sc6[pd.isna(sc6)] = 0
sc6 = np.mean(sc6, axis=0)
sc7 = np.delete(sc7, 0, axis=0) # 删掉第一行
sc7 = np.delete(sc7, 0, axis=1)
sc7 = np.delete(sc7, 0, axis=1)
sc7[pd.isna(sc7)] = 0
sc7 = np.mean(sc7, axis=0)
#
sc1 = [round(x, 2) for x in sc1]#求均后保留2位小数
sp= np.vstack((sp, sc1))#获取AQI每个月的数据,用来计算,年平均值
sc2 = [round(x, 2) for x in sc2]
sc3 = [round(x, 2) for x in sc3]
sc4 = [round(x, 2) for x in sc4]
sc5 = [round(x, 2) for x in sc5]
sc6 = [round(x, 2) for x in sc6]
sc7 = [round(x, 2) for x in sc7]
k1=k1+1#这里赋值一个k1用来循环,得到1,2,3......
k1=str(k1)#把数组1改为字符串用来拼接月份
sy1='月'
sy1=list(sy1)
sy1.insert(0,k1)#把月份插入列表”月“里
sy1=''.join(sy1)#将1和月连接起来,组成一个新的字符串
k1=int(k1)
sc1.insert(0,'AQI')#不能用等式,否则输出为空,把AQI插在之前求的平均值的前面,之前不是删了嘛,重新加上去
sc2.insert( 0, 'PM2.5_24h')
sc3.insert( 0, 'PM10_24h')
sc4.insert( 0, 'SO2_24h')
sc5.insert( 0, 'NO2_24h')
sc6.insert( 0, 'CO_24h')
sc7.insert( 0, 'O3_24h')
sc1.insert(0, sy1)#把月份插在AQI的前面
sc2.insert(0, sy1)
sc3.insert(0, sy1)
sc4.insert(0, sy1)
sc5.insert(0, sy1)
sc6.insert(0, sy1)
sc7.insert(0, sy1)
AQI = np.vstack((AQI,sc1))#再把这些已经插好的月份和aqi的值按行拼接起来
PM2 = np.vstack((PM2, sc2))
PM10 = np.vstack((PM10, sc3))
SO2 = np.vstack((SO2, sc4))
NO2 = np.vstack((NO2, sc5))
CO = np.vstack((CO, sc6))
O3 = np.vstack((O3, sc7))
sp=np.delete(sp, 0, axis=0) # 删掉第一行
sp = np.mean(sp, axis=0)#求年平均值
sp = [round(x, 2) for x in sp]
sp1= np.argsort(sp)#获取排序后的索引,0小到大
sp2=sp1[0:10]#小到大,空气质量好
sp3=sp1[-10:]#把这个列表倒过来输出
sp3=sp3[::-1]#大到小,空气质量差
# sp=np.vstack((sp1,sp))
# sp= np.argsort(sp["value"]) # 从大到小排序,获取排序后的索引
def mpm():#MPM函数是用来处理排名的,处理最好,跟下面那个函数差不多
global canvas1
try:
canvas1.get_tk_widget().destroy()#try,expect,finally 函数的意思就是如果不报错就执行这行,这行是用来摧毁画布的,方便以后生成一个新的画布
except:
pass
finally:
# print(sp2)
# print(sp3)
datax = [spp[316], spp[63], spp[220], spp[300], spp[315], spp[317], spp[137], spp[293], spp[320], spp[184]]#之前不是获取最大的排名的索引嘛,还有最小的,那就把这些用上了,作为x轴和轴
datay = [sp[316], sp[63], sp[220], sp[300], sp[315], sp[317], sp[137], sp[293], sp[320], sp[184]]
colors = ["r", "b", "y", "c", "g", "m", "pink", "purple", "gray", "orange"]#设置排名的颜色
fig = Figure(figsize=(3, 4), facecolor='White', edgecolor='White', frameon=True) # WhiteSmoke,Figure(figsize(尺寸), facecolor=背景颜色, edgecolor=边框颜射, frameon=True)
a = fig.add_subplot(111) # 添加子图:1行1列第1个
a.barh(datax, datay, height=0.5, color=colors) # bar竖着
a.set(title='空气质量排名前十')
canvas1 = FigureCanvasTkAgg(fig, master=leftFrame)#不知道是干嘛的,应该是和tkinter交互的代码
canvas1.draw()
canvas1.get_tk_widget().pack(side=tk.TOP, padx=10, pady=0, # 上对齐
fill=tk.X, # 填充方式
expand=tk.NO) # 随窗口大小调整而调整
def mpm1():#最差的
global canvas1
try:
canvas1.get_tk_widget().destroy()
except:
pass
finally:
# print(sp2)
# print(sp3)
datax = [spp[109], spp[124], spp[12], spp[2], spp[6], spp[358], spp[5], spp[350], spp[351], spp[352]]
datay = [sp[109], sp[124], sp[12], sp[2], sp[6], sp[358], sp[5], sp[350], sp[351], sp[352]]
colors = ["r", "b", "y", "c", "g", "m", "pink", "purple", "gray", "orange"]
fig = Figure(figsize=(3, 4), facecolor='White', edgecolor='black', frameon=True) # WhiteSmoke
a = fig.add_subplot(111) # 添加子图:1行1列第1个
a.barh(datax, datay, height=0.5, color=colors) # bar竖着
a.set(title='空气质量排名前十')
canvas1 = FigureCanvasTkAgg(fig, master=leftFrame)
canvas1.draw()
canvas1.get_tk_widget().pack(side=tk.TOP, padx=10, pady=0, # 上对齐
fill=tk.X, # 填充方式
expand=tk.NO) # 随窗口大小调整而调整
def mat():#显示折线图的函数
global m3
m3=0#用于后 if语句判断的变量
Button2 = ttk.Button(a1,text='显示',command=lambda:m1(),width=4,style='success.Outline.TButton')#弄一个按钮(目标tkinter,text=按钮上的文字,command,按钮命令,width=根据窗口设置宽度,style=安装了主题的就用,没安装的不要这句)
Button2.pack()
Button2.place(x=930, y=15)#设置x,y的位置
try:
canvas.get_tk_widget().destroy()
except:
pass
finally:
def m1():
global m3,canvas
print(m3)
m3 = m3 + 1
if m3 % 2 == 0:#用这个if实现点击一下显示没有文字的画布,再点一下就显示有文字的画布
canvas.get_tk_widget().destroy()
m2()
return
canvas.get_tk_widget().destroy()
data1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
data = elist
fig = Figure(figsize=(3, 4), facecolor='White', edgecolor='black', frameon=True) # WhiteSmoke
a = fig.add_subplot(211) # 添加子图:2行1列第1个,就是分成2个上下2个,画布在上面那个
a.plot(data1, data) #添加折线图,(x轴的数据,y轴的数据)
for i, n in zip(data1, data):
a.text(i, n, str(n))#给每个点添加文字
a.set(xlim=[1, 11], title='2017年空气质量分析图')#xlim表示x轴重1开始,后面的是这个画布的标题
a.set_xlabel('月份')#设置x轴的标签
a.xaxis.set_ticks(np.arange(1, 12, 1)) # 设置为11个月,步长为1
canvas = FigureCanvasTkAgg(fig, master=rightFrame)
canvas.draw()
canvas.get_tk_widget().pack(side=tk.TOP, padx=10, pady=0, # 上对齐
fill=tk.X, # 填充方式
expand=tk.NO) # 随窗口大小调整而调整
def m2():#没有文字的折线图
global canvas
data1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
data = elist
fig = Figure(figsize=(3, 4), facecolor='White', edgecolor='black', frameon=True) # WhiteSmoke
a = fig.add_subplot(211) # 添加子图:1行1列第1个
a.plot(data1, data) #
a.set(xlim=[1, 11], title='2017年空气质量分析图')
a.set_xlabel('月份')
a.xaxis.set_ticks(np.arange(1, 12, 1)) # 设置为11个月
canvas = FigureCanvasTkAgg(fig, master=rightFrame)
canvas.draw()
canvas.get_tk_widget().pack(side=tk.TOP, padx=10, pady=0, # 上对齐
fill=tk.X, # 填充方式
expand=tk.NO) # 随窗口大小调整而调整
m2()
print("sb")
def d():#一个函数,弹出一个警告窗口,在菜单关于会用上
messagebox.showinfo("关于", "本产品广西科技师范学院大数据193班陈新林制作\n仅供学术交流未经,允许不得进行商业行为")
def e():#用来创建选者框的函数,比如选者省份,还以查询按扭
global e1,e2,e3
# xVariable = tkinter.StringVar()
label1 = Label(a1, text="————城市变化图————")
label1.place(x=200, y=10)#创建文字的位置
label1=Label(a1, text="省份")
label1.place(x=10,y=50)
label1=Label(a1, text="城市")
label1.place(x=120,y=50)
label1=Label(a1, text="参数")
label1.place(x=230,y=50)
com = ttk.Combobox(a1,width=4)#创建一个选者框
com.pack()
com.place(x=50,y=50)
com["value"] = ('北京','广东','山东', '江苏','河南','上海','河北','浙江','陕西','湖南','重庆','福建','天津','云南','四川','广西',
'安徽','海南','江西','湖北','山西','辽宁','黑龙江','内蒙古','贵州','甘肃','青海','新疆','西藏','吉林','宁夏')#选者框可选者的内容
com.current()# #设定下拉菜单的默认值为第3个,即山东
def xFunc(event):#函数,用来获取选者框的内容
global e1
e1=com.get()#获取省份的值
print(e1) # #获取选中的值方法1
ecom1()#执行这两个函数,达到把后面两个选者框的,清空的目的,就把一个新的覆盖上去
ecom2()
fun1(event)#当年选者省份的时候,就为后面的按钮赋值了,不然要点一下才能赋值
com.bind("<>", xFunc) # #给下拉菜单绑定事件
def fun1(event):#用你你获取的省份,来为下一个选者框赋值
if e1=="北京":
com1["value"] = ('北京')
if e1=="广东":
com1["value"] = ('广州','深圳','珠海','佛山','中山','江门', '东莞','惠州','肇庆','韶关','汕头','湛江','茂名','梅州','汕尾','阳江','清远','潮州','云浮','河源','揭阳')
if e1=="山东":
com1["value"] = ('济南','青岛', '莱芜','临沂','德州','聊城','滨州', '淄博', '枣庄','烟台', '潍坊','济宁','泰安', '日照', '威海','东营','菏泽','寿光', '章丘','即墨','胶南','胶州','莱西','平度','蓬莱','招远','莱州','荣成', '文登','乳山',)
if e1=="江苏":
com1["value"] = ('南京', '苏州','南通','连云港','徐州', '扬州','无锡','常州','镇江','泰州','淮安','盐城','宿迁','吴江','昆山','常熟','张家港','太仓','句容','江阴', '宜兴','金坛', '溧阳','海门',)
if e1=="河南":
com1["value"] = ('郑州','洛阳','安阳''开封', '焦作','平顶山','三门峡','信阳','周口','鹤壁','新乡','濮阳','许昌','漯河','南阳', '商丘','驻马店',)
if e1=="上海":
com1["value"] = ('上海')
if e1=="河北":
com1["value"] = ('石家庄', '唐山', '秦皇岛','邯郸','保定', '张家口', '承德', '廊坊','沧州','衡水','邢台',)
if e1=="浙江":
com1["value"] = ('杭州', '宁波', '温州', '绍兴', '湖州','嘉兴','台州','舟山','金华','衢州','丽水','临安','富阳','义乌','诸暨', )
if e1=="陕西":
com1["value"] = ('西安', '咸阳','铜川', '延安','宝鸡','渭南','汉中','榆林','安康','商洛', )
if e1=="湖南":
com1["value"] = ('长沙','湘潭','株洲', '岳阳','常德','张家界','衡阳', '邵阳', '益阳','郴州', '永州','怀化', '娄底', '湘西州', )
if e1=="重庆":
com1["value"] = ('重庆',)
if e1=="福建":
com1["value"] = ( '福州', '厦门', '泉州','漳州','莆田','三明', '南平', '龙岩', '宁德',)
if e1=="天津":
com1["value"] = ( '天津', )
if e1=="云南":
com1["value"] = ('昆明','玉溪','曲靖','保山','昭通','丽江','临沧', '楚雄州', '红河州', '文山州','西双版纳州','大理州','德宏州','怒江州','迪庆州','普洱',)
if e1=="四川":
com1["value"] = ( '成都','绵阳','宜宾', '攀枝花','泸州', '自贡', '德阳','南充', '广元','遂宁', '内江', '乐山', '眉山', '广安', '达州', '雅安','巴中','资阳', '阿坝州', '甘孜州','凉山州',)
if e1=="广西":
com1["value"] = ('南宁', '桂林', '北海','柳州','梧州','防城港', '钦州','贵港','玉林', '百色', '贺州', '河池', '来宾', '崇左', )
if e1=="安徽":
com1["value"] = ('合肥','芜湖', '马鞍山', '蚌埠','淮南','淮北', '铜陵', '安庆', '黄山', '滁州','阜阳','宿州', '六安', '亳州', '池州', '宣城', )
if e1=="海南":
com1["value"] = ('海口','三亚', )
if e1=="江西":
com1["value"] = ('南昌', '九江', '景德镇', '萍乡', '新余', '鹰潭','赣州', '吉安' ,'宜春','抚州', '上饶', )
if e1=="湖北":
com1["value"] = ( '武汉','宜昌', '荆州','黄石', '十堰', '鄂州', '荆门','孝感', '黄冈','咸宁','随州','恩施州','襄阳', )
if e1=="山西":
com1["value"] = ( '太原', '大同', '长治', '临汾','阳泉','晋城','朔州','晋中','运城','忻州','吕梁',)
if e1=="辽宁":
com1["value"] = ('沈阳','大连', '营口', '盘锦', '鞍山','抚顺','本溪', '锦州','瓦房店','阜新', '铁岭', '葫芦岛', '辽阳','朝阳', '丹东', )
if e1=="黑龙江":
com1["value"] = ('哈尔滨','齐齐哈尔','牡丹江','大庆')
if e1=="内蒙古":
com1["value"] = ('呼和浩特','包头', '鄂尔多斯', '赤峰', '乌海','通辽','呼伦贝尔', '巴彦淖尔','乌兰察布', '兴安盟','锡林郭勒盟', '阿拉善盟', )
if e1=="贵州":
com1["value"] = ('贵阳','遵义','六盘水','安顺', '铜仁地区','毕节','黔西南州', '黔东南州', '黔南州',)
if e1=="甘肃":
com1["value"] = ('兰州','金昌', '嘉峪关','白银', '天水','武威','张掖','平凉','酒泉','庆阳','定西', '陇南','临夏州', '甘南州', )
if e1=="青海":
com1["value"] = ('海西州', '海东地区', '海北州', '果洛州', '玉树州', '西宁','海南州','黄南州')
if e1=="新疆":
com1["value"] = ('乌鲁木齐','克拉玛依', '库尔勒', '吐鲁番地区', '哈密地区','昌吉州','博州', '阿克苏地区', '喀什地区','和田地区', '伊犁哈萨克州', '塔城地区', '阿勒泰地区','石河子', '五家渠','克州',)
if e1=="西藏":
com1["value"] = ('拉萨','昌都地区', '山南地区', '日喀则地区', '那曲地区', '阿里地区', '林芝地区')
if e1=="吉林":
com1["value"] = ('长春', '吉林','四平', '辽源', '通化', '白山', '松原', '白城','延边州',)
if e1=="宁夏":
com1["value"] = ( '银川','石嘴山','吴忠','中卫', '固原',)
def ecom1():#下一个选择框
global com1
com1 = ttk.Combobox(a1, width=4)
com1.pack()
com1.place(x=160, y=50)
com1.current() # #设定下拉菜单的默认值为第3个,即山东
def fun2(event1):#同样为下个选者框赋值
global e2
e2 = com1.get() # 获取城市的值
print(e2) # #获取选中的值方法1
ecom2()
com1.bind("<>", fun2)#点击选者框触发的事件
def ecom2():#第三个按钮的值
com2 = ttk.Combobox(a1, width=4)
com2.pack()
com2.place(x=270, y=50)
com2["value"] = ('AQI', 'CO', 'NO2', 'O3', 'PM10', 'PM2.5', 'SO2')
com2.current()
def fun3(event2):#当选者第三个选者框的时候,就开始处理数据了
global elist
e3 = com2.get()#获取第三个选者框的值
if e3 == 'AQI':
ei = 0#用来循环的变量
en = 11
elist = []#空列表用来插入值
for i in AQI[0]:
if i == e2:
while en >= 1:
elist.insert(0, AQI[en][ei])#为空列表插入数据,如果桂林=桂林那么就循环把桂林的aqi的值赋给空列表,为折线图提供数据
en = en - 1
ei = ei + 1
if e3 == 'CO':
ei = 0
en = 11
elist = []
for i in CO[0]:
if i == e2:
while en >= 1:
elist.insert(0, CO[en][ei])
en = en - 1
ei = ei + 1
if e3 == 'NO2':
ei = 0
en = 11
elist = []
for i in NO2[0]:
if i == e2:
while en >= 1:
elist.insert(0, NO2[en][ei])
en = en - 1
ei = ei + 1
if e3 == 'PM10':
ei = 0
en = 11
elist = []
for i in PM10[0]:
if i == e2:
while en >= 1:
elist.insert(0, PM10[en][ei])
en = en - 1
ei = ei + 1
if e3 == 'PM2.5':
ei = 0
en = 11
elist = []
for i in PM2[0]:
if i == e2:
while en >= 1:
elist.insert(0, PM2[en][ei])
en = en - 1
ei = ei + 1
if e3 == 'SO2':
ei = 0
en = 11
elist = []
for i in SO2[0]:
if i == e2:
while en >= 1:
print(SO2[en][ei])
elist.insert(0, SO2[en][ei])
en = en - 1
ei = ei + 1
elist = [float(x) for x in elist] # 将数字字符转为int型,因为插入的是字符类型的
print(e3)
com2.bind("<>", fun3)
ecom1()
ecom2()
Button1 = Button(a1, text="查询", command=lambda:mat(), width=5)
Button1.pack()
Button1.place(x=380, y=50)
Button1 = Button(a1, text="最好", command=lambda:mpm(), width=4,style='danger')#按钮,标题,执行命令,宽度,主题风格
Button1.pack()
Button1.place(x=10, y=200)
Button1 = Button(a1, text="最差", command=lambda:mpm1(), width=4,style='success')
Button1.pack()
Button1.place(x=80, y=200)
def sj():
global sj3
entry1 = tkinter.Entry(a1) # 创建输入框,可以输入你的城市
entry1.pack()
entry1.place(x=270, y=150,width=60,height=31)
def sjj():#处理数据的函数,用来查询数据的
global sj3
sj1=entry1.get()#获取输入框的内容
j1=0
for i in AQI1:
if sj1==i:#如果输入的城市等于i那么就把这一列提取出来,提取后会变成一行列表
print(AQI)
SS1=AQI[:,j1]
SS2=PM2[:,j1]
SS3=PM10[:,j1]
SS4=SO2[:,j1]
SS5=NO2[:,j1]
SS6=CO[:,j1]
SS7=O3[:,j1]
print(SS7)
sj3 = np.vstack((SS1, SS2))#把这些列表拼接,就能得到一座城市每月的所有数据
sj3 = np.vstack((sj3, SS3))
sj3 = np.vstack((sj3, SS4))
sj3 = np.vstack((sj3, SS4))
sj3 = np.vstack((sj3, SS5))
sj3 = np.vstack((sj3, SS6))
sj3 = np.vstack((sj3, SS7))
sy1=['月份','一月','二月','三月','四月','五月','六月','七月','八月','九月','十月','十一月']
sj3= sj3 = np.vstack((sy1, sj3))#再在起前面拼接月份
# print(sj3)
sj3=sj3.T#把列表倒置,横的变竖的
sj3 = np.delete(sj3, 0, axis=0) # 删掉第一行
sj3=[tuple(x)for x in sj3.tolist()]#将数组变成元组,显示的值才不会有分号
try:
for row in tree.get_children():#如果表格里面有值,就清空所有的值
tree.delete(row)
except:
pass
finally:
for i in range(11):
tree.insert('', 'end', values=sj3[i])#用循环插入12行数据
print(sj3)
j1=j1+1
label1 = Label(a1, text="————数据查询————")
label1.place(x=200, y=115)
label1 = Label(a1, text="AQI指数")
label1.place(x=0, y=125)
label1 = Label(a1, text="一级优 0-50\n"#弄一些文字
"二级良 51-100\n"
"三级轻度污染 101-150\n"
"四级中度污染 151-200\n"
"五级重度污染 201-300")
label1.place(x=60, y=95)
label1 = Label(a1, text="————城市数据————")
label1.place(x=655, y=260)
label2=Label(a1, text="搜索城市")
label2.place(x=210,y=150)
tree = ttk.Treeview(a1,show='headings', height=13)#show=消除前面的空值,创建一个表格,设置高度
tree['column'] = ('月份','AQI', 'PM2.5', 'PM10', 'SO2', 'NO2', 'CO', 'O3')
tree.column('月份', width=62)#设置列名
tree.column('AQI', width=62)
tree.column('PM2.5', width=62)
tree.column('PM10', width=62)
tree.column('SO2', width=62)
tree.column('NO2', width=62)
tree.column('CO', width=62)
tree.column('O3', width=62)
tree.heading('月份', text='月份')
tree.heading('AQI', text='AQI')
tree.heading('PM2.5', text='PM2.5')
tree.heading('PM10', text='PM10')
tree.heading('SO2', text='SO2')
tree.heading('NO2', text='NO2')
tree.heading('CO', text='CO')
tree.heading('O3', text='O3')
tree.grid(row=8, column=0, columnspan=10)#有多少列
tree.place(x=490, y=300)
Button2 = Button(a1, text="月查询", command=lambda:sjj(), width=5)
Button2.pack()
Button2.place(x=380, y=150)
def a():
global style,a1,panedWindow,menuBar,item,rightFrame,leftFrame
from ttkbootstrap import Style#这句导包一定要在下一句话的前面
style = Style()
"osmo - flatly - journal - literal - lumen - minty - pulse - sandstone - united - yeti(浅色主题)cyborg - darkly - solar - superhero(深色主题)"
style = Style(theme='lumen')
a1 = style.master
# a1=tkinter.Tk()
a1.geometry('1000x600+300+150')
a1.iconphoto(False, tk.PhotoImage(file=r'D:\城市空气质量检测\带土.png')) # 将png转为ico然后修改窗口图片,jpg的报错需要先转换,false只在这次窗口有效
a1.title("2017空气质量分析") # 给主窗口弄一个标题
a1.resizable(0, 0) # 设置窗口大小不可变
leftFrame = tk.Frame(a1, height=470, width=550)#创建一个框框,此框框没有标题,而且没背景的时候是透明的
leftFrame.pack()
leftFrame.place(x=0,y=200)
leftFrame.pack_propagate(0)#用了这句话以后窗口就不能调大小了,默认是设置的大小
rightFrame = LabelFrame(a1, text='数据分析结果',width=500, height=555)#, width=120, height=150)#设置一个有标题的窗口
rightFrame.pack()
rightFrame.place(x=490,y=0)
rightFrame.pack_propagate(0)
menuBar = Menu(a1)#设置菜单
menuBar.add_command(label="关于", command=d)#增加菜单的按键
menuBar.add_command(label="退出",command=a1.quit)
menuBar.add_separator() # #添加分割线(可选)
a1["menu"] = menuBar
e()#条用那些函数设置数据图等
mpm()
sj()
a1.mainloop()
sql()
a()