You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

155 lines
4.9 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import logging
import pymysql
import subprocess
import numpy as np
from matplotlib import pyplot as plt
#%matplotlib inline
from tkinter import Tk
from pyecharts import options as _opts
from pyecharts.charts import Bar
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
#db_config={'host':'127.0.0.1','user':'root','password':'mysql>hyx123','db':'airquility','charset':'utf8'}
#ptimelist=[]
#cilist=[]
#data_dict=dict(zip(ptimelist,cilist))
jan_list = []
feb_list = []
mar_list = []
apr_list = []
may_list = []
ptime_list = []
def get_data(db_config):
"""
从数据库中获取ptime和ci数据。
:param db_config: 数据库配置字典
:return: 包含ptime和ci的元组列表
"""
# 存储ptime数据的列表
try:
with pymysql.connect(**db_config) as conn:
logging.info("数据库连接成功")
with conn.cursor() as cursor:
# 使用单个查询以提高性能
sql_ptime = "SELECT ptime FROM May"
cursor.execute(sql_ptime)
data_ptime = cursor.fetchall()
ptime_list = [row['ptime'] for row in data_ptime if 'ptime' in row]
sql_may = "SELECT pm FROM may"
cursor.execute(sql_may)
data_may = cursor.fetchall()
may_list = [row['pm'] for row in data_may if 'pm' in row]
sql_feb="SELECT pm FROM feb"
cursor.execute(sql_feb)
data_feb=cursor.fetchall()
#print(data_ci)
feb_list = [row['pm'] for row in data_feb if 'pm' in row]
sql_jan = "SELECT pm FROM jan"
cursor.execute(sql_jan)
data_jan = cursor.fetchall()
# print(data_ci)
jan_list = [row['pm'] for row in data_jan if 'pm' in row]
sql_mar = "SELECT pm FROM mar"
cursor.execute(sql_mar)
data_mar = cursor.fetchall()
# print(data_ci)
mar_list = [row['pm'] for row in data_mar if 'pm' in row]
sql_apr = "SELECT pm FROM apr"
cursor.execute(sql_apr)
data_apr = cursor.fetchall()
# print(data_ci)
apr_list = [row['pm'] for row in data_apr if 'pm' in row]
return ptime_list, may_list, feb_list, jan_list, mar_list, apr_list
except pymysql.err.OperationalError as e:
logging.error(f"数据库操作失败: {e}")
# 根据具体场景,可以选择返回空列表、抛出异常或返回特定错误码
return [], [], [], [], [], []
def average(str_list):
if not str_list: # 检查列表是否为空
return 0 # 或者根据需要处理比如返回None或者抛出异常
num_list = [float(item) for item in str_list] # 假设可能有浮点数
return sum(num_list) / len(num_list)
def visualize_data(ptime_list, may_list, feb_list, jan_list, mar_list, apr_list):
"""
可视化数据。
:param ptime_list: ptime数据列表
:param ci_list: ci数据列表
:param column_to_plot: 需要绘制的列名
"""
if not may_list or not feb_list or not jan_list:
logging.error("数据为空,无法进行可视化")
return
#y_list=[]
#for i in range(4,8):
# y_list.append(i)
x = np.arange(26)
bar_width = 0.2
# 调用函数并打印结果
jan_value = average(jan_list)
feb_value = average(feb_list)
may_value = average(may_list)
mar_value = average(mar_list)
apr_value = average(apr_list)
# 创建图形对象
fig = plt.figure("average_pm2.5")
#plt.title('每月pm2.5平均指数')
# 创建子图
ax = fig.add_axes([0, 0, 1, 1])
# 让饼状图变成圆形
ax.axis('equal')
# 准备数据
#labels = ['jan', 'feb', 'may','mar','apr']
#num_data = [jan_value, feb_value, may_value, mar_value, apr_value]
plt.figure(figsize=(15, 10), dpi=80)
plt.bar(ptime_list, apr_value, tick_label=ptime_list, width=bar_width)
plt.bar(x + bar_width, may_value, width=bar_width)
# 饼状图之间的间隙大小
#explode = (0.02, 0.03, 0.02, 0.01, 0.01)
# 画饼
#ax.pie(num_data, labels=labels, autopct='%1.1f%%', explode=explode)
plt.show()
if __name__ == "__main__":
db_config = {
"host": '127.0.0.1',
"user": "root",
"password": 'mysql>hyx123',
"db": 'airquility',
"charset": 'utf8',
"cursorclass": pymysql.cursors.DictCursor
}
ptime_list, may_list, feb_list, jan_list, mar_list, apr_list= get_data(db_config)
visualize_data(ptime_list, may_list, feb_list, jan_list, mar_list, apr_list)
#print(pymysql.__version__)
'''
window= Tk()
window.title("每日空气质量")
window.geometry("300x200")
#Label(window, text="图表已生成为air_quality_index.html").pack()
window.mainloop()
'''