模块_数据分析

目录

numpy模块

pandas模块

 

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]]


#创建多维对象以其类推
通过array创建ndarray
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]
通过numpy.arrange创建ndarray
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.     ]
通过linspace创建ndarray,等差数列
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.  ]
通过logspace创建ndarray,等比数列
# 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.]]
通过ones/zeros/eye/empty创建ndarray
# 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]
通过fromstring创建ndarray,由ascii码组成的序列
# 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开始的 
通过fromfunction创建ndarray

NaN

import numpy as np


print(np.nan)
# 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]
random

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]]
'''
reshape

查看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
dtype

索引

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
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]]
合并 hstack、vstack 和 concatenate

运算

一元函数: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]]
numpy自带函数
# 矩阵乘法必须满足矩阵乘法的条件,即第一个矩阵的列数等于第二个矩阵的行数。 
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]
最大值最小值 max/min
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.]
平均值 mean
"""
方差的函数为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]
方差 var
"""
标准差的函数为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]
标准差 std
"""
中值指的是将序列按大小顺序排列后,排在中间的那个值,如果有偶数个数,则是排在中间两个数的平均值。

例如序列[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.]
中值 median
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]
求和 sum
"""
某位置累积和指的是该位置之前(包括该位置)所有元素的和。

例如序列[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]]
累计和 cumsum

 转置

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]]
转置 T 或 transpose

 

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对象,具有value值和index值

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修改dtypes

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
指定Series索引
"""
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
通过索引获取Series数据
# 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
iloc 和 loc
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
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
处理缺失数据NaN

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
pandas在运算时,会按索引进行对齐然后计算。如果存在不同的索引,则结果的索引是两个操作数索引的并集。

创建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

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文件
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 #指定输出的列,传入列表
csv

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修改dtypes

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
index、colums、values、T、describe

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
loc iloc
"""
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
dropna/fillna/isnull/notnull

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
mean/sum/sort/apply等
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
head tail

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
读取csv,以时间为index

 

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选项:
ffill, bfill     向前填充/向后填充
  pad, backfill   向前搬运,向后搬运

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选项
'average'    在相等分组中,为各个值分配平均排名
'max','min'   使用整个分组中的最小排名
'first'      按值在原始数据中出现的顺序排名

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、连表

官网:

http://pandas.pydata.org/pandas-docs/stable/index.html

posted @ 2018-06-13 22:21  fat39  阅读(231)  评论(0编辑  收藏  举报