Pandas笔记-1-预备知识

最近对数据分析有些兴趣,在有了一定了解之后,我选择了joyful-pandas作为我的入门课程。
python基础、numpy基础

预备知识

Python基础

列表推导式与条件赋值

可以用这种方式生成一个列表

L=[]
for i in range(10)
    L.append(i)

可以利用列表推导式进行简化,形如[* for i in *]。第一个*为映射函数,其输入为i,第二个*为迭代的对象。

[i for i in range(10)]

列表表达式支持多层嵌套,如

[func(i,j) for i in ['a','b'] for j in ['1','2']]

其中前面的为外层,后面的为内层。

另一个实用的语法糖形如value = a if condition else b,类似于C的value = condition ? a : b

匿名函数和map方法

当我们不关心一个函数的名字的时候可以使用匿名函数。如

[(lambda x: 2*x)i for i in range(5)]

可以使用map函数完成这一功能,其返回map对象,需要list转为列表

list(map(lambda x: 2*x,range(5)))
#对于多个输入值的函数映射,可以通过追加迭代对象实现
list(map(lambda x, y: str(x)+'_'+y, range(5), list('abcde')))

zip对象与enumerate方法

zip函数将多个可迭代对象打包为元组,返回zip对象,通过tuplelist可以得到相应的打包结果。

L1, L2, L3 = list('abc'), list('def'), list('hij')
zipped = list(zip(L1, L2, L3))
tuple(zip(L1, L2, L3))
dict(zip(L1, L2))#这样可以对两个列表建立字典映射

循环迭代可以用zip函数。

for i, j, k in zip(L1, L2, L3):
     print(i, j, k)

可以通过*操作符与zip联合使用来进行解压操作。list(zip(*zipped))
enumerate可以在迭代时绑定迭代元素的遍历序号。

Numpy基础

np数组的构造

最一般的np.array()
以下是一些特殊数组的生成:

  • 等差序列
    np.linespace(起始、终止(含)、样本个数)np.arange(起始、终止(不含)、步长)
  • 特殊矩阵
    np.zeros(传入元组表示各维度大小)
    np.eye(n)n*n的单位矩阵
    np.eye(n,k = m)n*n,偏移主对角线m个单位的伪单位矩阵
    np.full(元组传入大小, 填充数值)全为填充数值的矩阵
    np.full(元组传入大小, 列表)每行填入相同的列表
  • 随机矩阵
    np.random.rand(n)生成0-1均匀分布的n个随机数
    np.random.rand(a,b)传入的不是元组,每个维度的大小分别输入。可以通过(b - a) * np.random.rand(n) + a来生成ab的均匀分布。但已有此库函数np.random.uniform(a,b,n)
    np.random.randn(d1,d2,···)生成N(0,I)的标准正态分布.可以通过u + np.random.randn(n) * sigma,已有此库函数np.random.normal(u,sigma,n)
    np.random.randint(最小值,最大值(不含),维度大小(元组传入))随机整数矩阵
    np.random.choice(列表,size=(结果大小),replace=(是否放回,默认True为放回抽样),p=概率列表(默认均匀采样))
    np.random.seed(整数)随机种子,用以固定随机数的输出结果

np数组的变形与合并

  • 转置
    matrix.T转置matrix
  • 合并
    matrix.r_[m1,m2]对二维数组而言,上下合并
    matrix.c_[m1,m2]对二维数组而言,左右合并
    一维数组和二维数组进行合并时,应当把其视作列向量,在长度匹配的情况下只能够使用左右合并的c_操作
  • 维度变换
    matrix.reshape(d1,d2,···)有两种模式,为C和F,分别以逐行和逐列的顺序填充读取matrix.reshape((d1,d2,···),order='C'(默认为C))。由于被调用的数组的大小是确定的,允许有一个维度空缺,形如matrix.reshape(-1,d2)。可以以这种方式m.reshape(-1)将n*1的数组转为一维数组

np数组的切片与索引

数组的切片模式支持使用slice类型的start:end:step切片,还可以直接传入列表指定某个维度的索引进行切片,如m[:-1,[0,2]]。也可以使用np.ix_在对应的维度上使用布尔索引,但不可与slice同时使用,如m[np.ix_([True,False,True])]。一维数组可以直接布尔索引

常用函数

  • where
    一种条件函数,可以指定满足条件与不满足条件位置对应的填充值,如np.where(a>0(条件),a(真),5(假))
  • nonzero,argmax,argmin
    nonzero返回非零数的索引。argmaxargmin分别返回最大和最小数的索引,如m.nonzero()
  • any,all
    any指当序列至少 存在一个 True或非零元素时返回True,否则返回False
    all指当序列元素 全为 True或非零元素时返回True,否则返回False
    a.any()
  • cumprod, cumsum, diff
    cumprod, cumsum分别表示累乘和累加函数,返回同长度的数组,diff表示和前一个元素做差,由于第一个元素为缺失值,因此在默认参数情况下,返回长度是原数组减1。如a.comprod()
  • 统计函数
    m.max()
    np.quantile(m,k)k分位数
    如果数组中含有缺失值,返回结果为缺失值,如需略过,在函数名前加nan,如np.nanmax(m)
    np.cov(m1,m2)协方差
    np.corrcoef(m1,m2)相关系数
    统计函数中有axis参数,能够进行某个维度的统计特征计算,axis=0列,axis=1

广播机制

用于处理两个不同维度数组之间的操作。

  • 标量和数组的操作
    标量与数组运算,标量扩容到数组大小后逐元素操作,如m=1/m
  • 二维数组之间的操作
    当两个数组维度完全一致时,使用对应元素的操作,否则会报错,除非其中的某个数组的维度是m×1m×1或者1×n1×n,那么会扩充其具有11的维度为另一个数组对应维度的大小。例如,1×21×2数组和3×23×2数组做逐元素运算时会把第一个数组扩充为3×23×2,扩充时的对应数值进行赋值。但是,需要注意的是,如果第一个数组的维度是1×31×3,那么由于在第二维上的大小不匹配且不为11,此时报错。(能扩容就扩容,不好扩容就报错)
  • 当一维数组AkA_k与二维数组Bm,nB_{m,n}操作时,等价于把一维数组视作A1,kA_{1,k}的二维数组,使用的广播法则与【b】中一致,当k!=nk!=nk,nk,n都不是11时报错。

向量与矩阵的计算

  • 向量内积dot
    ab=iaibi\rm \mathbf{a}\cdot\mathbf{b} = \sum_ia_ib_i
    a.dot(b)

  • 向量范数和矩阵范数np.linalg.norm

    • 向量范数
      L0L_{0}范数(也称0范数)

      x0=n\left| \left| x \right| \right|*{0}=n

      其中n为非零元的个数
      L1L*{1}范数(也称和范数或1范数)

      x1=i=1mxi=x1++xm\left| \left| x \right| \right|*{1}=\sum*{i=1}^{m}\left | x_{i} \right | =\left | x_{1} \right | + \cdots +\left | x_{m} \right |

      L2L_{2}范数

      x2=(x12++xm2)\left \| x \right \| *{2} = \sqrt[]{\left ( \left | x_1 \right |^{2} +\cdots +\left | x_m \right | ^{2}\right )}

      LL*{\infty}范数(无穷大范数)

      x=max{x1,,xm}\left| \left| x \right| \right|*{\infty}=max\left\{ \left| x*{1} \right| ,\cdot\cdot\cdot, \left| x_{m} \right| \right\}\\

    • 矩阵范数
      对向量范数推广可得矩阵范数。
      元素形式范数

      xp=(i=1mj=1naijp)1p\left \| x \right \| *p=\left ( \sum*{i=1}^{m} \sum_{j=1}^{n}\left | a_{ij} \right |^p \right )^\frac{1}{p}

      L1L_{1}范数(p=1p=1)

      A1=i=1mj=1naij\left \| A \right \| *{1}=\sum*{i=1}^{m} \sum_{j=1}^{n}\left | a_{ij} \right |

      L2L_{2}范数(p=2p=2)

      AF=(i=1mj=1naij2)12\left \| A \right \| *{F}=(\sum*{i=1}^{m} \sum_{j=1}^{n}\left | a_{ij} \right |^2)^\frac{1}{2}

    在矩阵范数的计算中,最重要的是ord参数

    ord norm for matrices norm for vectors
    None Frobenius norm 2-norm
    ‘fro’ Frobenius norm /
    ‘nuc’ nuclear norm /
    inf max(sum(abs(x), axis=1)) max(abs(x))
    -inf min(sum(abs(x), axis=1)) min(abs(x))
    0 / sum(x != 0)
    1 max(sum(abs(x), axis=0)) as below
    -1 min(sum(abs(x), axis=0)) as below
    2 2-norm (largest sing. value) as below
    -2 smallest singular value as below
    other / sum(abs(x)**ord)**(1./ord)

    -矩阵乘法@

    [Am×pBp×n]ij=k=1pAikBkj\rm [\mathbf{A}*{m\times p}\mathbf{B}*{p\times n}]*{ij} = \sum*{k=1}^p\mathbf{A}*{ik}\mathbf{B}*{kj}

    A@B