Python 数据分析基础知识部分
1. Python语言基础、IPython 及 Jupyter notebook
- Python 是一种解释型语言,Python 解释器通过一次执行一条语句来运行程序;
1.1 Jupyter notebook
- Tab 补全;
- 内省:
a. 在变量名前后使用 ?,显示对象的概要信息/函数的文档字符串;
b. 使用 ??,显示函数源代码;
c. np.*load*?:显示所有匹配通配符表达式的命名 - %run:运行任意的Python文件;
- %load:将脚本导入一个代码单元;
- %matplotlib 集成,必须输入,否则无法显示创建的图片
1.2 Python 语言基础
1.2.1 语言语义
- 缩进,而不是大括号;
- 一切皆为对象;
- 注释:#
- 函数和对象方法调用:位置参数、关键字参数;
- 变量与参数传递:对变量赋值时,创建了一个指向等号右边对象的引用;赋值也被称为绑定;
- 动态引用、强类型:Python中的对象引用并不涉及类型;Python为强类型语言;使用 isinstance(a, (int, float)) 检查对象是否为特定类型的实例;
- 二元运算符(不太熟的几个):
操作符 | 描述 |
---|---|
a // b | a 整除以 b |
a ** b | a 的 b 次方 |
a & b | a 与 b,对于整数则是按位 and |
a | b | a 或 b,对于整数则是按位 or |
a ^ b | a 异或 b,对于整数则是按位异或 |
1.2.2 标量类型
类型 | 描述 |
---|---|
None | Null |
str | 字符串(包含Unicode UTF-8 编码) |
bytes | 原生 ASCII字节(或 Unicode 编码字节) |
float | 双精度 64 位浮点数 |
bool | True or False |
int | 任意精度无符号整数 |
- 数值类型:int, float:整数除法会将结果自动转换位浮点数;
- 字符串:
a. 单引号 or 双引号;
b. 多行字符串则使用3个单引号 or 双引号;
c. 字符串是不可变的;
d. 转移符号 \;
e. 原生字符 r’…’;
f. 格式化字符串:.format - 日期和时间:datetime 模块,datetime.datetime 为不可变类型
a. dt = datetime(year, month, day, hour, minute, second)
b. 使用 .date 和 .time 获取日期和时间;
c. .strftime 方法将 datetime 转换位字符串;字符串通过 datetime.strptime 函数转换为 datetime 对象
e. datetime 格式化详细说明:
类型 | 描述 |
---|---|
%Y | 四位的年份 |
%y | 两位的年份 |
%m | 两位的月份[01, 12] |
%d | 两位的天数值 [01, 31] |
%H | 小时值(24 小时制)[00, 23] |
%I | 小时值(12 小时制)[01, 12] |
%M | 两位的分钟值 [00, 59] |
%S | 秒值 [00, 61] (60, 61用于区分闰秒) |
%w | 星期值 [0(星期天), 6] |
%U | 一年中的第几个星期值 [00, 53],星期天为每周第一天,第一个星期天前一周是第0周 |
%W | 一年中的第几个星期值 [00, 53],星期一为每周第一天,第一个星期一前一周是第0周 |
%z | UTC 时区偏置,格式为 +HHMM 或 -HHMM,如果是简单时区则为空 |
%F | %Y-%m-%d 的简写 |
%D | %m/%d/%y 的简写 |
1.2.3 控制流
- if, elif 和 else:
if condition_1:
do something
elif condition_2:
do something
else:
do something
- for 循环:
for value in condition:
if condition_2:
break # 嵌套循环里,break 只结束最内层的 for 循环
do something
- while 循环:
while condition:
if condition_2:
break # break 退出整个循环
if condition_3:
continue # continue 退出当前循环
do something
- pass:
if condition:
do something
else:
pass # 啥都不干
-
range:
迭代器
range(start, stop, step) -
三元表达式:
value = true-expr if condition else false-expr
2. 内建数据结构、函数及文件
2.1 数据结构和序列
Python中的序列索引都是从 0 开始的
2.1.1 元组
- 元组是一种固定长度,不可变的 Python 序列,但如果元组中的一个对象是可变的,可对其进行内部修改;
- 使用 tuple 函数将任意序列或迭代器转换为元组;
- 元组拆包:
可轻易地交换变量名;可遍历元组或列表组成的序列;特殊语法*rest(* 加上任意变量名)
tup = (1, 2, 3)
a, b, c = tup # 拆包
b, a = a, b # 交换变量名
- 元组方法: count
2.1.2 列表
列表的长度和内容是可以改变的
使用 [ ] 或 list 函数来定义列表
方法或函数 | 作用 |
---|---|
.append(component) | 将元素添加到列表的尾部 |
.insert(index, component) | 将元素插入到指定的列表位置 |
.pop(index) | 将特定位置的元素移除并返回 |
.remove(component) | 定位第一个符合要求的值并移除它 |
.extend(list) | 向列表中加入多个元素 |
.sort(key=len) | 列表排序 |
-
二分搜索和已排序列表的维护:
bisect 模块:
bisect.bisect(list, component) 返回元素应当被插入的位置,并保持序列排序;
bisect.insort(list, component) 将元素插入到相应位置 -
切片: list[start : end : step]
start 和 end 为负数:从尾部开始索引
step 为负数:倒序(可对列表或元组进行翻转)
2.1.3 内建序列函数
函数 | 描述 |
---|---|
enumerate(seq) | 返回 (i, value) 元组序列,用于遍历序列的同时追踪当前元素的索引 |
sorted(seq, key=len) | 返回一个根据任意序列中的元素新建的已排序列表 |
zip(seq1, seq2) | 将列表、元组或其他序列的元素配对,新建一个元组构成的列表,生成的列表长度由最短的序列决定 |
zip(*seq) | seq 为已“配对”的序列,拆分已配对的序列,也可理解为转置,zip的逆操作 |
reversed(seq) | 为一个倒序生成器,需使用list或for循环进行实例化才产生倒序的对象(如列表) |
2.1.4 字典
一系列键值对
函数方法等 | 作用 |
---|---|
value = dic[key] | 获取与键相关联的值 |
dic[new_key] = new_value | 添加键值对 |
dic[key] = new_value | 修改值 |
del dic[key] | 删除键值对 |
dic.pop(key) | 删除的同时返回值 |
dic1.update(dic2) | 合并 dic1 和 dic2(若 dic2 和 dic1 中有相同的键,则dic1中的值被覆盖) |
dic.keys() | 键的迭代器 |
dic.values() | 值的迭代器 |
dict(zip(seq1, seq2) | 由序列生成字典 |
dic.get(key, default_value) | 当 key 是 dic 的键时返回对应的值,否则返回 default_value |
2.1.5 集合
set 函数 or 大括号,类似于列表,但每个元素都是独一无二的
Python 集合操作(日后补充)
2.1.6 列表、集合和字典的推导式
- 列表推导式:[expr for val in collection if condition]
- 字典推导式:{key-expr: value-expr for value in collection if condition}
- 列表推导式可嵌套,与 for 嵌套循环等效,注意 for 表达式的顺序应当和写嵌套 for 循环来替代列表推导式的顺序一致
例子:
names_of_interest = []
for names in all_data:
enough_es = [name for name in names if name.count('e') >= 2]
names_of_interest.extend(enough_es)
# 等效的嵌套推导式
result = [name for names in all_data for name in names if name.count('e') >= 2]
2.2 函数
函数声明:
def my_function(x, y, z=1.5):
if z > 1:
return z * (x + y)
else:
return z / (x + y)
关键字参数与位置参数:
- 关键字参数常用于指定默认值或可选参数(z);
- 关键字参数必须更在位置参数(x,y)后;
- 指定关键字参数可以不考虑顺序;
- 可以使用关键字参数向位置参数传参;
2.2.1 全局变量、返回多个值、函数是对象
- 全局变量:需在函数内部使用 global 关键字声明
- 返回多个值:实质为返回一个元组,之后被拆包为多个结果变量
- 函数是对象:可将多个函数组合成列表,可将函数作为参数传递给其他函数
2.2.2 匿名函数(Lambda)
通过单个语句生成函数,其结果是返回值
lambda x: x ** 2
2.2.3 生成器
- 创建生成器:在函数中使用 yield 替代 return;
- 实际调用生成器时,代码不会立即执行,直到请求生成器中的元素时,它才会执行;
- 生成器表达式:只需将列表推导式中的中括号改为小括号
2.2.4 错误和异常处理
def function(x):
try:
do something #没有出错时执行
except [Error]:
do something #出现【特定】错误时执行
[else:
do something] #当 try 成功执行时才会执行
2.3 文件与操作系统
with open(path[, 'w']) as f:
lines = [x.rstrip() for x in f]
python 文件模式:
模式 | 描述 |
---|---|
r | 只读模式 |
w | 只写模式,创建新文件(清除路径下的同名文件中的数据) |
x | 只写模式,创建新文件,但存在同名路径时会创建失败 |
a | 添加到已经存在的文件(如果不存在就创建) |
r+ | 读写模式 |
b | 二进制文件的模式,添加到别的模式中(比如 ‘rb’ 或 ‘wb’) |
t | 文件的文本模式(自动将字节解码为 Unicode)。如果没有指明模式,默认使用此模式,可以添加到别的模式中(例如 ‘rt’ 或 ‘xt’) |
重要的 Python 文件方法或属性
方法 | 描述 |
---|---|
read([size]) | 将文件数据作为字符串返回,可选参数 size 控制读取的字节数 |
readlines([size]) | 返回文件中行内容的列表,size 参数可选 |
write(str) | 将字符串写入文件 |
writelines(strings) | 将字符串序列写入文件 |
close() | 关闭文件 |
flush() | 将内部 I/O 缓冲器内容刷新到硬盘 |
seek(pos) | 移动到指定的位置(整数) |
tell() | 返回当前的文件位置,返回值是整数 |
closed | 如果文件已关闭,则为 True |