From c03825b2c68f34a2737f4c3664c9955c735a51f5 Mon Sep 17 00:00:00 2001 From: yhjun1026 <460342015@qq.com> Date: Wed, 30 Aug 2023 14:41:51 +0800 Subject: [PATCH] feat(editor): ChatExcel MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🔥ChatExcel Mode Operation Manual --- pilot/commands/disply_type/show_chart_gen.py | 90 +++++- ...r_1d2c71b4-4637-11ee-86eb-b26789cc3e58.png | Bin 19523 -> 0 bytes ...r_6077945c-4638-11ee-9fb4-b26789cc3e58.png | Bin 17960 -> 0 bytes .../chat_excel/excel_learning/test.py | 261 +++++++++--------- .../chat_data/chat_excel/excel_reader.py | 3 +- 5 files changed, 220 insertions(+), 134 deletions(-) delete mode 100644 pilot/scene/chat_data/chat_excel/excel_learning/bar_1d2c71b4-4637-11ee-86eb-b26789cc3e58.png delete mode 100644 pilot/scene/chat_data/chat_excel/excel_learning/bar_6077945c-4638-11ee-9fb4-b26789cc3e58.png diff --git a/pilot/commands/disply_type/show_chart_gen.py b/pilot/commands/disply_type/show_chart_gen.py index 84d8782a9..3fe1df2eb 100644 --- a/pilot/commands/disply_type/show_chart_gen.py +++ b/pilot/commands/disply_type/show_chart_gen.py @@ -4,7 +4,6 @@ from pilot.commands.command_mange import command from pilot.configs.config import Config import pandas as pd import uuid -import io import os import matplotlib import seaborn as sns @@ -20,6 +19,53 @@ CFG = Config() logger = build_logger("show_chart_gen", LOGDIR + "show_chart_gen.log") static_message_img_path = os.path.join(os.getcwd(), "message/img") + +def data_pre_classification(df: DataFrame): + ## Data pre-classification + columns = df.columns.tolist() + + + number_columns = [] + non_numeric_colums = [] + + # 收集数据分类小于10个的列 + non_numeric_colums_value_map = {} + numeric_colums_value_map = {} + for column_name in columns: + if pd.api.types.is_numeric_dtype(df[column_name].dtypes): + number_columns.append(column_name) + unique_values = df[column_name].unique() + numeric_colums_value_map.update({column_name: len(unique_values)}) + else: + non_numeric_colums.append(column_name) + unique_values = df[column_name].unique() + non_numeric_colums_value_map.update({column_name: len(unique_values)}) + + sorted_numeric_colums_value_map = dict(sorted(numeric_colums_value_map.items(), key=lambda x: x[1])) + numeric_colums_sort_list = list(sorted_numeric_colums_value_map.keys()) + + sorted_colums_value_map = dict(sorted(non_numeric_colums_value_map.items(), key=lambda x: x[1])) + non_numeric_colums_sort_list = list(sorted_colums_value_map.keys()) + + # Analyze x-coordinate + if len(non_numeric_colums_sort_list) > 0: + x_cloumn = non_numeric_colums_sort_list[-1] + non_numeric_colums_sort_list.remove(x_cloumn) + else: + x_cloumn = number_columns[0] + numeric_colums_sort_list.remove(x_cloumn) + + # Analyze y-coordinate + if len(numeric_colums_sort_list) > 0: + y_column = numeric_colums_sort_list[0] + numeric_colums_sort_list.remove(y_column) + else: + raise ValueError("Not enough numeric columns for chart!") + + + return x_cloumn, y_column, non_numeric_colums_sort_list, numeric_colums_sort_list + + def zh_font_set(): font_names = ['Heiti TC', 'Songti SC', 'STHeiti Light', 'Microsoft YaHei', 'SimSun', 'SimHei', 'KaiTi'] fm = FontManager() @@ -36,9 +82,6 @@ def zh_font_set(): '"speak": "", "df":""') def response_line_chart(speak: str, df: DataFrame) -> str: logger.info(f"response_line_chart:{speak},") - - columns = df.columns.tolist() - if df.size <= 0: raise ValueError("No Data!") @@ -65,7 +108,14 @@ def response_line_chart(speak: str, df: DataFrame) -> str: sns.set(context='notebook', style='ticks', rc=rc) fig, ax = plt.subplots(figsize=(8, 5), dpi=100) - sns.lineplot(df, x=columns[0], y=columns[1], ax=ax) + x,y, non_num_columns, num_colmns =data_pre_classification(df) + # ## 复杂折线图实现 + if len(num_colmns)>0: + num_colmns.append(y) + df_melted = pd.melt(df, id_vars=x, value_vars=num_colmns, var_name='line', value_name='Value') + sns.lineplot(data=df_melted, x=x, y="Value", hue="line", ax=ax, palette="Set2") + else: + sns.lineplot(data=df, x=x, y=y, ax=ax, palette="Set2") chart_name = "line_" + str(uuid.uuid1()) + ".png" chart_path = static_message_img_path + "/" + chart_name @@ -79,7 +129,6 @@ def response_line_chart(speak: str, df: DataFrame) -> str: '"speak": "", "df":""') def response_bar_chart(speak: str, df: DataFrame) -> str: logger.info(f"response_bar_chart:{speak},") - columns = df.columns.tolist() if df.size <= 0: raise ValueError("No Data!") @@ -105,9 +154,34 @@ def response_bar_chart(speak: str, df: DataFrame) -> str: sns.set(context='notebook', style='ticks', rc=rc) fig, ax = plt.subplots(figsize=(8, 5), dpi=100) - sns.barplot(df, x=df[columns[0]], y=df[columns[1]], ax=ax) - chart_name = "pie_" + str(uuid.uuid1()) + ".png" + x,y, non_num_columns, num_colmns =data_pre_classification(df) + if len(non_num_columns) >= 1: + hue = non_num_columns[0] + + if len(num_colmns)>=1: + if hue: + if len(num_colmns) >= 2: + can_use_columns = num_colmns[:2] + else: + can_use_columns = num_colmns + sns.barplot(data=df, x=x, y=y, hue=hue, palette="Set2", ax=ax) + for sub_y_column in can_use_columns: + sns.barplot(data=df, x=x, y=sub_y_column, hue=hue, palette="Set2", ax=ax) + else: + if len(num_colmns) >= 3: + can_use_columns = num_colmns[:3] + else: + can_use_columns = num_colmns + sns.barplot(data=df, x=x, y=y, hue=can_use_columns[0], palette="Set2", ax=ax) + + for sub_y_column in can_use_columns[1:]: + sns.barplot(data=df, x=x, y=sub_y_column, hue=hue, palette="Set2", ax=ax) + else: + sns.barplot(data=df, x=x, y=y, hue=hue, palette="Set2", ax=ax) + + + chart_name = "bar_" + str(uuid.uuid1()) + ".png" chart_path = static_message_img_path + "/" + chart_name plt.savefig(chart_path, bbox_inches='tight', dpi=100) html_img = f"""
{speak}
""" diff --git a/pilot/scene/chat_data/chat_excel/excel_learning/bar_1d2c71b4-4637-11ee-86eb-b26789cc3e58.png b/pilot/scene/chat_data/chat_excel/excel_learning/bar_1d2c71b4-4637-11ee-86eb-b26789cc3e58.png deleted file mode 100644 index e9bd360b4e0c23692c372f9fe82f99190471afc1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19523 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 diff --git a/pilot/scene/chat_data/chat_excel/excel_learning/bar_6077945c-4638-11ee-9fb4-b26789cc3e58.png b/pilot/scene/chat_data/chat_excel/excel_learning/bar_6077945c-4638-11ee-9fb4-b26789cc3e58.png deleted file mode 100644 index 09ad02b582a90fdb948364aa32a725a79d9b47b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17960 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 diff --git a/pilot/scene/chat_data/chat_excel/excel_learning/test.py b/pilot/scene/chat_data/chat_excel/excel_learning/test.py index a751ec00b..5eb2c0a9d 100644 --- a/pilot/scene/chat_data/chat_excel/excel_learning/test.py +++ b/pilot/scene/chat_data/chat_excel/excel_learning/test.py @@ -1,9 +1,11 @@ import os import duckdb import pandas as pd +import numpy as np import matplotlib import seaborn as sns import uuid + from pandas import DataFrame import matplotlib.pyplot as plt @@ -29,9 +31,12 @@ def data_pre_classification(df: DataFrame): # 收集数据分类小于10个的列 non_numeric_colums_value_map = {} numeric_colums_value_map = {} + df_filtered = df.dropna() for column_name in columns: - - if pd.to_numeric(df[column_name], errors='coerce').notna().all(): + print(np.issubdtype(df_filtered[column_name].dtype, np.number)) + # if pd.to_numeric(df[column_name], errors='coerce').notna().all(): + # if np.issubdtype(df_filtered[column_name].dtype, np.number): + if pd.api.types.is_numeric_dtype(df[column_name].dtypes): number_columns.append(column_name) unique_values = df[column_name].unique() numeric_colums_value_map.update({column_name: len(unique_values)}) @@ -40,26 +45,65 @@ def data_pre_classification(df: DataFrame): unique_values = df[column_name].unique() non_numeric_colums_value_map.update({column_name: len(unique_values)}) + sorted_numeric_colums_value_map = dict(sorted(numeric_colums_value_map.items(), key=lambda x: x[1])) + numeric_colums_sort_list = list(sorted_numeric_colums_value_map.keys()) - if len(non_numeric_colums) <=0: - sorted_colums_value_map = dict(sorted(numeric_colums_value_map.items(), key=lambda x: x[1])) - numeric_colums_sort_list = list(sorted_colums_value_map.keys()) - x_column = number_columns[0] - hue_column = numeric_colums_sort_list[0] - y_column = numeric_colums_sort_list[1] - elif len(number_columns) <=0: - raise ValueError("Have No numeric Column!") + sorted_colums_value_map = dict(sorted(non_numeric_colums_value_map.items(), key=lambda x: x[1])) + non_numeric_colums_sort_list = list(sorted_colums_value_map.keys()) + + # Analyze x-coordinate + if len(non_numeric_colums_sort_list) > 0: + x_cloumn = non_numeric_colums_sort_list[-1] + non_numeric_colums_sort_list.remove(x_cloumn) else: - # 数字和非数字都存在多列,放弃部分数字列 - y_column = number_columns[0] - x_column = non_numeric_colums[0] - # if len(non_numeric_colums) > 1: - # - # else: + x_cloumn = number_columns[0] + numeric_colums_sort_list.remove(x_cloumn) - # non_numeric_colums_sort_list.remove(non_numeric_colums[0]) - # hue_column = non_numeric_colums_sort_list - return x_column, y_column, hue_column + # Analyze y-coordinate + if len(numeric_colums_sort_list) > 0: + y_column = numeric_colums_sort_list[0] + numeric_colums_sort_list.remove(y_column) + else: + raise ValueError("Not enough numeric columns for chart!") + + + return x_cloumn, y_column, non_numeric_colums_sort_list, numeric_colums_sort_list + + # + # if len(non_numeric_colums) <=0: + # sorted_colums_value_map = dict(sorted(numeric_colums_value_map.items(), key=lambda x: x[1])) + # numeric_colums_sort_list = list(sorted_colums_value_map.keys()) + # x_column = number_columns[0] + # hue_column = numeric_colums_sort_list[0] + # y_column = numeric_colums_sort_list[1] + # cols = numeric_colums_sort_list[2:] + # elif len(number_columns) <=0: + # raise ValueError("Have No numeric Column!") + # else: + # # 数字和非数字都存在多列,放弃部分数字列 + # x_column = non_numeric_colums[0] + # y_column = number_columns[0] + # if len(non_numeric_colums) > 1: + # sorted_colums_value_map = dict(sorted(non_numeric_colums_value_map.items(), key=lambda x: x[1])) + # non_numeric_colums_sort_list = list(sorted_colums_value_map.keys()) + # non_numeric_colums_sort_list.remove(non_numeric_colums[0]) + # hue_column = non_numeric_colums_sort_list[0] + # if len(number_columns) > 1: + # # try multiple charts + # cols = number_columns.remove( number_columns[0]) + # + # else: + # sorted_colums_value_map = dict(sorted(numeric_colums_value_map.items(), key=lambda x: x[1])) + # numeric_colums_sort_list = list(sorted_colums_value_map.keys()) + # numeric_colums_sort_list.remove(number_columns[0]) + # if sorted_colums_value_map[numeric_colums_sort_list[0]].value < 5: + # hue_column = numeric_colums_sort_list[0] + # if len(number_columns) > 2: + # # try multiple charts + # cols = numeric_colums_sort_list.remove(numeric_colums_sort_list[0]) + # + # print(x_column, y_column, hue_column, cols) + # return x_column, y_column, hue_column if __name__ == "__main__": # connect = duckdb.connect("/Users/tuyang.yhj/Downloads/example.xlsx") @@ -78,16 +122,35 @@ if __name__ == "__main__": # 获取系统中的默认中文字体名称 # default_font = fm.fontManager.defaultFontProperties.get_family() + # 创建一个示例 DataFrame + df = pd.DataFrame({ + 'A': [1, 2, 3, None, 5], + 'B': [10, 20, 30, 40, 50], + 'C': [1.1, 2.2, None, 4.4, 5.5], + 'D': ['a', 'b', 'c', 'd', 'e'] + }) + + # 判断列是否为数字列 + column_name = 'A' # 要判断的列名 + is_numeric = pd.to_numeric(df[column_name], errors='coerce').notna().all() + + if is_numeric: + print(f"Column '{column_name}' is a numeric column (ignoring null and NaN values in some elements).") + else: + print(f"Column '{column_name}' is not a numeric column (ignoring null and NaN values in some elements).") # - excel_reader = ExcelReader("/Users/tuyang.yhj/Downloads/example.xlsx") + # excel_reader = ExcelReader("/Users/tuyang.yhj/Downloads/example.xlsx") + excel_reader = ExcelReader("/Users/tuyang.yhj/Downloads/yhj-zx.csv") # # # colunms, datas = excel_reader.run( "SELECT CONCAT(Year, '-', Quarter) AS QuarterYear, SUM(Sales) AS TotalSales FROM example GROUP BY QuarterYear ORDER BY QuarterYear") # # colunms, datas = excel_reader.run( """ SELECT Year, SUM(Sales) AS Total_Sales FROM example GROUP BY Year ORDER BY Year; """) - df = excel_reader.get_df_by_sql_ex(""" SELECT Segment, Country, SUM(Sales) AS Total_Sales, SUM(Profit) AS Total_Profit FROM example GROUP BY Segment, Country """) + # df = excel_reader.get_df_by_sql_ex(""" SELECT Segment, Country, SUM(Sales) AS Total_Sales, SUM(Profit) AS Total_Profit FROM example GROUP BY Segment, Country """) + df = excel_reader.get_df_by_sql_ex(""" SELECT `明细`, `费用小计`, `支出小计` FROM yhj-zx limit 10""") - x,y,hue =data_pre_classification(df) - print(x, y, hue) + for column_name in df.columns.tolist(): + print(column_name + ":"+ str(df[column_name].dtypes)) + print(column_name + ":"+ str(pd.api.types.is_numeric_dtype(df[column_name].dtypes))) columns = df.columns.tolist() font_names = ['Heiti TC', 'Songti SC', 'STHeiti Light', 'Microsoft YaHei', 'SimSun', 'SimHei', 'KaiTi'] @@ -108,30 +171,63 @@ if __name__ == "__main__": sns.color_palette("hls", 10) sns.hls_palette(8, l=.5, s=.7) sns.set(context='notebook', style='ticks', rc=rc) - # sns.set_palette("Set3") # 设置颜色主题 - # sns.set_style("dark") - # sns.color_palette("hls", 10) - # sns.hls_palette(8, l=.5, s=.7) - # sns.set(context='notebook', style='ticks', rc=rc) fig, ax = plt.subplots(figsize=(8, 5), dpi=100) # plt.ticklabel_format(style='plain') # ax = df.plot(kind='bar', ax=ax) - # sns.barplot(df, x=x, y=y, hue= "Country", ax=ax) - sns.catplot(data=df, x=x, y=y, hue='Country', kind='bar') + # sns.barplot(df, x=x, y="Total_Sales", hue='Country', ax=ax) + # sns.barplot(df, x=x, y="Total_Profit", hue='Country', ax=ax) + + # sns.catplot(data=df, x=x, y=y, hue='Country', kind='bar') + x,y, non_num_columns, num_colmns =data_pre_classification(df) + print(x, y, str(non_num_columns), str(num_colmns)) + ## 复杂折线图实现 + if len(num_colmns)>0: + num_colmns.append(y) + df_melted = pd.melt(df, id_vars=x, value_vars=num_colmns, var_name='line', value_name='Value') + sns.lineplot(data=df_melted, x=x, y="Value", hue="line", ax=ax, palette="Set2") + else: + sns.lineplot(data=df, x=x, y=y, ax=ax, palette="Set2") + + # hue = None + # ## 复杂柱状图实现 + # x,y, non_num_columns, num_colmns =data_pre_classification(df) + # if len(non_num_columns) >= 1: + # hue = non_num_columns[0] + + # if len(num_colmns)>=1: + # if hue: + # if len(num_colmns) >= 2: + # can_use_columns = num_colmns[:2] + # else: + # can_use_columns = num_colmns + # sns.barplot(data=df, x=x, y=y, hue=hue, palette="Set2", ax=ax) + # for sub_y_column in can_use_columns: + # sns.barplot(data=df, x=x, y=sub_y_column, hue=hue, palette="Set2", ax=ax) + # else: + # if len(num_colmns) >= 3: + # can_use_columns = num_colmns[:3] + # else: + # can_use_columns = num_colmns + # sns.barplot(data=df, x=x, y=y, hue=can_use_columns[0], palette="Set2", ax=ax) + # + # for sub_y_column in can_use_columns[1:]: + # sns.barplot(data=df, x=x, y=sub_y_column, hue=hue, palette="Set2", ax=ax) + # else: + # sns.barplot(data=df, x=x, y=y, hue=hue, palette="Set2", ax=ax) + + # # 转换 DataFrame 格式 + # df_melted = pd.melt(df, id_vars=x, value_vars=['Total_Sales', 'Total_Profit'], var_name='line', value_name='y') + # + # # 绘制多列柱状图 + # + # sns.barplot(data=df, x=x, y="Total_Sales", hue = "Country", palette="Set2", ax=ax) + # sns.barplot(data=df, x=x, y="Total_Profit", hue = "Country", palette="Set1", ax=ax) + + # 设置 y 轴刻度格式为普通数字格式 ax.yaxis.set_major_formatter(mtick.FuncFormatter(lambda x, _: '{:,.0f}'.format(x))) - # fonts = font_manager.findSystemFonts() - # font_path = "" - # for font in fonts: - # if "Heiti" in font: - # font_path = font - # my_font = font_manager.FontProperties(fname=font_path) - # plt.title("测试", fontproperties=my_font) - # plt.ylabel(columns[1], fontproperties=my_font) - # plt.xlabel(columns[0], fontproperties=my_font) - chart_name = "bar_" + str(uuid.uuid1()) + ".png" @@ -139,89 +235,4 @@ if __name__ == "__main__": plt.savefig(chart_path, bbox_inches='tight', dpi=100) - - # sns.set(context="notebook", style="ticks", color_codes=True) - # sns.set_palette("Set3") # 设置颜色主题 - # - # # fig, ax = plt.pie(df[columns[1]], labels=df[columns[0]], autopct='%1.1f%%', startangle=90) - # fig, ax = plt.subplots(figsize=(8, 5), dpi=100) - # plt.subplots_adjust(top=0.9) - # ax = df.plot(kind='pie', y=columns[1], ax=ax, labels=df[columns[0]].values, startangle=90, autopct='%1.1f%%') - # # 手动设置 labels 的位置和大小 - # ax.legend(loc='center left', bbox_to_anchor=(-1, 0.5, 0,0), labels=None, fontsize=10) - # plt.axis('equal') # 使饼图为正圆形 - # plt.show() - - # - # - # def csv_colunm_foramt(val): - # if str(val).find("$") >= 0: - # return float(val.replace('$', '').replace(',', '')) - # if str(val).find("¥") >= 0: - # return float(val.replace('¥', '').replace(',', '')) - # return val - # - # # 获取当前时间戳,作为代码开始的时间 - # start_time = int(time.time() * 1000) - # - # df = pd.read_excel('/Users/tuyang.yhj/Downloads/example.xlsx') - # # 读取 Excel 文件为 Pandas DataFrame - # df = pd.read_excel('/Users/tuyang.yhj/Downloads/example.xlsx', converters={i: csv_colunm_foramt for i in range(df.shape[1])}) - # - # # d = df.values - # # print(d.shape[0]) - # # for row in d: - # # print(row[0]) - # # print(len(row)) - # # r = df.iterrows() - # - # # 获取当前时间戳,作为代码结束的时间 - # end_time = int(time.time() * 1000) - # - # print(f"耗时:{(end_time-start_time)/1000}秒") - # - # # 连接 DuckDB 数据库 - # con = duckdb.connect(database=':memory:', read_only=False) - # - # # 将 DataFrame 写入 DuckDB 数据库中的一个表 - # con.register('example', df) - # - # # 查询 DuckDB 数据库中的表 - # conn = con.cursor() - # results = con.execute('SELECT Country, SUM(Profit) AS Total_Profit FROM example GROUP BY Country ORDER BY Total_Profit DESC LIMIT 1;') - # colunms = [] - # for descrip in results.description: - # colunms.append(descrip[0]) - # print(colunms) - # for row in results.fetchall(): - # print(row) - # - # - # # 连接 DuckDB 数据库 - # # con = duckdb.connect(':memory:') - # - # # # 加载 spatial 扩展 - # # con.execute('install spatial;') - # # con.execute('load spatial;') - # # - # # # 查询 duckdb_internal 系统表,获取扩展列表 - # # result = con.execute("SELECT * FROM duckdb_internal.functions WHERE schema='list_extensions';") - # # - # # # 遍历查询结果,输出扩展名称和版本号 - # # for row in result: - # # print(row['name'], row['return_type']) - # # duckdb.read_csv('/Users/tuyang.yhj/Downloads/example_csc.csv') - # # result = duckdb.sql('SELECT * FROM "/Users/tuyang.yhj/Downloads/yhj-zx.csv" ') - # # result = duckdb.sql('SELECT * FROM "/Users/tuyang.yhj/Downloads/example_csc.csv" limit 20') - # # for row in result.fetchall(): - # # print(row) - # - # - # # result = con.execute("SELECT * FROM st_read('/Users/tuyang.yhj/Downloads/example.xlsx', layer='Sheet1')") - # # # 遍历查询结果 - # # for row in result.fetchall(): - # # print(row) - # print("xx") - # - # # diff --git a/pilot/scene/chat_data/chat_excel/excel_reader.py b/pilot/scene/chat_data/chat_excel/excel_reader.py index d5afd1a9c..26d600b51 100644 --- a/pilot/scene/chat_data/chat_excel/excel_reader.py +++ b/pilot/scene/chat_data/chat_excel/excel_reader.py @@ -62,7 +62,8 @@ class ExcelReader: for column_name in df_tmp.columns: self.columns_map.update({column_name: excel_colunm_format(column_name)}) try: - self.df[column_name] = self.df[column_name].astype(float) + self.df[column_name] = pd.to_numeric(self.df[column_name]) + self.df[column_name] = self.df[column_name].fillna(0) except Exception as e: print("transfor column error!" + column_name)