你好,我是千帆。
互联网公司从红利下的爆发期,进入新的精细化发展阶段,亟须深入分析与挖掘业务与数据价值,从而找到新的增长点突破现有增长瓶颈。各行各业的数据分析需求井喷,数据分析人才成为争抢的对象,数据分析技能也成为一大职业亮点。
想要掌握一项新技能,或者转行进入一个新行业,最难就在于起步阶段。而这个课程,我正是要带你从 0 开始掌握用 Python 做数据分析的能力,带你快速打通任督二脉。
很多同学一听到编程语言,可能条件反射就会觉得“很难”。
但 Python 是个例外!学 Python 不需要你关心计算机原理,也不需要你理解复杂的编程模式, 它有简短清晰的代码结构、易于理解且人性化的语法表达,以及丰富的库供选用,即使非开发人员,也能逻辑清晰地写出能够真正解决问题的代码,轻松完成手头项目。
很多数据分析从业者选用 Python 做数据分析的一个关键点,就是 Python 语言具备一套技术栈就能搞定整个数据闭环的巨大潜力。
以往的数据分析,当数据源发生变化后,往往需要分析师手动读取最新数据,然后用相应工具对新的数据重复之前的分析过程,再将最新的分析数据替换进数据分析报告中。而对于 Python 来说,整个数据分析的过程,包括取数、清洗、标准化、分析、建模以及报告的生成,模型的交付都是通过 Python 代码实现。数据源发生了更新,只需要重新跑一次代码即可,天生就具备自动化运行的条件。
数据分析行业的前辈们就是看到了这一点,将 Python 作为了数据分析的主力工具。
无论大厂小厂,用 Python 做数据分析已成为“行业标杆”。数据分析岗,熟练掌握 Python 是必备条件,我们必须面对一个事实:想求职数据分析岗,不会 Python,面试你都过不了。
我们打开拉勾招聘网站可以看到,运营、产品经理、商业分析等岗位,也都有提及 Python 基础,你至少需要知道 Python 处理数据的流程,具备用 Python 处理数据的基本能力。会 Python 是一个非常亮眼的技能,想一想面试官手上一沓的简历,如何让他眼前一亮,关注你。
你以为只有专业的数据分析师,才关心编码与数据分析能力吗?当然不是。
学会用 Python 做数据分析,哪怕不从事专门的数据分析工作,也能对你的日常工作与生活起到大帮助。
一一在从事新媒体运营,最近她通过抓取的 10w+ 历史文章,分析“共性”“关键词”来指导自己的创作方向,数据表现稳步向好,经常得到领导表扬,升职加薪指日可待。
二二在从事财务审核,每个月底都需要从庞大的 Excel 表中找出异常报销记录,现在他只需要跑一次脚本,就能够自动提取大量 Excel 中的数据汇总分析,大幅提升了工作效率。
三三想买学区房,他通过分析所在城市的小升初成绩、中考成绩与片区房价的关系,成功找到处于价值洼地的小区,后续增值非常可观。
肆肆是负责增长的产品经理,她通过 Python 分析产品数据,可以自动执行许多报告和分析任务,帮助自己的同时还让技术人员对她刮目相看。
……
在这个人人都要学点编程的时代,学好 Python + 数据分析,可以让计算机帮我们打工。
我从事 Python 领域开发已有 8 年。我曾用 Python 搭建并实现了包含分布式爬虫、电商大促秒杀、订单物流运营管理、异构数据源多维度可视化报表等系统,有着丰富的实践经验。
目前,我在一家头部互联网公司任高级技术专家,带领一个数据工程团队,用 Python 打造自动化数据分析与机器学习系统,生成数据报告、分析指标走向,赋能业务,提升 CTR……
如今,我能够从过来人的角度,来帮你审视用 Python 做数据分析的难点、重点,以及学习方法。
Python 大火,数据分析大火,两个都在风口上的主题,让市面上充斥着大量 Python 数据分析内容。
这些内容也都很好,对我们了解知识和打好基础非常有帮助,但有一个很大的特点:大多是以 Python 基础,以及 NumPy、Pandas、Matplotlib 等功能模块的讲解为主线,像书本一样偏重知识点的学习和理解,对于想要快速上手和实践的同学来说,相对偏理论,难在学以致用。
知识点的罗列和讲解,总是避免不了人类学习的惰性,课程学不完不说,还浪费了时间和精力。很多耐着性子学完的同学,最后却经常表示:“明明感觉都掌握了,一遇到实际问题,还是不知道如何解决复杂任务。”
怎么办呢?其实有个好方法,我想换个角度来帮你解决“学时都明白,学后不会用”的上述问题。
8 年的代码生涯,我感触最深的就是:学编程,最快、最有效的方式就是多动手,学以致用。而且,人天生对学习“怎么做”更有兴趣与动力,而不是概念和理论,因此我想从实际工作问题到解决问题来激励和帮助大家。
因此,我依据语言基础、数据集获取、数据加载及处理、数据预测、数据可视化呈现,这 5 个功能关卡,来带你掌握 Python 做数据分析关键流程,并通过解决实际场景问题的过程来理解消化。
第一模块,Python 语言基础。 重点讲述后续课程中需要用到的 Python 语言基础,比如理解程序是如何运行的,学习 Python 的常用指令……让 0 编程基础的同学,也可以使用 Python 编写出简单实用的程序,为学习后面的应用知识打好基础。
第二模块,获取数据集。进行数据分析,首先要有数据。我会着重介绍用 Python 获取、筛选、保存网页上数据的技巧和方法。学完之后,你就可以构建任意工作领域的数据集。
第三模块,加载、查看与数据处理。 这一部分会将上一步我们构建的数据集加载到 Python 中,查看、修改,以及清洗掉一些冗余的脏数据。这样你在实际工作场景中,就会从多种类型的数据文件中加载数据、查看数据、清洗数据,使数据标准化。
第四模块,深挖数字背后的逻辑。 这个部分我会介绍如何操作数值列,轻松完成统计分析常用的矩阵计算、回归分析等任务。这样你才能在数据中发现“金子”,助力业务,比如预测未来业务数据的趋势等(课程中有这个实战案例解说)。
第五模块,可视化你的分析思路。 我会将之前的数据通过各种形式的图表呈现出来(散点图、直方图、线图、饼图、图例、注解等),你还可以绘制可交互的图表,让你的方案汇报更加清晰、有亮点。
第六模块,综合项目实战篇。 这一部分会通过多个实际、高级、综合的数据分析任务,比如全球新冠肺炎区域确诊病例趋势分析、电影票房预测模型、用户流失预测与分析等。来让你把所有学会的技巧融会贯通,同时也能学会数据分析的基本套路与方法。这样无论你是接独立的项目,或者去互联网公司求职数据分析的岗位,都能驾轻就熟。
轻松入门。模块一完全考虑了编程初学者的理解梯度,让哪怕没有任何编程经验的朋友,也完全能够学好本课程。
以“解决问题”为核心主线。从大模块到小课时,都以“怎么做”某件事情为核心,穿插讲述必要的基本概念和理论,我们始终相信,学习是为了最终解决问题。
阶段性成就。每个模块带你解锁一项具体技能,完成一项任务,有成就感的学习过程更容易坚持。
案例驱动。课程中有密集的工作场景案例。分为三个维度:课时内容中的主线案例、模块总结级别的案例,以及最终综合实战中的案例。
综合学下来,你不仅可以掌握 Python 处理数据的流程和方法,更能举一反三,用 Python 做各种领域、各种场景下的数据分析工作。
“你要悄悄学 Python,然后惊艳所有人。”在人人都在学 Python 的当下,Python 数据分析对于非程序员来说,将会是最有价值的学习方向。
大数据和人工智能已经彻底改变行业,这正是数据分析大展身手的好时机。打好这个基础,也必然是你后续发展的基石。
多想不如行动。学习和理解是被动学习的起始,主动实战才是最核心的内容。希望你在后续课程中,多动手敲代码,多联系工作实际去练手。甚至,你可以自己创造问题,然后再想着用 Python 解决它,这样你的成长才会是多倍速!
马上就要开始体验数据分析的威力,让我们一起把 Python 数据分析这个神器收入囊中吧!
在我们启程之前,为了使刚接触程序、代码的同学快速理解计算机程序,我先介绍一些非常非常基础的知识和概念。
如果你对编程已经有了一定的认识,或者有编程经验,你可以直接跳过本课时,直接进入第二课时环境搭建。
概括地讲,我今天主要会介绍编程的基础概念:程序、程序语言以及程序设计中一个非常常见的技巧:打印。
抛开计算机不谈,在我们的日常生活中,程序往往代表解决某个问题的步骤。比如我们买房,有一套程序;毕业了转户口,有一套程序;甚至我们在家里做一道菜,也有程序。就拿做一道黄焖鸡的程序来说,有这么一系列操作。
第 1 步,准备材料。
第 2 步,起锅烧油。
第 3 步,放入葱姜大料爆香。
第 4 步,放入鸡腿肉翻炒。
第 5 步,放入料酒生抽老抽。
第 6 步,加水小火慢炖。
第 7 步,放入配菜。
第 8 步,出锅。
在上面的例子里,我们通过【一系列操作】,完成了一个任务【做黄焖鸡】。所以本质上,我们是写了一个做黄焖鸡的程序。只是这个程序是写给别人看的,比如你写给你的朋友,他可以执行这个程序做出一道黄焖鸡,但计算机则看不懂,因为计算机只能看懂它认可的程序语言(C、C++、Python、Java 等)
从上面的例子中,我们不难看出程序要发生作用,有两个关键的要素:
编写程序的步骤,比如刚才的做菜步骤;
执行程序,比如我的朋友看着我编写的步骤,实际去做这个菜。
对于计算机程序的关键要素也是一样的,只是方式稍有不同。
编写程序的步骤:通过各种计算机认可的程序语言来编写程序的步骤。
执行程序:使用程序语言编写完程序后,由特定的工具(编译器)输送到操作系统(比如我们常说的 Windows、Mac 等)。操作系统根据用户的指示(比如我们点击桌面的程序图标)来决定是否开始执行程序。
所以,计算机程序从本质上来说和我们理解的程序也是一样的,都是解决具体问题的步骤,只是它比我们人为描述的复杂上许多倍。我们在电脑上使用的各种软件,比如 Word、QQ、微信等,本质上也都是程序,只是这类复杂的程序,一般也被叫作软件。
程序语言,如上文所说,就是用来编写程序的步骤的语言,有很多种叫法,比如程序设计语言,编程语言。事实上,计算机和操作系统往往只认知一种语言,就是一种叫作二进制化的机器语言,但由于比较晦涩难懂,所以逐渐发展出了很多高级语言,比如常见的 C++、Python、Java 等。
既然高级语言都是为了解决机器语言过于晦涩而提出的,那为什么还需要那么多种高级语言呢?
原因就是计算机解决的问题越来越多,编写程序面对的挑战也就越来越多。比如不同的应用场景,写网站和数据分析,对于编程语言的特型要求侧重都是不同的。目前 Java 一般用来开发后端服务,C++ 用来开发音视频类应用,而 Python 则在人工智能和数据分析领域大显身手。
当我们使用某一门高级程序语言,编写的程序,在翻译之前,我们也叫这个代码的片段为源代码,或者代码,在翻译之后,才能称之为程序。所以一般把用程序语言编写的片段“文章”,一般都统称为代码。
下面,我们通过 Python 代码为例,来让你对上述概念有个感性的认识。
下面的例子只需要看一下,不需要实操,实操等到课前准备 2 学习完之后再进行即可。
我们的第一句 Python 代码:
print("Hello World")
这段代码只有一行,print 表示打印,这句代码是告诉计算机,打印 “Hello World” 这句话。注意!这里的打印,指的并不是通过打印机把这句话打印出来,而是把这句话打印在屏幕上。不同的 Python 开发工具,打印内容的位置也不同,以咱们课程即将使用的 VSCode + Jupyter Notebook 为例,执行这段代码后,打印的内容显示在代码下方。如图所示:
截图中的软件就是 VS Code, 在下一讲会教你安装。
打印在程序设计中是非常有用的概念,毕竟程序运行得对不对,一般都需要把结果打印在屏幕上我们才能知道。后面的章节中会经常用到这个指令,下面我们就稍微详细认识下这个指令。
通俗来说,在代码中我们用 print("xxxx") 这样的指令的话,代码执行之后,双引号中的内容就会被打印在下方。
接下来,我们通过看几个例子来认识下这个 print 的常见用法。
用 print 打印文本,比如 “我在学习 Python”,那需要把文本用双引号括起来之后,再放入括号中。如下所示:
print("我在学习 Python")
输出
我在学习 Python
用 print 打印数字或者运算结果,比如 1+1,如下所示:
print(1 + 1)
print(3)
print(3 - 100)
输出
2
3
-97
如(2)中所示,每次我们调用 print ,在打印结果中都会新起一行。如果我们在把多条内容在同一行打印,可以把多条内容在 print 后的括号中,并用逗号隔开。如下所示。
print("我真棒", 1+3, 2*5)
输出
我真棒 4 10
可以看到,我们的文本和数字都在同一行被打印了出来。
细心的你是否发现,打印文本(英文字母或者文字)时,需要加双引号,即 print("我真棒") 。而数字则不需要加引号,即 print(1+1)。这是因为本身像 print 指令这样的代码,也是文本,所以文本如果没有加引号,则计算机不知道哪些是文本,哪些是代码。而数字则不会混淆。
后面的章节中会经常用到 print 指令,现在你只需理解它可以打印出文本、数字和一些算式的结果即可。
今天我简单介绍了编程需要掌握的几个基本概念。
程序:计算机完成特定任务的一系列步骤的集合,比如用来打字的 Word,用来聊天的微信,都属于程序。
程序语言:编写计算机能识别的程序的语言,比如 C++、Java、Python。
操作系统:负责执行程序的主体,比如常见的 Windows、Mac 系统。
打印:程序语言中很有用的指令,用于把内容显示在屏幕上,可以帮助开发人员看程序运行是否正确。
print:Python 中的打印指令,可以打印出文本、数字和一些算式的结果。
那如果想打印出“今天我收获很多”,你会怎么输入 print 指令呢?
“工欲善其事,必先利其器。”在课程正式开始之前,我们先搭建一套高效的 Python 工作环境为后续数据分析做准备。
关于高效作业,对于需要编写 Python 代码进行数据分析的工作而言,主要涉及两个方面。
1. 一款具备强大的自动完成和错误提示的开发工具。
Python 丰富的函数库和组件库是这门语言强大的核心原因,但我们不可能去记忆所有的方法名和参数名,往往只能记住一些常用的或者某个方法开头的几个字母。这个时候一个好的开发工具就需要能聪明地“猜”出你想输入的代码,并给出候选列表方便你选择(类似于输入法的字词提示功能)。
另外,当你输入错误的时候,这个工具能够提示你具体是哪里错了,建议改成什么,从而大幅提升编写效率。在别人还在查到底是哪个单词拼错了导致代码跑不起来的时候,你已经写完一个完整的模块了。
2. 掌握快捷键。
Python 数据分析需要边写边看结果,甚至每写两行代码就需要点击运行、新建文本段落、代码段落等操作。所以熟练地掌握快捷键,可以使绝大多数的操作都不需要鼠标,手不用离开键盘就能完成,起到事半功倍的效果。
接下来,我就先带你配置一套比传统方式更高效的数据分析开发工具,而快捷键则会在之后的教学过程一步步教给大家。
整个配置过程相比传统的环境安装稍微多了几步,不过并不复杂,你只需要跟着一步一步操作就可以。
本课时搭建环境的版本说明如下:
Anaconda3.0
VS Code 1.51.1
实际并无太多版本限制,你安装最新版即可。
Anaconda 是一个 Python 数据科学工具包,里面包含了 Python 做数据计算最常用的库和工具,属于必装软件。目前它已经非常成熟,并且整套 Anaconda 可以免费提供给个人使用。
1. 用浏览器访问 Anaconda 的个人版页面:https://www.anaconda.com/products/individual ,点击 Download,页面会自动跳转到具体的下载页面,如图所示:
2. 根据自己的设备类型 (Mac/Windows),选择合适的安装包版本。无论 Windows 还是Mac, 都选择 Graphical Installer,它代表图形化的安装器,之后更易于使用。
本篇教程后续步骤以 Windows 为例。
3. 下载之后双击安装包进行安装(如图所示),直接点击 Next。
4. 接下来就是使用协议界面,点击 I Agree,代表同意使用协议。
5. 之后连续 Next,可以看到选择安装位置的界面,如果没有特殊的需求,直接默认位置就好,继续点击 Next。
6. 最后一个配置界面是高级选项,不用更改,直接点击 Install,等待 2~3 分钟之后,即可完成安装。
安装完毕之后,可以从程序中找到 Anaconda Navigator,点击打开就可以看到整套 Anaconda3 的所有工具(如下图所示):
其中 Notebook 是数据分析应用范围最广泛的工具,也是本次课程的主力工具,但它却不是一款足够有效率的工具,因为它缺乏智能的代码输入联想、自动完成和错误提示。而有效率的分析师是不会容忍自己用“记事本”写代码的。
所以,接下来,我会带你在自己的电脑中配置一个智能、强大的 Notebook(此时安装好的Anaconda3 页面先不关闭)。
VS Code( Visual Studio Code),是微软开发的跨平台代码编辑器,靠着其强大的插件生态,目前已经成为全球最流行的代码编辑器。本次我们就通过 VS Code,来解决 Notebook 开发效率的问题。
首先按照以下的步骤安装和配置 VS Code。
1. 下载:用浏览器访问https://code.visualstudio.com/,网页会直接识别当前的操作系统,直接点击下载按钮,下载安装包。
2. 安装:下载完毕后,双击安装包进行安装,全部默认配置即可。
3. 安装中文语言包【可选,习惯英文的同学可以跳过】:启动 VS Code,进入插件 Tab(左侧边栏最后下方的图标),输入 【Chinese】,出现的第一个插件,点击 Install 安装。安装完成后,重启 VS Code 即可生效。
4. 安装 Python 插件:依旧是在插件面板,输入 【Python】,安装列表中的第一个插件。
至此,基础的 VS Code 环境已经配置完毕,在下一步我们会开始用 VS Code 编写Python 代码。
现在,我们开始实际地玩一玩 VS Code。
打开 VS Code,选择【文件】-【新建文件】,会建立一个默认的文本文件,按 CTRL +s 保存,文件名为【hello.py】。
后缀名一定要是 .py,因为 VS Code 要根据文件的后缀名来匹配合适的工具链。
保存之后,如果 VS Code 识别到 Python 文件,我们上一步安装的 Python 插件就会开始工作,寻找本机的Python 环境,结果会展示在下方的状态栏上。
状态栏上的是 Python 3.8.5 64-bit(conda),说明目前 VS Code 已经在使用我们第一步 Anaconda 安装的 Python 环境。如果不是,可以点击这行字,在弹出的列表中选择带 Conda 字样的Python 环境。
Anaconda的 Python环境包含了丰富的科学计算的库,所以是做数据分析的首选。
确认环境之后,我们即可进入最后一步。
见证奇迹的时刻来临了,我们进入 VS Code 的插件 Tab(左侧边栏最下方的图标),输入 Jupyter 安装由微软官方出品的 Jupyter 插件(前几个有 Microsoft 字眼的)。
安装完成之后,重启 VS Code(如果显示是禁用,那就是安装好了,直接操作后续即可)。按 【CTRL+P】 弹出命令面板,输入【>Jupyter】,此时会列出所有 Jupyter 插件支持的操作,选择 【Jupyter: Create New Blank Jupyter Notebook】,如下图所示。
选择之后,VS Code 内部就出现了一个类似 Notebook 的编辑界面,和传统的网页版 Notebook不同,VS Code 中的Notebook 具备强大的代码提示和自动完成的功能。接下来,我们来学习一下它的主要操作。
打开编辑界面,我们将 Notebook 可操作性的区域分为三个部分:主操作区、Cell 操作区、 边栏操作区。
主操作区:主要用来控制整个 Notebook 的一些行为,从左到右的功能依次为:
运行全部 Cell;
运行上一个 Cell;
运行下一个 Cell;
重启 Kernel;
中断 Kernel;
插入 Cell;
清空结果;
展示活动的变量;
保存;
导出。
Kernel 代表在后台实际运行Python代码的服务。
边栏操作区:不同位置的“+”号代表在不同位置插入 Cell。
Cell 操作区:主要用来控制当前 Cell 的行为,从左到右依次为:
运行 Cell(快捷键:【Shift + Enter】);
逐行运行 Cell;
切换为文本模式(切换为文本模式后,点击"{}"图标可切换回代码模式)。
Cell是Notebook 中的核心概念,直译过来是“单元格”,但 Notebook 中的Cell 却不能用单元格简单概括,所以本文统一用Cell 描述,一个 Notebook 由多个 Cell 组成。
Cell 一共有两种类型:
代码Cell,主要用来编写 Python 代码,每个代码 Cell 都可以单独执行,并且执行结果会展示在 Cell的下方。
文本 Cell,顾名思义,用来编写文本, 对于数据分析工作而言,除了代码本身,分析的思路、推导的逻辑同样非常重要,文本 Cell 就是用来承载这些内容。
这也是 Notebook 区别于 IPython 最大的地方,可以实现代码和文本的混排,来最大化的呈现数据分析的产出。
接下来,我们通过一个具体的任务,学习一下 Notebook 的基本操作。这些操作在后续的课程中会经常用到,我们先通过几个简单的小任务初步熟悉一下。
任务目标如下。
创建一个 Notebook,保存为 my_practice.ipynb。
添加一个 Cell,通过代码打印“I am using Notebook”, 并运行。 在之后的课程中,我们每学完一个小阶段,都会通过新建一个 Cell 来编写代码测试我们学习的内容。
添加一个Cell,并转换成文本 Cell,输入文字“我的数据分析启程了!耶!”。在之后的课程中,我们希望把自己编写代码和分析的思路写下来的时候,往往就需要添加一个 Cell 并转换为文本模式这样来记录。这样最后我们的代码和分析文字都在同一个文件(Notebook)中,非常清晰。
添加一个 Cell,通过代码打印 1+1 的结果。
让我们来一步步实现上面的任务吧。
第一步,按【CTRL + P】(Mac 对应【CMD + P】), 调出 VS Code 的命令面板,输入【> Jupyter】可以看到 Notebook 插件支持的命令,其中比较常用的几个如下。
1. Create New Black Jupyter Notebook: 创建新的空白 Notebook 工作区。
2. Export to PDF:将当前的Notebook 导出为 PDF,在后续写数据分析报告的时候会用到。
3. Import Jupyter Notebook:导入已有的Notebook。用来导入已有的 Notebook 文件,后续课程的所有 Notebook 我都会放到 Github 上共享,可以下载后导入运行。
今天我们首先选择第一个,创建一个新的Notebook,创建之后按 【CTRL + S】 保存,文件名输入:my_practice.ipynb。
第二步,我们要新建 Cell,我们点击边栏操作区的 + 号即可新建 Cell, 然后我们输入以下代码:
print("I am using Notebook")
点击 Cell 操作区中的“运行 Cell”,可以看到我们代码被执行,并打印出了上述字符串。效果如下图所示。
第三步,我们类似第二步首先新建一个 Cell,并点击 Cell 操作区中的 M 图标,切换为文本模式,并输入“我的数据分析启程了!耶!”。输入完毕后鼠标点击 Cell 之外的任意区域即可退出编辑模式,进入预览模式(双击 Cell 可重新进入编辑模式)。这样,我们的第三步就完成了。 如图所示。
第四步,就很简单了,我们直接新建一个 Cell, 并输入以下代码:
print(1+1)
运行 Cell,可以看到打印了“2”,至此,我们的任务已经全部完成。整个过程如图所示。
至此,你已经在自己电脑上配置出一套面向数据分析的Python 开发环境,也知道如何新建 Notebook,以及在 Notebook中添加代码 Cell 来输入代码、文本 Cell 来输入文字。
回顾下今天的内容,我主要强调了这几点:
对于需要编写 Python 代码进行数据分析的工作而言,一款具备强大的自动完成和错误提示的开发工具、掌握常用的快捷键会让你事半功倍;
使用 Anaconda + VS Code + Jupyter Notebook 插件,可以搭建一套具备代码提示和自动完成的、高效的、面向数据分析的开发环境;
你要学会 VS Code Notebook 的基本操作,这些基础我们后续都会用到。
搭建环境是用Python 做数据分析的第一步,为了让你学习更顺畅,我们的视频观看形式附带了实操视频。如果你在搭建环境中还有什么问题,可以写在留言区,我会帮你扫清障碍,让你快速上手 Python。
下一讲,我们将正式进入 Python 语言的世界,开始学习 Python 语言的基础:变量与数据类型。
彩蛋
本节课里会用到的快捷键:
【CTRL + P】打开 VS Code 的命令面板;
【Shift + Enter】运行当前 Cell;
【Esc】退出当前 Cell 的编辑状态,退出编辑状态之后可以用方向键上下移动 Cell。
课程正式开始的第一讲,我先介绍 Python 语言的基础构成要素:变量与数据类型。因为不仅是 Python,变量与数据类型可以说是所有编程语言的核心。掌握了语言的变量与数据类型的体系,可以说就掌握了这门语言的一大半儿。
我们都知道应用程序在运行阶段的数据存放在内存中,那实现应用程序的编程语言是怎么操作内存的呢?
比如我们通过程序语言申请了一块内存空间,存入了一个数字,那下次我想读取这个数字的时候,面临的问题就是:如何告诉操作系统“我想读取的是刚才我存了数字的那块内存”。
上面的问题,从直觉出发,我们很容易想到可以在申请空间和存入数字的时候,给这块内存区域起一个名字,比如叫我的内存1
,然后当我想读取这个部分的值的时候,只需要告诉操作系统,请读取我的内存1
名字对应的内存里的值。
编程语言中所谈到的变量,其实就是上面例子中提到的,给某块内存区域起的名字。这也是变量为什么有一个“变”字,因为这个名字对应的内存区域里面的值是可以变化的。
变量对应的内存区域的内容,一般称为变量的值。在 Python 中,变量的命名一般使用“字母+数字”的形式来表示,最好使用符合变量含义的英文单词,这样方便理解。比如存储地址的变量可以叫:address。
一个变量不仅存储的值可以变化,就连数据类型也是可以变化的。比如同样叫我的内存1
,这会儿存的还是数字,但下次我也可以存一个字符串进去。
接下来,我们通过实操来感受一下变量的含义。
打开 VS Code,建立一个新的 Notebook, 保存为 Chapter2.ipynb。我们本章的代码练习都在这个 Notebook 中完成。你记得不要关闭哦!
第一步,新建一个代码的 Cell,输入以下代码。
a1 = "Hello Data Science"
a2 = 135
在这段代码中,我们通过赋值的形式创建了两个变量,一个叫 a1,存储了一个字符串:“Hello Data Science”,一个叫 a2, 存储了一个数字:135。
等于符号(“=”)在 Python,甚至绝大多数编程语言中都代表赋值,代表把等号右边的值存储到等号左边的变量中,这里和数学中的等式中的等号含义是不一样的,需要注意。
按Shift + Enter
运行该 Cell,由于我们没有 print 语句的调用,所以这个 Cell 不会输出任何内容。但运行之后, a1 和 a2 这两个变量在整个 Notebook 中都会是有效的。在之后的代码中,我们都可以直接访问 a1 和 a2 的值。接下来我们马上试一下。
第二步,在新的 Cell 中输入a1
, 直接运行,可以看到打印出了我们第一步存储的字符串。
这里虽然没有 print, 为什么仍然能够打印变量的值呢?
在 Notebook 中,如果一个 Cell 最后一行是一个单独变量的话, Notebook 会自动打印出该变量的值。同理我们输入 a2 并运行,可以看到打印了 135。如下图所示。
第三步,新建一个 Cell,输入以下代码。
a2 = 100
a3 = 135
print(a2 + a3)
在上面的代码中,首先修改了变量 a2 的值为 100,然后新创建了一个变量 a3 并存储了 135 这个数字。最后,打印了 a2 + a3 的值。运行 Cell,可以看到打印了235
。
上面的例子演示了变量的创建、查看、修改与打印。完整的 Notebook Cell 如下图所示。
从这个例子我们可以更清楚地明白,变量首先是一个名字,是某块内存区域的名字。我们可以给通过等号变量赋值,即把数据存储到变量中,也可以从变量读取目前存储的值。变量的创建和修改都是通过赋值实现的(即等号)。最后,我们可以通过 Python 的 print 语句打印出变量的值,通过这个方式来查看变量中存储的值。
在刚才的例子中,a1
(“Hello Data Science”)是一个字符串,而a2
(100)、a3
(135)是整数。这里提到的“字符串”“整数”就代表变量的数据类型。在编写代码的时候,搞清楚变量的数据类型至关重要。
为什么呢? 下面通过一个例子来说明。
还记得在刚才的 Notebook 中,我们最后计算了a2 + a3
的值,由于a2
和a3
都是整数,所以 Python 算出了结果。但如果是一个字符串和一个整数呢?
让我们来试一下,在刚才的 Notebook 新建一个 Cell,输入print(a1 + a2)
并运行,运行结果如下图所示。程序执行出错,提示“字符串只可以与字符串拼接,而不能和整数”。
这背后的原因是:加运算对于整数类型和字符串类型的含义是不一样的,对于整数来说,加是做加法,而对于字符串,加号则代表将两个字符串拼接起来。所以搞清楚不同变量的数据类型,以及运算过程(运算符和函数)对于参与运算的变量的数据类型的要求,是能够写出正确的 Python 代码的基础。
在逐一介绍数据类型之前,我会先介绍一个实用的技巧:查看变量的类型。掌握这个技巧可以在后续的环节帮助我们更好地理解数据类型。
在实际工作中,我们看到的经常是多个变量,并不能明显看出它到底是整型还是浮点型。那如何查看一个变量的类型呢?Python 中可以使用type
语句来查看一个变量的类型,使用方法和print
语句一样,只是括号内部不是字符串,而是变量名。
新建一个 Cell,输入如下代码并运行。
print(type(a2))
代码的含义是:我们首先用type
语句获得a2
的类型,然后再用print
语句打印出来。
代码运行后,输出在 Cell 下方的内容如下所示。这里的 class 代表我们打印的是一个类型,类型的名字是:int,也就是整型,往上看我们的代码。a2
确实是整型。所以结果是符合预期的。
<class 'int'>
像 type 和 print 这样的特殊的 python 语句,叫作函数,大家只需要先对这个概念有个感性的认识,具体下一章会展开讲。这里只需要掌握其用法即可。
接下来,我们就来看看 Python 的常见的数据类型:整型、浮点型、布尔型、字符串、列表。
整型可以简单理解成:整数类型,英文名叫 int,也有很多语言叫作 Integer。像刚才例子中的a2
和a3
都是整型。
浮点型一般用来表达小数,英文名叫 float。在数值计算中,小数比整数应用的场景更加广泛。
比如我们希望通过数据分析来预测用户点击某一类商品的概率,就很显然需要使用小数(浮点型)。这里我们可以一起操作下。
新建 Cell,输入以下代码。
a4 = 10 / 8
a5 = a4 * 2
a6 = a5 / 3
print(a4, type(a4), a5, type(a5), a6, type(a6))
上述代码中,我们做了这几件事。
计算了 10 除以 8 的值,并将结果存入了变量 a4;
计算了 a4 乘以 2 的值,并将结果存入了变量 a5;
计算了 a5 除以 3 的值,并将结果存入了变量 a5;
打印上述三个变量的值域类型。
输出如下所示,可以看到,三个变量的类型都是 float,代表都是浮点数。在输出的格式中,也有小数的部分,其中对于无理数, Python 会取前 16 位展示。
1.25 <class 'float'> 2.5 <class 'float'> 0.8333333333333334 <class 'float'>
布尔型代表变量只可能有两种取值:True / False,英文名叫 Bool 或者 Boolean,一般用来存储逻辑判断的结果。True / False 用中文的理解可以是真或假、是或否。在数据分析中,我们经常需要根据一定的条件筛选出数据,比如我们希望从一个班的成绩表中,筛选出大于 90 分的学生,那我们需要看每一个学生,他的成绩“是否大于 90”。 这里判断一个分数“是否大于 90”的结果,就是一个布尔型变量。
我们还是直接基于代码来理解。新建 Cell, 输入以下代码:
stu_score = 93
a7 = stu_score > 90
a8 = stu_score < 60
a9 = a7 and a8
a10 = a7 or a8
print(a7, type(a7), a8, type(a8), a9, type(a9), a10, type(a10))
代码和上面一节的结构很像,主要做了:
创建了一个整型变量stu_score
并赋值 93;
将逻辑判断stu_score
是否大于 90 的结果存到了变量a7
;
将逻辑判断stu_score
是否小于 60 的结果存到了变量a8
;
对a7
和a8
进行逻辑“与”运算,并将结果存到a9
;
对a7
和a8
进行逻辑“或”运算,并将结果存到a10
;
打印a7``a8``a9``a10
的值和类型。
输出结果如下所示。
True False False True
可以看到变量a7
和a8
的值都为 bool 类型,也就是布尔型。其中a7
为真,a8
为假,a9
为假,a10
为真。
以上,我们学习了布尔类型的基础以及针对布尔类型的基本运算:逻辑运算。Python 中,用and
表示逻辑的与运算,代表需要两个操作数都为真,结果才为真。or
表示逻辑的或运算,代表两个操作数只要有其中一个为真,则结果就为真。
字符串,顾名思义,是用来描述、存储和表达文本的数据类型,是计算机领域一个非常重要的数据类型。我们在电脑上写的文章,微信聊天中发送的消息,背后都是一个个字符串类型的数据。
Python 中,字符串代表用单引号或者双引号包住的内容,比如 "Hello Data Science"就是一个字符串,字符串由一对双引号内的一个个字符组成(空格也算一个字符)。
在实际工作场景中,我们处理的数据表往往不全是数字,比如学生信息表,除了性别、年龄之外,像姓名,籍贯,家庭住址等信息,都是通过字符串来存储的,所以掌握字符串的使用对于数据分析也至关重要。
接下来,我们通过几个简单的例子来感受字符串的特性与基本的使用。
(1)拼接。在 Python 中,对于字符串类型的值和变量,加号代表拼接,就是把两个字符串拼接到一起。新建 Cell, 输入以下代码:
a1 = "Hello, Data Science"
a2 = "I'm coming"
a3 = a1 + ", " + a2
print(a1, type(a1))
print(a3, type(a3))
输出结果是这样的:
Hello, Data Science <class 'str'>
Hello, Data Science, I'm coming <class 'str'>
可以看到,第二行的字符串已经是两个字符串 a1 和 a3 拼接起来的做过,并且我们还在中间增加了一个逗号。
(2)换行。如果字符串太长,我们希望在打印出来的时候能够换行显示,可以在字符串中插入 '\n' 字符。这样,最终打印的时候 '\n' 之后的字符都会在新的一行显示。示例如下:
a1 = "Hello\nData Science"
print(a1, type(a1))
输出结果是这样的:
Hello
Data Science <class 'str'>
可以看到,在 \n 后面的 Data Science 被显示到了新的一行。
总结一下,字符串代表字符的集合,是用来存储文本的数据类型。两个字符串类型的变量可以用相加,代表把两个字符串拼接在一起。另外,当字符串包含\n
这样的换行符时,我们通过print
函数打印该字符串时,\n
字符后面的内容会在新的一行显示,\n
字符本身并不会显示。
列表和字符串一样,都是存储多个值的集合。与字符串不同的是,字符串只能存储一个个字符,而列表则可以存储任意类型的变量。
比如我们可以有存储多个整型的列表,也可以有存储多个浮点型的列表。比如最简单的场景,要统计一个班 50 名同学数学考试的平均分,一般情况下都需要将 50 个分数存在列表,然后才能针对这个列表去算平均分。
与字符串一样,列表类型也有一系列函数用于操作自身,话不多说,咱们直接上 Notebook 演示列表的基本操作,主要包含:
列表的创建;
打印;
获取列表长度;
获取列表中的某个位置的变量;
往列表中添加新的值;
删除列表的某个值。
我们还是新建 Cell,输入以下代码。
tc_a1 = 10
la = [1,2,3,tc_a1]
print("List is: ", la)
print("List length: ", len(la))
print("List tail: ", la[-1])
print("List head: ", la[0])
la.append("Hello")
print("After append: ", la)
la.remove(2)
print("After remove: ", la)
在上面的代码中,我们主要完成了:
创建列表类型的变量la
,并且存入了 4 个值,分别是数字 1、2、3 和变量tc_a1
;
打印了变量la
;
打印了变量la
的长度,通过len
函数,这里和之前学习到的取字符串长度的方法是一样的;
打印了变量la
的最后一个元素,对于列类型的变量,la[x]
代表取列表中第 x 个元素的值,从 0 开始。当 x = -1 时,代表返回列表的最后一个元素;
打印变量la
的第一个元素,原理同上;
通过列表类型的append
函数,将字符串“Hello”添加到la
中;
打印添加元素后的la
;
通过列表类型的remove
函数,将数字 2 从la
中删除;
打印删除元素后的la
。
最终运行 Cell,结果输出如下:
List is: [1, 2, 3, 10]
List length: 4
List tail: 10
List head: 1
After append: [1, 2, 3, 10, 'Hello']
After remove: [1, 3, 10, 'Hello']
通过以上练习,我们可以知道列表类型的基本使用方法。
创建:通过中括号来创建一个列表,中括号里面是一个或多个值,用逗号隔开,代表列表中的值。
获取长度:同字符串一样,可以通过len
函数计算列表的长度(即列表中的元素的个数)。
获取元素:可以通过列表变量[x]
的形式访问列表中的第 x 个值(从 0 开始算),如la[0]
代表列表 la 的第一个元素
增删元素:在创建完列表之后,可以通过调用列表的append
添加元素,remove
函数元素。
到此,相信你对于列表类型已经有了初步的认识,在接下来的内容中,列表还会被经常用到。下一节,我们将会介绍不同的数据类型之间如何混合运算。
目前,我们已经学习完了 Python 的主要集中数据类型。课程刚开始提到,不同的类型所支持的操作和计算也不同,同一个操作在不同的数据类型中的行为也不相同,当时我们举了字符串和整数的加法运算作为例子。
现在回过头来看,虽然我们没办法对字符串和整数做加法,但我们是不是可以针对整型和浮点型做加法呢? 因为对于数值而言,虽然类型不一样,但对于运算的定义是一致的。答案是肯定的,这就需要一个神奇的机制:类型转换登场了。
Python 本身也是支持整型和浮点型做混合运算的,怎么实现的呢?我们来做一个简单的试验。还是熟悉的新建 Cell, 输入以下代码:
tc_a1 = 10
tc_a2 = 1.5
tc_a3 = tc_a1 + tc_a2
print(tc_a3, type(tc_a3))
我们将一个整数和一个浮点数分别存在变量tc_a1
和tc_a2
中,并且将其相加,把结果存在tc_a3
中,运行之后,结果输出是 11.5:
11.5 <class 'float'>
可以看到最终结果被正确地算了出来,并且存储结果的变量类型为浮点型。
所以本质上来说,运算过程仍然是限定在同一类型中进行的,只是对于一部分类型,Python 会进行自动地类型转换,比如当一个整型和浮点型相加时,Python 会自动先将整型转换为浮点型,然后再做加法,所以最后的结果是浮点型。
为什么是整型自动转浮点而不是反过来呢? 核心原因是如果默认浮点转整型,则会造成精度的丢失。所以从代价上来看,整型转浮点更合适。
如果我们不希望用 Python 默认的类型转换,而是希望由我们来决定怎么转换该怎么办呢? 比如像刚才的例子,我就希望转成整数去做计算,精度丢失无所谓(现实生活中确实也存在这种场景,比如我们想统计大概人数,显然一般不存在几点几个人,所以这种情况我们倾向于直接转换为整数计算,抛弃小数部分)。
接下来,我就介绍一下 Python 的手动类型转换。我们还是新建 Cell,输入以下代码:
tc_a4 = tc_a1 + int(tc_a2)
print(tc_a4, type(tc_a4))
我们仍然延续了上一个 Cell 的变量:整型tc_a1
和浮点型tc_a2
,与刚才直接相加不同的是,我们首先通过int
函数将tc_a2
强制转换成整型之后再做加法。运行之后,输出如下所示。
11 <class 'int'>
可以看到最终结果是 11,因为我们把tc_a2
强制转换为整数的时候,丢失了精度(这里的丢失精度跟四舍五入没关系,只是把小数点后面的内容直接去掉了),所以最后计算的是 10 +1。
强制类型转换还有另一个经典场景就是将内容为数字的字符串转换为数字参与运算。与上一例类似,我们可以用类型函数进行转换。在下面的例子中我们用float
函数将变量tc_a5
从字符串转换为了浮点数.
tc_a5 = "21.5"
tc_a6 = tc_a1 + float(tc_a5)
tc_a6
结果输出为 31.5:
31.5
今天,我们学习了 Python 语言中最重要的基础 —— 变量与数据类型。
首先,变量代表的是某块内存地址的名字,而变量对应内存地址存储的内容,则成为变量的值。一个变量肯定会有值,但值不一定会对应变量。比如 Python 中的一个数字 130 ,如果我没有将其赋值给一个变量,那它就是单纯的一个值。
之后,我们学习了变量的数据类型,主要包括以下几种。
整型:也就是整数,比如 15、100 这样的数字都是整型。
浮点型:也就是小数,比如 1.2、13.5 这样的数字。
布尔型:表示逻辑运算的结果,比如常见的 x 是否大于 50 这样的结果。
字符串:表示一个或多个字符组成的集合,用来存储文本。比如学生的名字,一般就是一个字符串。
列表:存储的是变量的集合。可以理解成变量的列表,我们可以通过中括号+位置: [x] ,来获取列表中第 x 个位置的变量的值。
本讲内容有点长,但都是 Python 最最最最核心的基础,之后每一讲的内容基本上都需要用到本讲的知识,建议你可以多花一些时间,吃透它!把课程的代码都试着自己敲一遍,加深印象!
最后留一个互动话题: 生活中的邮政编码和电话号码,用什么数据类型来存储比较好呢? 为什么?可以把自己的想法写在留言区~