资讯详情

空气质量分析系统

空气质量分析系统

2017年京东万象空气质量a218f4c9d5694b0fb4fdd492db4e7a53.png

这是一个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("<<ComboboxSelected>>", 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("<<ComboboxSelected>>", 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("<<ComboboxSelected>>", 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()

标签: 平凉温湿度变送器标定计量阿坝交流电流变送器平凉hpax电流变送器句容风电高速轴制动器传感器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台