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 @@ + + + + + Awesome-pyecharts + + + + + +
+ + +