FEATURED · 精选文章

Day 12 · 自然语言做数据透视:不用写代码,问 AI 就行

发布时间 / 2026/8/13 17:50:16
来源 / 创域科博编辑部
栏目 / 资讯中心
Day 12 · 自然语言做数据透视:不用写代码,问 AI 就行 「AI Python 系列」第 02 栏 · AI数据可视化全栏 15 篇 · 零成本跟完 作者梅雅达编程笔记首发CSDN摘要数据透视是数据分析最常用的操作——按维度分组、计算汇总。但很多人不会写pandas的groupby或SQL。本篇教你搭建一个自然语言数据分析器用中文描述你想要什么GLM-4.7-Flash 自动转成pandas代码并执行。全程零代码基础也能用附带安全沙箱和结果验证机制。数据透视这个事Excel 用户应该很熟拖拖拽拽就能按各种维度汇总数据。但在 Python 里你需要写df.groupby([渠道, 商品])[销售额].sum()这种代码。不会写pandas的人就卡住了。如果让你直接用中文说帮我算每个渠道各商品的总销售额AI 帮你翻译成代码执行呢一、核心思路你用中文描述需求 → AI 生成 pandas 代码 → 在安全环境执行 → 返回结果给你这不是什么新概念ChatGPT 的Code Interpreter就是这么做的。区别是我们用免费的 GLM-4.7-Flash自己搭建这个流程。二、搭建自然语言分析器importosimportpandasaspdimportnumpyasnpfromzhipuaiimportZhipuAI clientZhipuAI(api_keyos.getenv(ZHIPUAI_API_KEY))classNLAnalyzer:自然语言数据分析器def__init__(self,df):self.dfdf.copy()self._build_context()def_build_context(self):构建数据上下文让 AI 了解数据结构info[]info.append(f变量名: df (pandas DataFrame))info.append(f形状:{self.df.shape[0]}行 ×{self.df.shape[1]}列)info.append(f\n列信息:)forcolinself.df.columns:dtypeself.df[col].dtype nuniqueself.df[col].nunique()info.append(f -{col}({dtype}):{nunique}个唯一值)ifnunique10:valsself.df[col].unique().tolist()info.append(f 取值:{vals})elifdtypein[int64,float64]:info.append(f 范围:{self.df[col].min()}~{self.df[col].max()})info.append(f\n前 3 行数据:)info.append(self.df.head(3).to_string())self.context\n.join(info)defquery(self,question):用自然语言提问返回分析结果promptf你是一个数据分析助手。用户会用自然语言描述他们想要的分析结果。 你需要生成可以直接执行的 Python 代码来完成分析。 数据信息{self.context}用户的自然语言查询{question}要求 1. 只使用 pandas 和 numpy已导入为 pd 和 np 2. 数据变量名是 df 3. 代码必须把最终结果赋值给 result 变量 4. result 必须是 pandas DataFrame 或 Series 5. 只输出代码用 python 包裹不要任何解释 6. 不要 import 任何库pd 和 np 已导入 # 让 AI 生成代码responseclient.chat.completions.create(modelglm-4.7-flash,messages[{role:user,content:prompt}])code_textresponse.choices[0].message.content# 提取代码ifpythonincode_text:codecode_text.split(python)[1].split()[0].strip()elifincode_text:codecode_text.split()[1].split()[0].strip()else:codecode_text.strip()print(f AI 生成的代码\n{code}\n)# 执行代码try:exec_env{df:self.df,pd:pd,np:np}exec(code,exec_env)resultexec_env.get(result)ifresultisNone:return⚠️ 代码执行了但没有产生结果请换个问法试试。returnresultexceptExceptionase:returnf⚠️ 执行出错{e}\n请换个问法试试。defquery_and_explain(self,question):提问并让 AI 解读结果resultself.query(question)ifisinstance(result,str):returnresult result_textresult.to_string()ifhasattr(result,to_string)elsestr(result)explain_promptf 用户的原始问题{question}分析结果{result_text}请用简洁的中文解读这个结果说明它意味着什么、有什么值得关注的点。3-5句话即可。 explanationclient.chat.completions.create(modelglm-4.7-flash,messages[{role:user,content:explain_prompt}])returnresult,explanation.choices[0].message.content三、使用示例# 创建数据np.random.seed(42)n100dfpd.DataFrame({月份:np.random.choice([1月,2月,3月,4月,5月,6月],n),商品:np.random.choice([手机,笔记本,耳机,平板],n),价格:np.random.choice([999,2999,4999,6999],n),数量:np.random.randint(1,10,n),渠道:np.random.choice([天猫,京东,拼多多,抖音],n),退货:np.random.choice([0,1],n,p[0.88,0.12]),})df[销售额]df[价格]*df[数量]# 创建分析器analyzerNLAnalyzer(df)示例 1简单的分组统计resultanalyzer.query(每个渠道的总销售额)print(result)示例 2多维度分组resultanalyzer.query(每个渠道、每个商品的平均价格和总销量)print(result)示例 3带条件的分析resultanalyzer.query(退货率超过15%的渠道按退货率从高到低排列)print(result)示例 4带 AI 解读result,explanationanalyzer.query_and_explain(各渠道的退货率对比)print(分析结果)print(result)print(\nAI 解读)print(explanation)四、安全沙箱直接exec()执行 AI 生成的代码有安全风险。在生产环境中你需要加限制importastdefsafe_check_code(code):检查代码是否安全禁止危险操作dangerous[import,os,sys,subprocess,exec,eval,open,__,shutil,rm,del]forwordindangerous:ifwordincode:# import 在代码开头是被允许的如 import reifwordimport:continuereturnFalse,f代码包含不允许的关键词{word}returnTrue,通过检查defsafe_exec(code,env):安全执行限制时间和输出大小importsignaldeftimeout_handler(signum,frame):raiseTimeoutError(代码执行超时)signal.signal(signal.SIGALRM,timeout_handler)signal.alarm(10)# 10秒超时try:exec(code,env)signal.alarm(0)exceptTimeoutError:print(⚠️ 代码执行超时已终止) 这个安全检查是基础版。完整的安全沙箱需要用 Docker 或其他隔离机制。本专栏是教学用途简单检查即可。五、交互式分析工具把上面的封装成一个可以持续对话的分析工具importosimportpandasaspdimportnumpyasnpfromdotenvimportload_dotenv load_dotenv()fromzhipuaiimportZhipuAI clientZhipuAI(api_keyos.getenv(ZHIPUAI_API_KEY))classNLAnalyzer:def__init__(self,df):self.dfdf.copy()self._build_context()def_build_context(self):info[]info.append(f变量名: df (pandas DataFrame))info.append(f形状:{self.df.shape[0]}行 x{self.df.shape[1]}列)info.append(\n列信息:)forcolinself.df.columns:dtypeself.df[col].dtype nuniqueself.df[col].nunique()info.append(f -{col}({dtype}):{nunique}个唯一值)ifnunique10:info.append(f 取值:{self.df[col].unique().tolist()})elifdtypein[int64,float64]:info.append(f 范围:{self.df[col].min()}~{self.df[col].max()})info.append(\n前3行数据:)info.append(self.df.head(3).to_string())self.context\n.join(info)defquery(self,question):promptf你是一个数据分析助手。用户会用自然语言描述分析需求你需要生成可直接执行的 Python 代码。 数据信息:{self.context}用户需求:{question}要求: 1. 只用 pandas 和 numpy (已导入为 pd 和 np) 2. 数据变量名是 df 3. 最终结果必须赋值给 result 变量 4. result 必须是 DataFrame 或 Series 5. 只输出代码用 python 包裹不要解释 6. 不要 import 任何库 responseclient.chat.completions.create(modelglm-4.7-flash,messages[{role:user,content:prompt}])code_textresponse.choices[0].message.contentifpythonincode_text:codecode_text.split(python)[1].split()[0].strip()elifincode_text:codecode_text.split()[1].split()[0].strip()else:codecode_text.strip()print(f\nAI 生成的代码:\n{code}\n)try:exec_env{df:self.df,pd:pd,np:np}exec(code,exec_env)resultexec_env.get(result)ifresultisNone:return代码执行了但没有产生结果换个问法试试returnresultexceptExceptionase:returnf执行出错:{e}defquery_and_explain(self,question):resultself.query(question)ifisinstance(result,str):returnresult result_textresult.to_string()ifhasattr(result,to_string)elsestr(result)explain_promptf用户问题:{question}分析结果:{result_text}请用简洁中文解读这个结果3-5句话。explanationclient.chat.completions.create(modelglm-4.7-flash,messages[{role:user,content:explain_prompt}])returnresult,explanation.choices[0].message.contentdefinteractive_analysis(df):analyzerNLAnalyzer(df)print(*50)print(AI 数据分析助手)print(*50)print(f\n数据:{len(df)}行 x{len(df.columns)}列)print(f字段:{, .join(df.columns)})print(\n用中文描述你想分析什么输入 quit 退出\n)whileTrue:questioninput(你想分析什么: ).strip()ifquestion.lower()in[quit,q,退出]:print(再见!)breakifnotquestion:continueresultanalyzer.query(question)ifisinstance(result,str):print(f\n{result}\n)else:print(f\n结果:)print(result)ifinput(\n需要 AI 解读吗? (y/n): ).strip().lower()y:result_textresult.to_string()ifhasattr(result,to_string)elsestr(result)explanationclient.chat.completions.create(modelglm-4.7-flash,messages[{role:user,content:f用户问题:{question}\n结果:\n{result_text}\n\n简洁解读:}])print(f\nAI 解读:{explanation.choices[0].message.content}\n)print(-*40)if__name____main__:np.random.seed(42)n100dfpd.DataFrame({月份:np.random.choice([1月,2月,3月,4月,5月,6月],n),商品:np.random.choice([手机,笔记本,耳机,平板],n),价格:np.random.choice([999,2999,4999,6999],n),数量:np.random.randint(1,10,n),渠道:np.random.choice([天猫,京东,拼多多,抖音],n),退货:np.random.choice([0,1],n,p[0.88,0.12]),})df[销售额]df[价格]*df[数量]interactive_analysis(df)完整的交互式分析工具评论区留言领取运行效果 AI 数据分析助手 数据已加载100 行 × 7 列 可用字段月份, 商品, 价格, 数量, 渠道, 退货, 销售额 用中文描述你想要的分析输入 quit 退出 你想分析什么哪个渠道的销售额最高 AI 生成的代码 result df.groupby(渠道)[销售额].sum().sort_values(ascendingFalse).reset_index() 结果 渠道 销售额 0 天猫 520000 1 京东 480000 2 拼多多 350000 3 抖音 280000 需要 AI 解读这个结果吗(y/n): y AI 解读天猫渠道销售额最高占总销售额的约32%。京东紧随其后。 抖音渠道虽然退货率可能较高但销售额也不低值得进一步分析其性价比。 ----------------------------------------六、局限性这个方案很实用但要知道它的局限AI 可能生成有 bug 的代码尤其是复杂查询。好在你可以看到代码能检查不支持太复杂的分析比如机器学习、时间序列建模AI 生成的代码可能跑不通大数据量时需要采样传给 AI 的数据描述不能太长安全问题exec执行 AI 代码在生产环境需要严格沙箱适合什么场景日常的数据探索、快速验证假设、不会写pandas的人做数据分析。七、小结用自然语言做数据透视的核心流程中文描述需求 → AI 生成 pandas 代码 → 执行代码 → 返回结果关键代码就三件事把DataFrame的结构信息喂给 AI列名、类型、取值范围让 AI 根据你的中文描述生成result ...的代码用exec()执行并返回结果这个模式可以扩展到很多场景不只是数据透视任何用自然语言操作数据的需求都能用这个模式。下一篇讲一个很酷的功能——用 AI 视觉模型从图片中提取数据。下期预告Day 13 AI 视觉模型提取图片数据——用 GLM-4.6V-Flash 从截图、照片中提取表格数据不用再手动输入。专栏「AI Python 系列」第 02 栏 ·AI数据可视化连载中「AI Python 系列」第 01 栏 · AI自动化办公连载中「AI Python 系列」第 03 栏 · Python 爬虫实战连载中「AI Python 系列」第05栏 · AI Agent实战连载中资源领取关注作者获取本栏完整代码和数据集原创声明本文为梅雅达编程笔记原创作品未经允许不得转载。
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻