Python自动化小技巧24——实现自动化输出模板表格报告

server/2024/11/19 0:35:31/

背景

很多人拿到数据excel文件,然后要写报告,做表格,要各种计算,各种排序,分组聚合,数据透视,然后合并单元格,添加边框,加粗,添加显示规则,添加数据条......然后变成固定格式的表格,复制到word里面或者直接发给领导看。 一样的工作每天或者每月都做的话,重复性的劳动真的很没有意义....

为什么不用Python进行自动化呢,单元格的颜色填充都可以模板化,自定义化。 代码开发完后,以后拿到数据只需双击运行一下代码,就可以模板化输出自己的报告啦

什么?不会写代码...在AI如此发达的今天,不会就问,就学倍。

本次就全场使用gpt编程,来给大家演示怎么对自己的数据进行一个模板化的报告输出。

所有过程都可以使用自然语言和gpt对话完成,让他来写代码,不会编程一样能做出属于自己的自动化程序。


代码实现(提示词实现)

不需要你写代码,你需要和gpt提需求就好了。

我们从头开始,

生成/读取数据

首先我要分析我需要数据,我懒得找数据了....就直接让gpt帮我生成一个数据:

帮我生成一个pandas数据框,要有4列,第一列时间(按月统计),第二列地区,第三列产品名称,第四列销售量。 时间就从2023-11到2024-10。地区就北上广深杭州南京6个城市,产品名称就是产品ABC3众,销售量你numpy正态分布随机来吧

然后gpt就吭哧吭哧的写出代码,你放入python中运行:

python">import pandas as pd
import numpy as np# 定义时间范围
date_range = pd.date_range(start='2023-11-01', end='2024-10-31', freq='M').strftime('%Y-%m')# 定义地区和产品名称
regions = ['北京', '上海', '广州', '深圳', '杭州', '南京']
products = ['产品A', '产品B', '产品C']# 创建数据框架
data = {'时间': np.repeat(date_range, len(regions) * len(products)),'地区': np.tile(np.repeat(regions, len(products)), len(date_range)),'产品名称': np.tile(products, len(date_range) * len(regions)),'销售量': np.random.normal(loc=500, scale=100, size=len(date_range) * len(regions) * len(products)).astype(int)
}df = pd.DataFrame(data)# 确保销售量非负
df['销售量'] = df['销售量'].apply(lambda x: max(x, 0))
df.shape
df

挺好,就是自己想要的样子。

如果你是本地excel数据要读取,那就问gpt,怎么用pandas读取本地文件就好了。你告诉它你数据张什么样,要如何读取......用它写的代码就能读取进来,和我上面生成的这个是一样的。很简单。


分组聚合计算统计量

我们要统计不同地方不同商品的销售量变化,那我就开始问gpt了:

好,现在帮我进行统计,我要输出一个多层索引的表。 首先可以计算一个环比,每个地区每个产品比上个月的销售量环比增加了多少。 然后进行数据的变形,行是不同的时间,列是多层索引,第一层是不同的地区,第二层是不同的商品,取值就是销售量的环比

然后它就会写出代码:

python">df.sort_values(by='时间', inplace=True)
# 计算环比变化
df['环比'] = df.groupby(['地区', '产品名称'])['销售量'].pct_change()
# 将数据变形为所需的多层索引格式
pivot_table = df.pivot_table(index='时间',  columns=['地区', '产品名称'], values='环比')
pivot_table

就这么短短几行代码就行了,不比excel方便??


格式化模板样式输出

我们继续,按照自己想要的样式来保存这个Excel表。

一般人做表可能就是添加一下突出单元格规则显示,单元格颜色填充,表头加粗什么的。但是我这里为了演示啥样式python都能实现,也为了考验gpt的理解能力,我就进行了各自花里胡哨的样式添加,什么颜色,填充,字体,下划线,边框,数据条,全部都改一下,所以我的提示词如下:

好,我现在要进行储存,但我想用openxl库进行格式的调整。

1.把pivot_table表头第一层索引使用蓝色填充,字体加大加粗,转为白色,第二层索引使用浅蓝色填充。

2.对产品c的列添加渐变色的数据条,条件格式里面的的数据条。

3.对产品a里面取值大于0.3的单元格浅红色填充,小于0.2的用浅绿色填充。

4.产品b里面大于0.3的单元格的字体加粗,斜线,转为橙色字体,小于0的单元格,边框加满,字体加上下划线

然后gpt就会生成代码:

python">import pandas as pd
import numpy as np
from openpyxl import Workbook
from openpyxl.styles import PatternFill, Font, Border, Side
from openpyxl.formatting.rule import CellIsRule, ColorScaleRule, DataBarRule
from openpyxl.drawing.image import Imagefile_name = 'styled_pivot_table.xlsx'
pivot_table.to_excel(file_name, engine='openpyxl')# 打开生成的 Excel 文件进行格式化
wb = load_workbook(file_name)
ws = wb.active# 定义格式
header_fill1 = PatternFill(start_color='0000FF', end_color='0000FF', fill_type='solid')  # 蓝色
header_fill2 = PatternFill(start_color='ADD8E6', end_color='ADD8E6', fill_type='solid')  # 浅蓝
font_header1 = Font(size=12, bold=True, color='FFFFFF')  # 白色字体# 应用样式到第一层和第二层表头
for cell in ws[1]:  # 第一行是第一层表头cell.fill = header_fill1cell.font = font_header1for cell in ws[2]:  # 第二行是第二层表头cell.fill = header_fill2# 条件格式化
# 为产品C添加数据条
for col in ws.iter_cols(min_row=2, min_col=3, max_col=ws.max_column):col_header_value = col[0].valueif col_header_value and '产品C' in col_header_value:col_letter = col[0].column_letterws.conditional_formatting.add(f'{col_letter}3:{col_letter}{ws.max_row}',DataBarRule(start_type='num', start_value=0,end_type='num', end_value=1,color='FF638EC6', showValue="None"))# 为产品A添加特定条件的单元格格式
for col in ws.iter_cols(min_row=2, min_col=1, max_col=ws.max_column):col_header_value = col[0].valueif col_header_value and '产品A' in col_header_value:col_letter = col[0].column_letter# 大于0.3的单元格浅红色填充ws.conditional_formatting.add(f'{col_letter}3:{col_letter}{ws.max_row}',CellIsRule(operator='greaterThan', formula=['0.3'],fill=PatternFill(start_color='FFC7CE', end_color='FFC7CE', fill_type='solid')))# 小于0.2的单元格浅绿色填充ws.conditional_formatting.add(f'{col_letter}3:{col_letter}{ws.max_row}',CellIsRule(operator='lessThan', formula=['0.2'],fill=PatternFill(start_color='C6EFCE', end_color='C6EFCE', fill_type='solid')))# 为产品B的特定格式
bold_italic_orange_font = Font(bold=True, italic=True, color='FFA500')  # 橙色, 加粗, 斜体
underline_font = Font(underline='single')  # 下划线
border_style = Side(border_style='thin', color='000000')
full_border = Border(left=border_style, right=border_style, top=border_style, bottom=border_style)for col in ws.iter_cols(min_row=2, min_col=1, max_col=ws.max_column):col_header_value = col[0].valueif col_header_value and '产品B' in col_header_value:col_letter = col[0].column_letter# 大于0.3的字体加粗斜体橙色ws.conditional_formatting.add(f'{col_letter}3:{col_letter}{ws.max_row}',CellIsRule(operator='greaterThan', formula=['0.3'],font=bold_italic_orange_font))# 小于0的单元格加边框和下划线ws.conditional_formatting.add(f'{col_letter}3:{col_letter}{ws.max_row}',CellIsRule(operator='lessThan', formula=['0'],font=underline_font,border=full_border))# 保存工作簿
wb.save(file_name)

这样,它就把结果表生成好了,我们打开看看效果:

 

很不错!!!,基本都是按照我的要求来的,美中不足的是产品A我指定的是小于0.2填充为浅绿色,但是它空白的位置也填充为浅绿色了,,,不过无伤大雅。

当然实际工作的表格不可能这么花里胡哨......我只是为了演示 “颜色,填充,字体,下划线,边框,数据条”这些都可以用python调整。并且GPT都能理解,都能写出来,很方便的。

你只需要用自然语言表述出你的需求,然后它写代码,你运行就好了,很简单的。

(当然,也不是完全没门槛,据我观察,很多人是写不出自己的明确需求的.....就我这提示词,他们都写不出来,并且他们很多没有数据思维,可能自己都不知道自己想要的是什么,更别说清楚的表述出来让AI理解了。并且AI也不一定一次都写的对,需要你自己和他反复对话反复调整。但是很多人没这个耐心和能力,觉得AI写的东西不是自己想要的就说它垃圾.....再也不用了....我只能说这种人没有任何自学思维...活该工作效率低)


以前的文章可以参考
自动化小技巧_阡之尘埃的博客-CSDN博客">


http://www.ppmy.cn/server/143030.html

相关文章

Shell学习(一)——基础命令

01 find、grep find find pathname -options pathname 查找的目录路径, 例如 .表示当前目录, /表示根目录-name 按文件名查找文件 (递归查找文件)-size 按文件大小查找文件-mtime 按文件修改时间查找文件,例如 -mtime -2 查找 48 小时内修改…

动手学深度学习69 BERT预训练

1. BERT 3亿参数 30亿个词 在输入和loss上有创新 两个句子拼起来放到encoder–句子对 cls-class分类 sep-seperate 分隔符 分开每个句子 告诉是哪个句子 两个句子给不同的向量 位置编码不用sin cos, 让网络自己学习 bert–通用任务 encoder 是双向的,…

基于Python的仓库管理系统设计与实现

背景: 基于Python的仓库管理系统功能介绍 本仓库管理系统采用Python语言开发,利用Django框架和MySQL数据库,实现了高效、便捷的仓库管理功能。 用户管理: 支持员工和管理员角色的管理。 用户注册、登录和权限分配功能&#x…

html文本元素

在HTML中&#xff0c;文本元素指的是用于展示文本内容的元素。以下是一些常用的HTML文本元素&#xff1a; <h1>至<h6>&#xff1a;标题元素&#xff0c;<h1>表示最高级别的标题&#xff0c;<h6>表示最低级别的标题。<p>&#xff1a;段落元素&am…

蓝桥杯每日真题 - 第13天

题目&#xff1a;&#xff08;删边问题&#xff09; 题目描述&#xff08;14届 C&C B组F题&#xff09; 解题思路&#xff1a; 图的构建&#xff1a;使用邻接链表表示图&#xff0c;边的起点和终点分别存储在数组中&#xff0c;以支持高效的遍历。 Tarjan算法&#xff1a…

Nature Communications 基于触觉手套的深度学习驱动视触觉动态重建方案

在人形机器人操作领域&#xff0c;有一个极具价值的问题&#xff1a;鉴于操作数据在人形操作技能学习中的重要性&#xff0c;如何有效地从现实世界中获取操作数据的完整状态&#xff1f;如果可以&#xff0c;那考虑到人类庞大规模的人口和进行复杂操作的简单直观性与可扩展性&a…

构建SSH僵尸网络

import argparse import paramiko# 定义一个名为Client的类&#xff0c;用于表示SSH客户端相关操作 class Client:# 类的初始化方法&#xff0c;接收主机地址、用户名和密码作为参数def __init__(self, host, user, password):self.host hostself.user userself.password pa…

kafka消费数据太慢了,给优化下

原代码 public class KafkaConsumerDemo {public static void main(String[] args) {int numConsumers 5; // 增加消费者的数量for (int i 0; i < numConsumers; i) {new Thread(new KafkaConsumerThread()).start();}}static class KafkaConsumerThread implements Runn…