1.numpy
import numpy as np
a=np.array([[1,2,3],
[2,3,4]]) #列表转n维数组,在后面可以设置数组类型 dtype=np.int 为整数类型
a.ndim #维度
a.shape #行 列.. 返回元组形式
a.size #数组中元素个数
np.zeros(shape) #生成全为0 参数为array.shape类型
np.ones(shape) #生成全为1...
np.empty(shape) #生成全无限接近0...
np.arange(2,12,2) #生成[2,12) 区间内以2为步长的数组,步长默认为1
np.arange(12) #这样就是生成[0,1,2,3,...,11]
np.arange(12).reshape((3,4)) #生成3行4列
np.linspace(1,10,5) #将[1,10]分为5段显示出来
np.linspace(1,10,6).reshape((2,3)) #也可以指定shape 2行3列
若已知两规格相同的数组 a和b 可以直接进行各种运算,对应位置的元素直接计算
c=a+b
c=a-b
c=a*b
c=a**2 #a中每个元素全取平方然后赋给c
c=np.sin(a) #a中每个元素全取sin值然后赋给c
但若是矩阵的乘法,则不是直接a*b 它是每一行乘每一列各个值相加
c=np.dot(a,b) 或者是 c=a.dot(b)
a=np.random.random((2,4)) #在[0,1)中生成随机数 参数为shape
np.sum(a) #a中求和 可以指定axis,np.sum(a,axis=1) 每一行之内求和,返回数组 axis=0 表示每一列之内求和,返回数组
np.min(a) #a中求最小值 也可指定axis
np.max(a) #a中求最大值 也可指定axis
np.argmax(a) #a中最大值的索引 np.argmin(a) #a中最小值的索引
np.average(a) np.mean(a) #a中所有元素的平均值,也可以指定axis
np.median(a) #a中所有元素的中位数
a.T #转置
#索引
一维数组a的话 直接 a[i] 就是下标为i的元素
二维数组a的话 可直接a[i][j] 找到对应元素,也可a[i,j]
a[i]直接表示第i行,a[i,:]表示第i行,a[:,j]表示第j列
#迭代
for row in a:
print(row) 直接打印出每一行
for column in a.T:
print(column) 直接打印出每一列
a.flatten() 将多维数组转换为一维数组
for item in a.flat:
print(column) 按照每一行每一列依次打印每一个元素
#合并
a=np.array([1,1,1])
b=np.array([2,2,2])
c=np.vstack((a,b)) 垂直方向合并 c=[[1 1 1]
[2 2 2]]
c=np.hstack((a,b)) 水平方向合并 c=[1 1 1 2 2 2]
c=np.concatenate((a,b,b,a),axis=1) 多个数组的合并 axis=1表示水平方向合并
axis=0 表示竖直方向上合并
#分割
a=np.arange(12).reshape((3,4))
np.split(a,2,axis=1) 水平方向上将a分成两块 axis=0 表示垂直方向
np.vsplit(a,3) 垂直方向分3块
np.hsplit(a,2) 水平方向分2块
#copy
若b与a关联起来,一方边另一跟着变
b=a
若b与a不关联,两者独立,复制过后一方变另一方不变
b=a.copy()
#读取文件
with open("test1.txt", 'rt', encoding='UTF-8') as raw_data: # 读取数据文件到二维数组中
data = np.loadtxt(raw_data, delimiter=',')
2.pandas
一维用Series
二维用DataFrame
三维用Panel
import pandas as pd
import numpy as np
s=pd.Series([1,3,6,np.nan,44,1]) #参数为列表类型,np.nan指代空,打印s会自动显示出序号以及数据类型
dates=pd.date_range('20160101',periods=6) #生成日期列表,连续6天,显示出数据类型
df=pd.DataFrame(np.random.randn(6,4),index=dates,column=['a','b','c','d']) 生成二维数组,index表示每一行的序号,columns表示每一列的序号。不定义index columns时默认为 0 1 2 3...
也可以直接规定每一列包含的内容:
df2=pd.DataFrame({'A':1.,
'B':2.,
'C':pd.Series(1,index=list(range(4)))
'D':np.array([3]*4,dtype='int32'),
'E':'foo'})
df2.dtypes #显示出每一列的数据类型
df2.index #显示出每一行的序号
df2.columns #显示出每一列的序号
df2.values #不显示序号,只显示数据
df2.describe() #按列展示出所有数值型数据
df2.T #转置
df2.sort_index(axis=1,ascending=False) #水平方向上 按照序号降序
df2.sort_index(axis=0,ascending=False) #垂直方向上 按照序号降序
df2.sort_values(by='E') 对序号为'E'的列中的数据进行排序,不能是行
#选择数据
import pandas as pd
import numpy as np
dates=pd.date_range('20130101',periods=6)
df=pd.DataFrame(np.arange(24).reshape((6,4)),index=dates,columns=['A','B','C','D'])
print(df)
print(df['A']) #输出列号为A的这一列,并显示出行号
print(df.A) #与上面一样
print(df[0:3]) #切片,选择第0行到第2行
print(df['20130102':'20130104']) #也是切片,按照自己设定的行号,右区间为包含
#按照设定的标签号获取
print(df.loc['20130102']) #输出行号为'20130102'的这一行,并显示出列号
print(df.loc['20130102','A':'B']) #输出行号为'20130102'的这一行,列只输出标号为[A B]的
print(df.loc[:,'A':'B']) #行号选全部 列号只取到[A B]
#类似于numpy的按照0 1 2 3这样的序号获取
print(df.iloc[0]) #输出第0行
print(df.iloc[0,1]) #输出第0行第1列
print(df.iloc[3:5,1:3]) #切片,选择行[3,4] 列[1,2]
print(df.iloc[[1,3,5],1:3]) #按不连续的选取1 3 5行
print(df[df.A<8]) #对所有行,筛选出第A列小于8的行
#修改值
df.loc['20130101','B']=2222 #通过设定的标签值修改
print(df)
df.iloc[2,2]=1111 #通过数字序号修改
print(df)
df[df.A>4]=0 #对A这一列中的数,若第i行的数大于4,则该行全部数置0
print(df)
df.A[df.A>4]=0 #对A这一列中的数,若某数>4,则该数置0
df.B[df.A>4]=0 #对A这一列中的数,若第i行的数>4,则第i行的B列置0
print(df)
df['F']=np.nan #增加一个空列
df['E']=6 #增加一个值全为6的列
print(df)
print(df.dropna(axis=1,how='all')) #水平方向上,删除所有包含NaN的列 若axis=0,为垂直方向上删除所有包含NaN的行
print(df.fillna(value=0)) #将所有的NaN填入0
print(df.isnull()) #判断是否丢失数据,丢失的位置为True,未丢失的位置未False
print(np.any(df.isnull())==True) #判断df.isnull()中是否存在True从而直接得出df中是否缺值
#导入csv文件到pandas
data=pd.read_csv('student.csv')
print(data)
#导出##文件 此处导出pickle文件
data.to_pickle('student.pickle')
#contat合并
df1=pd.DataFrame(np.zeros((3,4)),columns=['a','b','c','d'],index=[1,2,3])
df2=pd.DataFrame(np.ones((3,4)),columns=['b','c','d','e'],index=[2,3,4])
print(df1)
print(df2)
#合并两个DataFrame,join默认为outer,表示列全合并[abcd] [bcde]->[abcde],若为inner,表示自动裁剪两者不共有的列 即->[bcd] axis指定方向 0为垂直 1为水平
res1=pd.concat([df1,df2],join='inner',ignore_index=True,axis=0) #ignore_index=True表示忽略行号 重新从0 1 2 3..
print(res1)
#append添加
df1=pd.DataFrame(np.zeros((3,4)),columns=['a','b','c','d'],index=[1,2,3])
df2=pd.DataFrame(np.ones((3,4)),columns=['a','b','c','d'],index=[2,3,4])
df3=pd.DataFrame(np.ones((3,4)),columns=['a','b','c','d'],index=[2,3,4]) #如果columns不同,则会采取outer的形式
res1=df1.append(df2,ignore_index=True)
print(res1)
res2=df1.append([df2,df3],ignore_index=True) #可以一下添加多个DataFrame
print(res2)
s1=pd.Series([1,2,3,4],index=['a','b','c','d'])
res3=df1.append(s1,ignore_index=True) #添加一个Series
print(res3)
#merge合并
left=pd.DataFrame({'key':['K0','K1','K2','K3'],
'A':['A0','A1','A2','A3'],
'B':['B0','B1','B2','B3']})
right=pd.DataFrame({'key':['K0','K1','K2','K2'],
'C':['C0','C1','C2','C3'],
'D':['D0','D1','D2','D3'],
'E':['E0','E1','E2','E3']})
print(left)
print(right)
res=pd.merge(left,right,on='key',how='outer') #以'key'那一列为基准进行合并,how同上面的join,默认值为inner,自动裁剪
print(res)
#画图
data=pd.Series(np.random.randn(1000),index=np.arange(1000))
data=data.cumsum() #数据累加显示
data.plot();
plt.show(); #显示出一条线,来回跳代表数据的变化
data=pd.DataFrame(np.random.randn(1000,4),index=np.arange(1000),columns=list("ABCD"))
data=data.cumsum()
data.plot()
plt.show() #显示出四条线,每条代表每一列
3.matplotlib
#最简单的折线图
import matplotlib.pyplot as plt
x=range(2, 26, 2)
y=[15,13,14,17,20,25,26,26,24,22,18,15] # x和y共同组成了所有点的坐标
plt.plot(x, y) # 传入x y
plt.show()
#在plt.show()之前可设置图片大小 dpi表示像素
plt.figure(figsize=(20,10),dpi=80)
#可保存显示的图片
plt.savefig("./k1.png") #保存到当前目录下
#设置x轴的刻度 直接传入x的话是以列表x的值为刻度,或者可以传range(2,26),从2-25 步长为1,np.arange(2,26,0.5) 从2-25步长0.5
plt.xticks(np.arange(2,25,0.5))
#同理可设置y轴的刻度
plt.yticks(range(min(y),max(y)+1))
#设置x轴的刻度为 字符串+数字 的形式,字符串必须与数字一一对应
_xticks_labels=["hello,{}".format(i) for i in x] # 这里定义字符产格式
plt.xticks(x,_xticks_labels)
#设置刻度显示的方向,默认水平,rotation代表旋转多少度
plt.xticks(x,_xticks_labels,rotation=90)
#添加描述信息
plt.xlabel("1111") # 在x轴添加
plt.ylabel("2222") # 在y轴添加
plt.title("tttt") # 在最上面添加
#绘制网格
plt.grid(alpha=0.2) # alpha设置透明度,从0-1
#若要显示出多条折线图,则只需plt多次plot即可
plt.plot(x1, y1)
plt.plot(x2, y2)
#若还想在右上角对两条线进行解释,即每条折线的名称
plt.plot(x1, y1, label="111")
plt.plot(x2, y2, label="222")
plt.legend()
#对于plt.plot可以设置很多东西 类似的(grid中也可以设置)
color='' 设置线条颜色
linestyle='--' 设置线条风格
linewidth=5 设置线条粗细
alpha 设置透明度