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

6 months ago
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()
'''