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.

144 lines
4.8 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 os
from pyecharts import options as opts
from pyecharts.charts import Bar
from Text2Sql.Util.PostgreSQLUtil import PostgreSQLUtil
from Text2Sql.Util.SaveToExcel import save_to_excel
from Text2Sql.Util.Text2SqlUtil import *
def generate_bar_chart_from_result(result, x_column: str, y_columns: list, output_file: str = "bar_chart.html"):
"""
根据结果集生成柱状图并保存为 HTML 文件。
参数:
result: 结果集,通常是一个列表(字典格式)。
x_column (str): 作为 X 轴的列名。
y_columns (list): 作为 Y 轴的列名列表。
output_file (str): 输出 HTML 文件名(默认 "bar_chart.html")。
"""
try:
# 如果结果集为空,直接返回
if not result:
raise ValueError("结果集为空,无法生成图表!")
# 检查列名是否存在
if x_column not in result[0]:
raise ValueError(f"X 轴列名 '{x_column}' 不存在!")
for col in y_columns:
if col not in result[0]:
raise ValueError(f"Y 轴列名 '{col}' 不存在!")
# 提取 X 轴和 Y 轴数据
x_axis_data = [row[x_column] for row in result]
series_data = [
(col, [row[col] for row in result])
for col in y_columns
]
print("X 轴数据:", x_axis_data)
print("Y 轴数据:", series_data)
# 创建柱状图
bar = Bar()
bar.add_xaxis(x_axis_data)
for name, data in series_data:
bar.add_yaxis(name, data)
# 设置全局配置
bar.set_global_opts(
title_opts=opts.TitleOpts(title="动态柱状图"),
xaxis_opts=opts.AxisOpts(name=x_column),
yaxis_opts=opts.AxisOpts(name=""),
legend_opts=opts.LegendOpts(is_show=True)
)
# 确保目标目录存在
if not os.path.exists(os.path.dirname(output_file)):
os.makedirs(os.path.dirname(output_file))
# 保存为 HTML 文件
bar.render(output_file)
print(f"柱状图已保存为 {output_file}")
# 检查文件是否存在
if os.path.exists(output_file):
print("文件生成成功!")
else:
print("文件生成失败!")
except Exception as e:
print(f"生成柱状图时发生错误: {e}")
'''
经验:
1、尽量使用宽表少用关联越少越好
2、应该有一些固定的组合用法预置出来给出范例让用户可以简单修改后就能使用
3、应该有类似于 保存为用例,查询历史等功能,让用户方便利旧。
'''
if __name__ == "__main__":
vn = DeepSeekVanna()
# 开始训练
print("开始训练...")
# 打开CreateTable.sql文件内容
with open("Sql/AreaSchoolLesson.sql", "r", encoding="utf-8") as file:
ddl = file.read()
# 训练数据
vn.train(
ddl=ddl
)
# 自然语言提问
# 整体情况
# question = '''
# 查询:
# 1、发布时间是2024年度
# 2、每个行政区每个学校都上传了多少课程数量
# 3、格式: 行政区划名,学段,排名,学校名称,课程数量
# '''
# 指定行政区域
# question = '''
# 查询:
# 1、发布时间是2024年度
# 2、二道区每个学校都上传了多少课程数量
# 3、格式: 行政区划名,学段,排名,学校名称,发布年份,课程数量
# '''
# 指定学段
question = '''
查询:
1、发布时间是2024年度
2、每个学段每个科目上传课程数量按由多到少排序
3、字段名: 学段,科目,排名,课程数量
'''
common_prompt = '''
返回的信息要求:
1、行政区划为NULL 或者是空字符的不参加统计
2、目标数据库是Postgresql 16,注意字段名称不要有二义性问题
3、使用stage_name描述学段,一定不要使用stage_id
4、使用subject_name描述科目,一定不要使用subject_id
'''
question = question + common_prompt
# 开始查询
print("开始查询...")
# 获取完整 SQL
sql = vn.generate_sql(question)
print("生成的查询 SQL:\n", sql)
# 执行SQL查询
with PostgreSQLUtil() as db:
_data = db.execute_query(sql)
# 生成柱状图
# generate_bar_chart_from_result(
# _data,
# x_column="科目",
# y_columns=["课程数量"],
# output_file="d:/lesson_bar_chart.html"
# )
filename = "d:/导出信息.xlsx"
save_to_excel(_data, filename)
os.startfile(filename)