数据分析三剑客

数据分析三剑客是指 NumPy、Pandas 和 Matplotlib 这三个 Python 库。它们是数据分析领域最常用的工具,可以满足大多数数据分析需求。

NumPy 是一个用于科学计算的 Python 库。它提供了一个强大的 n 维数组对象,并支持大量的数学函数。NumPy 非常适合处理数值数据,例如进行矩阵运算、统计分析等。

Pandas 是一个用于数据分析的 Python 库。它提供了一系列用于处理结构化数据的工具,例如数据框、时间序列等。Pandas 非常适合处理表格数据,例如进行数据清洗、转换、分析等。

Matplotlib 是一个用于数据可视化的 Python 库。它提供了一系列用于绘制各种图形的工具,例如折线图、柱状图、饼图等。Matplotlib 非常适合将数据以直观的方式呈现出来。

基本了解

NumPy

  • 创建和操作 n 维数组
  • 进行数学运算和统计分析
  • 傅里叶变换
  • 随机数生成
  • 线性代数

熟练运用

Pandas

  • 读取和写入各种格式的数据
  • 清洗和转换数据
  • 计算统计指标
  • 绘制图形
  • 时间序列分析

熟练运用

Matplotlib

  • 绘制折线图、柱状图、饼图等
  • 控制图形的各个方面
  • 支持交互式绘图
  • 导出图形

NumPy

NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。

引入库

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple numpy

import numpy as np

NumPy的数据类型

数组和列表的区分,我们先要区分数组和列表的区别

特性数组列表
元素类型相同不同
创建方式array() 函数list() 函数或方括号
存储方式连续内存链表
性能更快更慢
可变性不可变可变
用途存储需要快速访问的数据存储需要频繁更改的数据

np.array的类型是数组

维度概念

一维二维三维。。。

NumPy 元素的创建

1. 使用np.array()从list列表创建

列表:[1,4,2,5,3]

my_list=[1,4,2,5,3]
my_np=np.array(my_list)

2. 使用np的routines函数创建

包含以下常见创建方法:

  1. np.ones(shape,dtype=None,order='C')
  2. np.zeros(shape,dtype=float,order='C')
  3. np.full(shape,full_value,dtype=None,order='C')
  4. np.eye(N,M=None,k=0,dtype=float)
  5. np.linspace( start sto num= endpoint=T retstep=F dtype, x
  6. np.arange([start,] stop[, step,], dtype=None, *, like=None)
  7. np.random.randint(low, high=None, size=None, dtype=int)
  8. np.random.randn(d0, d1, ..., dn)is=0,

2.1 np.ones

np.ones(shape, dtype=None, order='C'): 创建一个给定形状(shape)和数据类型(dtype)的数组,所有元素初始化为1。

np.ones(shape=(4,2))

4,2表示什么?,默认类型为? 默认值为?

np.ones(shape=(4,2),dtype=int)
np.ones(shape=(3,2,1),dtype=int)

能否理解三维数组?

2.2 np.zeros

np.zeros(shape, dtype=float, order='C'): 创建一个给定形状和数据类型的数组,所有元素初始化为0,可以指定数据类型,默认为浮点数。

np.zeros(shape=(4,2))

2.3 np.full

np.full(shape, full_value, dtype=None, order='C'): 创建一个给定形状和数据类型的数组,所有元素初始化为指定的值(full_value)。

np.full(shape=(4,2),fill_value=6)

2.4 np.eye

np.eye(N, M=None, k=0, dtype=float): 创建一个单位矩阵,对角线上的元素为1,其余元素为0。(不介绍)

2.5 np.linspace

np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None): 在指定的范围内生成等间隔的数字,可以设置生成的数量、是否包括终点、是否返回步长等参数。

np.linspace(10,25,num=15,dtype=int,axis=0,)

python

np.linspace(10,25,num=10,dtype=None,axis=0,)

2.6 np.arange

np.arange([start, ] stop[, step, ], dtype=None, *, like=None): 在指定的范围内以指定的步长生成数字,类似于Python内建的 range()函数。

np.arange(0,10)

python

np.arange(0,10,step=2)

python

np.arange(10,dtype=int)

2.7 np.random.randint

np.random.randint(low, high=None, size=None, dtype=int): 生成一个指定范围内的随机整数数组,可以指定数组形状和数据类型。

np.random.randint(0, high=100, dtype=int)

python

np.random.randint(0, high=100, size=1,dtype=int)

python

np.random.randint(0, high=100,size=(2,3), dtype=int)

2.8 np.random.randn

np.random.randn(d0, d1, ..., dn): 从标准正态分布中生成随机样本,可以指定生成数组的形状。

np.random.randn(50)

python

import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

sns.displot(np.random.randn(2000))
plt.show()

python


import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

sns.distplot(np.random.normal(loc=100,scale=10,size=1000))
plt.show()

np.array的属性

4个必记参数:

  • ndim:维度
  • shape:形状(各维度的长度)
  • size:总长度
  • dtype:元素类型

import numpy as np
my_arr=np.random.randint(0,10,size=(4,3,2))
print(my_arr)
print(my_arr.ndim,my_arr.shape,my_arr.size,my_arr.dtype)

np.array的基本操作

列表的索引方式:

python

my_list=[1, 4, 2, 5, 3]
my_list[0]

1. numpu索引

索引方式和列表基本相同

1.1 元素访问

my_arr=np.random.randint(0,10,size=(4,3,2))
my_arr[0]
my_arr[0][1]
my_arr[0][1][0]

1.2 行访问/列访问(重点)

单个 : 表示所有

my_arr=np.array([[1,2,3,4],[5,6,7,8]])
my_arr
my_arr[0]
my_arr[0,:]
my_arr[:,2]

1.3 列表作为索引取值

index=[2,3,1]
my_arr=np.array([1,2,3,4,5,6,7,8])
my_arr[index]

1.4 一些用法

my_arr=np.random.randint(100,size=(4,4))
my_arr
my_arr[0:2,2:4]
my_arr[[1,3],2]
my_arr[[1,3],[0,2]]
my_arr[[1,3],:][:,[0,2]]

2. 切片

在 NumPy 中,切片(slicing)是指从数组中选择一部分元素或子数组的操作。这允许您根据需要从数组中提取出特定的数据子集,而无需复制原始数据。

my_arr=np.random.randint(0,100,size=10)

间隔取数

my_arr[::2]

倒序取数

my_arr[::-1]
my_arr=np.random.randint(0, high=100,size=(2,3), dtype=int)
print(my_arr)
print(my_arr[:,::-1])

切片对图片的应用

需要安装扩展Image Preview

import matplotlib.pyplot as plt
tu=plt.imread('./test.jpg')
print(tu.shape)
import numpy as np
import matplotlib.pyplot as plt
tu=plt.imread('./image.png')
plt.figure(figsize=(2,2))
# 行倒序
plt.imshow(tu[::-1])
plt.show()
import numpy as np
import matplotlib.pyplot as plt
tu=plt.imread('./image.png')
plt.figure(figsize=(2,2))
# 列倒序
plt.imshow(tu[:,::-1])
plt.show()
import numpy as np
import matplotlib.pyplot as plt
tu=plt.imread('./image.png')
plt.figure(figsize=(2,2))
# 颜色倒序
plt.imshow(tu[:,:,::-1])
plt.show()

3. 变形

4. 级联

5. 切分

6. 副本

所有赋值运算不会为np.array的任何元素创建副本。对赋值后的对象的操作也对原来的对象生效 这里需要区分一下:

  • 浅复制,默认的,本质上复制了原先的“引用”
  • 深复制,copy的内存,并产生新内存
  • deepcopy,这个属于第三种,用到再说
import numpy as np
my_arry=np.random.randint(10,size=10)
my_arry_copy=my_arry
print(my_arry,my_arry_copy)
my_arry_copy[0]=11

print(my_arry,my_arry_copy)

import numpy as np
my_arry=np.random.randint(10,size=10)

# 此次深复制
my_arry_copy=my_arry.copy()
print(my_arry,my_arry_copy)
my_arry_copy[0]=11

print(my_arry,my_arry_copy)

NumPy的常用操作

1. 求和:np.sum

import numpy as np
my_arr=np.ones(shape=(4,3))
print(my_arr)
print(my_arr.sum(),my_arr.sum(axis=1),my_arr.sum(axis=0))

2. 平均值:np.mean()

#平均值
my_arr.mean()

3. 方差:np.std()

# 方差
my_arr.std()

需注意

np.nan

nan 就是空值,而np中nan与其他数运算结果都是空

my_arr=np.array([1,2,3,4,np.nan])
my_arr.sum()

np.nansum() 能忽略nan

4. 最大最小值:np.max/np.min

my_arr.max()
np.nanmax(my_arr)