从Excel到Python数据分析:Pandas、xlwings、openpyxl、Matplotlib的交互与应用
上QQ阅读APP看书,第一时间看更新

2.1 程序设计

Python是一门面向对象编程的语言,它具备丰富的库,能够轻松地与其他语言进行连接,因此Python语言也经常被称为“胶水”语言。在Python中,“类、成员、对象、属性、方法”是面向对象编程的几个核心概念。例如把具有相同属性和方法的对象归为一个类(class),“物以类聚”,类是抽象的。对象是某个类中的每个实体,对象是类的实例化结果,万物皆对象,对象是具体存在的事物。对象可以有自己的属性和动态行为,静态的属性、动态的方法,属性和方法是所在类的成员,属性和方法是构成一个类的主要部分。

2.1.1 编码规范

依据尼古拉斯·沃斯的理论:程序本质上就是对数据的一种处理流程。任何流程都有基本的输入与输出,只有当输入遵循一定的规则时,输出才能达到预期的效果。这些输入的规则便是Python编码与命名规范等。

在生产制造行业有“模具是工业之母,IE(工业工程)是工业之父”的说法。IE在面向微观管理时有要求遵循“简单化、专业化、标准化”3个原则,并且一再强调“标准化是改善的基线”,由此可见规范的重要性。

以下是Python编码规则与注意事项:

(1)推荐每个import语句只导入一个模块,不建议一次导入多个模块。宜采用的导入方式如下:

    #ch02d001.ipynb
    import numpy as np
    import pandas as pd

不建议采用以下方式导入模块:

    import numpy as np,pandas as pd

在Python中有“模块、包、库”等术语,其中模块(module)是一个.py文件,文件名就是模块的名称,里面定义了函数、变量或类等,需要的时候可通过import命令导入。主要有以下几种导入方式:

    import模块名
    import模块名as别名
    from模块名  import类名/函数名

包(package)是在模块之上的概念,模块是一个文件,包则存放了多个模块,相当于一个文件夹。原则上,只要文件夹包含__init__.py文件(该文件可以没有内容)则该文件夹就会被视为Python的一个包。假如其子目录文件夹内也有__init__.py,那么它就是这个包的子包。以获取Pandas的文件夹路径为例,代码如下:

    import pandas as pd
    print(pd.__file__)

运行以上代码,返回的值如下:

    D:\Users\HFX\anaconda3\lib\site-packages\pandas\__init__.py

可以通过资源浏览器访问该文件夹来查看xlwings中的所有模块、子包和子模块等。相对于Python中的内置模块与包而言,由第三方提供的包又称“第三方库”或“第三方模块”,例如本书所用到的NumPy、Pandas、Matplotlib、xlwings、openpyxl等都是第三方库,需要(用pip或conda)另外安装;不过在Anaconda中这些库都已经事先自动安装好了。

(2)推荐使用小括号对多行内容进行隐式连接,不建议采用反斜杆(\)进行连接。

宜采用的方式如下:

    (df.groupby(['片区','包装方式'])
       .agg({'订单数':['mean',sum],'入库数':['size',sum,'mean']})
       .pipe(y)
    ).head()

不建议采用以下方式:

    df.groupby(['片区','包装方式'])\
       .agg({'订单数':['mean',sum],'入库数':['size',sum,'mean']})\
       .pipe(y)\
    .head()

2.1.2 命名规范

在每个族谱中都有各自的辈分名序,如果所有人都按照名序命名,则族人聚会时能够轻松了解到各自辈分的高低。当然,如果不按族谱名序命名也是可以的,但是族人聚会时信息的透明度与可比性就会下降很多。同理,在团队合作过程中,命名规范是很重要的,既方便自己日后维护,也方便团队共享与维护。

以下是Python中的一些命名规则举例:

(1)模块名全部使用小写字母;当模块名由两个或多个单词构成时,单词间用下画线连接。

(2)包名全部使用小写字母;当包名由两个或多个单词构成时,单词间用点(.)连接,例如matplotlib.pyplot。

(3)类名采用单词首字母大写,例如Path。

注意:在Python中字母有严格的大小写区分。

2.1.3 保留字

保留字(或称关键字)是Python中一些已经被赋予特定意义的单词。在程序开发过程中,这些保留字不能再作为标识符给变量、函数、类、模板及其他对象命名。

在Python中,可通过以下方式查看所有保留字,代码如下:

    import keyword
    print(keyword.kwlist)

运行以上代码,返回的值如下:

    ['False','None','True','__peg_parser__','and','as','assert','async','await','break','class',
    'continue','def','del','elif','else','except','finally','for','from','global','if','import','in','is
    ','lambda','nonlocal','not','or','pass','raise','return','try','while','with','yield']

以上保留字是区别大小写的。例如将True写成true、将False写成false后用作变量或标识符是不受影响的,因为true与false不是Python中的关键字或保留字。

在Python使用过程中,不可以把这些保留字用作变量、函数、类、模块和其他对象的名称,否则会报错提示invalid syntax。应用举例:

    and= '苏州'                 #SyntaxError:invalid syntax
    or= '杭州'                  #SyntaxError:invalid syntax

2.1.4 标识符

标识符主要用来标识变量、函数、类、模块和其他对象的名称。在Python中,标识符的命名规则如下:

(1)标识符由字母、下画线和数字构成,但首字符不能是数字。

(2)标识符中,不能包含空格、@、%及$等特殊字符。

(3)标识符不能和Python中的保留字相同。

在Python中,标识符严格区分大小写。应用举例,代码如下:

    nws= '(华东)苏州'
    Nws = 512
    NWS = 'sz'

在以上代码中:变量nws、Nws、NWS彼此独立且有效。利用id()查看各标识符或变量的地址。代码及返回的值如下:

    id(nws)                 #2273574901328
    id(Nws)                 #2273573510096
    id(NWS)                 #2273469182512

当标识符中存在空格、@、%及$等特殊字符时将报错提示。应用举例如下:

    @苏州                   #SyntaxError:unexpected EOF while parsing
    %苏州                   #UsageError:Line magic function`%苏州`not found
    $苏州                   #SyntaxError:invalid syntax
    苏州                    #SyntaxError:invalid syntax

2.1.5 变量

在Python中,变量是用于存储数据的内存空间,依据变量作用域的不同可分为“全局变量”和“局部变量”。将数据放入变量的过程叫作赋值,可通过“变量名=值”的方式来对变量赋值。在Python中,变量的命名与使用规则如下:

(1)变量必须是一个有效的标识符。

(2)不能使用Python中的保留字。

(3)宜选择有意义的字词作为变量。

(4)在Python中变量需要先定义后使用。

(5)命名时,同一字母的大小写代表的是不同变量。

变量赋值应用举例,代码如下:

    nws= '(华东)苏州'
    va = 32

在以上代码中,nws、va为变量名,(华东)苏州、32为值。在变量赋值时遵循的是“无则新增、有则修改”的原则。例如对以上的nws变量重新赋值,代码如下:

    nws= '(江苏)苏州'
    nws

返回的值为“(江苏)苏州”,原有的值“(华东)苏州”则被替换。在Python中可通过内置函数id()来查看变量的内存地址。应用举例,代码如下:

    id(nws)

返回的值为2273573797200。

例如,使用未被事先定义的变量ws,代码如下:

    print(ws)

此时返回的错误提示如下:

    -----------------------------------------------------------------
    NameError              Traceback(most recent call last)
    ~\AppData\Local\Temp/ipyKernel_12292/2210202466.py in<module>
    ---->1 print(ws)
     
    NameError:name  'ws'is not defined

2.1.6 代码缩进

在Python中,采用Tab键、2个空格或4个空格进行代码缩进,但是,出于跨平台兼容性考虑,在代码缩进过程中不建议Tab键与空格键混合使用,因为不同平台间对于一个Tab键占据多少个空格是没有统一规定的。如此下来会造成平台切换后因代码不整齐而运行报错。代码缩进,应用举例:

    …
    ws2.title= '苏州'
    for i in range(1,ws1.max_row+1):
        for j in range(1,ws1.max_column+1):
           ws2.cell(row = i,column = j).value = ws1.cell(row = i,column = j).value

在以上代码中,流程控制语句行尾的冒号(:)和下一行的缩进代表一个代码块的开始,而缩进的结束则代表该代码块的结束。

2.1.7 注释

在Python中有单行注释和多行注释之分。

1.单行注释

在Python中,使用#接注释内容。从#开始至换行为止,#后面所接的内容将被作为注释内容而被Python编译器所忽略。应用举例,代码如下:

    #'该行为注释,不会被编译'
    #-*-coding:utf-8-*-              #中文编码声明注释
    from pathlib import Path              #导入pathlib模块中的Path
    from openpyxl import load_workbook    #导入openpyxl模块中的load_workbook
2.多行注释

在Python中,使用三单引号或三双引号进行多行注释。三单引号或三双引号间的多行内容均会被作为注释内容而被Python编译器所忽略。应用举例,代码如下:

    """
    Created on Wed Feb 1 16:59:01 2023
    @author:HFX
    《从Excel到Python数据分析》
    -*-Pandas、xlwings、openpyxl、Matplotlib的交互与应用
    """

以上多行注释也可写成如下形式:

    #Created on Wed Feb 1 16:59:01 2023
    #@author:HFX
    #《从Excel到Python数据分析》
    #-*-Pandas、xlwings、openpyxl、Matplotlib的交互与应用

2.1.8 输入与输出

在Python中,可通过调用input()内置函数实现信息的输入,通过print()内置函数实现信息的输出。这两个函数的语法如下:

    input([prompt])
    print(value,…,sep = '',end = '\n')