利用Python进行数据分析
NumPy基础:数组和矢量计算
生成数组:
np.random.randn(10) 生成10个标准正态分布的随机数
np.arange(10) 长度为10的数组,值分别是0-9
arr=np.array(列表名) 列表变成数组
np.zeros(10) ones(10 表示生成全为0 或者全为1的数组
np.empty((2.3.2)) 返回未初始化的垃圾值
np.eye() np.identity() 创建单位矩阵n*n
数组切片:
arr[m:n] 表示包括n,不包括m
arr[0,2] 和 arr[0][2] 表示二维数组访问单个元素的含义是相同的
arr[:2,1:] 表示前两行的第一列以及第一列后边
arr[:2] 表示前两行
data[name ==‘guo’,2:] 布尔型索引(python关键字and or在布尔型中无效,用丨和&)
data[ data<0]=0
arr[[3,5,4,1]] 表示按35,4,1的顺序返回四行数据(花式索引将数据复制到新数组)
arr[[3,5,4,1],[ 3,5,4,1]] 表示返回(3,3)(5,5)元素(花式索引)
arr[[3,5,4,1],[:,3,5,4,1]] 表示按照特定的行和列顺序返回
arr[np.ix_([3,5,4,1],[3,5,4,1])] 用np.ix_函数表示按照特定的行和列顺序返回
数组转置和轴对换(返回源数组视图)
arr.T 二维数组直接转置
ar.transpose((n,m,l)) n.m.l表示维数的编号
arr.swapaxes(1,2) 根据shape(n,m,l)→(m,n,l),转置数组
通用函数
一元函数 | 说明 |
abs、fabs | 计算整数、浮点数或复数的绝对值。对于非复数,可以用更快的fabs |
sqrt、square、exp | 计算元素的平方根、平方、指数ex |
sign | 计算元素的正负号 |
ceil | 大于等于该值的最小整数 |
floor | 小于等于该值的最大整数 |
rint | 四舍五入最接近的整数,保留dtype |
modf | 将数组的整数部分和小数部分以两个独立的数组返回 |
isnan | 返回一个表示哪些是NAN的布尔型数组 |
Isfinite/isinf | 返回表示有穷和无穷的布尔型数组 |
二元函数 | 说明 |
subtract | 从第一个数组中减去第二个数组中的元素 |
multiply | 数组元素相乘 |
divide、floor_divide | 除法或者向下圆整除法(丢弃余数) |
power | AB |
maximum/fmax | 元素级的最大值计算,fmax忽略NAN |
mod | 元素级取模运算(除法的余数) |
copysign | 将第二个数组中的值的符号复制给第一个数组中的值 |
greater/greater_equal/ less/less_equal/equal/not_equal | 执行元素级别的比较运算,最终产生布尔型数组 |
logical_and/logical_or/logical_xor | 执行元素级的真值逻辑运算 |
利用数组进行数据处理
np.where函数是x if condition else y 的矢量化版本;
result=np.where(cond,x,y) 括号中condition为ture时x,否则y
改写嵌套:np.where(cond1&cond2,0
np.where(cond1,1
np.where(cond2,2,3)))
argmin、argmax 分别表示最大和最小元素的索引
cumsum、cumprod 所有元素的累积和、累积积(横轴1,纵轴0)
arr.sort(1) 多维数组根据某一维排序只需要根据排序的轴序号传入即可
数组的集合运算 | 说明 |
uniques(x) | 计算x中为唯一元素,并返回有序结果(序列根据发现的顺序) |
value_counts | 计算series中各值出现的频率 |
intersect1d(x,y) | 计算xy中的公共元素,并返回有序结果 |
union1d(x,y) | xy的并集,并返回有序结果 |
in1d(x,y) | 得到元素x是否包含于y的布尔型数组 |
setdiff1d(x,y) | 集合的差 |
setxor1d(x,y) | 集合的对称差,即X+Y-2XY |
数组文件的输入输出
np.save(’文件名‘,数组)和np.load(’文件名‘)将数组以二进制格式保存到磁盘;
np.savez(’文件名‘,数组)将多个数组存到一个压缩文件下,读取时返回字典形式的数组
arr.np.loadtxt(‘arr_ex.txt’.delimiter=’,’)将逗号分隔符文件转化为二维数组
线性代数
numpy.linalg函数 | 说明 |
diag | 以一维数组的形式返回方阵的对角线元素,或者将一维数组转化为方阵(非对角线元素为0) |
dot | 矩阵乘法;矩阵*矩阵=矩阵/数 |
trace | 对角线元素之和 |
det | 计算矩阵行列式 |
eig | 求解特征值和特征向量 |
inv | 逆矩阵 |
pinv | 伪逆矩阵 |
qr | 计算QR分解值 |
svd | 计算奇异值分界SVD |
solve | 解线性方程组Ax=b,其中A为一个方阵 |
lstsq | 计算Ax=b 的最小二乘解 |
随机数生成
numpy.random模块对Python的内置random进行了补充,更加高效
numpy.ransom函数 | 说明 |
seed(x) | 确定随机数生成器的种子。如果x相同,返回的随机数相同,若没有参数,系统随机返回 |
permutation | 返回一个序列的随机排序或者返回一个随机排序的范围 |
shuffle | 对一个序列就地随机排序 |
rand | 均匀分布的样本值 |
randint | 从给定的上下限范围内随机选取整数 |
randn | 正态分布样本值(平均值为0,标准差为1) |
binomial | 二项分布的样本值 |
normal | 正态分布的样本值 |
beta | beta分布的样本值 |
chisquare | 卡方分布的眼本质 |
gamma | gamma分布的样本值 |
uniform | [0,1)中均匀分布的样本值 |
pandas入门
Series
series由一组数据以及一组与之相关的数据标签(即索引)组成。可以通过series的values和index属性获取其数组表示形式和索引对象。(可以通过字典构建series)
obj=Series([1,2,3],index=[‘a’,’b’,’c’])
obj[obj>2],返回值大于2的,obj*2;np.exp(obj) 运算
series对象本身和索引都有一个name属性
DataFrame
frame= DataFrame(data,columns=[‘year’,’state’,’pop’],index=[‘one’,’two’,’three’])
将DataFrame的列获取为series:frame[‘year’]或者frame.year 索引还与原来相同,也可以根据其进行赋值,赋值的长度必须相同,如果有索引会匹配索引进行赋值
frame[‘guo’]=frame.year==’2019’ 添加列,并根据年份是否2019年进行赋值true、false
如果是嵌套字典形成DataFrame,则外层字典的键作为列,内层字典的键作为行,如果指定了索引,则按照索引
frame.columns返回所有列名
重新索引
reindex可以修改索引和列,series调用该函数,某个索引值不存在,直接引入缺失值nan,
method=ffill或pad(向前填充值或搬运值)、bfill或backfill(向后填充或搬运值)
参数 | 说明 |
fill_value | 重新索引过程中,需要引入缺失值是使用的替代值 |
limit | 向前或向后填充时的最大填充量 |
level | 在multindex的指定级别上匹配简单索引,否则选取其子集 |
copy | 默认true,无论如何复制;如果为false,则新旧相等就不复制 |
索引、选取和过滤
obj表示series:
obj[2:3]是闭区间
obj[1]和obg[‘a’]是相同意思
obj[obj<5]
obj[[‘c’,’a’,’b’]]按照给定序列输出
dataframe的索引选项 | 说明 |
obj.ix[val] | 选取dataframe的单行或者一组行 |
obj.ix[:,val] | 选取单个列或者一组列 |
xs方法 | 根据标签选取单行或者单列,并返回一个series |
icol、irow | 根据整数位置选取单列或者单行,并返回一个series |
get_value、set_value | 根据行列标签选取和重设某个值 |
算术运算和数据对齐
算术运算时,索引相同的进行算术运算,索引不同的引入nan值;
可以用fill_value=对缺失值进行填充
算术运算方法:add/sub/div/mul+-*/
dataframe和series的算数运算利用广播的形式进行计算(P136)
函数应用和映射
numpy的ufuncs(元素级数据方法)也可用于操作panadas对象;
另一种操作是,将函数应用到由各行或列形成的一维数组上,dataframe的apply方法可以实现:
f=lambdax:x.man()-x.min()
frame.apply(f,axis=1)
排序和排名
根据索引排序:sort_index(axis=1,ascending=False) ,默认axis=0
series按照值进行排序用order(),任何缺失值都会被放到最后
dataframe 根据多个列进行排序by即可:frame.sort_index(by=[‘a’,’b’])
rank()增设一个排名值:
obj.rank(ascending=False,methos=’max’)
排名时用于破坏平级关系的method | 说明 |
average | 默认:排名的平均值 |
min | 使用整个分组的最小排名 |
max | 使用整个分组的最大排名 |
first | 按值在原始数据中的出现顺序分配排名 |
汇总和计算描述统计
skipna 在进行汇总和计算时,排除缺失值,(默认为true)
描述和汇总统计 | 说明 |
count | 非NA值的数量 |
describe | 针对series和dataframe列计算汇总统计 |
argmin/argmax | 计算能够获取到最小值和最大值的索引位置 |
idxmin/idxman | 计算能够获取到最小值和最大值的索引值 |
mean/median | 值的平均值和中位数 |
mad | 根据平均值计算平均绝对离差 |
var/std | 样本值的方差和标准差 |
skew/kurt | 样本值的偏度/峰度 |
diff | 计算一阶差分(对时间序列很有用) |
pct_change | 计算百分数变化 |
相关系数corr和协方差cov
series:arr.a.corr(arr.b) 返回相关系数
dataframe:arr.corr() 返回相关矩阵(对称)
series和dataframe:arr.corrwith(arr.a) 返回series与dataframe中各列的相关系数
处理缺失数据
删除:
dropna:根据各标签的值中是否存在缺失数据对轴标签进行过滤,可通过阈值调节对缺失值的容忍度。
对于dataframe来说,dropna默认丢弃任何含有缺失值的行。想要丢弃列传入axis=1
arr.dropna(how=’all’) 丢弃全部为NA的行
arr.dropna(how=’any’) 丢弃任何包含NA的行
arr.dropna(thresh=3) 将至少含有三个非空值的行留下
填充:
fillna:将缺失值补充为常数
arr.fillna(0) 将缺失值补充为0
arr.fillna({1:0.5,2:9}) 通过调用字典,实现不同列填充不同值
fillna默认返回新对象,但也可以对现有对象进行就地修改。inplace=True
limit=n 可以连续填充的最大数量为n
层次化索引
能够以低纬度的形式处理高纬度的数据;index=[[‘a’,’a’,‘a’,’a’,’b’, ’b’],[1,2,3,4,1,2]]
frame.index.names=[‘key1’,’key2’] 索引名字重命名
swaplevel() 重新调整两个级别上的名称,但是数据不会发生变化。
sortlevel() 根据单个级别中的值对数据进行排序(稳定的)
根据级别汇总统计
frame.sum(level=’color’,axis=1)
dataframe中将其中一列或者多列当做行索引,使用set_index(),创建新的dataframe
frame2=frame.set_index([‘a’,’b’]) 将ab两列转化为行索引
默认情况下ab两列将删除,但也可以将其保留下来:
frame2=frame.set_index([‘a’,’b’],drop=False)
reset_index()的功能正好和set_index()的功能相反,将层次化索引的级别转移到列里面
整数索引
如果轴索引含有索引器,那么根据整数进行数据选取的操作总是面向标签的。
ix[:1],表示标签1前边的所有行;
如果需要基于位置索引,则series的get_value(位置参数)和dataframe的irow()行和icol()列
.loc[] 基于标签
.iloc[] 基于位置
面板数据
用一个dataframe对象组成的字典或者一个三维ndarry来创建panel对象:
对于呈现面板数据的办法是堆积式的dataframe形式to_frame():
stack=pdata.ix[:,’5/30/2019’,:].to_frame()
to_frame()的逆运算:to_panel()
数据加载、存储与文件格式
pandas中的解析函数 | 说明 |
read_csv | 从文件、URL、文件型对象中加载带分隔符的数据。默认分隔符为逗号 |
resd_table | 从文件、URL、文件型对象中加载带分隔符的数据。默认分隔符为制表符(“\t”) sep=’,’ |
read_fwf | 读取定宽列格式数据(也就是说没有分隔符) |
read_clipboard | 读取剪切板中的数据,可以看做rea_table的剪切板版。在将网页转化为表格时很有用 |
read_csv/read_table函数的参数 | 说明 |
path | 表示文件系统位置、URL、文件型对象的字符串 |
sep或delimiter | 对行中各字段进行拆分的字符序列或正则表达式 |
header | 用作列名的行号。默认0,表示第一行,没有用None表示 |
index_col | 用作行索引的列编号或列名。可以是单个也可以是多个组成的列表(层次化索引) |
names | 用于没有列名的列表;header=None时 |
skiprows | 要忽略的行数(从文件开始算起),或者需要跳过的行号(从0开始) |
na_value | 一组用于替换NA 的值 |
comment | 将注释信息从行尾拆分除去的字符(一个或多个) |
parse_dates | 尝试将数据解析为日期,默认false。若为true,则尝试解析所有列。此外还可以制定需要解析的列号或者列名。如果列表的元素为列表或元组,就会将多格列组合到一起在进行日期解析工作(日期/时间分别位于两列) |
keep_date_col | 如果连接多列解析日期,则保持参与连接的列。默认false |
converters | 由列号/列名跟函数之间的映射关系组成的字典。{‘foo’:f}会对foo列的所有值应用函数f |
dayfirst | 当解析有歧义的日期时,将其看做国际格式。默认false |
day_parser | 用于解析日期的函数 |
nrows | 需要读取的行数从文件开始出算起 |
iterator | 返回一个TextParser以便逐块读取文件 |
chunksize | 文件块的代销(用于迭代) |
skip_footer | 需要忽略的函数(从文件末尾处算起) |
verbose | 打印各种解析器输出信息,“非数值列中缺失值的数量” |
squeeze | 如果数据经解析后仅含有一列,返回series |
thousands | 千分位分隔符,如“,”或“.” |