一、 数据分析环境搭建
1. anaconda环境搭建
Conda 是一个开源的软件包管理系统和环境管理系统,用于安装多个版本的软件包及其依赖关系,并在它们之间轻松切换。Conda 是为 Python 程序创建的,适用于 Linux,OS X 和Windows,也可以打包和分发其他软件 。最流行的 Python 环境管理工具。
conda官网上下载安装,安装过程不停下一步就行。打开conda,调用里面的jupyter功能。
可以实现在线编写python,并进行可视化分析。
2.pycharm中调用anaconda中的库
安装好conda之后,之前使用PYcharm 去 pip install matpllotlip的包时候,始终出现错误,方法的根本出发点在于,Pycharm本身缺少numpy和matplotlib这些库,而另一个Python的开发环境Anaconda则自带了300多种常见的库。所以想在pycharm中使用Anaconda自带的库。实现这一“借用”的则是Pycharm中对 “Project Interpreter”的设置,该设置是设定Pychar使用哪一个python编译器。那么只要将该interpreter设置为Anaconda下的python.exe,就可以将Anaconda下众多的库导入到Pycharm中。(这是一种借用conda的方法,但让pycharm自己去调用库的问题始终没有解决)
3.建议的学习顺序
NumPy是使用Python进行科学计算的基础包,常用于数据分析。NumPy通常与SciPy和Matplotlib一起使用,广泛用于替代matlab,有助于我们学习数据科学或机器学习。
Matplotlib是用于数据可视化的最流行的Python包之一,它是一个跨平台库,用于根据数组中的数据制作2D和简单3D图。
Pandas是一款开放源码的BSD许可的Python库,为Python编程语言提供了高性能,易于使用的数据结构和数据分析工具。Pandas用于广泛的领域,包括金融,经济,统计,分析等学术和商业领域。
二、NumPy学习
Numpy的核心:多维数组
代码简洁:减少Python代码中的循环。
底层实现:厚内核©+薄接口(Python),保证性能。
学习numpy,参考视频是numpy学习视频
1.学习预备概念
a.相对路径和绝对路径
怎么理解补充一下
附上一个链接
b.空值(nan )和无穷(inf)
c.Numpy副本和视图
## 列表 list01 =[1,2,3,4,5,6] list02 =list01#两个地址是一样的,都是指向同一个内存地址 print(list01,list02) print(id(list01)) print(id(list02)) # copy()函数,浅复制 list02=list01.copy() print(id(list01)) print(id(list02)) ## 深复制 #导入模块 import copy list03 = [1,2,3,[4,5,6]] print(list03) list03 list04=copy.deepcopy(list03) list04 #修改list01第三个元素中的第0个数值 list03[3][0]=100 list03 list04
2.Numpy的数据类型
a.数据类型
numpy 支持的数据类型比 Python 内置的类型要多很多,基本上可以和 C 语言的数据类型对应上,其中部分类型对应为 Python 内置的类型。下表列举了常用 NumPy 基本类型。
名称 | 描述 | 字符码 |
np.bool | 用一个字节存储的布尔类型(True或False) | ‘b’ |
np.int8 | 一个字节大小,-128 至 127 (一个字节) | ‘i’ |
np.int16 | 整数,-32768 至 32767 (2个字节) | 'i2‘ |
np.int32 | 整数,(4个字节) | ‘i4’ |
np.int64 | 整数,(8个字节) | ‘i8’ |
np.uint8 | 无符号整数,0 至 255 | ‘u’ |
np.uint16 | 无符号整数,0 至 65535 | ‘u2’ |
np.uint32 | 无符号整数 | ‘u4’ |
np.uint64 | 无符号整数 | ‘u8’ |
np.float16 | 半精度浮点数:16位,正负号1位,指数5位,精度10位 | ‘f2’ |
np.float32 | 单精度浮点数:32位,正负号1位,指数8位,精度23位 | ‘f4’ |
np.float64 | 双精度浮点数:64位,正负号1位,指数11位,精度52位 | ‘f8’ |
np.complex64 | 复数,分别用两个32位浮点数表示实部和虚部 | ‘c8’ |
np.complex128 | 复数,分别用两个64位浮点数表示实部和虚部 | ‘c16’ |
np.object_ | python对象 | ‘O’ |
np.string_ | 字符串 | ‘S’ |
np.unicode_ | unicode类型 | ‘U’ |
3.数组的定义和创建
a. ndarray数组定义
用np.ndarray类的对象表示n维数组
import numpy as np ary = np.array([1, 2, 3, 4, 5, 6]) print(type(ary),ary) #<class 'numpy.ndarray'> [1 2 3 4 5 6]
b. ndarray数组创建
numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
名称 | 描述 |
object | 数组或嵌套的数列 |
dtype | 数组元素的数据类型,可选 |
copy | 对象是否需要复制,可选 |
order | 创建数组的样式,C为行方向,F为列方向,A为任意方向(默认) |
subok | 默认返回一个与基类类型一致的数组 |
ndmin | 指定生成数组的最小维度 |
import numpy as np # 用np代替numpy,让代码更简洁 a = [1,2,3,4] # 创建列表a b = np.array([1,2,3,4]) # 从列表a创建数组b,array就是数组的意思 print(a) print(type(a)) # 打印a的类型 print(b) print(type(b)) # 打印b的类型 #观察输出值的区别,列表和数组的区别是什么? #[1, 2, 3, 4] #<class 'list'> #[1 2 3 4] #<class 'numpy.ndarray'>
创建数组的几种方式:
创建一维数组和二维数组
# 创建一维数组 c = np.array([5,6,7,8]) print(c) # 创建二维数组 d = np.array([[1,2],[3,4],[5,6]]) print(d) print(type(d)) #[5 6 7 8] #[[1 2] # [3 4] #[5 6]]
np.arange
np.arange(起始值(0),终止值,步长(1))
numpy.arange(start, stop, step, dtype) # 1个参数:参数值为终止值,起始值取默认值0,步长为1,左闭右开 x = np.arange(5) print(x) # 2个参数:参数值为起始值,终止值,步长默认为1 ,左闭右开 y = np.arange(5,10) print(y) # 3个参数:参数值为起始值,终止值,步长为2 ,左闭右开 z = np.arange(10,20,2) print(z) #[0 1 2 3 4] #[5 6 7 8 9] #[10 12 14 16 18]
np.zeros
np.zeros(数组元素个数, dtype=‘类型’)
numpy.zeros(shape, dtype = float, order = 'C') e = np.zeros(10) print(e) #[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
np.ones
np.ones(数组元素个数, dtype=‘类型’)
numpy.ones(shape, dtype = None, order = 'C') f = np.ones(10) print(f) #[1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
np.random
np.random中的函数来创建随机一维数组
np.random.randn() 创建一个一维数组,其中包含服从标准正态分布(均值为0、标准差为1的分布)的n个随机数 np.random.rand() 生成的一维数组中包含的就是0~1之间的n个随机数 # 创建一个包含5个随机数的正态分布一维数组 g = np.random.randn(5) print(g) # 创建一个范围在0~1之间的含有5个随机数的一维数组 h = np.random.rand(5) print(h) #[ 0.68384377 0.278969 0.31402352 -0.19564941 -0.07348227] #[0.59140982 0.77833598 0.33633508 0.46787355 0.34251799]
# 其他函数
zeros_like, ones_like, empty, empty_like, linspace, numpy.random.Generator.rand, numpy.random.Generator.randn, fromfunction, fromfile,set_printoptions
numpy.empty
numpy.empty方法用来创建一个指定形状(shape)、数据类型(dtype)且未初始化的数组
numpy.empty(shape, dtype = float, order = 'C') import numpy as np x = np.empty((3,2), dtype = int) print (x) #[[ 869667760 589] # [ 253155624 -618297307] # [ 869667824 589]]
numpy.linspace
numpy.linspace函数用于创建一个一维数组,数组是一个等差数列构成的
np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
参数 | 描述 |
start | 序列的起始值 |
stop | 序列的终止值,如果endpoint 为true ,该值包含于数列中 |
num | 要生成的等步长的样本数量,默认为50 |
endpoint | 该值为 true 时,数列中包含stop 值,反之不包含,默认是True。 |
retstep | 如果为 True 时,生成的数组中会显示间距,反之不显示。 |
dtype | ndarray 的数据类型 |
import numpy as np a = np.linspace(1,10,10) print(a) # [ 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.]
创建二维数组
创建一维数组的np.arange()函数和reshape()函数来创建二维数组
# 创建一个3行4列的二维数组 i = np.arange(12).reshape(3,4) print(i) #[[ 0 1 2 3] # [ 4 5 6 7] #[ 8 9 10 11]]
np.random.randint()函数用于创建随机整数数组
j = np.random.randint(0,10,(4,4)) print(j) # 括号里第1个参数0为起始数,第2个参数10为终止数,第3个参数(4,4)则表示创建一个4行4列的二维数组。 #[[6 5 7 2] #[9 3 8 7] #[1 1 4 3] #[5 6 6 7]]
从已有的数组创建数组
numpy.asarray 类似 numpy.array,但 numpy.asarray 参数只有三个,比 numpy.array 少两个
numpy.asarray(a, dtype = None, order = None)
参数 | 描述 |
a | 任意形式的输入参数,可以是列表, 列表的元组, 元组, 元组的元组, 元组的列表,多维数组 |
dtype | 数据类型,可选 |
order | 可选,有"C"和"F"两个选项,分别代表,行优先和列优先,在计算机内存中的存储元素的顺序。 |
import numpy as np x = [1,2,3] a = np.asarray(x) print (a) #[1 2 3]
4.数组的属性
ndarray.shape - 维度,数组的尺寸。这是一个整数元组,指示每个维度中数组的大小。对于具有n行和m列的矩阵(n,m)
ndarray.dtype - 描述数组中元素类型的对象。
ndarray.size - 数组元素的总数。等于shape的乘积。
ndarray.ndim - 数组的轴数(尺寸)。len(shape)(长度)。
ndarray.itemsize - 数组中每个元素的大小(以字节为单位)。
ndarray.nbytes - 总字节数 = size x itemsize。
ndarray.real - 复数数组的实部数组。
ndarray.imag - 复数数组的虚部数组。
ndarray.T - 数组对象的转置视图。
ndarray.flat - 扁平迭代器。
5.数组的维数
数组的轴数(尺寸)
a.什么是轴?
在numpy中可以理解为方向,使用0,1,2数字表示
对于1维数组,只有一个0轴;
对于2维数组(shape(2,2))有0轴和1轴;
对于3维数组(shape(2,2,3))有0,1,2轴;
b.为什么要学习轴?
有了轴的概念后,我们计算会更加方便,比如计算一个2维数组的平均值,必须指定是计算哪个方向上面的数字的平均值。
import numpy as np a = np.array([[1, 2, 3], [4, 5, 6]]) print(np.sum(a, axis=0)) print(np.sum(a, axis=1)) print(np.sum(a)) # 计算所有的值的和 # 三维的数据 a = np.arange(27).reshape((3, 3, 3)) print(a) b = np.sum(a, axis=0) print(b) c = np.sum(a, axis=2) print(c) ’‘’’‘’‘’’‘’‘’‘’’‘编译结果如下: [5 7 9] [ 6 15] 21 [[[ 0 1 2] [ 3 4 5] [ 6 7 8]] [[ 9 10 11] [12 13 14] [15 16 17]] [[18 19 20] [21 22 23] [24 25 26]]] [[27 30 33] [36 39 42] [45 48 51]] [[ 3 12 21] [30 39 48] [57 66 75]]
总结: 在计算的时候可以想象成是每一个坐标轴,分别计算这个轴上面的每一个刻度上的值,或者在二维数组中记住0表示行1表示行列。
import numpy as np ary = np.array([ [1,2,3,4], [5,6,7,8] ]) print(ary.ndim) #2
c.数组维度有关的属性
ndarray.shape
数组的维度。这是一个整数元组,指示每个维度中数组的大小。对于具有n行和m列的矩阵,shape将为(n,m)。shape因此,元组的长度 是轴数ndim。
import numpy as np ary = np.array([1, 2, 3, 4, 5, 6]) print(type(ary), ary, ary.shape,ary.dtype) #二维数组 ary = np.array([ [1,2,3,4], [5,6,7,8] ]) print(type(ary), ary, ary.shape) #<class 'numpy.ndarray'> [1 2 3 4 5 6] (6,) int32 #<class 'numpy.ndarray'> [[1 2 3 4],[5 6 7 8]] (2, 4)
ndarray.size
数组元素的个数。这等于的shape的乘积。
import numpy as np ary = np.array([ [1,2,3,4], [5,6,7,8] ]) # 观察shape,size,len的区别 print(ary.shape, ary.size, len(ary)) (2, 4) 8 2