模块_数据分析
目录
numpy模块
numpy说明
说明
NumPy是高性能科学计算和数据分析的基础包。它是pandas等其他各种工具的基础。 NumPy的主要功能: ndarray,一个多维数组结构,高效且节省空间 无需循环对整组数据进行快速运算的数学函数 *读写磁盘数据的工具以及用于操作内存映射文件的工具 *线性代数、随机数生成和傅里叶变换功能 *用于集成C、C++等代码的工具
安装
pip install numpy import numpy
# import numpy as np
numpy常用
创建ndarray对象
array() 将列表转换为数组,可选择显式指定dtype
arange() range的numpy版,支持浮点数
linspace() 类似arange(),第三个参数为数组长度
zeros() 根据指定形状和dtype创建全0数组
ones() 根据指定形状和dtype创建全1数组
empty() 根据指定形状和dtype创建空数组(随机值)
eye() 根据指定边长和dtype创建单位矩阵
以上所有方法均可使用reshape进行重构
import numpy as np #引入numpy库 #创建一维的narray对象 a = np.array([1,2,3,4,5]) # <class 'numpy.ndarray'> [1 2 3 4 5] #创建二维的narray对象 a2 = np.array([[1,2,3,4,5],[6,7,8,9,10]]) # <class 'numpy.ndarray'> [[ 1 2 3 4 5] [ 6 7 8 9 10]] #创建多维对象以其类推
import numpy as np a = np.arange(10) # 默认从0开始到10(不包括10),步长为1 print(a) # 返回 [0 1 2 3 4 5 6 7 8 9] a1 = np.arange(5,10) # 从5开始到10(不包括10),步长为1 print(a1) # 返回 [5 6 7 8 9] a2 = np.arange(5,20,2) # 从5开始到20(不包括20),步长为2 print(a2) # 返回 [ 5 7 9 11 13 15 17 19]
import numpy as np a = np.linspace(0,10,7) # 生成首位是0,末位是10,含7个数的等差数列 print(a) # 结果 # [ 0. 1.66666667 3.33333333 5. 6.66666667 8.33333333 10. ]
import numpy as np # 下面的例子用于生成首位是10的0次方,末位是10的2次方,含5个数的等比数列。 a = np.logspace(0,2,5) # 参数2是指10的2次方 print(a) # 结果 # [ 1. 3.16227766 10. 31.6227766 100. ]
# ones创建全1矩阵 # zeros创建全0矩阵 # eye创建单位矩阵 # empty创建空矩阵(实际有值) import numpy as np a_ones = np.ones((3,4)) # 创建3*4的全1矩阵 print(a_ones) # 结果 # [[ 1. 1. 1. 1.] # [ 1. 1. 1. 1.] # [ 1. 1. 1. 1.]] a_zeros = np.zeros((3,4)) # 创建3*4的全0矩阵 print(a_zeros) # 结果 # [[ 0. 0. 0. 0.] # [ 0. 0. 0. 0.] # [ 0. 0. 0. 0.]] a_eye = np.eye(3) # 创建3阶单位矩阵 print(a_eye) # 结果 # [ 1. 0. 0.] # [ 0. 1. 0.] # [ 0. 0. 1.]] a_empty = np.empty((3,4)) # 创建3*4的空矩阵 print(a_empty) # 结果 # [[0. 0. 0. 0.] # [0. 0. 0. 0.] # [0. 0. 0. 0.]]
# fromstring()方法可以将字符串转化成ndarray对象,需要将字符串数字化时这个方法比较有用,可以获得字符串的ascii码序列。 import numpy as np a = "abcdef" b = np.fromstring(a,dtype=np.int8) # 因为一个字符为8位,所以指定dtype为np.int8 print(b) # 返回 [ 97 98 99 100 101 102]
# fromfunction()方法可以根据矩阵的行号列号生成矩阵的元素。 # 例如创建一个矩阵,矩阵中的每个元素都为行号和列号的和。 import numpy as np def func(i,j): return i+j a = np.fromfunction(func,(5,6)) # 第一个参数为指定函数,第二个参数为列表list或元组tuple,说明矩阵的大小 print(a) # 返回 # [[ 0. 1. 2. 3. 4. 5.] # [ 1. 2. 3. 4. 5. 6.] # [ 2. 3. 4. 5. 6. 7.] # [ 3. 4. 5. 6. 7. 8.] # [ 4. 5. 6. 7. 8. 9.]] #注意这里行号的列号都是从0开始的
NaN
import numpy as np print(np.nan) # nan
random
import numpy as np print(np.random.rand()) # 给定形状产生随机数组(0到1之间的数) 0.5428533738729602 # float print(np.random.randint(1,100)) # 给定形状产生随机整数 40 # int print(np.random.choice(list(range(10)),5)) # 在样本中选择n个数据 [8 6 5 0 8] # ndarray x = np.arange(1,6) # 用list也是可以的[1,2,3,4,5] print(np.random.shuffle(x)) # None print(x) # [4, 1, 2, 3, 5] print(np.random.uniform(0,100,5)) # None # [34.40384563 96.14040662 32.90570129 58.28899661 60.20901579]
shape方法,数组的维度大小(以元组形式),获取ndarray的列数、行数,
import numpy as np #引入numpy库 #创建一维的narray对象 a = np.array([1,2,3,4,5]) print(a.shape) # (5,) #创建二维的narray对象 a2 = np.array([[1,2,3,4,5],[6,7,8,9,10]]) print(a2.shape) # (2, 5) print(a2.shape[0]) # 获得行数,2 print(a2.shape[1]) # 获得列数,5
reshape
import numpy as np a = np.arange(0,12).reshape(3,4) print(a) ''' [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]] '''
查看dtype
import numpy as np a = np.arange(1.1111111,20,2) b = np.array([[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15]]) print(a.dtype) # float64 print(b.dtype) # int32
索引
import numpy as np a = np.array([[1,2,3],[4,5,6],[7,8,9]]) print(a[2]) # 获取index为2的列 [7 8 9] print(a[2][2]) # 9 print(a[2,2]) # 9
import numpy as np a = np.arange(0,20,2) print(a) # [ 0 2 4 6 8 10 12 14 16 18] # 问题1:对于一个数组,选出其第1,3,4,6,7个元素,组成新的二维数组。 print(a[[1,3,4,6,7]]) # [ 2 6 8 12 14] a = np.array([[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15]]) # 问题2:对一个二维数组,选出其第一列和第三列,组成新的二维数组。 print(a[:,[1,3]]) # [[ 2 4] # [ 7 9] # [12 14]]
切片
import numpy as np a = np.array([[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15]]) print(a[0:2]) #截取第1-2行,返回 [[1 2 3 4 5] [ 6 7 8 9 10]] print(a[1,2:5]) #截取第2行,第三、四、五列,返回 [8 9 10] print(a[2,:]) #截取第3行,返回 [11 12 13 14 15]
import numpy as np a = np.array([[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15]]) # 其实布尔语句首先生成一个布尔矩阵,将布尔矩阵传入[](方括号)实现截取 print(a>3) # [[False False False True True] # [ True True True True True] # [ True True True True True]] # 问题1:给一个数组,选出数组中所有大于5的偶数 print(a[(a>5) & (a%2==0)]) # [ 6 8 10 12 14] # 问题2:给一个数组,选出数组中所有大于5的数和偶数 print(a[(a>5) | (a%2==0)]) # [ 2 4 6 7 8 9 10 11 12 13 14 15] # 问题3:给一个数组,选出数组中所有大于6的数 print(a[a>6]) # [ 7 8 9 10 11 12 13 14 15] # 问题4:给一个数组,把大于6的数置零 a[a>6] = 0 print(a) #大于6清零后矩阵为 # [[1 2 3 4 5] # [6 0 0 0 0] # [0 0 0 0 0]]
copy
与列表不同,数组切片时并不会自动复制,在切片数组上的修改会影响原数组。 【解决方法:copy()】
""" 某位置累积和指的是该位置之前(包括该位置)所有元素的和。 例如序列[1,2,3,4,5],其累计和为[1,3,6,10,15],即第一个元素为1,第二个元素为1+2=3,……,第五个元素为1+2+3+4+5=15。 矩阵求累积和的函数是cumsum(),可以对行,列,或整个矩阵求累积和。 """ import numpy as np a = np.array([1,2,3,4,5]) print(a) # [1 2 3 4 5] a_ = a[:3] print(a_) # [1 2 3] a_[:] = 0 print(a) # [0 0 0 4 5] # 切片数据的修改会影响原本的array print(a_) # [0 0 0] b = np.array([6,7,8,9,10]) print(b) # [ 6 7 8 9 10] b_ = b[:3].copy() print(b_) # [6 7 8] b_[:] = 0 print(b) # [ 6 7 8 9 10] # 使用copy后,对原array无影响 print(b_) # [0 0 0] copy
合并
import numpy as np a1 = np.array([[1,2],[3,4]]) a2 = np.array([[5,6],[7,8]]) #!注意 参数传入时要以列表list或元组tuple的形式传入 print(np.hstack([a1,a2])) # 等价于tmp = np.concatenate( (a1,a2), axis=1 ) #横向合并,返回结果如下 # [[1 2 5 6] # [3 4 7 8]] print(np.vstack((a1,a2))) # 等价于np.concatenate( (a1,a2), axis=0 ) #纵向合并,返回结果如下 # [[1 2] # [3 4] # [5 6] # [7 8]]
运算
一元函数:abs, sqrt, exp, log, ceil, floor, rint, trunc, modf, isnan, isinf, cos, sin, tan
二元函数:add, substract, multiply, divide, power, mod, maximum, mininum,
sum 求和
mean 求平均数
std 求标准差
var 求方差
min 求最小值
max 求最大值
argmin 求最小值索引
argmax 求最大值索引
""" 运算符 说明 + 矩阵对应元素相加 - 矩阵对应元素相减 * 矩阵对应元素相乘 / 矩阵对应元素相除,如果都是整数则取商 % 矩阵对应元素相除后取余数 ** 矩阵每个元素都取n次方,如**2:每个元素都取平方 """ import numpy as np a1 = np.array([[4,5,6],[1,2,3]]) a2 = np.array([[6,5,4],[3,2,1]]) print(a1+a2) # 相加 # [[10 10 10] # [ 4 4 4]] print(a1/a2) # 整数相除取商 # [[0.66666667 1. 1.5 ] # [0.33333333 1. 3. ]] print(a1%a2) # 相除取余数 # [[4 0 2] # [1 0 0]] print(a1 % 2) # [[0 1 0] # [1 0 1]] print(a1 ** 2) # [[16 25 36] # [ 1 4 9]] print(a1 ** a2) # [[4096 3125 1296] # [ 1 4 3]]
""" np.sin(a) 对矩阵a中每个元素取正弦,sin(x) np.cos(a) 对矩阵a中每个元素取余弦,cos(x) np.tan(a) 对矩阵a中每个元素取正切,tan(x) np.arcsin(a) 对矩阵a中每个元素取反正弦,arcsin(x) np.arccos(a) 对矩阵a中每个元素取反余弦,arccos(x) np.arctan(a) 对矩阵a中每个元素取反正切,arctan(x) np.exp(a) 对矩阵a中每个元素取指数函数,ex np.sqrt(a) 对矩阵a中每个元素开根号√x """ import numpy as np a = np.array([[1,2,3],[4,5,6]]) print(np.sin(a)) # 结果 # [[ 0.84147098 0.90929743 0.14112001] # [-0.7568025 -0.95892427 -0.2794155 ]] print(np.arcsin(a)) # 结果 # C:\Users\Administrator\Desktop\learn.py:6: RuntimeWarning: invalid value encountered in arcsin # print(np.arcsin(a)) # [[ 1.57079633 nan nan] # [ nan nan nan]]
# 矩阵乘法必须满足矩阵乘法的条件,即第一个矩阵的列数等于第二个矩阵的行数。 import numpy as np a1 = np.array([[1,2,3],[4,5,6]]) # a1为2*3矩阵 a2 = np.array([[1,2],[3,4],[5,6]]) # a2为3*2矩阵 print(a1.shape[1]==a2.shape[0]) # True, 满足矩阵乘法条件 print(a1.dot(a2)) # a1.dot(a2)相当于matlab中的a1*a2 # 而python中的a1*a2相当于matlab中的a1.*a2 # [[22 28] # [49 64]] print(a2.dot(a1)) # 注意,与a1.dot(a2)是不一样的 # [[ 9 12 15] # [19 26 33] # [29 40 51]]
""" 求矩阵的逆需要先导入numpy.linalg,用linalg的inv函数来求逆。 矩阵求逆的条件是矩阵的行数和列数相同。 """ import numpy as np import numpy.linalg as lg a = np.array([[1,2,3],[4,5,6],[7,8,9]]) print(lg.inv(a)) # 结果 # [[ -4.50359963e+15 9.00719925e+15 -4.50359963e+15] # [ 9.00719925e+15 -1.80143985e+16 9.00719925e+15] # [ -4.50359963e+15 9.00719925e+15 -4.50359963e+15]] a = np.eye(3) # 3阶单位矩阵 print(lg.inv(a)) # 单位矩阵的逆为他本身 # 结果 # [[ 1. 0. 0.] # [ 0. 1. 0.] # [ 0. 0. 1.]]
import numpy as np a = np.array([[1,2,3],[4,5,6]]) print(a.max()) #获取整个矩阵的最大值 结果: 6 print(a.min()) #结果:1 # 可以指定关键字参数axis来获得行最大(小)值或列最大(小)值 # axis=0 行方向最大(小)值,即获得每列的最大(小)值 # axis=1 列方向最大(小)值,即获得每行的最大(小)值 # 例如 print(a.max(axis=0)) # 结果为 [4 5 6] print(a.max(axis=1)) # 结果为 [3 6] # 要想获得最大最小值元素所在的位置,可以通过argmax函数来获得 print(a.argmax(axis=1)) # 结果为 [2 2]
import numpy as np a = np.array([[1,2,3],[4,5,6]]) print(a.mean()) #结果为: 3.5 # 同样地,可以通过关键字axis参数指定沿哪个方向获取平均值 print(a.mean(axis=0)) # 结果 [ 2.5 3.5 4.5] print(a.mean(axis=1)) # 结果 [ 2. 5.]
""" 方差的函数为var(),方差函数var()相当于函数mean(abs(x - x.mean())**2),其中x为矩阵。 """ import numpy as np a = np.array([[1,2,3],[4,5,6]]) print(a.var()) # 结果 2.91666666667 print(a.var(axis=0)) # 结果 [ 2.25 2.25 2.25] print(a.var(axis=1)) # 结果 [ 0.66666667 0.66666667]
""" 标准差的函数为std()。 std()相当于sqrt(mean(abs(x - x.mean())**2)),或相当于sqrt(x.var())。 """ import numpy as np a = np.array([[1,2,3],[4,5,6]]) print(a.std()) # 结果 1.70782512766 print(a.std(axis=0)) # 结果 [ 1.5 1.5 1.5] print(a.std(axis=1)) # 结果 [ 0.81649658 0.81649658]
""" 中值指的是将序列按大小顺序排列后,排在中间的那个值,如果有偶数个数,则是排在中间两个数的平均值。 例如序列[5,2,6,4,2],按大小顺序排成 [2,2,4,5,6],排在中间的数是4,所以这个序列的中值是4。 又如序列[5,2,6,4,3,2],按大小顺序排成 [2,2,3,4,5,6],因为有偶数个数,排在中间两个数是3、4,所以这个序列中值是3.5。 中值的函数是median(),调用方法为numpy.median(x,[axis]),axis可指定轴方向,默认axis=None,对所有数去中值。 """ import numpy as np x = np.array([[1,2,3],[4,5,6]]) print(np.median(x)) # 对所有数取中值 # 3.5 print(np.median(x,axis=0)) # 沿第一维方向取中值 # [ 2.5 3.5 4.5] print(np.median(x,axis=1)) # 沿第二维方向取中值 # [ 2. 5.]
import numpy as np a = np.array([[1,2,3],[4,5,6]]) print(a.sum()) # 对整个矩阵求和 # 结果 21 print(a.sum(axis=0)) # 对行方向求和 # 结果 [5 7 9] print(a.sum(axis=1)) # 对列方向求和 # 结果 [ 6 15]
""" 某位置累积和指的是该位置之前(包括该位置)所有元素的和。 例如序列[1,2,3,4,5],其累计和为[1,3,6,10,15],即第一个元素为1,第二个元素为1+2=3,……,第五个元素为1+2+3+4+5=15。 矩阵求累积和的函数是cumsum(),可以对行,列,或整个矩阵求累积和。 """ import numpy as np a = np.array([[1,2,3],[4,5,6]]) print(a.cumsum()) # 对整个矩阵求累积和 # [ 1 3 6 10 15 21] print(a.cumsum(axis=0)) # 对行方向求累积和 # [[1 2 3] # [5 7 9]] print(a.cumsum(axis=1)) # 对列方向求累积和 # [[ 1 3 6] # [ 4 9 15]]
转置
import numpy as np a = np.array([[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15]]) print(a) # [[ 1 2 3 4 5] # [ 6 7 8 9 10] # [11 12 13 14 15]] print(a.T) # [[ 1 6 11] # [ 2 7 12] # [ 3 8 13] # [ 4 9 14] # [ 5 10 15]] print(a.transpose()) # [[ 1 6 11] # [ 2 7 12] # [ 3 8 13] # [ 4 9 14] # [ 5 10 15]]
numpy函数和属性
numpy数据类型
类型 | 类型代码 | 说明 |
int8、uint8 | i1、u1 | 有符号和无符号8位整型(1字节) |
int16、uint16 | i2、u2 | 有符号和无符号16位整型(2字节) |
int32、uint32 | i4、u4 | 有符号和无符号32位整型(4字节) |
int64、uint64 | i8、u8 | 有符号和无符号64位整型(8字节) |
float16 | f2 | 半精度浮点数 |
float32 | f4、f | 单精度浮点数 |
float64 | f8、d | 双精度浮点数 |
float128 | f16、g | 扩展精度浮点数 |
complex64 | c8 | 分别用两个32位表示的复数 |
complex128 | c16 | 分别用两个64位表示的复数 |
complex256 | c32 | 分别用两个128位表示的复数 |
bool | ? | 布尔型 |
object | O | python对象 |
string | Sn | 固定长度字符串,每个字符1字节,如S10 |
unicode | Un | 固定长度Unicode,字节数由系统决定,如U10 |
numpy常用函数
生成函数 | 作用 |
np.array( x) np.array( x, dtype) |
将输入数据转化为一个ndarray 将输入数据转化为一个类型为type的ndarray |
np.asarray( array ) | 将输入数据转化为一个新的(copy)ndarray |
np.ones( N ) np.ones( N, dtype) np.ones_like( ndarray ) |
生成一个N长度的一维全一ndarray 生成一个N长度类型是dtype的一维全一ndarray 生成一个形状与参数相同的全一ndarray |
np.zeros( N) np.zeros( N, dtype) np.zeros_like(ndarray) |
生成一个N长度的一维全零ndarray 生成一个N长度类型位dtype的一维全零ndarray 类似np.ones_like( ndarray ) |
np.empty( N ) np.empty( N, dtype) np.empty(ndarray) |
生成一个N长度的未初始化一维ndarray 生成一个N长度类型是dtype的未初始化一维ndarray 类似np.ones_like( ndarray ) |
np.eye( N ) np.identity( N ) |
创建一个N * N的单位矩阵(对角线为1,其余为0) |
np.arange( num) np.arange( begin, end) np.arange( begin, end, step) |
生成一个从0到num-1步数为1的一维ndarray 生成一个从begin到end-1步数为1的一维ndarray 生成一个从begin到end-step的步数为step的一维ndarray |
np.mershgrid(ndarray, ndarray,...) |
生成一个ndarray * ndarray * ...的多维ndarray |
np.where(cond, ndarray1, ndarray2) |
根据条件cond,选取ndarray1或者ndarray2,返回一个新的ndarray |
np.in1d(ndarray, [x,y,...]) |
检查ndarray中的元素是否等于[x,y,...]中的一个,返回bool数组 |
矩阵函数 | 说明 |
np.diag( ndarray) np.diag( [x,y,...]) |
以一维数组的形式返回方阵的对角线(或非对角线)元素 将一维数组转化为方阵(非对角线元素为0) |
np.dot(ndarray, ndarray) | 矩阵乘法 |
np.trace( ndarray) | 计算对角线元素的和 |
排序函数 |
说明 |
np.sort( ndarray) |
排序,返回副本 |
np.unique(ndarray) |
返回ndarray中的元素,排除重复元素之后,并进行排序 |
np.intersect1d( ndarray1, ndarray2) np.union1d( ndarray1, ndarray2) np.setdiff1d( ndarray1, ndarray2) np.setxor1d( ndarray1, ndarray2) |
返回二者的交集并排序。 返回二者的并集并排序。 返回二者的差。 返回二者的对称差 |
一元计算函数 | 说明 |
np.abs(ndarray) np.fabs(ndarray) |
计算绝对值 计算绝对值(非复数) |
np.mean(ndarray) |
求平均值 |
np.sqrt(ndarray) |
计算x^0.5 |
np.square(ndarray) |
计算x^2 |
np.exp(ndarray) |
计算e^x |
log、log10、log2、log1p |
计算自然对数、底为10的log、底为2的log、底为(1+x)的log |
np.sign(ndarray) |
计算正负号:1(正)、0(0)、-1(负) |
np.ceil(ndarray) np.floor(ndarray) np.rint(ndarray) |
计算大于等于改值的最小整数 计算小于等于该值的最大整数 四舍五入到最近的整数,保留dtype |
np.modf(ndarray) |
将数组的小数和整数部分以两个独立的数组方式返回 |
np.isnan(ndarray) |
返回一个判断是否是NaN的bool型数组 |
np.isfinite(ndarray) np.isinf(ndarray) |
返回一个判断是否是有穷(非inf,非NaN)的bool型数组 返回一个判断是否是无穷的bool型数组 |
cos、cosh、sin、sinh、tan、tanh |
普通型和双曲型三角函数 |
arccos、arccosh、arcsin、arcsinh、arctan、arctanh |
反三角函数和双曲型反三角函数 |
np.logical_not(ndarray) |
计算各元素not x的真值,相当于-ndarray |
多元计算函数 |
说明 |
np.add(ndarray, ndarray) np.subtract(ndarray, ndarray) np.multiply(ndarray, ndarray) np.divide(ndarray, ndarray) np.floor_divide(ndarray, ndarray) np.power(ndarray, ndarray) np.mod(ndarray, ndarray) |
相加 相减 乘法 除法 圆整除法(丢弃余数) 次方 求模 |
np.maximum(ndarray, ndarray) np.fmax(ndarray, ndarray) np.minimun(ndarray, ndarray) np.fmin(ndarray, ndarray) |
求最大值 求最大值(忽略NaN) 求最小值 求最小值(忽略NaN) |
np.copysign(ndarray, ndarray) |
将参数2中的符号赋予参数1 |
np.greater(ndarray, ndarray) np.greater_equal(ndarray, ndarray) np.less(ndarray, ndarray) np.less_equal(ndarray, ndarray) np.equal(ndarray, ndarray) np.not_equal(ndarray, ndarray) |
> >= < <= == != |
logical_and(ndarray, ndarray) logical_or(ndarray, ndarray) logical_xor(ndarray, ndarray) |
& | ^ |
np.dot( ndarray, ndarray) | 计算两个ndarray的矩阵内积 |
np.ix_([x,y,m,n],...) | 生成一个索引器,用于Fancy indexing(花式索引) |
文件读写 | 说明 |
np.save(string, ndarray) | 将ndarray保存到文件名为 [string].npy 的文件中(无压缩) |
np.savez(string, ndarray1, ndarray2, ...) | 将所有的ndarray压缩保存到文件名为[string].npy的文件中 |
np.savetxt(sring, ndarray, fmt, newline='\n') | 将ndarray写入文件,格式为fmt |
np.load(string) | 读取文件名string的文件内容并转化为ndarray对象(或字典对象) |
np.loadtxt(string, delimiter) | 读取文件名string的文件内容,以delimiter为分隔符转化为ndarray |
ndarray属性
ndarray.ndim | 获取ndarray的维数 |
ndarray.shape | 获取ndarray各个维度的长度 |
ndarray.dtype | 获取ndarray中元素的数据类型 |
ndarray.T | 简单转置矩阵ndarray |
ndarray函数
函数 | 说明 |
ndarray.astype(dtype) | 转换类型,若转换失败则会出现TypeError |
ndarray.copy() | 复制一份ndarray(新的内存空间) |
ndarray.reshape((N,M,...)) | 将ndarray转化为N*M*...的多维ndarray(非copy) |
ndarray.transpose((xIndex,yIndex,...)) | 根据维索引xIndex,yIndex...进行矩阵转置,依赖于shape,不能用于一维矩阵(非copy) |
ndarray.swapaxes(xIndex,yIndex) | 交换维度(非copy) |
计算函数 | 说明 |
ndarray.mean( axis=0 ) | 求平均值 |
ndarray.sum( axis= 0) | 求和 |
ndarray.cumsum( axis=0) ndarray.cumprod( axis=0) |
累加 累乘 |
ndarray.std() ndarray.var() |
方差 标准差 |
ndarray.max() ndarray.min() |
最大值 最小值 |
ndarray.argmax() ndarray.argmin() |
最大值索引 最小值索引 |
ndarray.any() ndarray.all() |
是否至少有一个True 是否全部为True |
ndarray.dot( ndarray) |
计算矩阵内积 |
排序函数 |
说明 |
ndarray.sort(axis=0) |
排序,返回源数据 |
ndarray索引/切片方式
ndarray[n] | 选取第n+1个元素 |
ndarray[n:m] | 选取第n+1到第m个元素 |
ndarray[:] | 选取全部元素 |
ndarray[n:] | 选取第n+1到最后一个元素 |
ndarray[:n] | 选取第0到第n个元素 |
ndarray[ bool_ndarray ] 注:bool_ndarray表示bool类型的ndarray |
选取为true的元素 |
ndarray[[x,y,m,n]]... |
选取顺序和序列为x、y、m、n的ndarray |
ndarray[n,m] ndarray[n][m] |
选取第n+1行第m+1个元素 |
ndarray[n,m,...] ndarray[n][m].... |
选取n行n列....的元素 |
numpy.random常用函数
函数 | 说明 |
seed() seed(int) seed(ndarray) |
确定随机数生成种子 |
permutation(int) permutation(ndarray) |
返回一个一维从0~9的序列的随机排列 返回一个序列的随机排列 |
shuffle(ndarray) | 对一个序列就地随机排列 |
rand(int) randint(begin,end,num=1) |
产生int个均匀分布的样本值 从给定的begin和end随机选取num个整数 |
randn(N, M, ...) | 生成一个N*M*...的正态分布(平均值为0,标准差为1)的ndarray |
normal(size=(N,M,...)) | 生成一个N*M*...的正态(高斯)分布的ndarray |
beta(ndarray1,ndarray2) | 产生beta分布的样本值,参数必须大于0 |
chisquare() | 产生卡方分布的样本值 |
gamma() | 产生gamma分布的样本值 |
uniform() | 产生在[0,1)中均匀分布的样本值 |
numpy.linalg常用函数
函数 | 说明 |
det(ndarray) | 计算矩阵列式 |
eig(ndarray) | 计算方阵的本征值和本征向量 |
inv(ndarray) pinv(ndarray) |
计算方阵的逆 计算方阵的Moore-Penrose伪逆 |
qr(ndarray) | 计算qr分解 |
svd(ndarray) | 计算奇异值分解svd |
solve(ndarray) | 解线性方程组Ax = b,其中A为方阵 |
lstsq(ndarray) | 计算Ax=b的最小二乘解 |
pandas模块
pandas说明
说明
pandas是一个强大的Python数据分析的工具包。 pandas是基于NumPy构建的。 pandas的主要功能 具备对其功能的数据结构DataFrame、Series 集成时间序列功能 提供丰富的数学运算和操作 灵活处理缺失数据
官网
http://pandas.pydata.org/pandas-docs/stable/index.html
安装
pip install pandas import pandas # import pandas as pd # from pandas import Series, DataFrame
# 查看pandas版本
pandas.show_version()
pandas.__version__
pandas常用
copy
与列表不同,Series/DataFrame切片时并不会自动复制,在切片上的修改会影响原数据。 【解决方法:copy()】
过程略。
创建Series对象
""" Series是一种类似于一位数组的对象,由一组数据和一组与之相关的数据标签(索引)组成。 Series比较像列表(数组)和字典的结合体 """ import pandas as pd a = pd.Series([4,7,-5,3]) # 0 4 # 1 7 # 2 -5 # 3 3 # dtype: int64 b = pd.Series([4,7,-5,3],index=['a','b','c','d']) # a 4 # b 7 # c -5 # d 3 # dtype: int64 c = pd.Series({'a':1, 'b':2}) # a 1 # b 2 # dtype: int64 d = pd.Series(0, index=['a','b','c','d']) # a 0 # b 0 # c 0 # d 0 # dtype: int64
Series修改dtypes
""" """ import numpy as np import pandas as pd sr = pd.Series([1,2,3,4]) # 0 1 # 1 2 # 2 3 # 3 4 # dtype: int64 print(sr.dtypes) # int64 sr = sr.astype(float) print(sr.dtypes) # float64 print(sr) # 0 1.0 # 1 2.0 # 2 3.0 # 3 4.0 # dtype: float64
Series索引
import numpy as np import pandas as pd sr = pd.Series(np.arange(4.0)) print(sr) # 0 0.0 # 1 1.0 # 2 2.0 # 3 3.0 # dtype: float64 sr.index = ["a","b","c","d"] print(sr) # a 0.0 # b 1.0 # c 2.0 # d 3.0 # dtype: float64
""" s4[3] s4['e'] s4[[1,3,5]] s4[['a','b','d','f']] s4[:4] s4['c':] s4['b':'e'] """ import numpy as np import pandas as pd sr = pd.Series(np.arange(4.0)) print(sr) # 0 0.0 # 1 1.0 # 2 2.0 # 3 3.0 # dtype: float64 sr.index = ["a","b","c","d"] print(sr) # a 0.0 # b 1.0 # c 2.0 # d 3.0 # dtype: float64 print(sr[0]) # 0.0 print(sr["a"]) # 0.0 print(sr[[0,2,3]]) # a 0.0 # c 2.0 # d 3.0 # dtype: float64 print(sr[["a","c","d"]]) # a 0.0 # c 2.0 # d 3.0 # dtype: float64 print(sr[:3]) # a 0.0 # b 1.0 # c 2.0 # dtype: float64 print(sr["c":]) # c 2.0 # d 3.0 # dtype: float64 print(sr['b':'d']) # b 1.0 # c 2.0 # d 3.0 # dtype: float64
# loc 对应标签 # iloc 对应index import numpy as np import pandas as pd sr1 = pd.Series(np.array([10,15,20,30,55,80]),index = ['a','b','c','d','e','f']) print(sr1.iloc[1]) # 15 print(sr1.iloc[3:]) # d 30 # e 55 # f 80 # dtype: int32 print(sr1.iloc[3:5]) # 注意,不包含右边界数据 # d 30 # e 55 # dtype: int32 print(sr1.loc['b']) # 15 print(sr1.loc['d':]) print(sr1.loc["d":"f"]) # 注意,这是左右包含边界数据 # d 30 # e 55 # f 80 # dtype: int32
import numpy as np import pandas as pd data=pd.Series(np.random.rand(9), index=[['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c'], [1,2,3,1,2,3,1,2,3]]) print(data) # a 1 0.369071 # 2 0.799169 # 3 0.633432 # b 1 0.080917 # 2 0.484825 # 3 0.462479 # c 1 0.463004 # 2 0.591250 # 3 0.541369 # dtype: float64
注意:
import numpy as np import pandas as pd # sr1 = pd.Series(np.array([10,15,20,30,55,80]),index = ['a','b','c','d','e','f']) sr1 = pd.Series(np.array([10,15,20,30,55,80]),index = [1,2,3,4,5,6]) print(sr1) # 1 10 # 2 15 # 3 20 # 4 30 # 5 55 # 6 80 # dtype: int32 print(sr1[1]) # 10
Series运算
注意:Series对象运算时,可使用fill_value参数进行缺失数据补全
import numpy as np import pandas as pd sr1 = pd.Series([12,23,34], index=['c','a','d']) sr3 = pd.Series([11,20,10,14], index=['d','c','a','b']) print(sr1.add(sr3,fill_value=0)) # a 33.0 # b 14.0 # c 32.0 # d 45.0 # dtype: float64 # 同理: add, sub, div, mul
Series处理缺失数据 NaN
""" 缺失数据:使用NaN(Not a Number)来表示缺失数据。其值等于np.nan。内置的None值也会被当做NaN处理。 处理缺失数据的相关方法: dropna() 过滤掉值为NaN的行 fillna() 填充缺失数据 isnull() 返回布尔数组,缺失值对应为True notnull() 返回布尔数组,缺失值对应为False 过滤缺失数据:sr.dropna() 或 sr[data.notnull()] 填充缺失数据:fillna(0) """
import numpy as np import pandas as pd sr1 = pd.Series([12,23,34,None], index=['a','b','c', 'd']) print(sr1.dropna()) # 等同于sr1[sr1.notnull()] # a 12.0 # b 23.0 # c 34.0 # dtype: float64 print(sr1.fillna(0)) # a 12.0 # b 23.0 # c 34.0 # d 0.0 # dtype: float64 print(sr1.isnull()) # a False # b False # c False # d True # dtype: bool print(sr1.notnull()) # a True # b True # c True # d False # dtype: bool
Series支持numpy和dict的特性
Series支持NumPy模块的特性(下标): 从ndarray创建Series:Series(arr) 与标量运算:sr*2 两个Series运算:sr1+sr2 索引:sr[0], sr[[1,2,4]] 切片:sr[0:2] 通用函数:np.abs(sr) 布尔值过滤:sr[sr>0] Series支持字典的特性(标签): 从字典创建Series:Series(dic), in运算:’a’ in sr 键索引:sr['a'], sr[['a', 'b', 'd']]
注意:
import numpy as np import pandas as pd sr1 = pd.Series([12,23,34], index=['c','a','d']) sr2 = pd.Series([11,20,10], index=['d','c','a',]) print(sr1+sr2) # a 33 # c 32 # d 45 # dtype: int64 sr3 = pd.Series([11,20,10,14], index=['d','c','a','b']) print(sr1+sr3) # a 33.0 # b NaN # c 32.0 # d 45.0 # dtype: float64
创建DataFrame对象
DataFrame是一个表格型的数据结构,含有一组有序的列。
DataFrame可以被看做是由Series组成的字典,并且共用一个索引。
import numpy as np import pandas as pd df = pd.DataFrame({'one':[1,2,3,4],'two':[4,3,2,1]}) print(df) # one two # 0 1 4 # 1 2 3 # 2 3 2 # 3 4 1 df = pd.DataFrame({'one':pd.Series([1,2,3],index=['a','b','c']), 'two':pd.Series([1,2,3,4],index=['b','a','c','d'])}) print(df) # one two # a 1.0 2 # b 2.0 1 # c 3.0 3 # d NaN 4
DataFrame CSV
import numpy as np import pandas as pd df = pd.read_csv("test.csv") # 从csv导入为DataFrame print(df) """ date open high ... v_ma10 v_ma20 turnover 0 2018-05-25 28.11 28.28 ... 42531.08 50972.04 1.09 1 2018-05-24 28.11 28.49 ... 44772.36 52807.80 0.82 2 2018-05-23 28.18 28.53 ... 45845.72 53660.69 1.21 ... """ df.to_csv("new.csv") # 写入csv文件
df = pd.read_csv("601318.csv") #默认以,为分隔符 - pd.read_csv("601318.csv",sep='\s+') #匹配空格,支持正则表达式 - pd.read_table("601318.csv",sep=',') #和df = pd.read_csv("601318.csv") 一样 - pd.read_excle("601318.xlsx") #读Excel文件 sep:指定分隔符 header = NOne,就会吧默认的表名去除 了 df.rename(column={0:'a',1:"b"}) #修改列名 pd.read_csv(index_col=0) #第0列 如果想让时间成为索引 pd.read_csv(index_col='date') #时间列 pd.read_csv(index_col='date',parse_datas=True) #时间列 parse_datas转换为时间对象,设为true是吧所有能转的都转 pd.read_csv(index_col='date',parse_datas=['date']) #知识吧date的那一列转换成时间对象 na_values=['None'] #吧表里面为None的转换成NaN,是吧字符串转换成缺失值 na_rep() #是吧缺失值nan转换成字符串 cols #指定输出的列,传入列表
DataFrame增删改查
# -*- coding:utf-8 -*- import numpy as np import pandas as pd df = pd.DataFrame({'one':pd.Series([1,2,3],index=['a','b','c']), 'two':pd.Series([1,2,3,4],index=['b','a','c','d'])}) df2 = pd.DataFrame({'one':pd.Series([5,6,7],index=['a','b','c']), 'three':pd.Series([2,4,6],index=['a','b','c'])}) # print(df.drop(["two"],axis=1)) # one # a 1.0 # b 2.0 # c 3.0 # d NaN df3 = pd.concat([df,df2]) # 拼接 两df,axis默认=0,对应位置无值的填NaN # one three two # a 1.0 NaN 2.0 # b 2.0 NaN 1.0 # c 3.0 NaN 3.0 # d NaN NaN 4.0 # a 5.0 2.0 NaN # b 6.0 4.0 NaN # c 7.0 6.0 NaN x = pd.concat([df,df2],axis=1) # one two one three # a 1.0 2 5.0 2.0 # b 2.0 1 6.0 4.0 # c 3.0 3 7.0 6.0 # d NaN 4 NaN NaN df4 = pd.DataFrame(df3,columns=["one","two","three","ten"]) # 新增一列ten,填充值为NaN # one two three ten # a 1.0 2.0 NaN NaN # b 2.0 1.0 NaN NaN # c 3.0 3.0 NaN NaN # d NaN 4.0 NaN NaN # a 5.0 NaN 2.0 NaN # b 6.0 NaN 4.0 NaN # c 7.0 NaN 6.0 NaN df4["xyz"] = 9999 # one two three ten xyz # a 1.0 2.0 NaN NaN 9999 # b 2.0 1.0 NaN NaN 9999 # c 3.0 3.0 NaN NaN 9999 # d NaN 4.0 NaN NaN 9999 # a 5.0 NaN 2.0 NaN 9999 # b 6.0 NaN 4.0 NaN 9999 # c 7.0 NaN 6.0 NaN 9999
# -*- coding:utf-8 -*- import numpy as np import pandas as pd df = pd.DataFrame({'one':pd.Series([1,2,3],index=['a','b','c']), 'two':pd.Series([1,2,3,4],index=['b','a','c','d']),'three':pd.Series([8,9,10,11,12],index=['a','b','c','d','e'])}) del df["two"] print(df) # one three # a 1.0 8 # b 2.0 9 # c 3.0 10 # d NaN 11 # e NaN 12 print(df.drop("c")) # one two three # a 1.0 2.0 8 # b 2.0 1.0 9 # d NaN 4.0 11 # e NaN NaN 12 print(df.drop("three",axis=1)) # one two # a 1.0 2.0 # b 2.0 1.0 # c 3.0 3.0 # d NaN 4.0 # e NaN NaN df = pd.DataFrame({'one':pd.Series([1,2,3]), 'two':pd.Series([1,2,3,4]),'three':pd.Series([8,9,10,11,12])}) # one two three # 0 1.0 1.0 8 # 1 2.0 2.0 9 # 2 3.0 3.0 10 # 3 NaN 4.0 11 # 4 NaN NaN 12 print(df.drop([0,2,4])) # one two three # 1 2.0 2.0 9 # 3 NaN 4.0 11
# -*- coding:utf-8 -*- import numpy as np import pandas as pd df = pd.DataFrame({'one':pd.Series([1,2,3],index=['a','b','c']), 'two':pd.Series([1,2,3,4],index=['b','a','c','d']),'three':pd.Series([8,9,10,11,12],index=['a','b','c','d','e'])}) # one two three # a 1.0 2.0 8 # b 2.0 1.0 9 # c 3.0 3.0 10 # d NaN 4.0 11 # e NaN NaN 12 df.loc["b"] = "B" df.loc["c"].loc["three"] = 8888 print(df) # one two three # a 1 2 8 # b B B B # c 3 3 8888 # d NaN 4 11 # e NaN NaN 12
DataFrame修改dtypes
# -*- coding:utf-8 -*- import numpy as np import pandas as pd df = pd.DataFrame({'one':pd.Series([1,2,3],index=['a','b','c']), 'two':pd.Series([1,2,3,4],index=['b','a','c','d']),'three':pd.Series([8,9,10,11,12],index=['a','b','c','d','e'])}) # one two three # a 1.0 2.0 8 # b 2.0 1.0 9 # c 3.0 3.0 10 # d NaN 4.0 11 # e NaN NaN 12 print(df.dtypes) # one float64 # two float64 # three int64 # dtype: object df["three"] = df["three"].astype(float) print(df.dtypes) # one float64 # two float64 # three float64 # dtype: object print(df) # one two three # a 1.0 2.0 8.0 # b 2.0 1.0 9.0 # c 3.0 3.0 10.0 # d NaN 4.0 11.0 # e NaN NaN 12.0
DataFrame查看数据
""" index 获取索引 columns 获取列索引 T 转置 values 获取值数组 describe() 获取快速统计 """ import numpy as np import pandas as pd df = pd.DataFrame({'one':pd.Series([1,2,3],index=['a','b','c']), 'two':pd.Series([1,2,3,4],index=['b','a','c','d'])}) # one two # a 1.0 2 # b 2.0 1 # c 3.0 3 # d NaN 4 print(df.index) # Index(['a', 'b', 'c', 'd'], dtype='object') print(df.columns) # Index(['one', 'two'], dtype='object') print(df.values) # <class 'numpy.ndarray'> # [[ 1. 2.] # [ 2. 1.] # [ 3. 3.] # [nan 4.]] print(df.describe()) # one two # count 3.0 4.000000 # mean 2.0 2.500000 # std 1.0 1.290994 # min 1.0 1.000000 # 25% 1.5 1.750000 # 50% 2.0 2.500000 # 75% 2.5 3.250000 # max 3.0 4.000000 print(df.T) # a b c d # one 1.0 2.0 3.0 NaN # two 2.0 1.0 3.0 4.0
DataFrame索引
""" df[‘A’] # 单个时,表示列 df[[‘A’, ‘B’]] # 单个花式索引,表示列 df[‘A’][0] # 第一个是列,单列表示Series,[0]表示索引 df[0:10][[‘A’, ‘C’]] # 切片时,表示行;第二个花式索引表示列 df.loc[:,[‘A’,‘B’]] # 第一个表示行 df.loc[:,'A':'C'] # 行,列 df.loc[0,'A'] # 行,列 df.loc[0:10,['A','C']] # 出错,loc对应的参数为索引,如果用index,则需要用iloc print(df.iloc[0:2,0:1]) # iloc对应是index """ import numpy as np import pandas as pd df = pd.DataFrame({'one':pd.Series([1,2,3],index=['a','b','c']), 'two':pd.Series([1,2,3,4],index=['b','a','c','d'])}) # one two # a 1.0 2 # b 2.0 1 # c 3.0 3 # d NaN 4 print(df["one"]) # 单个时,表示列 # a 1.0 # b 2.0 # c 3.0 # d NaN # Name: one, dtype: float64 print(df["one"]["a"]) # 单个花式索引,表示列 # 1.0 print(df[["one","two"]]) # 第一个是列,单列表示Series,[0]表示索引 # one two # a 1.0 2 # b 2.0 1 # c 3.0 3 # d NaN 4 print(df[1:3][["one","two"]]) # 切片时,表示行;第二个花式索引表示列 # one two # b 2.0 1 # c 3.0 3
""" df.loc[:,[‘A’,‘B’]] # 第一个表示行 df.loc[:,'A':'C'] # 行,列 df.loc[0,'A'] # 行,列 df.loc[0:10,['A','C']] # 出错,loc对应的参数为索引,如果用index,则需要用iloc df.iloc[3] df.iloc[3,3] df.iloc[0:3,4:6] df.iloc[1:5,:] df.iloc[[1,2,4],[0,3]] """ import numpy as np import pandas as pd df = pd.DataFrame({'one':pd.Series([1,2,3],index=['a','b','c']), 'two':pd.Series([1,2,3,4],index=['b','a','c','d'])}) # one two # a 1.0 2 # b 2.0 1 # c 3.0 3 # d NaN 4 print(df.loc["a":"c",["one","two"]]) # 行,列 # one two # a 1.0 2 # b 2.0 1 # c 3.0 3 print(df.loc[:,'one':'two']) # 行,列 # one two # a 1.0 2 # b 2.0 1 # c 3.0 3 # d NaN 4 print(df.loc["a",'two']) # 行,列 # 2 # print(df.loc[0:2,["one","two"]]) # 出错,loc对应的参数为索引,如果用index,则需要用iloc # 出错 print(df.iloc[0:2,0:1]) # iloc对应是index # one # a 1.0 # b 2.0 print(df.iloc[3]) # one NaN # two 4.0 # Name: d, dtype: float64 print(df.iloc[0:3,0:2]) # one two # a 1.0 2 # b 2.0 1 # c 3.0 3 print(df.iloc[1:3,:]) # one two # b 2.0 1 # c 3.0 3 print(df.iloc[[1,2],[0,1]]) # one two # b 2.0 1 # c 3.0 3
""" df[df['A']>0] df[df['A'].isin([1,3,5])] df[df<0] = 0 """ import numpy as np import pandas as pd df = pd.DataFrame({'one':pd.Series([1,2,3],index=['a','b','c']), 'two':pd.Series([1,2,3,4],index=['b','a','c','d'])}) # one two # a 1.0 2 # b 2.0 1 # c 3.0 3 # d NaN 4 print(df[df["one"] > 2]) # one two # c 3.0 3 print(df[df['one'].isin([1,3,5])]) # one two # a 1.0 2 # c 3.0 3 df[df<=2] = 0 print(df) # one two # a 0.0 0 # b 0.0 0 # c 3.0 3 # d NaN 4
DataFrame数据缺失
DataFrame处理缺失数据的方法: dropna(axis=0,how=‘any’,…) # 行axis=0,列axis=1 fillna() # method="ffill" 使用前值填充 # method="bfill" 使用后值填充 # 字典,根据列进行填充 isnull() notnull()
""" DataFrame处理缺失数据的方法: dropna(axis=0,how=‘any’,…) # 行axis=0,列axis=1 fillna() # method="ffill" 使用前值填充 # method="bfill" 使用后值填充 # 字典,根据列进行填充 isnull() notnull() """ import numpy as np import pandas as pd df = pd.DataFrame({'one':pd.Series([1,2,3],index=['a','b','c']), 'two':pd.Series([None,None,3,4],index=['b','a','c','d'])}) # one two # a 1.0 NaN # b 2.0 NaN # c 3.0 3.0 # d NaN 4.0 print(df.dropna(axis=0,how="any")) # 默认axis=0 行axis=0,列axis=1 # one two # c 3.0 3.0 print(df.dropna(axis=1,how="any")) # 由于两列均有None,则都drop掉 # Empty DataFrame # Columns: [] # Index: [a, b, c, d] print(df.fillna(10000000)) # 等价于 df[df.isnull()] = 10000000 # one two # a 1.0 10000000.0 # b 2.0 10000000.0 # c 3.0 3.0 # d 10000000.0 4.0 print(df.fillna(method="ffill")) # one two # a 1.0 NaN # b 2.0 NaN # c 3.0 3.0 # d 3.0 4.0 print(df.fillna(method="bfill")) # one two # a 1.0 3.0 # b 2.0 3.0 # c 3.0 3.0 # d NaN 4.0 print(df.fillna({"one":2000,"two":1999})) # one two # a 1.0 1999.0 # b 2.0 1999.0 # c 3.0 3.0 # d 2000.0 4.0 print(df.isnull()) # one two # a False True # b False True # c False False # d True False print(df.notnull()) # one two # a True False # b True False # c True True # d False True
DataFrame其他方法 mean sum sort apply等
""" mean(axis=0,skipna=False) sum(axis=1) sort_index(axis, …, ascending) 按行或列索引排序,ascending=True/False顺序、倒序 sort_values(by, axis, ascending) 按值排序 NumPy的通用函数同样适用于pandas apply(func, axis=0) 将自定义函数应用在各行或者各列上 ,func可返回标量或者Series applymap(func) 将函数应用在DataFrame各个元素上 map(func) 将函数应用在Series各个元素上 """ import numpy as np import pandas as pd df = pd.DataFrame({'one':pd.Series([1,2,3],index=['a','b','c']), 'two':pd.Series([None,None,3,4],index=['b','a','c','d'])}) # one two # a 1.0 NaN # b 2.0 NaN # c 3.0 3.0 # d NaN 4.0 print(df.mean(axis=0)) # 按列取平均 # one 2.0 # two 3.5 # dtype: float64 print(df.mean(axis=0,skipna=False)) # 按列取平均 # one NaN # two NaN # dtype: float64 print(df.mean(axis=1)) # 按行取平均 # a 1.0 # b 2.0 # c 3.0 # d 4.0 # dtype: float64 print(df.sum(axis=0)) # print(df.sum(axis=0,skipna=False)) # one 6.0 # two 7.0 # dtype: float64 print(df.sum(axis=1)) # a 1.0 # b 2.0 # c 6.0 # d 4.0 # dtype: float64 print(df.sort_index(axis=0,ascending=True)) # one two # a 1.0 NaN # b 2.0 NaN # c 3.0 3.0 # d NaN 4.0 print(df.sort_values(by=["two","one"],axis=0,ascending=False)) # 先two后one进行排序 # one two # d NaN 4.0 # c 3.0 3.0 # b 2.0 NaN # a 1.0 NaN def f(x): return x ** x print(df.apply(f)) # one two # a 1.0 NaN # b 4.0 NaN # c 27.0 27.0 # d NaN 256.0 print(df.applymap(f)) # one two # a 1.0 NaN # b 4.0 NaN # c 27.0 27.0 # d NaN 256.0 x = pd.Series(np.arange(10)) print(x.apply(f)) # 0 1 # 1 1 # 2 4 # 3 27 # 4 256 # 5 3125 # 6 46656 # 7 823543 # 8 16777216 # 9 387420489 # dtype: int64 print(x.map(f)) # 0 1 # 1 1 # 2 4 # 3 27 # 4 256 # 5 3125 # 6 46656 # 7 823543 # 8 16777216 # 9 387420489 # dtype: int64
import numpy as np import pandas as pd df = pd.DataFrame({'one':pd.Series([1,2,3],index=['a','b','c']), 'two':pd.Series([None,None,3,4],index=['b','a','c','d'])}) # one two # a 1.0 NaN # b 2.0 NaN # c 3.0 3.0 # d NaN 4.0 # 查询数据的前n行或末尾n行 print(df.head(3)) # one two # a 1.0 NaN # b 2.0 NaN # c 3.0 3.0 print(df.tail(2)) # one two # c 3.0 3.0 # d NaN 4.0
DataFrame文件处理
从文件读取 """ 读取文件:从文件名、URL、文件对象中加载数据 read_csv 默认分隔符为, read_table 默认分隔符为\t 读取文件函数主要参数: sep 指定分隔符,可用正则表达式如'\s+' header=None 指定文件无列名 name 指定列名 index_col 指定某列作为索引 na_values 指定某些字符串表示缺失值 parse_dates 指定某些列是否被解析为日期,布尔值或列表 nrows 指定读取几行文件 chunksize 分块读取文件,指定块大小 skip_row (可能是skiprows,版本) 指定跳过某些行 """ 写入到文件: """ to_csv 写入文件函数的主要参数: sep na_rep 指定缺失值转换的字符串,默认为空字符串 header=False 不输出列名一行 index=False 不输出行索引一列 cols 指定输出的列,传入列表 其他文件类型:json, XML, HTML, 数据库 pandas转换为二进制文件格式(pickle): save load """
pandas的时间处理
时间序列类型: 时间戳:特定时刻 固定时期:如2017年7月 时间间隔:起始时间-结束时间 Python标准库:datetime datetime.datetime.timedelta # 表示 时间间隔 dt.strftime() #f:format吧时间对象格式化成字符串 strptime() #吧字符串解析成时间对象p:parse 灵活处理时间对象:dateutil包 dateutil.parser.parse('2018/1/29') dateutil.parser.parse('27/6/2017',dayfirst =True) 成组处理时间对象:pandas pd.to_datetime(['2001-01-01', '2002-02-02']) DatetimeIndex(['2001-01-01', '2002-02-02'], dtype='datetime64[ns]', freq=None) 产生时间对象数组:date_range start 开始时间 end 结束时间 periods 时间长度 freq 时间频率,默认为'D',可选H(our),W(eek),B(usiness),S(emi-)M(onth),(min)T(es), S(econd), A(year),… import pandas as pd import numpy as np x = pd.date_range(start="2015-01-01",periods=100,freq="D") x = pd.date_range(start="2015-01-01",end="2016-01-01",freq="D") print(x)
1、时间序列就是以时间对象为索引的Series或DataFrame。 2、datetime对象作为索引时是存储在DatetimeIndex对象中的。 3、时间序列特殊功能: 传入“年”或“年月”作为切片方式 传入日期范围作为切片方式 丰富的函数支持:resample(), strftime(), …… 批量转换为datetime对象:to_pydatetime()
import pandas as pd import numpy as np dates = ['2017-06-20','2017-06-21','2017-06-22','2017-06-23','2017-06-24','2017-06-25','2017-06-26','2017-06-27'] ts = pd.Series(np.random.randn(8),index = pd.to_datetime(dates)) print(ts) # 2017-06-20 -0.228449 # 2017-06-21 0.938766 # 2017-06-22 0.474168 # 2017-06-23 -0.868375 # 2017-06-24 0.777883 # 2017-06-25 -1.248373 # 2017-06-26 -0.306503 # 2017-06-27 0.406621 # dtype: float64 print(ts.index) # DatetimeIndex(['2017-06-20', '2017-06-21', '2017-06-22', '2017-06-23', # '2017-06-24', '2017-06-25', '2017-06-26', '2017-06-27'], # dtype='datetime64[ns]', freq=None) print(ts["20170622"]) # 0.4741684129056889 print(ts["2017-06-24":"20170627"]) # 2017-06-24 0.543603 # 2017-06-25 0.006838 # 2017-06-26 0.953454 # 2017-06-27 0.870791 # dtype: float64
import pandas as pd import numpy as np df = pd.read_csv("test.csv",index_col="date") print(df) # open high close ... v_ma10 v_ma20 turnover # date ... # 2018-05-25 28.11 28.28 27.35 ... 42531.08 50972.04 1.09 # 2018-05-24 28.11 28.49 28.04 ... 44772.36 52807.80 0.82 # 2018-05-23 28.18 28.53 28.03 ... 45845.72 53660.69 1.21 # 2018-05-22 26.88 28.50 28.20 ... 45417.26 54292.05 2.11 # 2018-05-21 26.40 27.08 26.76 ... 43111.53 53120.01 1.39
pandas函数和属性
pandas常用函数
函数 | 说明 |
pd.isnull(series) pd.notnull(series) |
判断是否为空(NaN) 判断是否不为空(not NaN) |
Series常用属性
属性 | 说明 |
values | 获取数组 |
index | 获取索引 |
name | values的name |
index.name | 索引的name |
Series常用函数
函数 | 说明 |
Series([x,y,...])Series({'a':x,'b':y,...}, index=param1) | 生成一个Series |
Series.copy() | 复制一个Series |
Series.reindex([x,y,...], fill_value=NaN) Series.reindex([x,y,...], method=NaN) Series.reindex(columns=[x,y,...]) |
重返回一个适应新索引的新对象,将缺失值填充为fill_value 返回适应新索引的新对象,填充方式为method 对列进行重新索引
reindex的method选项: |
Series.drop(index) | 丢弃指定项 |
Series.map(f) | 应用元素级函数 |
排序函数 | 说明 |
Series.sort_index(ascending=True) | 根据索引返回已排序的新对象 |
Series.order(ascending=True) | 根据值返回已排序的对象,NaN值在末尾 |
Series.rank(method='average', ascending=True, axis=0) |
为各组分配一个平均排名
rank的method选项 |
df.argmax() df.argmin() |
返回含有最大值的索引位置 返回含有最小值的索引位置 |
DataFrame常用属性
属性 | 说明 |
values | DataFrame的值 |
index | 行索引 |
index.name | 行索引的名字 |
columns | 列索引 |
columns.name | 列索引的名字 |
ix | 返回行的DataFrame |
ix[[x,y,...], [x,y,...]] | 对行重新索引,然后对列重新索引 |
T | frame行列转置 |
Dataframe常用函数
函数 | 说明 |
DataFrame(dict, columns=dict.index, index=[dict.columnnum]) DataFrame(二维ndarray) DataFrame(由数组、列表或元组组成的字典) DataFrame(NumPy的结构化/记录数组) DataFrame(由Series组成的字典) DataFrame(由字典组成的字典) DataFrame(字典或Series的列表) DataFrame(由列表或元组组成的列表) DataFrame(DataFrame) DataFrame(NumPy的MaskedArray) |
构建DataFrame 数据矩阵,还可以传入行标和列标 每个序列会变成DataFrame的一列。所有序列的长度必须相同 类似于“由数组组成的字典” 每个Series会成为一列。如果没有显式制定索引,则各Series的索引会被合并成结果的行索引 各内层字典会成为一列。键会被合并成结果的行索引。 各项将会成为DataFrame的一行。索引的并集会成为DataFrame的列标。 类似于二维ndarray 沿用DataFrame 类似于二维ndarray,但掩码结果会变成NA/缺失值
|
df.reindex([x,y,...], fill_value=NaN, limit) df.reindex([x,y,...], method=NaN) df.reindex([x,y,...], columns=[x,y,...],copy=True) |
返回一个适应新索引的新对象,将缺失值填充为fill_value,最大填充量为limit 返回适应新索引的新对象,填充方式为method 同时对行和列进行重新索引,默认复制新对象。 |
df.drop(index, axis=0) | 丢弃指定轴上的指定项。 |
排序函数 | 说明 |
df.sort_index(axis=0, ascending=True) df.sort_index(by=[a,b,...]) |
根据索引排序 |
汇总统计函数 | 说明 |
df.count() | 非NaN的数量 |
df.describe() | 一次性产生多个汇总统计 |
df.min() df.min() |
最小值 最大值 |
df.idxmax(axis=0, skipna=True) df.idxmin(axis=0, skipna=True) |
返回含有最大值的index的Series 返回含有最小值的index的Series |
df.quantile(axis=0) | 计算样本的分位数 |
df.sum(axis=0, skipna=True, level=NaN) df.mean(axis=0, skipna=True, level=NaN) df.median(axis=0, skipna=True, level=NaN) df.mad(axis=0, skipna=True, level=NaN) df.var(axis=0, skipna=True, level=NaN) df.std(axis=0, skipna=True, level=NaN) df.skew(axis=0, skipna=True, level=NaN) df.kurt(axis=0, skipna=True, level=NaN) df.cumsum(axis=0, skipna=True, level=NaN) df.cummin(axis=0, skipna=True, level=NaN) df.cummax(axis=0, skipna=True, level=NaN) df.cumprod(axis=0, skipna=True, level=NaN) df.diff(axis=0) df.pct_change(axis=0) |
返回一个含有求和小计的Series 返回一个含有平均值的Series 返回一个含有算术中位数的Series 返回一个根据平均值计算平均绝对离差的Series 返回一个方差的Series 返回一个标准差的Series 返回样本值的偏度(三阶距) 返回样本值的峰度(四阶距) 返回样本的累计和 返回样本的累计最大值 返回样本的累计最小值 返回样本的累计积 返回样本的一阶差分 返回样本的百分比数变化 |
计算函数 | 说明 |
df.add(df2, fill_value=NaN, axist=1) df.sub(df2, fill_value=NaN, axist=1) df.div(df2, fill_value=NaN, axist=1) df.mul(df2, fill_value=NaN, axist=1) |
元素级相加,对齐时找不到元素默认用fill_value 元素级相减,对齐时找不到元素默认用fill_value 元素级相除,对齐时找不到元素默认用fill_value 元素级相乘,对齐时找不到元素默认用fill_value |
df.apply(f, axis=0) | 将f函数应用到由各行各列所形成的一维数组上 |
df.applymap(f) | 将f函数应用到各个元素上 |
df.cumsum(axis=0, skipna=True) | 累加,返回累加后的dataframe |
Dataframe常用索引方式
索引方式 | 说明 |
df[val] | 选取DataFrame的单个列或一组列 |
df.ix[val] | 选取Dataframe的单个行或一组行 |
df.ix[:,val] | 选取单个列或列子集 |
df.ix[val1,val2] | 将一个或多个轴匹配到新索引 |
reindex方法 | 将一个或多个轴匹配到新索引 |
xs方法 | 根据标签选取单行或者单列,返回一个Series |
icol、irow方法 | 根据整数位置选取单列或单行,并返回一个Series |
get_value、set_value | 根据行标签和列标签选取单个值 |
主要的Index属性
主要的Index对象 | 说明 |
Index | 最广泛的Index对象,将轴标签表示为一个由Python对象组成的NumPy数组 |
Int64Index | 针对整数的特殊Index |
MultiIndex | “层次化”索引对象,表示单个轴上的多层索引。可以看做由元组组成的数组 |
DatetimeIndex | 存储纳秒级时间戳(用NumPy的Datetime64类型表示) |
PeriodIndex | 针对Period数据(时间间隔)的特殊Index |
常用Index函数
函数 | 说明 |
Index([x,y,...]) | 创建索引 |
append(Index) | 连接另一个Index对象,产生一个新的Index |
diff(Index) | 计算差集,产生一个新的Index |
intersection(Index) | 计算交集 |
union(Index) | 计算并集 |
isin(Index) | 检查是否存在与参数索引中,返回bool型数组 |
delete(i) | 删除索引i处元素,得到新的Index |
drop(str) | 删除传入的值,得到新Index |
insert(i,str) | 将元素插入到索引i处,得到新Index |
is_monotonic() | 当各元素大于前一个元素时,返回true |
is_unique() | 当Index没有重复值时,返回true |
unique() | 计算Index中唯一值的数组 |
参考or转发
http://www.cnblogs.com/prpl/p/5537417.html
http://www.cnblogs.com/smallpi/p/4550361.html
https://www.cnblogs.com/nxld/p/6058591.html # 还有pandas的数据透视表,类sql操作的groupby、连表
官网: