前言
最近做项目,需要统计分析哪些不合规,按照项目情况分析治理,其实经常是Excel填一下,然后填个时间之类的,也没有做一个平台,数据库存储,自动筛选生成报表,这样每次都要对Excel进行统计分析,然后才生成报表,为了提升效率,写个代码自动分析,生成报表数据,其实也可以自动生成报表图,只是代码写的比较多。
准备分析
一般业界使用python处理报表,并不是性能强,而是各种数据统计库比较齐全,代码编写少,所以还是使用python吧,毕竟AI训练使用的github上python代码居多,使用最广泛的语言。做个报表而已,又不是什么关键大并发的业务,AI完全自动生成就行,有问题调试一下,完美的vibe coding场景。笔者使用opencode,GLM模型。
demo
先安装pandas的包,AI推荐使用pandas,笔者以前很少使用python,这个包没用过,安装pip3 install默认从国外官网仓库,使用国内镜像加速
准备阶段
# 设置全局镜像源(以清华大学源为例)
pip3 config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
pip3 config set global.trusted-host pypi.tuna.tsinghua.edu.cn
pip3 install pandas
AI使用的命令是pip,但是实际上应该使用pip3,因为Python迭代到3版本,为了跟Python2版本区分加了3的大版本

然后通过AI提示写代码,其实也可以写skills,通过opencode写代码,cli非常nice。但是我既然skills都了然了,目标非常明确,直接需求让AI写代码片段不就好了,自己拼接一下,避免写伪代码,毕竟笔者的场景就使用那么几回。
简单统计
列名其实就是表格的第一行命名。从语法看类似SQL
import pandas as pd
def deal_xlsx(filename):
# 读取Excel,贼简单,比Java代码简洁太多了,读取文件后是一个DataFrame,还可以对这个进行筛选,不影响原表格数据
res_26 = pd.read_excel(filename, sheet_name='sheet1').query('`列计划` == "2026年计划"')
# group count 聚合函数,也可以使用去重函数计数 nunique()
# 统计结果是Series,可以for遍历
# res_count = res_26.groupby('列分类组')['列1'].nunique()
res_count = res_26.groupby('列分类组')['列1'].count()
print(res_count)
def aggregate_xlsx(filename_1, filename_2):
#
print()
if __name__ == '__main__':
deal_xlsx("/Users/huahua/Downloads/demo.xlsx")
先筛选分组统计计数吧,其实Excel也很方便,但是Excel打印数据不方便,笔者本地未安装Excel,用系统自带的演示

自带Excel其实使用还好,但是不方便使用微软的一系列能力,然后运行

这个简单,Conda可以安装非Python的代码包,比如CPython,一般而言pip3即可
pip3 install openpyxl

再次运行

这样就筛选了26年计划的分组统计,如果需要其他维度的更多统计,可以进行迭代,这个分组,且可以查询出具体的内容,比如我需要统计,结束日期大于今天的分组和统计
# 先转时间
res_26['列日期开始'] = pd.to_datetime(res_26['列日期开始'], errors='coerce')
res_26['列日期结束'] = pd.to_datetime(res_26['列日期结束'], errors='coerce')
now = datetime.now()
for key,val in res_count.items():
not_exec_num = res_26.query('`列分类组` == @key and `列日期结束` > @now')['列1'].nunique()
print(key, val, not_exec_num)
执行一下:

完美,可以根据实际情况进行处理,让AI生成代码片段,自己组装逻辑
其实也可以使用嵌套的方式筛选
# 读取Excel,贼简单,比Java代码简洁太多了,读取文件后是一个DataFrame,还可以对这个进行筛选,不影响原表格数据
res_26 = pd.read_excel(filename, sheet_name='sheet1')#.query('`列计划` == "2026年计划"')
res_26 = res_26[res_26['列计划'] == "2026年计划"]
嵌套的条件可以支持多条件判断,结果一样。如果需要打印某一列,可以使用列名取数,tolist()函数打印,打印的风格代码随意组装。
多维度统计
其实上面的统计只有一个分组的聚合函数,如果需要多维度的聚合
pd_data = pd.read_excel(filename, "sheet1")
result = pd_data.groupby("聚合分组的字段").agg(
A聚合函数的结果标签=('聚合函数字段A', '函数名,比如count'),
B聚合函数的结果标签=('聚合函数字段B', '函数名,比如min'),
).reset_index()
print(result)
多字段聚合处理,类似SQL的group by having,当然可以支持多聚合函数。
多表格合并
看一个重要的逻辑,如果需要多表格合并,则需要merge
def aggregate_xlsx(filename_1, filename_2):
#读取2个Excel
res_l = pd.read_excel(filename_1, sheet_name='sheet1')
res_r = pd.read_excel(filename_2, sheet_name='sheet1')
# 合并,一般为内连接,或者左连接,SQL语法,以左连接为例
res = pd.merge(res_l, res_r, on="列1", how="left")
res.to_excel("xxx.xlsx", index=False)
print(res)
然后发起调用,这样得到的就是最终合并的结果xlsx,其实就是SQL的join
总结
其实如果笔者自己搜索引擎查询也可以实现,查看选型,然后查看pandas api说明,根据笔者的需求实现统计功能,毕竟比Excel的统计效率高太多了,以后每次可以用,统计内容稍微改一下代码可以长期使用,当然也可以通过opencode的skills实现从0到完成,但是其实也是写代码。
Python真少代码,包已经封装超级完善,尤其是工具的调用,随然也可以面向对象,但是比Java代码少了不知道多少倍,尤其适用AI的实现,代码少,github开源多,而且3.14.x之前还是gil,多线程并发就相对麻烦很多。
1260

被折叠的 条评论
为什么被折叠?



