利用Python进行数据分析-学习笔记一
chapter 1 Python语言基础,IPython及Jupyter Notebook
Python是一种解释型语言,Python解释器通过一次执行一条语句来运行程序。标准的交互式Python解释器可以通过在命令行中输入Python启动:
$ python
Python 3.6.0 | packaged by conda-forge | (default, Jan 13 2017, 23:17:12)
[GCC 4.8.2 20140120 (Red Hat 4.8.2-15)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> a = 5
>>> print(a)
5
在命令汉字行看到的>>>提示符是键入代码的地方。要退出Python解释器回到命令行提示符,可以输入exit()或者按下Ctrl-D
通过python命令,再把.py文件作为第一个参数就可以非常方便的的运行Python程序。假设我们已经写好了一个叫做hello_world.py的文件:
print("hello world")
执行以下命令去运行程序(hello_world.py必须在命令行的当前路径下):
$ python hello_world.py
Hello world
下面来简单介绍ipython:ipython是一个加强版的python解释器,当使用%run
命令时,ipython会在同一个进程内执行指定文件的代码,确保你在执行完成时可以立即探索执行结果。
$ ipython
Python 3.6.0 | packaged by conda-forge | (default, Jan 13 2017, 23:17:12)
Type "copyright", "credits" or "license" for more information.
IPython 5.1.0 -- An enhanced Interactive Python.
? -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help -> Python's own help system.
object? -> Details about 'object', use 'object??' for extra details.
In [1]: %run hello_world.py
Hello world
In [2]:
IPython基础
运行IPython命令行
import numpy as np
data = {i : np.random.randn() for i in range(7)}
data
结果:
1:-0.8445343866158372,
2:1.2539550827346986,
3:-0.4716165071892965,
4:1.4871738066920603,
5:0.12535112214383046,
6:-2.0241679120500202}```
常见的print打印语句不同,IPython中大多数Python对象被格式化为更可读,更美观的形式。
from numpy.random import randn
data = {i : randn() for i in range(7)}
print(data)
{0: -1.5948255432744511, 1: 0.10569006472787983, 2: 1.972367135977295, 3: 0.15455217573074576, 4: -0.24058577449429575, 5: -1.2904897053651216, 6: 0.3308507317325902}
运行Jupyter notebook
启动Jupyter
$ jupyter notebook
[I 15:20:52.739 NotebookApp] Serving notebooks from local directory:
/home/wesm/code/pydata-book
[I 15:20:52.739 NotebookApp] 0 active kernels
[I 15:20:52.739 NotebookApp] The Jupyter Notebook is running at:
http://localhost:8888/
[I 15:20:52.740 NotebookApp] Use Control-C to stop this server and shut down
all kernels (twice to skip confirmation).
Created new window in existing browser session.
界面如下所示:
右上角点击新建按钮选择Python3即可新建一个笔记本
输入一行python代码,然后按下Shift-Enter或Ctrl-Enter来执行。
Tab补全
当在命令行输入表达式时,按下键即可为任意变量(对象,函数等)搜索命名空间,与你目前输入的字符串进行匹配:
In [1]: an_apple = 27
In [2]: an_example = 42
In [3]: an<Tab>
内省
在一个变量名前的前后使用**?**可以显示一些关于该对象的概要信息:
In [8]: b = [1, 2, 3]
In [9]: b?
Type: list
String Form:[1, 2, 3]
Length: 3
Docstring:
list() -> new empty list
list(iterable) -> new list initialized from iterable's items
In [10]: print?
Docstring:
print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)
Prints the values to a stream, or to sys.stdout by default.
Optional keyword arguments:
file: a file-like object (stream); defaults to the current sys.stdout.
sep: string inserted between values, default a space.
end: string appended after the last value, default a newline.
flush: whether to forcibly flush the stream.
Type: builtin_function_or_method
这就是对象内省。
%run命令
可以在IPython会话中使用**%run**命令运行任意的Python程序文件。
例如在ipython_script_test.py中有如下脚本:
def f(x, y, z):
return (x + y) / z
a = 5
b = 6
c = 7.5
result = f(a, b, c)
运行该程序:
In [14]: %run ipython_script_test.py
In [15]: c
Out [15]: 7.5
In [16]: result
Out[16]: 1.4666666666666666
在Jupyter notebook中如果想将一个脚本文件导入一个代码单元,可以使用**%load**魔法函数
>>> %load ipython_script_test.py
def f(x, y, z):
return (x + y) / z
a = 5
b = 6
c = 7.5
result = f(a, b, c)
快捷键
Jupyter笔记本有两种不同的键盘输入模式. 编辑模式允许您将代码或文本输入到一个单元格中,并通过一个绿色的单元格来表示 命令模式将键盘与笔记本级命令绑定在一起,并通过一个灰色的单元格边界显示,该边框为蓝色的左边框。在这里我只罗列编辑模式的快捷键:
编辑模式(按 Enter 生效)
Tab : 代码完成或缩进
Shift-Tab : 工具提示
Ctrl-] : 缩进
Ctrl-[ : 取消缩进
Ctrl-A : 全选
Ctrl-Z : 撤销
Ctrl-/ : 评论
Ctrl-D : 删除整行
Ctrl-U : 撤销选择
Insert : 切换 重写标志
Ctrl-Home : 跳到单元格起始处
Ctrl-上 : 跳到单元格起始处
Ctrl-End : 跳到单元格最后
Ctrl-下 : 跳到单元格最后
Ctrl-左 : 跳到单词左边
Ctrl-右 : 跳到单词右边
Ctrl-删除 : 删除前面的单词
Ctrl-Delete : 删除后面的单词
Ctrl-Y : 重做
Alt-U : 重新选择
Ctrl-M : 进入命令行模式
Ctrl-Shift-F : 打开命令配置
Ctrl-Shift-P : 打开命令配置
Esc : 进入命令行模式
Shift-Enter : 运行代码块, 选择下面的代码块
Ctrl-Enter : 运行选中的代码块
Alt-Enter : 运行代码块并且插入下面
Ctrl-Shift-Minus : 在鼠标出分割代码块
Ctrl-S : 保存并检查
下 : 光标下移
上 : 光标上移
常用魔术命令
在代码块里输入**%magic**可获得所有可用魔术命令的详细文档。
matplotlib集成
在Ipython命令行中,运行%matplotlib
命令可以生成多个绘图窗口,而不干扰控制台的对话。
In [26]: %matplotlib
Using matplotlib backend: Qt4Agg
在Jupyter notebook中使用
In [26]: %matplotlib inline
Python语言基础
语言语义
缩进
Python使用缩进(tab或者空格)来组织代码,一个冒号代表一个缩进代码块的开始,单个代码块中所有的代码必须保持相同的缩进,直到代码块结束。
for x in array:
if x < pivot:
less.append(x)
else:
greater.append(x)
注释
Python用**#**表示注释,不执行#后的语句
有时候像排除掉部分代码又不想删除,这时候就可以使用#注释掉相应语句
results = []
for line in file_handle:
# keep the empty lines for now
# if len(line) == 0:
# continue
results.append(line.replace('foo', 'bar'))
写在语句的后面,说明语句含义
print("Reached this line") # Simple status report
函数和对象调用的方法
调用函数时,向函数括号里传递0或多个参数,通常会把返回值赋值给一个变量;
result = f(x, y, z)
g()
变量和参数传递
在Python中对一个变量赋值时,就创建了一个指向等号右边对象的引用。例如:
a=[1,2,3]
b=a
a.append(4)
b
Out[1]: [1,2,3,4]
在Python中,a,b实际指向了相同的对象,即原来的[1,2,3]
导入
在Python中,模块就是以.py为后缀名并包含python代码的文件,假设我们有以下模块;
# some_module.py
PI = 3.14159
def f(x):
return x + 2
def g(a, b):
return a + b
假如我们想从另一个相同路径下的文件连接到some_module.py中定义的变量或函数,我们需要:
import some_module
result = some_module.f(5)
pi = some_module.PI
或者
from some_module import f, g, PI
result = g(5, PI)
通过使用as关键词,对导入内容给予不同的变量名
import some_module as sm
from some_module import PI as pi, g as gf
r1 = sm.f(pi) r2 = gf(6, pi)
二元运算符和比较运算
操作符 | 描述 |
---|---|
a + b | 加 |
a - b | 减 |
a * b | 乘 |
a / b | 除以 |
a // b | 整除以 |
a ** b | a的b次方 |
a & b | 与 |
a | b | 或 |
a ^ b | 对布尔值,a异或b;对整数则是按位异或 |
a == b | 相等则为Rrue |
a != b | 不等则为True |
a <=b, a < b | 小于等于,小于 |
a >=b,a > b | 大于等于,大于 |
a is b | a,b是同一个对象则为True |
a is not b | a,b不是同一个对象则为True |
可变对象与不可变对象
Python中的大部分对象,例如列表,字典,Numpy数组都是可变对象,大多数用户定义的类型也是可变的。可变对象中包含的对象和值是可以被修改的;
a_list = ['foo', 2, [4, 5]]
a_list[2] = (3, 4)
a_list
Out[]: ['foo', 2, [4, 5]]
字符串和元组不可改变:
标量类型
类型 | 描述 |
---|---|
None | null |
str | 字符串类型 |
byte | 原生ASCII类型(或者Unicode编码字节) |
float | 双精度64位浮点数值 |
bool | 布尔值,true 或false |
int | 任意精度无符号整数 |
字符串
用单引号或者双引号创建一个字符串:
a = 'one way of writing a string'
b = "another way"
对于含有换行的多行字符串,可以使用三个单引号**’’'或者三个双引号"""**:
c = """
This is a longer string that
spans multiple lines
"""
可以使用count方法来计算c的回车符:
c.count('\n')
3
很多python对象可以通过str函数转成字符串:
a = 5.6
s = str(a)
print(s)
字符串可别看作序列;
s = 'python'
list(s)
s[:3]
**s[:3]**这种语法被称为切片
类型转换
s = '3.14159'
fval = float(s)
type(fval)
out: float
int(fval)
out: 3
bool(fval)
out: True
bool(0)
out: False
None
None是null值类型。如果一个函数没有显式的返回值,那么它会隐式的返回None.
日期和时间
Python中内置的datatime模块,提供了datatime,data,time类型。
from datetime import datetime, date, time
dt = datetime(2011, 10, 29, 20, 30, 21)
dt.day
dt.minute
strftime方法将datatime转化为字符串:
dt.strftime('%m/%d/%Y %H:%M')
strptime将字符串转化为datatime对象:
datetime.strptime('20091031', '%Y%m%d')
控制流
if,elif,else
if x < 0:
print('It's negative')
if x < 0:
print('It's negative')
elif x == 0:
print('Equal to zero')
elif 0 < x < 5:
print('Positive but smaller than 5')
else:
print('Positive and larger than or equal to 5')
for循环
for循环用于遍历一个集合或一个迭代器。语法如下所示:
for value in collection:
# do something with value
使用continue关键字可以跳过continue之后的代码进入下一次循环。例如对列表中的非null值进行累加:
sequence = [1, 2, None, 4, None, 5]
total = 0
for value in sequence:
if value is None:
continue
total += value
break关键字可以结束一个for循环。以下代码会对列表元素累加,直到5出现:
sequence = [1, 2, 0, 4, 6, 5, 2, 1]
total_until_5 = 0
for value in sequence:
if value == 5:
break
total_until_5 += value
while循环
while循环会在条件符合时一直执行代码块,知道条件判断为False或显式的以break结尾时才结束:
x = 256
total = 0
while x > 0:
if total > 500:
break
total += x
x = x // 2
pass
pass用于在代码段中表示不执行任何操作(或者是作为还没有实现的代码占位符)。
if x < 0: print('negative!') elif x == 0:
# TODO: put something smart here
pass
else: print('positive!')
整理自《利用Python进行数据分析》第二版