diff --git a/AI/Text2Sql/Start.py b/AI/Text2Sql/Start.py
index 68cc19ff..2f7da1c9 100644
--- a/AI/Text2Sql/Start.py
+++ b/AI/Text2Sql/Start.py
@@ -3,6 +3,97 @@ import platform
from Text2Sql.Util.Text2SqlUtil import *
from Text2Sql.Util.PostgreSQLUtil import PostgreSQLUtil
from Text2Sql.Util.SaveToExcel import save_to_excel
+from pyecharts.charts import Bar
+from pyecharts import options as opts
+from pyecharts.commons.utils import JsCode
+import pandas as pd
+import webbrowser
+
+
+def process_data(raw_data):
+ """
+ 处理原始数据:
+ 1. 过滤无效行政区
+ 2. 按上传数量降序排序
+ 3. 取前10名
+ """
+ df = pd.DataFrame(raw_data)
+ df = df[df['行政区划名称'].notna() & (df['行政区划名称'] != '')]
+ df = df.sort_values('上传课程数量', ascending=False).head(10)
+ return df
+
+
+def create_top10_chart(data):
+ # 准备数据
+ schools = data['学校名称'].tolist()
+ counts = data['上传课程数量'].tolist()
+ districts = data['行政区划名称'].tolist()
+
+ # 生成颜色渐变(从深到浅)
+ colors = [f"rgb({75 + i * 15}, {115 - i * 10}, {220 - i * 20})" for i in range(10)]
+
+ # 创建图表
+ bar = Bar(init_opts=opts.InitOpts(width='1200px', height='600px'))
+ bar.add_xaxis(schools)
+ bar.add_yaxis(
+ series_name="上传数量",
+ y_axis=counts,
+ itemstyle_opts=opts.ItemStyleOpts(color=JsCode(
+ "function(params){"
+ f" return {colors}[params.dataIndex];"
+ "}"
+ )),
+ label_opts=opts.LabelOpts(
+ position="right",
+ formatter=JsCode(
+ "function(params){"
+ " return params.value + ' (' + params.name.split('').join('\\n') + ')';"
+ "}"
+ )
+ )
+ )
+
+ # 全局配置
+ bar.set_global_opts(
+ title_opts=opts.TitleOpts(
+ title="上传资源数量TOP10学校排名",
+ subtitle="数据来源:课程资源管理系统"
+ ),
+ tooltip_opts=opts.TooltipOpts(
+ formatter=JsCode(
+ """function(params){
+ return params.name + '
'
+ + '所属行政区:' + %s[params.dataIndex] + '
'
+ + '上传数量:' + params.value + ''
+ }""" % districts
+ )
+ ),
+ xaxis_opts=opts.AxisOpts(
+ axislabel_opts=opts.LabelOpts(
+ rotate=30,
+ formatter=JsCode(
+ "function(value){"
+ " return value.length > 6 ? value.substring(0,6)+'...' : value;"
+ "}"
+ )
+ )
+ ),
+ yaxis_opts=opts.AxisOpts(name="上传数量(件)"),
+ datazoom_opts=[opts.DataZoomOpts(type_="inside")],
+ visualmap_opts=opts.VisualMapOpts(
+ min_=min(counts),
+ max_=max(counts),
+ orient="horizontal",
+ pos_left="center",
+ range_color=["#91CC75", "#5470C6"]
+ )
+ )
+
+ # 反转Y轴使降序排列
+ bar.reversal_axis()
+
+ return bar
+
if __name__ == "__main__":
vn = DeepSeekVanna()
@@ -20,6 +111,8 @@ if __name__ == "__main__":
# 自然语言提问
question = '''
查询每个区每个校都上传了多少课程数量,需要返回行政区名称,学校名称,上传课程数量等属性.
+ 字段名:行政区划名称,学校名称,上传课程数量,
+ 行政区划为NULL 或者是空字符的不参加统计工作,
先按行政区划排序,再按课程数量由高到低排序'''
# ,只要行政区划是二道区的
@@ -40,13 +133,14 @@ if __name__ == "__main__":
sample_data = db.execute_query(sql)
filename = "d:/导出信息.xlsx"
save_to_excel(sample_data, filename)
- # 在代码最后添加自动打开逻辑
- if platform.system() == "Windows":
- try:
- full_path = os.path.abspath(filename)
- print(f"\n✅ 文件已保存到:{full_path}")
- os.startfile(full_path) # 关键代码
- except Exception as e:
- print(f"\n⚠️ 自动打开失败: {str(e)},请手动打开文件")
+ # 用WINDOWS打开这个xlsx
+ if platform.system() == 'Windows':
+ os.startfile(filename)
else:
- print("\n⚠️ 非Windows系统,请手动打开文件")
+ # 对于其他系统,使用默认程序打开文件
+ os.system(f'open "{filename}"')
+ # 生成统计图
+ processed_data = process_data(sample_data)
+ chart = create_top10_chart(processed_data)
+ chart.render("top10_chart.html")
+ webbrowser.open("top10_chart.html")
diff --git a/AI/Text2Sql/drawEcharts.py b/AI/Text2Sql/drawEcharts.py
new file mode 100644
index 00000000..29eb3ca3
--- /dev/null
+++ b/AI/Text2Sql/drawEcharts.py
@@ -0,0 +1,67 @@
+from pyecharts.charts import Bar
+from pyecharts import options as opts
+import pandas as pd
+
+def process_data(raw_data):
+ """
+ 数据处理流程:
+ 1. 转换为DataFrame
+ 2. 过滤无效行政区
+ 3. 按上传量降序排序
+ 4. 取前10条记录
+ """
+ df = pd.DataFrame(raw_data)
+ # 过滤空值(包括NaN和空字符串)
+ df = df[(df['行政区划名称'].notna()) & (df['行政区划名称'] != '')]
+ # 按上传量排序并保留前10
+ return df.sort_values('上传课程数量', ascending=False).head(10)
+
+
+def create_horizontal_barchart(data):
+ # 提取数据
+ schools = data['学校名称'].tolist()
+ counts = data['上传课程数量'].tolist()
+
+ # 创建图表对象
+ bar = Bar(init_opts=opts.InitOpts(width='1200px', height='600px'))
+
+ # 添加数据(横向柱状图需要反转坐标系)
+ bar.add_xaxis(counts)
+ bar.add_yaxis(
+ series_name="上传数量",
+ y_axis=schools,
+ itemstyle_opts=opts.ItemStyleOpts(color="#5470c6"),
+ label_opts=opts.LabelOpts(
+ position="right",
+ formatter="{b}: {c}"
+ )
+ )
+
+ # 配置图表选项
+ bar.set_global_opts(
+ title_opts=opts.TitleOpts(
+ title="课程资源上传量TOP10学校排名"
+ #subtitle="数据来源:课程资源管理系统"
+ ),
+ tooltip_opts=opts.TooltipOpts(
+ formatter=opts.TooltipItemOptsFormatter(
+ # 显示学校、行政区和数量
+ "行政区:{a}
"
+ "上传量:{c}"
+ )
+ ),
+ yaxis_opts=opts.AxisOpts(
+ name="学校名称",
+ axislabel_opts=opts.LabelOpts(
+ font_size=12,
+ formatter=lambda name: name[:6] + "..." if len(name) > 6 else name
+ )
+ ),
+ xaxis_opts=opts.AxisOpts(name="上传数量(件)"),
+ datazoom_opts=[opts.DataZoomOpts(type_="inside")],
+ )
+
+ # 反转坐标系实现横向显示
+ # bar.reversal_axis()
+
+ return bar
\ No newline at end of file
diff --git a/AI/Text2Sql/top10_chart.html b/AI/Text2Sql/top10_chart.html
new file mode 100644
index 00000000..f3fbac3c
--- /dev/null
+++ b/AI/Text2Sql/top10_chart.html
@@ -0,0 +1,273 @@
+
+
+