Python 可以为 Excel 做些什么?如果你经历过工作簿意外崩溃、计算出错,并且需要执行枯燥的手动操作,那么肯定想知道这个问题的答案。这本书是为工作表软件用户准备的一本全面又简明扼要的 Python 入门指南。不要因为害怕学习编程就避而远之,费利克斯为学习 Python 提供了一个极佳的切入点,即便是经验丰富的程序员也能从中获益。同时,他将这本书的内容进行了合理的编排,使得像你一样的 Excel 用户更易于理解和应用。可以指导人们如何在 Python 的帮助下最大化地发挥 Excel 的能力。如果你想知道 Excel 结合 Python 有何潜能,那么费利克斯是回答这个问题的不二人选。希望你能像我一样喜欢这堂大师课程。
从 Excel 到 Python 是一种自然的过渡,并且 Python 会让人想要直接丢掉 Excel。虽然这种想法很吸引人,但是要直接丢掉 Excel 还是不那么现实。Excel 不会消失,它会作为一种用途广泛的桌面工具持续存在于企业和家庭中。这本书架起了连接这两个世界的桥梁。书中解释了你应该如何将 Python 集成到 Excel 中,以及如何从躲都躲不掉的巨型工作簿、上千个公式、奇形怪状的 VBA 代码中解脱。这本书可能是我读过的关于 Excel 的书之中最有用的一本,并且是每一位高级 Excel 用户的必读书目。强烈推荐!
Excel 一直是金融界的基础性工具,但是有大量的 Excel 应用程序用处不大。这本书很好地教会了读者如何在 xlwings 的帮助下构建更优秀、更健壮的 Excel 应用程序。
目录
每当工作表工具碰到瓶颈,Excel 用户就会开始质疑这些工具。当 Excel 工作簿保存了太多的数据和公式时,它们就会变得越来越慢甚至崩溃,这样的事屡见不鲜。不过在事态变得严重之前,或许应该先思考一下你的工作方式。比如你处理的是十分重要的工作簿——一旦发生错误便会造成经济损失或名誉损失;又或者你每天都要花上几小时来手动更新Excel 工作簿。如果碰到上述情形,那么你就应该学习一下如何用一门编程语言来自动化这些操作。自动化能够避免人为错误的发生,并且能够让你把更多的时间花在更具生产力的任务上——而不是花大量时间把数据复制并粘贴Excel 工作表中。
既然你已经知道为何 Python 可以成为 Excel 的“好伙伴”,那么是时候配置好环境,开始
写你的第一行 Python 代码了!
看到最后有惊喜哦,文末可领取此书本资料~
开发环境
2.1.1 安装
前往 Anaconda 主页下载最新版的 Anaconda 安装器(个人版,Individual Edition)。要确保下载的是 Python 3.x 版本的 64 位图形化安装器。下载完成之后,双击安装器开始安装,确保所有选项保持默认值。更详细的安装过程请参照 Anaconda 官方文档。
安装好 Anaconda 之后,就可以启动 Anaconda Prompt 开始学习了。下面来看看这是个什么东西,又是如何工作的。
2.1.2 Anaconda Prompt
Anaconda Prompt 实际上就是 Windows 中的一个命令提示符或者 macOS 中的终端,只不过它配置好了 Python 解释器和第三方包。Anaconda Prompt 是执行 Python 代码的最基本的工具,本书会大量使用它来执行 Python 脚本和各种包提供的命令行工具。
2.1.3 Python REPL:交互式Python会话
在 Anaconda Prompt 中,可以通过执行 python 命令启动一个交互式 Python 会话:
(base) C:\Users\felix>python
Python 3.8.5 (default, Sep 3 2020, 21:29:08) [...] :: Anaconda, Inc. on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>
macOS 终端中显示的文本可能有些不一样,但是道理都是一样的。本书是按照 Python 3.8版本撰写的,如果你想用更新的版本,一定要看一下本书主页上的说明。
2.1.4 包管理器:Conda和pip
我在前面提到过 Python 的包管理器 pip,它负责下载、安装、更新和卸载 Python 包及其依赖项和子依赖项。虽然 Anaconda 也可以配合 pip 工作,但是它还有一个名为 Conda 的内置包管理器。Conda 的一大优势是不仅可以安装 Python 包,还可以安装多种版本的 Python解释器。一言以蔽之:软件包可以为 Python 添加标准库中所没有的功能。第 5 章将介绍的pandas 就是这样的包。由于 Anaconda Python 发行版已经预装好了这些包管理器,因此就不需要我们手动安装了。
2.1.5 Conda环境
你可能很好奇 Anaconda Prompt 每行开头的 (base) 到底是什么。它是当前激活的 Conda环境的名称。Conda 环境是一个被隔离的“Python 世界”,有着特定版本的 Python 和一系列安装好的包。为什么非要这么做呢?当你同时开发多个项目的时候,各个项目会有不同的需求:一个项目可能需要 Python 3.8 和 pandas 0.25.0,而另一个项目可能需要 Python3.9 和 pandas 1.0.0。由于为 pandas 0.25.0 编写的代码往往需要进行修改才能用到 pandas1.0.0 上,因此不能只更新 Python 和 pandas 而保持代码原封不动。为每个项目都配置一个Conda 环境可以保证它们使用正确的依赖项运行。Conda 环境虽然是 Anaconda 发行版的专有概念,但虚拟环境是所有 Python 发行版的通用概念。相比之下 Conda 环境更加强大,因为它不仅可以管理多个版本的软件包,还可以轻松管理不同版本的 Python 解释器。
学习 点击拿走腾讯文档-在线文档https://docs.qq.com/doc/DT3VGWkhwRml0WlFC
Python入门
3.1 数据类型
和其他编程语言一样,Python 会区别对待数字、文本、布尔值等数据。Python 的做法是为它们赋予不同的数据类型(data type)。最常用的数据类型有整型、浮点型、布尔值和字符串。本节会通过一些例子对它们进行逐一介绍。要理解什么是数据类型,需要先解释一下什么是对象。
3.2 索引和切片
索引和切片让你可以访问一个序列的指定元素。字符串是字符的序列,我们可以通过字符串来学习这种机制。下一节还会介绍其他支持索引和切片的序列,比如列表和元组。
3.3 数据结构
Python 提供了强大的数据结构以便于处理对象集合。本节会介绍列表、字典、元组和集合。虽然每种数据结构有各自的特点,但它们有一个共同特点,即都能存储多个对象。在VBA 中,你可能用过集合或者数组来保存多个值。VBA 也提供了一种名为字典的数据结构,这和 Python 中的字典是一样的,不过还是只能用在 Windows 中。现在先来学习最常用的数据结构——列表。
3.4 控制流
本节会介绍 if 语句、 for 循环和 while 循环。 if 只会在满足特定条件时执行特定的代码,for 循环和 while 循环会反复执行代码块中的代码。在本节末尾,我还会介绍列表推导式,它可以代替 for 循环完成列表的构造。本节首先会介绍代码块的定义,同时还会介绍Python 最值得注意的特点:有特殊含义的空白。
3.5 组织代码
在本节中我们会了解到如何让代码形成可维护的结构:首先会介绍函数的核心知识,然后会教你如何将代码分成不同的 Python 模块。在本节末尾,我们会运用所学知识研究标准库中的 datetime 模块。
3.6 PEP 8:Python风格指南
你可能很好奇为什么我有时候在变量名中加下划线,有时候又会把变量名全部大写。在本节中,我会一边介绍 Python 官方的风格指南,一边解释我在格式化方面的选择。Python使用所谓的Python 改进提案(Python Enhancement Proposals,PEP)来讨论新语言特性的引入。Python 代码的风格指南就是其中之一。这些提案一般用数字来表示,代码风格指南就被称作 PEP 8。PEP 8 是一系列提供给 Python 社区的风格建议。如果使用相同代码的所有人都遵循相同的代码风格,那么写出的代码可读性就会更高。在开源的世界中,会有很多互不相识的程序员开发同一个项目,此时遵循相同的代码风格会显得尤为重要。
例 3-2中这个简短的 Python 文件展示了最重要的编程惯例。
例 3-2 pep8_sample.py
"""这个脚本展示了一些PEP 8的规则 ➊
"""
import datetime as dt ➋
TEMPERATURE_SCALES = ("fahrenheit", "kelvin",
"celsius") ➌
➍
class TemperatureConverter: ➎
pass # 暂时不做任何事 ➏
def convert_to_celsius(degrees, source="fahrenheit"): ➐
"""这个函数将华氏度或开氏度转化为摄氏度 ➑
"""
if source.lower() == "fahrenheit": ➒
return (degrees-32) * (5/9) ➓
elif source.lower() == "kelvin":
return degrees - 273.15
else:
return f"Don't know how to convert from {source}"
celsius = convert_to_celsius(44, source="fahrenheit")
non_celsius_scales = TEMPERATURE_SCALES[:-1]
print("Current time: " + dt.datetime.now().isoformat())
print(f"The temperature in Celsius is: {celsius}")
➊ 在文件顶部用文档字符串(docstring)解释这个脚本或者模块做了些什么。文档字符串是一种特殊的字符串,它用 3 个引号引用。除了作为代码的文档,它还可以用来编写跨越多行的字符串。如果你的字符串中有很多双引号或单引号,那么也可以用文档字符串来避免转义。我们会在第 11 章中看到,编写跨越多行的 SQL 查询时,文档字符串也很好用。
➋ 所有的导入语句都应该放在文件顶部,一行一个导入。从标准库导入的内容放在前面,然后是第三方包,最后是自己编写的模块。不过这个例子中只用到了标准库。
➌ 用大写字母和下划线表示常量。每行的长度不超过 79 个字符。尽可能地利用圆括号、方括号或花括号隐式跨行。
➍ 类、函数和其他代码之间用两个空行隔开。
➎ 尽管很多类像 datetime 一样使用小写字母命名,但是你自己编写的类也应该使用首字母大写的名称( CapitalizedWords )。有关类的更多内容请参见附录 C。
➏ 行内注释应该和代码间隔至少两个空格。代码块应该用 4 个空格缩进。
➐ 在能够提高可读性的情况下,函数和参数应该使用小写字母和下划线命名。不要在参数名和默认值之间使用空格。
➑ 函数的文档字符串应当列出函数参数并解释其意义。为了让例子更简短我并没有这么做,但我们会在第 8 章配套代码库中看到,excel.py 具有完整的文档字符串。
➒ 冒号前后不要使用空格。
➓ 可以在算术运算符前后使用空格。如果同时使用了优先级不同的运算符,则应当考虑在优先级最低的运算符前后添加空格。在本例中,由于乘号的优先级最低,因此它的前后被添加了空格。
变量名称使用小写字母。在可以提升可读性的前提下使用下划线。为变量赋值时,在等号前后添加空格。不过在调用函数时,不要在关键字参数前后使用空格。在进行索引和切片时,不要在方括号前后使用空格。这只是对 PEP 8 的一个简单介绍,在你开始认真使用 Python 之后,应该看一下 PEP 8 的原文。PEP 8 明确指出,这些规则只是建议,应当优先考虑你自己的编程风格。毕竟统一性才是最重要的。如果你对其他公开的编程风格指南感兴趣,也可以看一下谷歌的 Python 风
格指南,它和 PEP 8 比较接近。实际上大部分 Python 程序员并未严格遵循 PEP 8,最常见的错误是每行超过了 79 个字符。在编写代码时,要保持格式规整可能很难,不过你可以利用工具让它自动检查代码是否遵循了某种编程风格。下一节会教你如何使用 VS Code 进行自动格式化。
pandas入门
4.1 NumPy数组
正如第 3 章所描述的那样,如果要对嵌套列表进行数组运算,可以使用循环来完成。例如,要为嵌套列表中的每一个元素都加上 1,可以使用下面的嵌套列表推导式:
In [1]: matrix = [[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]
In [2]: [[i + 1 for i in row] for row in matrix]
Out[2]: [[2, 3, 4], [5, 6, 7], [8, 9, 10]]
但是这样的代码可读性很低。更关键的是,在面对更大的数组时,遍历整个数组会非常慢。如果你的用例和数组大小合适的话,那么使用 NumPy 数组进行运算会比 Python 列表快上几百倍。为了达到如此高的性能,NumPy 利用了用 C 和 Fortran(它们都是编译型语言,比 Python 要快得多)编写的代码。NumPy 数组是保存同构数据(homogenous data)的 N 维数组。“同构”意味着数组中的所有数据都必须是相同类型。最常见的情况就是处理
图 4-1 所示的一维和二维的浮点数数组。
索引
一维数组
轴0
轴0
轴1
二维数组
图 4-1:一维和二维的 NumPy 数组
下面来创建一个一维数组和一个二维数组,本章会一直使用这两个数组。
In [3]: # 首先导入NumPy
import numpy as np
In [4]: # 使用列表构造一个一维数组
array1 = np.array([10, 100, 1000.])
In [5]: # 使用嵌套列表构造一个二维数组
array2 = np.array([[1., 2., 3.],
[4., 5., 6.]])
数组维度
要注意一维数组和二维数组之间的区别。一维数组只有一个轴,因此不区分行数组和列数组。这和 VBA 中的数组是类似的,但是如果你是从 MATLAB等语言(MATLAB 中的一维数组会区分行数组和列数组)转过来的,那么可能需要花点儿时间习惯 NumPy 的做法。
即使 array1 除了最后一个元素(浮点数)之外全是整数,但由于 NumPy 对同构的要求,这个数组的数据类型依然是 float64 ,这个类型足以容纳所有的元素。要想了解一个数组的数据类型,可以访问它的 dtype 属性:
In [6]: array1.dtype
Out[6]: dtype('float64')
dtype 返回的是 float64 而不是第 3 章中介绍过的 float 。你可能已经猜到了,NumPy 使用的是它自己的数值数据类型,它们比 Python 的数据类型粒度要细。通常这都不是问题,因为大部分时候 Python 和 NumPy 中的不同数据类型可以自动转换。如果你需要显式地将NumPy 数据类型转换成 Python 的基本数据类型,只需使用对应的构造器即可(稍后我会更详细地介绍如何存取数组的元素):
In [7]: float(array1[0])
Out[7]: 10.0
在 NumPy 的文档中可以看到 NumPy 数据类型的完整列表。我们马上就会看到,有了NumPy 数组,就可以以简洁的方式执行数组运算了。
5.2 数据操作
真实世界的数据并非天上掉下来的,在使用数据之前,需要对其进行清理,使其更易于理解。在本节开头,先来看看如何从 DataFrame 中选取数据,如何修改数据,以及如何处理缺失和重复的数据。然后再对 DataFrame 进行一些运算,看看如何处理文本数据。在本节末尾,你会明白 pandas 什么时候会返回视图,什么时候又会返回数据的副本。本节中的很多概念和我们在第 4 章的 NumPy 数组中看到的是相关联的。
5.3 组合DataFrame
在 Excel 中组合不同的数据集是一件麻烦事,通常需要用到很多 VLOOKUP 公式。幸运的是,DataFrame 的组合是 pandas 的“撒手锏”,数据对齐机制也会让实现相关功能获得极大的便利,进而能够减少错误发生的可能性。组合和合并 DataFrame 的方法有很多,本节会涉及最常用的 concat 、 join 和 merge 。虽然这些函数的功能有重叠的部分,但是每一个函数都可以让一类特定的工作更加轻松。我会先介绍 concat 函数,然后解释 join 函数的不同选项,最后介绍通用性最高的 merge 函数。
5.4 描述性统计量和数据聚合
让大型数据集更有条理的方法之一是计算整个数据集或者子集上的描述性统计量,比如总和或平均值。本节首先会介绍如何在 pandas 中计算这些统计量,然后会介绍将数据聚合到子集中的两种方式: groupby 方法和 pivot_table 函数。
5.5 绘图
绘图可以将数据分析的结果可视化,这可能是整个数据分析过程中最重要的一步。我们需要用到两个库来进行绘图,首先来看 pandas 默认的绘图库 Matplotlib,之后再着眼于另一个现代化的绘图库,即 Plotly,我们可以用它在 Jupyter 笔记本中获得更好的交互式体验。
5.6 导入和导出DataFrame
到目前为止,我们用各种方式构造了 DataFrame:嵌套列表,字典和 NumPy 数组。知道这些技巧很有必要,但是很多时候我们的数据已经准备好了,你只需要将它录入 DataFrame。要做到这一点,pandas 为你提供了各种读取函数。但即便要访问一个专用的系统且 pandas没有提供内置的读取器,你通常也有一个 Python 包来连接这个系统,一旦获得了数据,要把数据录入 DataFrame 也就很容易了。在 Excel 中,数据导入通常是 Power Query 的工作。在分析和修改数据集之后,你可能想把结果推送回数据库或者导出到一个 CSV 文件中,又或者如本书书名所述,把它放到 Excel 工作簿中给你的上级看。要导出 pandas DataFrame,可以使用 DataFrame 提供的导出方法。表 5-7 展示了最常用的导入和导出方法。
后续章节资料学习可以点击下方链接获取哦~ ↓
点击拿走腾讯文档-在线文档https://docs.qq.com/doc/DT3VGWkhwRml0WlFC