准备工作
- 安装Anaconda
- 安装Jupyter notebook
- 安装ipython
Python语法基础
- 万物皆对象
- 动态引用,强类型
isinstance(a, int)
- 鸭子类型
- 列表、字典、NumPy数组,和用户定义的类型(类),都是可变的;字符串和元组,是不可变的
- 对于有换行的字符串,可以使用三引号,’’'或"""
- 三元表达式
Python数据结构和序列
- 元组
In [1]: tup = 4, 5, 6
- tuple方法
- 列表
- 二级排序 b.sort(key=len)
- bisect 二分搜索
- 匿名函数
equiv_anon = lambda x: x * 2
- 柯里化:部分参数应用
- 生成器
NumPy基础
- NumPy是在一个连续的内存块中存储数据,独立于其他Python内置对象。NumPy的C语言编写的算法库可以操作内存,而不必进行类型检查或其它前期工作。比起Python的内置序列,NumPy数组使用的内存更少。
- NumPy可以在整个数组上执行复杂的计算,而不需要Python的for循环。
numpy使用
import numpy as np
data1 = [6,7.5,8,0,1]
arr1 = np.array(data1)
arr1.shape
arr1.dtype
data2 = [[1, 2, 3, 4], [5, 6, 7, 8]]
arr2 = np.array(data2)
numpy数组的运算
不用编写循环即可对数据执行批量运算。
NumPy用户称其为矢量化(vectorization)。
大小相等的数组之间的任何算术运算都会将运算应用到元素级
data = [[1.,2.,3.],[4.,5.,6.]]
arr = np.array(data)
arr+arr
arr*arr
基本的索引和切片
数组切片是原始数组的视图。这意味着数据不会被复制,视图上的任何修改都会直接反映到源数组上。
arr = np.arange(10)
arr_slice = arr[5:8]
arr_slice[1]=12345
注意:如果想要得到ndarray切片的一份副本而非视图,
就需要明确地进行复制操作,例如arr[5:8].copy()。
切片索引
arr2d = np.array([[1,2,3],[4,5,6],[7,8,9]])
arr2d[:2,1:]
arr2d[:, :1]
[4],
[7]])
布尔型索引
In [98]: names = np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'])
In [99]: data = np.random.randn(7, 4)
In [102]: names == 'Bob'
Out[102]: array([ True, False, False, True, False, False, False], dtype=bool)
In [103]: data[names == 'Bob']
花式索引
以特定顺序选取行子集,
只需传入一个用于指定顺序的整数列表或ndarray
In [117]: arr = np.empty((8, 4))
In [118]: for i in range(8):
arr[i] = i
In [120]: arr[[4, 3, 0, 6]]
Out[120]:
array([[ 4., 4., 4., 4.],
[ 3., 3., 3., 3.],
[ 0., 0., 0., 0.],
[ 6., 6., 6., 6.]])
使用负数索引将会从末尾开始选取行
arr[[1, 5, 7, 2], [0, 3, 1, 2]]
选取的是(1,0)、(5,3)、(7,1)和(2,2)
arr[[1, 5, 7, 2]][ :, [0, 3, 1, 2]]
先选取1,5,7,2行。每一行再按照0,3,1,2排序
数组转置和轴对换
arr.T
np.dot(arr.T,arr)
arr.transpose((1,0,2))
通用函数
对ndarray中的数据执行元素级运算的函数。
可看做简单函数(接受一个或多个标量值,并产生一个或多个标量值)的矢量化包装器。
np.sqrt(arr)
np.exp(arr)
np.maximum(x, y)
remainder, whole_part = np.modf(arr)
np.sqrt(arr, arr)
其他函数见书
利用数组进行数据处理
用数组表达式代替循环的做法,通常被称为矢量化
np.meshgrid函数接受两个一维数组,并产生两个二维矩阵(对应于两个数组中所有的(x,y)对) xs, ys = np.meshgrid(points, points)
将条件逻辑表述为数组运算
result = np.where(cond,x,y) cond为一个条件数组,如果cond中为true,使用x替换,如果为false,使用y替换
数学和统计方法
arr.mean()
arr.mean(axis=1)
arr.sum()
arr.sum(axis=0)
arr.cumsum()
arr.cumsum(axis=0)
arr.cumprod()
arr.cumprod(axis=0)
排序
arr.sort()
arr.sort(0)
arr.sort(1)
np.sort(arr)
唯一化以及其他的集合逻辑
np.unique(names)
np.in1d(values,array)
用于数组的文件输入输出
np.save('some_array', arr)
np.savez('array_archive.npz', a=arr, b=arr)
arch = np.load('array_archive.npz')
arch['b']
np.savez_compressed('arrays_compressed.npz', a=arr, b=arr)
线性代数
伪随机数生成
samples = np.random.normal(size=(4, 4))
rng = np.random.RandomState(1234)
示例:随机漫步
pandas入门
Series
相当于一个Map
DataFrame
相当于一个表格
data = {’a':[1,2,3],'b':[4,5,6]}
frame = np.DataFrame(data)
frame = np.DataFrame(data,columns['b','a'],index=['one','two','three'])
frame['a']
frame.a
frame.loc['three']
frame['a'] = pd.Series([3,4,5],index=['one','three','two'])
del frame['a']
索引对象
将索引作为对象,进行存储。 索引对象不可修改,pandas的Index可以包含重复的标签。
index = obj.index
index[1] = 'b' ?
pd.index = (['a','a','b'])
基本功能
- 重新索引 reindex
obj.reindex(['a','c','b'])
obj.reindex(columns = ['ohio','texas','california'])
obj.reindex(range(6),method='ffill')
- 丢弃指定轴上的项
obj.drop(['d', 'c'])
data.drop('two', axis=1)
obj.drop('c', inplace=True)
- 索引、选取和过滤
obj = pd.Series(np.arange(4),index=['a','b','c','d'])
obj['a']
obj[1]
obj[:2]
obj[['a','b']]
obj[obj<2]
obj['a':'c']
- loc和iloc
loc通过名字,iloc通过整数
data.loc['ohio']
data.loc[['ohio','utah']]
data.loc[:2,['one','three']]
data.iloc[0]
data.iloc[[0,2]]
data.iloc[:2,[0,2]]
-
算术运算和数据对齐 不包括的自动填充NaN -
DataFrame和Series之间的运算
series = frame.iloc[0]
frame - series
frame + series2
series3 = frame['d']
frame.sub(series3, axis='index')
- 函数应用和映射
np.abs(frame)
f = lambda x: x.max() - x.min()
frame.apply(f)
def f(x):
return pd.Series([x.min(), x.max()], index=['min', 'max'])
frame.apply(f)
format = lambda x: '%.2f' % x
frame.applymap(format)
- 排序和排名
frame.sort_index()
frame.sort_index(axis=1, ascending=False)
frame.sort_values(by=['b','a'])
frame.rank(axis='columns')
series.sort_values()
series.rank()
series.rank(method='first')
- 带有重复标签的轴索引
obj = pd.Series(range(4),index=['a','a','b','c'])
obj['a']
obj['b']
obj.index.is_unique
汇总和计算描述统计
- 常规
axis = 0 列
axis = 1 行
df.sum()
df.mean()
df.idxmax()
df.cumsum()
df.describe()
- 相关系数与协方差
更改axis='columns’ 可以按照行进行计算
returns = price.pct_change()
returns.tail()
returns['MSFT'].corr(returns['IBM'])
returns['MSFT'].cov(returns['IBM'])
returns.corrwith(returns.IBM)
- 唯一值、值计数以及成员资格
uniques = obj.unique()
obj.value_counts()
pd.value_counts(obj.values, sort=False)
mask = obj.isin(['b', 'c'])
pd.Index(unique_vals).get_indexer(to_match)
result = data.apply(pd.value_counts).fillna(0)
数据加载、存储与文件格式
读取文本格式的数据
pd.read_csv('examples/ex1.csv')
pd.read_csv('examples/ex1.csv',header=None)
pd.read_csv('examples/ex1.csv',names=['a','b','c'])
pd.read_csv('examples/ex1.csv', names=names, index_col='message')
parsed = pd.read_csv('examples/ex1.csv',index_col=['key1', 'key2'])
pd.read_csv('examples/ex4.csv', skiprows=[0, 2, 3])
pd.isnull(parsed)
sentinels = {'message': ['foo', 'NA'], 'something': ['two']}
pd.read_csv('examples/ex5.csv', na_values=sentinels)
pd.read_table('ex1.csv')
pd.read_table('ex1.csv',sep=',')
逐块读取文本文件
pd.read_csv('examples/ex6.csv',nrows = 5)
chunker = pd.read_csv('examples/ex6.csv',chunksize=1000)
tot = pd.Series([])
for piece in chunker:
tot = tot.add(piece['key'].value_counts(), fill_value=0)
tot = tot.sort_values(ascending=False)
将数据写出到文本格式
data.to_csv('examples/out.csv')
data.to_csv('examples/out.csv',sep='|')
处理分隔符格式
import csv
f = open('examples/ex7.csv')
reader = csv.reader(f)
for line in reader:
print(line)
剩下的不太懂,记下
JSON 数据
result = json.loads(jsonObj)
result['a'] 获取Json属性为a 的那个
siblings = pd.DataFrame(result['siblings'], columns=['name', 'age'])
data = pd.read_json('examples/example.json')
jsonObj = json.dumps(result)
XML和HTML
主要下载lxml和beautifulsoup4和html5lib
conda install lxml
pip install beautifulsoup4 html5lib
利用lxml.objectify解析XML
用lxml.objectify解析文件,然后通过getroot得到该XML文件的根节点的引用 不是很懂,记下此处。
path = 'datasets/mta_perf/Performance_MNR.xml'
parsed = objectify.parse(open(path))
root = parsed.getroot()
二进制数据格式
frame.to_pickle('examples/frame_pickle')
pd.read_pickle('examples/frame_pickle')
HDF5格式
store = pd.HDFStore('mydata.h5')
store['obj1'] = frame
store['obj1_col'] = frame['a']
store
store['obj1']
store.put('obj2', frame, format='table')
store.select('obj2', where=['index >= 10 and index <= 15'])
读取Microsoft Excel文件
xlsx = pd.ExcelFile('examples/ex1.xlsx')
pd.read_excel(xlsx, 'Sheet1')
frame = pd.read_excel('examples/ex1.xlsx', 'Sheet1')
writer = pd.ExcelWriter('examples/ex2.xlsx')
frame.to_excel(writer, 'Sheet1')
writer.save()
frame.to_excel('examples/ex2.xlsx')
Web APIs交互
resp = requests.get(url)
data = resp.json()
data[0]['title']
issues = pd.DataFrame(data, columns=['number', 'title','labels', 'state'])
数据库交互
con = sqlite3.connect('mydata.sqlite')
con.execute(query)
data = [('Atlanta', 'Georgia', 1.25, 6),('Tallahassee', 'Florida', 2.6, 3),('Sacramento', 'California', 1.7, 5)]
stmt = "INSERT INTO test VALUES(?, ?, ?, ?)"
con.executemany(stmt,data)
cursor = con.execute('select * from test')
rows = cursor.fetchall()
pd.DataFrame(rows, columns=[x[0] for x in cursor.description])
db = sqla.create_engine('sqlite:///mydata.sqlite')
pd.read_sql('select * from test', db)
|