《利用Python进行数据分析》原书第二版 学习笔记(一)

终于更新了!!!

时隔六年,Wes McKInney终于推出第二版了。对于使用Python3.6以及pandas 0.23.4的我来说,这是一个天大的好消息。因为终于不用忍受,使用第一版时总遇到语法不一致。话不多说,我先大致介绍一下,第二版的新内容。
第二版中的主要更新包括:

  • 多有的代码,包括把Python的教程更新到了Python3.6版本(第一版使用的是Python2.7)
  • 更新pandas哭到2017年的最新版
  • 新增一章,关于更多高级pandas工具和一些使用提示
  • 新增statsmodels和scikit-learn的简要使用简介
    除以上更新内容,作者还重新组织了第一版的部分重要内容,是本书对新手来说更易于理解。

本书第二章介绍Python语言基础、Ipython及Jupyter notebook,第三章介绍了内建数据结构、函数以及文件。由于笔者有一定的Python编程经验,这里我就直接跳过第二章和第三章直接进入后面章节的想学习。如有读者还不了解Python编程语言的请先学习廖雪峰Python教程。

第二、三章中我认为值得注意的知识点:

  1. 匿名(Lambda)函数
    例:
strings=['foo','card','bar','aaaa','abab']
strings.sort(key=lambda x:len(set(list(x))))
print(strings)
运行结果:
['aaaa', 'foo', 'abab', 'bar', 'card']

2. itertools 模块
例如:
groupby可以根据任意的序列和一个函数,通过函数的返回值对序列中的连续的元素进行分组。

import itertools
first_leetter=lambda x:x[0]
names=['Alan','Adam','Wes','Will','Albert','Steven']
for letter,names in itertools.groupby(names,first_leetter):
    print(letter,list(names))#names is a generator
运行结果如下:
A ['Alan', 'Adam']
W ['Wes', 'Will']
A ['Albert']
S ['Steven']

一些有用的itertools函数:

  • combinations(iterable,k)
    根据iterable参数中的所有元素生成一个包含所有可能K-元祖的序列,忽略元素的顺序,也不进行替代(需要替代请参考combinations_with_replacement)
  • permutations(iterable,k)
    根据iter参数中的所有元素按顺序生成包含所有可能K元组的序列
  • groupby(iterable[,keyfunc])
    根据每一个独一的key生成(key,subiterable)元组
  • product(*iterables,repeat=1)
    以元组的形式,根据输入的可遍历对象生成笛卡尔积,与嵌套的for循环类似

第四章 Numpy 基础:数组与向量化计算

NumPy ndarray:多维数组对象

import numpy as np

#生成随机数据
data=np.random.randn(2,3)
print(data)
 运行结果:
[[-1.38868928  0.60036765  0.54270476]
 [-0.3853248  -0.75124344  0.00777614]]
#数学操作
print(data*10)
print(data+data)
运行结果:
[[-13.88689281   6.00367651   5.42704757]
 [ -3.853248    -7.51243443   0.07776136]]
[[-2.77737856  1.2007353   1.08540951]
 [-0.7706496  -1.50248689  0.01555227]]

在第一个数学操作中,所有的元素都同时乘以了10。在第二个数学操作中,数组中的对应元素进行了相加。

:ndarray是一个通用的多维同类数据容器,即:它包含的每一个元素均为相同类型。
每一个数组都有一个shape属性,用来表征数组每一维度的数量:

print(data.shape)
运行结果:
(2, 3)

每一个数组都有一个dtype属性,用来描述数组的数据类型:

print(data.dtype)
运行结果:
float64

生成ndarray

例1:

data1=[6,7.5,8,0,1]
arr1=np.array(data1)
print(arr1)

例2:

data2=[[1,2,3,4],[5,6,7,8]]
arr2=np.array(data2)
print(arr2)
运行结果:
[[1 2 3 4]
 [5 6 7 8]]

arr2的维数

print(arr2.ndim)
运行结果:
2

参考文献:
numpy官网
np.array会自动推断生成数组的数据类型,并存储在一个特殊元数据dtype中。例如:

print(arr1.dtype)
运行结果:
float64
print(arr2.dtype)
运行结果:
int32

给定长度及形状后,zeros可以一次性创造全0数组,ones可以一次性创造全1数组:

print(np.zeros(10))
运行结果:
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
print(np.zeros((3,6)))
运行结果:
[[0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0.]]

empty可以创建一个没有初始化数值的数组:

print(np.empty((2,3,2)))
运行结果:
[[[1.28760970e-311 1.28760970e-311]
  [1.28760972e-311 1.28760969e-311]
  [1.28760972e-311 1.28760972e-311]]

 [[1.28760972e-311 1.28760969e-311]
  [1.28760969e-311 0.00000000e+000]
  [1.28760969e-311 1.28760969e-311]]]

注:使用np.empty来生成全0数组,并不安全,有些时候它会返回为初始化的垃圾数值。上面运行结果也证实了这一观点。
arange是Python内建函数range的数组版:

print(np.arange(15))
运行结果:
[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14]

数组生成函数:

函数名 描述
array 将输入数据(可以是列表、元组、数组以及其他序列)转换为ndarray,如不显式指明数据类型,将自动推断;默认复制所有的输入数据
asarray 将输入数据转化为ndarray,但如果输入已经是ndarray则不再复制
arange Python内建函数arange的数组版,返回一个数组
ones 根据给定形状和数据类型生成全1数组
ones_like 根据所给的数组生成一个形状一样的全1数组
zeros 根据给定形状和数据类型生成全0数组
zeros_like 根据所给的1数组生成一个形状一样的全0数组
empty 根据给定的形状生成一个没有初始化熟知的空数组
empty_like 根据所给数组生成一个形状一样但没有初始化数值的空数组
full 根据给定形状和数据类型生成指定数值的数组
full_like 根据所给的数组生成一个形状一样单内容是指定数值的数组
eye,identity 生成一个N×N特征矩阵(对角线位置都是1,去位置是0)

例如:

print(np.identity(5))
运行结果:
[[1. 0. 0. 0. 0.]
 [0. 1. 0. 0. 0.]
 [0. 0. 1. 0. 0.]
 [0. 0. 0. 1. 0.]
 [0. 0. 0. 0. 1.]]
print(np.eye(5))
运行结果:
[[1. 0. 0. 0. 0.]
 [0. 1. 0. 0. 0.]
 [0. 0. 1. 0. 0.]
 [0. 0. 0. 1. 0.]
 [0. 0. 0. 0. 1.]]

你可能感兴趣的:(Python学习笔记)