《利用python进行数据分析》读书笔记 cha1, 3, 4, 5, 7

再次感觉到了读新版书的重要性,技术更新换代太快额。

cha1 准备工作

EPD已经不提供下载了;IPython 已经变成Jupyter了(所以目前我只是安了个IPython)
Jupyter notebook文件默认存储路径以及更改方法
为了熟悉下jupyter的操作,接着看的第3章。

cha3 IPython:一种交互式计算和开发环境

page49:In[542] 最后的莫名问号需要去掉
page50:print(data)
page55 : %paste 和 %cpaste 不行?
快捷键?
jupyter快捷键

cha4 numpy

1. ndarray:一种多维数组对象

ndarray是一个通用的同构数据多维容器,所有元素必须是相同类型。
每个数组都有一个shape(表示各维度大小的元组)和一个dtype(说明数组数据类型的对象)。
数据类型dtype:是一个特殊的对象,它含有ndarray将一块内存解释为特定数据类型所需的信息。
astype可以显示转换其dtype。
索引:在多维数组中,如果省略了后面的索引,则返回对象是一个维度低一点的ndarray。
切片沿着一个轴向选取元素。
通过布尔行索引选取数组中的数据,将总是创建数据的副本
花式索引是利用整数数组进行索引。总是将数据复制到新数组中。
数组转置和轴对换高维矩阵的转置transpose
swapaxes方法,接受一对轴编号,返回源数据的视图。

2. 通用函数(ufunc):快速的元素级数组函数

modf把数拆成小数和整数

3. 利用数组进行数据处理

矢量化:用数组表达式代替循环的做法
np.meshgrid() numpy.meshgrid()理解/ numpy中meshgrid的使用
np.where() 三元表达式x if condition else y的矢量化版本。
**any()**是否存在一个或多个True;**all()**所有值是否都是True。
**sort()**可在任何一个轴上排序,只需将轴编号传给sort即可。
**np.unique()**找出数组中的唯一值并返回已排序的结果。
**np.in1d()**测试一个数组中的值在另一个数组中的成员资格,返回一个布尔型数组

4. 用于数组的文件输入输出

**np.save()**以未压缩的原始二进制格式保存在拓展名为.npy的文件中;**np.load()**
**np.savez()**将多个数组保存在一个压缩文件中,将数组以关键字参数的形式传入即可。
**np.loadtxt()**将文件加载到二维数组中,**np.savetxt()**将数组写到以某种分隔符隔开的文本文件中。

5. 线性代数

  • .dot() 矩阵乘法
  • numpy.linalg 中有一组标准的矩阵分解运算以及诸如求逆和行列式之类的东西。
    qr计算QR分解

6.随机数生成

  • np.random.normal可以得到标准正态分布。
  • numpy.random比python内置的random快,python内置的random模块则只能一次生成一个样本值。
    page 111 python3.x中把xrange()改为range()

7.范例:随机漫步

  • random.randint(low, high, size)
nsteps= 1000
draws= np.random.randint(0, 2, size=nsteps)
steps = np.where(draws>0, 1, -1)
walk = steps.cumsum()

cha5 pandas入门

1. pandas的数据结构介绍

(1)Series 类似于一维数组的对象,数据+索引(标签)
可以通过series的valuesindex属性获取其数组表示形式和索引对象。
可以通过索引选取Series中的单个或一组值。

	obj2 = Series([4, 7, -5, 3], index =['d', 'b', 'a', 'c'])
	obj2 [['c', 'a', 'd']] #选取

numpy数组运算都会保留索引和值之间的连接
可以将Series看成是一个定长的有序字典。可通过Python字典创建 Series。
pandas的isnull和notnull函数可用于检测缺失数据。
Series在算数运算中自动对齐不同索引的数据
Series对象本身及其索引都有一个name属性

(2)DataFrame 表格型的数据结构
有行索引、列索引,可被看作由Series组成的字典(面向行和面向列的操作基本上是平衡的)。
创建:传入一个由等长列表或Numpy数组组成的字典。

		data = {'state':['ohio', 'ohio', 'ohio', 'nevada','nevada'],
      				 'year':[2000, 2001, 2002, 2001, 2002],
    			     'pop': [1.5, 1.7, 3.6, 2.4, 2.9]}
		data = DataFrame(data)

结果
Q问题:page 120 同时操作frame2的colums和index,全是NaN。python – pandas版本0.16.0更改数据帧索引后所有值都变为NaN
A解决:Dataframe 索引的修改(可使用reindex())
Q:page 121 pandas的1.0.0版本开始,移除了Series.ix and DataFrame.ix 方法
A: 用loc方法

嵌套字典传给DataFrame时,被解释为:外层字典的键作为列,内层键则作为行索引
如果设置了DataFrame的index和columns的name属性,则这些信息也会被显示出来。
values属性以二维ndarray的形式返回DataFrame中的数据。

(3)索引对象
所用到的任何数组或其它序列的标签都会被转换成一个index,index对象是不可修改的。

2. 基本功能

(1)重新索引
reindex创建一个适应新索引的新对象。
如果某个索引值不存在,就引入缺失值。
method选项,可以使用ffill实现前向值填充。
reindex可以修改index和columns选项
同时对行和列进行重新索引,而插值则只能按行应用
Q:(page128) ix不可用,col不能使用没有的行和列
A: frame.reindex(index=[‘a’, ‘b’, ‘c’, ‘d’], columns=states)
(2)丢弃指定轴上的项
drop方法返回一个在指定轴上删除了指定值的新对象
(3)索引、选取和过滤
obj[…],索引值不只是整数
ex: obj[‘b’], obj[1], obj[2:4], obj[[1,3]], obj[obj<2]
利用标签的切片运算,末端是包含的。
(4)算数运算和数据对齐
可以对不同索引的对象进行算术运算。存在不同索引对->得到索引的并集。
在不重叠的索引处引入NA值
使用fill_value参数,可以在一个对象中某个轴标签在另一个对象中找不到时填充一个特殊值。
(5)DataFrame和Series之间的运算
将Series的索引匹配到DataFrame的列,然后沿着一直向下广播。
某个索引值在Series的列或DataFrame的列中找不到,重新索引两个对象以形成并集。
必须使用算数运算方法才能匹配行列上广播
frame.sub(series, axis=0) # frame为DataFrame,series为Series。
当axis=0:匹配行以列为单位操作; axis=1:匹配列以行为单位操作。
(6)函数应用和映射
元素级数组方法(ufuncs)可用于操作pandas对象。
apply方法:将函数应用到由各列或行所形成的一维数组上。
元素级Python函数也可以用。applymap方法。
Series的元素级函数map方法。
(7)排序和排名
sort_index方法: 返回一个已排序的新对象。
可根据任意一个轴上的索引进行排序。(.sort_index(axis=1) )
可降序(.sort_index(ascending=False))
可根据一个或多个列中的值进行排序(.sort_index(by=‘b’))
Series按值的排序可使用order方法。任何缺失默认值都会被放到Series的末尾。
rank方法:为各组分配平均排名(名次相同的,最后的名次等于平均值)
可根据值在元数据中出现的顺序给出排名(.rank(method=‘first’))
(8)带有重复值的轴索引
索引的is_unique方法:索引值是否唯一

3. 汇总和计算描述统计

自动排除NA值,除非整个行或列都是NA。通过skipna选项可禁用此功能。
间接统计、累计型、汇总型(.describe())
(1)唯一值、值计数以及成员资格
unique:得到Series中的唯一值数组
value_counts:计算Series中各值出现的频率,结果按值频率降序排列
isin:判断矢量化集合的成员资格

4. 处理缺失数据

(1)滤除
dropna默认丢弃任何含有缺失值的行;传入**how='all’之丢弃全为NA的行;
thresh参数:保留至少由n个非NAN的。
(2)填充
** fillna
:通过字典调用,可实现对不同列填充不同值。
默认返回新对象,也可对现有对象进行修改(.fillna(inplace=True))

5.层次化索引。

MultiIndex 在一个轴上有多个索引级别。
DataFrame每条轴都可以有分层索引;每层都可以有名字。
swaplevel 交换两个级别的名称,返回一个互换了级别的新对象(数据不会发生变化)。
sortlevel 根据单个级别中的值对数据进行排序(稳定的)。索引由外到内排序。
level 选项指定在某条轴上求和的级别。
set_index 将一个或多个列转换为行索引,并创建一个新的DataFrame。默认删除列,也可保留(.set_index([‘c’, ‘d’], drop=False))。
reset_index将层次化索引得级别转移到列里面。

6.其它有关pandas的话题

(1)整数索引
Q&A:(page159)iget_value变成 .iloc[i] or .iat[i]
.irow变成 .iloc[i]
(2)面板数据
Panel数据结构(可以看作三维版得DataFrame)。Panel中的每一项都是一个DataFrame。
呈现面板数据,to_frame(); DataFrame的to_panel方法是to_frame的逆运算。

cha7 数据规整化:清理、转换、合并、重塑

1.合并数据集

pandas.merge可根据一个或多个键将不同DataFrame中的行连接起来。
(a)没有指明用那个列连接时,会将重叠的列名当作
显示指定 on = ‘key’ 键;两个对象的列名不同时,可以分别指定left_on, right_on
根据多个键进行合并,可传入由列名组成的列表。
(b)默认情况,how =inner 内连接,结果是交集;还有left, right以及外连接 outer,外连接是并集。
多对多连接产生的是行的笛卡尔积。
(c)对重复列名的处理。
suffixes选项,可以指定附加到左右两个DataFrame对象的重叠列名上的字符串。
(1)索引上的合并:连接键位于索引中,可以传入left_index = True 或者 right_index = True(或两个都传)。
对于层次化索引的数据,必须以列表的形式指明用作合并键的多个列。
DataFrame的join实例方法,在连接键上做左连接;支持索引与调用者DataFrame的某个列之间的连接;还可以向join传入一组DataFrame。

(2)轴向连接 连接/ 绑定/ 堆叠
numpy有一个用于合并原始numpy数组的concatenation函数
pandas.concat可以沿着一条轴将多个对象堆叠在一起(将值和索引粘合在一起)。默认情况,在axis=0(行)上工作;可以传入axis=1(列)。
join_axes指定要在其他轴上使用的索引。
如果想在连接轴上创建一个层次化索引,使用keys参数
如果传入字典,字典的键会被当做keys选项的值。
管理层次化索引创建方式的参数:levels指定用子层次化索引各级别上的索引(大于keys参数的个数)。
names用于创建分层级别的名称。
跟当前分析工作无关的DataFrame行索引,可以通过ignore_index选项产生一组新的索引。

(3)合并重叠数据
实例方法combine_first可以将重复数据编接在一起,用一个对象中的值填充另一个对象中的缺失值。可看作用参数对象中的数据为调用者对象的缺失数据“打补丁“。

2.重塑和轴向旋转

(1)重塑层次化索引
stack:将数据的列”旋转“为行。默认滤除缺失数据,dropna=False可保留确实选项。
unstack:将数据的行”旋转“为列。默认情况,操作最内层。作为旋转轴的级别会成为结果中的最低级别。
传入分层级别的编号或名称即可对其他级别进行操作。
(2)将”长格式“旋转为”宽格式“
pivot方法:将前两个参数值分别用作行和列索引的列名,最后一个参数值则是用于填充DataFrame的数据列的列名。
假设有两个需要参与重塑的数据列,如果忽略最后一个参数,得到的DataFrame就会带有层次化的列。
pivot是快捷方式 = 用set_index创建层次化索引,再用unstack重塑。

3.数据转换

(1)移除重复数据
duplicated方法:返回表示各行是否是重复行的布尔型Series。
drop_duplicates方法:返回移除了重复行的DataFrame。可以指定部分列进行重复项判断。
两者都默认保留第一个出现的值组合,传入take_last=True则保留最后一个。
(2)利用函数或映射进行数据转换
Series的map方法:可以接受一个函数或含有映射关系的字典型对象。
(3)替换值
replace可将某个/些数进行替换。
(4)重命名轴索引
轴标签有map方法,可以将其赋值给index。
如果想创建数据集的转换版,使用rename:实现部分轴标签的更新;就地修改数据集,可以传入inplace = True。
(5)离散化和面元划分
cut函数:返回一个特殊的Categorical对象,含有表示不同分类名称的levels数组以及为年龄数据进行标号的labels属性
区间符号,哪边是开端可以通过right=False进行修改。
可以自己设置面元名称,将labels选项设置为一个列表或数组。
传入面元数量时,会根据最小值和最大值计算等长面元。
qcut:可以得到大小基本相等的面元。也可以设置自定义的分位数。
(6)检测和过滤异常值
any
sign
(7) 排列和随机采样
numpy.random.permutation
take
(8)计算指标/哑变量
pandas的get_dummies函数:将分类变量转换为“哑变量矩阵”。
prefix参数可以实现给列加上前缀 ( prefix=‘key’)
Q: page 215: In[195]
在这里插入图片描述 A: 解决方法:增加函数的引擎参数engine=‘python’

4.字符串操作

(1)字符串对象方法
split
strip:修建空白符(包括换行符) rstrip/ lstrip。
可向字符串’::'的join方法传入一个列表或元组。
子串定位:in
找不到字符串,index 会引发异常。
find找到返回发现的子串第一个字符所在的位置;否则返回-1。
count返回指定子串的出现次数。
replace将指定模式替换为另一个指定模式。
(2)正则表达式
re模块 的三大类函数:模式匹配、替换以及拆分。
re.compile编译regex可以得到一个可重用的regex对象
可重用的regex对象的findall方法:得到匹配regex对象的所有模式。
search只返回第一个匹配项。
match只匹配字出现在字符串的开头的模式。
sub将匹配到的模式替换为指定字符串,返回所得到的新字符串。
(3)pandas中矢量化的字符串函数
NA存在:str属性可在有NA存在时,使得方法被应用于各个值。
正则表达式中flags = re.IGNORECASE
实现矢量化的元素获取操作:str.get 或者 在str属性上使用索引。

5.示例:USDA食品数据库

Quantile什么是分位数?如何求分位数?
page 229: Q: Series’ object has no attribute ‘order’
A: 使用sort_values()
page 229: Q: get_maximum = lambda x: x.xs(x.value.idxmax()) # .xs???

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值