最新发布《数智时代的AI人才粮仓模型解读白皮书(2024版)》,立即领取! 了解详情
写点什么

从 Excel 到 Python

  • 2020-08-04
  • 本文字数:2979 字

    阅读完需:约 10 分钟

从Excel到Python

在 2016 年的 Build 大会上,微软宣布全球有 12 亿人在使用 Excel,而在同一年,全球的人口为 74 亿。也就是说,使用 Excel 的人占全球人口的 16.2%。


2019 年的一份报告( https://slashdata-website-cms.s3.amazonaws.com/sample_reports/ZAamt00SbUZKwB9j.pdf)显示,Python 拥有 820 万活跃开发者,占全球人口的 0.001%。


从这些数据可以看出,增强 Excel 和 Python 之间的交互性对我们是有好处的,这为更多人打开了一扇使用 Python 工具的大门。


Python 在 Excel 前端方面的机会是巨大的。在本文中,我们将分享如何实现一个“典型的”财务 Excel 表格。

先工具,后 Excel

在几乎所有我能想到的场景中,通常是先写 Python 代码,不过必须要保持数据“输入”格式的灵活性。



改变输入数据集格式不应该影响到代码


假设我们使用 Pandas 读取一个或两个 CSV/Excel 表格,可能会依赖一组给定的列名。


如果有数千行这样的代码,我们就依赖了很多硬编码的列名,当我们试图使用 Excel 动态输入列名时,就会遇到问题。


因此,在最初的原型设计阶段,在还没有使用 Excel 工作表时,可以在代码里将列名和内部标签名映射起来:


mappings = {'loan identifier': 'loan_id',               'amt': 'amount',                ...               'init fees': 'initial_fees'}    data.rename(mappings, axis=1, inplace=True) 
复制代码


稍后,这种映射将被 Excel 工作表取代。

Excel 前端

等到 Python 初具模型,就可以开始构建 Excel 前端了。首先,我们要确定哪些变量可以放在 Excel 工作表中。


在开发这类工具时,一般都是要假设输入数据的格式是会变的。


这点要么很重要,要么不那么重要,具体取决于你所在的工作环境以及你要开发什么样的工具。有些工作流程定义得比较好,数据格式不太可能会发生变化。


但是,我总是会倾向于保持谨慎,希望通过 Excel 来增加灵活性,但要注意不要将事情复杂化。



使用 Excel 将 Python 内部列名与外部 CSV/Excel 列名映射起来


使用内部命名系统并允许 Excel 用户指定列映射,这是保持灵活性的一个很好的例子。现在,Excel 用户不再依赖于硬编码的列名,他们可以在不修改 Python 代码的情况下调整列映射。

映射

mappings 是集成的核心部分,它的内容来自 Excel 中的一张表(我通常会叫它 Mapping)。


要得到 mappings,我们需要一个函数来读取 Excel。为此,我们使用了 openpyxl。


我们可以这样读取 Excel 中的单元格:


import openpyxl # 加载工作簿 wb = openpyxl.load_workbook("sheet.xlsx", data_only=True) # 创建工作簿对象 ws = wb.active # 获取单元格E4的值 value = ws['E4'].value 
复制代码


我们可以通过这种方式得到 mappings。我们将代码稍作调整,添加 Excel 工作簿“tool_setup.xlsx”本地路径。


我们还要假设 Excel 的当前工作表可能不是我们想要的那个,而且可能会新增、被删除或被移动,所以我们需要通过遍历找到目标工作表的索引位置:


# 首先,我们设置Excel文件的路径 path = r".\documents\tool_setup.xlsx" # 加载文件,创建工作簿对象 wb = openpyxl.load_workbook(path, data_only=True) # 找到目标工作表的索引 idx = [i for i, name in wb.sheetnames if name == 'Mapping'][0] # 将目标工作表设置为当前工作表 wb.active = idx ws = wb.active 
复制代码


现在,我们可以填充 mappings 内容了 :


mappings = {} mappings['Amount'] = ws["E4"].value mappings['Term'] = ws["E5"].value 
复制代码

保持灵活性

如果工作表里添加了新行或者把旧行删除,有可能会得到一个不正确的 mappings。为了避免这种情况,我们需要 search_col 函数,它会遍历查找每个单元格,直到找到包含我们想要的值(或超过 limit 限制)的单元格。


# 定义一个函数,用于查找openpyxl工作簿对象中的给定列 def search_col(sheet, column, value, limit=100):      # 从1开始,逐行查找,直到达到limit限制     for row in range(1, limit+1):                if sheet[f"column{row}"].value == value:             # 找到想要的单元格,返回单元格的列和行             return (col, row) 
复制代码


search_col 返回我们想要的数据的列和行。



如果没处理好,哪怕是在工作表里添加一个注释也会让工具不可用。左边的“Internal”在第 12 行,而右边是第 14 行。


我们可以像下面这样找到“Internal”的单元格位置:


search_col(ws, 'B', 'Internal') [Out]: ('B', 12) 
复制代码


接下来,我们通过循环往 mappings 添加其他列映射。在遇到两个或者更多个空的单元格后,我们就知道映射内容已经全部读取完毕,就可以结束循环了:


empty = 0  # 初始化空单元格数量 while empty < 2:     # 增加行计数     row += 1     # 赋值     internal = ws[f'B{row}'].value          if internal is None:         empty += 1  # 遇到空单元格就增加空单元格计数     else:         # 加入mappings         mappings[internal] = ws[f'D{row}'].value         empty = 0  # also re-initialize the empty counter 
复制代码


运行上面的代码,就可以得到像下面这样的 mappings:


{     'Loan ID': 'loan identifier',     'Product': 'product type',      ...     'Initial Fees': 'init fees' } 
复制代码


如果要引入其他变量,比如文件路径(filepath),我们只需要找到包含“Filepath”的单元格,并把它的值赋给“filepath”:


row, _ = search_col(ws, 'C', 'Filepath') mappings['filepath'] = ws[f'D{row}].value 
复制代码

集成

最后一步,也是最容易的一步——在 Python 脚本中使用列名。


我们使用上面得到的 mappings,将输入列名转成内部标签。


data = pd.read_csv(mappings['Filepath']) 
复制代码


在将输入列名转成内部标签之前,我们必须翻转键值对,即把键-值转成值-键。


# 翻转 inv_mappings = {mappings[key]: key for key in mappings} 
复制代码


对于这个简单的例子,或许在构建 mappings 时就进行翻转会更方便些。对于复杂一点的工具,我发现使用内部到外部的映射格式会更好。但不管怎样,这一切取决于你自己。


最后,将输入列名转成内部标签:


data.rename(inv_mappings, axis=1, inplace=True) 
复制代码


我们可以做得更灵活一些。为了处理不必要的空格或大小写拼写错误,我们重写了一小部分代码:


data = pd.read_csv(mappings['Filepath']) # 转成小写,剔除不必要的空格 data.rename({col: col.strip().lower() for col in data.columns},             axis=1, inplace=True) # inv_mappings也是一样 # 内部标签使用蛇形命名方式 (不是必需的) inv_mappings = {     mappings[key].strip().lower():         key.strip().lower().replace(' ', '_')     for key in mappings } # 现在安全了 data.rename(inv_mappings, axis=1, inplace=True) 
复制代码


另外,我们在 Excel 中显示内部标签时通常会使用首字母大写和正常空格,而在内部我个人还是选择蛇形命名格式。


"Loan ID" -> "loan_id" "Initial Rate" -> "initial_rate" 
复制代码

结论

我曾见过无数家重度使用 Excel 的公司,这么做可以节省数百个小时用于检查单元格、输入值或等待 Excel 模型处理数据的时间。


尽管自动化和机器学习时代正在迅速地将 Excel 的很多领域自动化,但 Excel 不会很快就消失掉。


目前,世界上发展最快的编程语言(Python)和世界上使用最为广泛的软件(Excel)之间的紧密集成可以给很多行业带来巨大收益。


原文链接:


https://towardsdatascience.com/excel-to-python-79b01638f2d9


2020-08-04 18:333989

评论 1 条评论

发布
用户头像
感觉还是管理Excel这个产品比Python更能和excel对接拓展
2020-08-05 11:04
回复
没有更多了
发现更多内容

活在无限中

少油少糖八分饱

读后感 阅读 动漫 葬送的芙莉莲 有限与无限游戏

Premiere Pro 2024 for mac(pr2024视频编辑器) v24.0完整激活版

mac

苹果mac Windows软件 视频剪辑软件 Premiere Pro 2024

【论文阅读】【三维场景点云分割】Superpoint Transformer for 3D Scene Instance Segmentation

AI帅辉

深度学习 论文阅读 Transformer 分割 3D点云

苹果Mac文件管理浏览软件Path Finder中文破解版 支持Mac14系统

Rose

mac文件管理软件 Path Finder Path Finder破解

Downie 4 for Mac(最好用的视频下载软件) 4.6.31中文激活版

mac

Downie4 苹果mac Windows软件 网站视频下载

DeFi/DAPP质押借贷分红挖矿系统开发/详情方案

V\TG【ch3nguang】

可观测 AIOps 的智能监控和诊断实践丨QCon 全球软件开发大会总结

阿里巴巴云原生

阿里云 云原生 AIOPS 可观测

Defi/DAPP/LP代币流动性质押挖矿系统开发(技术组件)

V\TG【ch3nguang】

充换电企业开迈斯低成本提升线上应用稳定性的最佳实践

阿里巴巴云原生

阿里云 云原生

茶百道全链路可观测实战

阿里巴巴云原生

阿里云 云原生 可观测

Python开发:pycharm pro 2023 永久激活秘钥【Mac/win】

Rose

Python开发 PyCharm破解版 PyCharm Pro密钥 JetBrainsPyCharm

CSS小技巧之单标签loader

南城FE

CSS css3 前端 Loader

Lightroom Classic 2024更新,最新LRC2024中文激活版下载mac/win

iMac小白

Lightroom Classic2024 LrC2024

启动速度提升 10 倍:Apache Dubbo 静态化方案深入解析

阿里巴巴云原生

阿里云 云原生

蓝易云:Centos 7 通过 targz文件安装 Elastic Search服务教程!

百度搜索:蓝易云

elasticsearch Linux centos SEO targz

ATE机台哪家强?

IC男奋斗史

芯片 半导体 职场经验 芯片测试 ATE测试

OpenResty 入门以及 WAF 防御实战

越长大越悲伤

nginx openresty waf

Easysearch压缩模式深度比较:ZSTD+source_reuse的优势分析

极限实验室

easysearch

ARTS 打卡第6周

AI帅辉

ARTS 打卡计划 学习分享

如何转产品工程师?

IC男奋斗史

职业规划 芯片 半导体 芯片测试 ATE测试

Avid Sibelius Ultimate 2023 for Mac(西贝柳斯音乐记谱软件)

Rose

西贝柳斯终极解锁版 Avid Sibelius 2023 Mac Mac乐谱制作软件

Illustrator 2024 for mac(标准矢量插画设计软件) v28.0完整激活版

mac

苹果mac Windows软件 矢量图形编辑软件 Illustrator 2024

安装Linux系统对硬件的要求

二哈侠

文心一言 VS 讯飞星火 VS chatgpt (113)-- 算法导论10.2 5题

福大大架构师每日一题

福大大架构师每日一题

不抖机灵!让工程师来告诉你做芯片是如何烧钱的!

IC男奋斗史

芯片 半导体 芯片测试 ATE测试

蓝易云:Redis相比Memcached有哪些优势?

百度搜索:蓝易云

redis memcached 云计算 Linux 云服务器

Python - 字典2

小万哥

Python 程序员 软件 后端 开发

Apache Dubbo 云原生可观测性的探索与实践

阿里巴巴云原生

Apache 阿里云 云原生 dubbo

基于 Triple 实现 Web 移动端后端全面打通

阿里巴巴云原生

阿里云 微服务 云原生

Bridge 2024 (BR)新功能介绍及破解安装教程

Rose

Adobe Bridge 2024 BR2024下载 Bridge 2024破解版 Bridge 2024 中文版

几款好用的苹果Mac硬盘检测工具

Rose

SSD mac软件下载 Mac硬盘健康 硬盘检测软件

从Excel到Python_语言 & 开发_James Briggs_InfoQ精选文章