PandasAI:用自然语言操作 DataFrame 的库
什么是 PandasAI
PandasAI 是一个将自然语言处理与 Pandas 结合的开源库。它允许你使用日常英语(或其他语言)直接向 DataFrame 提问,而无需编写复杂的过滤、聚合或绘图代码。PandasAI 在底层借助大型语言模型(LLM)将自然语言转换为 Python 代码,在本地执行后返回结果,让数据分析变得像聊天一样简单。
为什么选择 PandasAI
- 零代码分析:无需记忆 Pandas 语法,适合非技术用户或快速探索数据。
- 保留原始数据:所有计算在本地完成,数据不会上传至第三方服务器(使用本地模型时)。
- 支持可视化:可以直接要求生成图表,PandasAI 会返回 Matplotlib 或 Seaborn 图像。
- 兼容多种数据源:除 DataFrame 外,还支持 CSV、Excel、SQL 数据库等多种格式。
环境准备与安装
安装 PandasAI 库
推荐在虚拟环境中通过 pip 安装:
pip install pandasai
如果你希望使用本地模型(如 Llama、Mistral),可以安装对应的后端扩展:
pip install pandasai[local]
pip install pandasai[ollama] # 例如使用 Ollama 本地服务
配置 API 密钥(使用云端 LLM)
PandasAI 默认使用 OpenAI 模型,你需要设置 API 密钥。可以通过环境变量或代码直接配置:
import os
os.environ["OPENAI_API_KEY"] = "sk-..."
也可在初始化智能代理时传入 api_key 参数。如果使用其他平台(如 Azure OpenAI、Google PaLM),需要提供对应的凭证对象。
初始化 PandasAI 智能代理
所有操作围绕 SmartDataframe 或 Agent 展开。最基本的方式:
from pandasai import SmartDataframe
import pandas as pd
df = pd.DataFrame({
"国家": ["中国", "美国", "印度"],
"人口(亿)": [14.1, 3.3, 14.2],
"GDP(万亿美元)": [17.7, 25.0, 3.4]
})
sdf = SmartDataframe(df)
基础查询:像聊天一样分析数据
简单问答
直接使用 chat() 方法用自然语言提问:
response = sdf.chat("哪个国家人口最多?")
print(response)
# 输出:印度
可以进行数值计算:
sdf.chat("GDP 总和是多少?")
# 输出:46.1 万亿美元
条件过滤与排序:
sdf.chat("按 GDP 从高到低列出所有国家")
# 返回排序后的 DataFrame 表格
获取代码与解释
有时你想查看 PandasAI 生成的底层代码,可以设置 verbose=True 或使用 last_code 属性。
sdf = SmartDataframe(df, config={"verbose": True})
sdf.chat("人均 GDP 最高的国家")
# 控制台会输出生成的代码,如:
# df['人均GDP'] = df['GDP(万亿美元)'] / df['人口(亿)']
# df.sort_values('人均GDP', ascending=False).head(1)
也可以事后查询代码:
print(sdf.last_code_generated)
数据可视化
PandasAI 能够根据要求直接生成图表。只需用自然语言描述你想要的图形:
sdf.chat("绘制人口与 GDP 的散点图,用国家作为标签")
默认会生成一张 PNG 图片路径;在 Jupyter 环境下可以自动显示图像。
你也可以通过返回的路径将图片嵌入报告或网页。如需保存到指定位置,可以指定文件名:
response = sdf.chat("保存一张 GDP 柱状图,文件名为 gdp_bar.png")
可视化支持 Matplotlib 和 Seaborn,你可以要求调整样式、颜色等细节:
sdf.chat("绘制人口分布饼图,使用 seaborn 风格,并添加标题")
连接多种数据源
CSV 文件
无需先读取为 DataFrame,直接传入文件路径:
sdf = SmartDataframe("sales_data.csv")
sdf.chat("找出销售额最高的前 5 天")
Excel 文件
PandasAI 支持读取指定工作表:
sdf = SmartDataframe("report.xlsx", sheet_name="2024Q1")
sdf.chat("利润月度趋势如何?")
数据库(SQL)
通过连接器查询关系型数据库:
from pandasai import SmartDatalake
from pandasai.connectors import SQLConnector
connector = SQLConnector(
config={
"dialect": "mysql",
"host": "localhost",
"username": "root",
"password": "pass",
"database": "sales"
},
tables=["orders", "customers"]
)
lake = SmartDatalake(connector)
lake.chat("每个客户的总消费金额,并画出Top10柱状图")
注意:数据库操作仅在查询时返回样本数据,不会将整个表加载到内存。
高级功能与定制
使用本地模型保护隐私
如果你的数据敏感,可以使用完全本地部署的 LLM,例如通过 Ollama:
ollama pull llama3
然后在代码中指定本地模型:
from pandasai import SmartDataframe
from pandasai.llm.local_llm import LocalLLM
llm = LocalLLM(api_base="http://localhost:11434/v1", model="llama3")
sdf = SmartDataframe(df, config={"llm": llm})
sdf.chat("哪些产品的退货率超过5%?")
自定义提示与安全策略
你可以提供额外的上下文来约束回答格式或风格:
sdf = SmartDataframe(df, config={
"custom_instructions": "用中文回答,并始终给出计算过程。"
})
为防止执行危险代码(如系统调用),PandasAI 内置了一个安全沙箱,但建议避免让 LLM 接触不受信任的输入。
处理大型数据集
PandasAI 本身并不改变 Pandas 的性能,但对于超大 DataFrame,你可以先对数据进行抽样,再用自然语言分析:
sample_df = df.sample(10000)
sdf = SmartDataframe(sample_df)
sdf.chat("这个样本中数值列的相关系数矩阵")
或者使用 SmartDatalake 配合数据库仅查询聚合结果,避免全量加载。
多 DataFrame 分析
SmartDatalake 允许同时加载多个 DataFrame 并进行跨表查询:
customers_df = pd.DataFrame(...)
orders_df = pd.DataFrame(...)
lake = SmartDatalake([customers_df, orders_df])
lake.chat("将订单与客户合并,计算每个城市的总销售额")
常见问题与技巧
如何确保回答准确
- 提供清晰的列名和上下文,避免歧义(例如用“销售额(万元)”而不是“sale”)。
- 对于复杂逻辑,可以先要求 PandasAI 解释它生成的代码,再人工审核。
- 使用
verbose=True查看每次生成的 Python 代码。
错误处理
如果查询遇到错误,PandasAI 会返回一个包含错误信息的字符串。你可以根据提示重新提问或检查数据格式。
缓存 LLM 响应
重复问题可能消耗 API 额度,可以开启简单的响应缓存:
from pandasai import SmartDataframe
sdf = SmartDataframe(df, config={"enable_cache": True})
总结
PandasAI 为数据分析师、业务人员以及学习 Pandas 的新手提供了一条快速通道。它不能完全替代手写代码,但在探索性数据分析、快速出图、报告草稿生成等场景下能显著提升效率。结合本地模型,甚至可以做到离线使用且不泄露数据。现在就可以用几行代码尝试:“我的数据里最有趣的现象是什么?”
更多高级用法和实时更新,请参考 PandasAI 官方文档。