Numpy简介
Numpy是一个科学计算库的基础库,多用于多维数组上执行数值运算。
创建数组及数据类型
import numpy as np
a = np.array([1,2,3,4,5])
b = np.array(range(1,6))
c = np.arange(1,6)
上面的三个创建的数组内容相同
数组的类名:
type(a)
返回: numpy.ndarray
数据的类型:
a.dtype
返回: dtype('int64')
指定创建的数组的数据类型:
a = np.array([1,0,1,0],dtype = '?') 或者 dtype=np.bool
类型对应的类型代码在下图
修改数组的数据类型:
a.astype("i1") 或者 a.astype(np.int8)
保留几位小数:
np.round(a,2) //数组a中均保留两位小数
数组的属性
查看数组的大小(也就是总的个数):
a.size
查看数组的形状:
a.shape
若返回 (2,3,4)其中2代表数组含有几块数据,3表示每块数据的行数,4表示每块数据的列数。
a.shape[0] 代表的是块数,也就是2
a.shape[1]代表的是行数,也就是3
a.shape[2] 代表的是列数,也就是4
修改数组的形状:
a.reshape((6,4))
若要修改成一维数据:
a.reshape((24,))
或者 a.flatten() //进行展平处理
数组的计算
只要数组的形状在某一个方向上相同即可进行计算。具体计算结果可以自己尝试一下。
轴
shape(1) 一维数组 只有0轴
shape(2,2)二维数组,有0轴和1轴
shape(2,2,2)三维数组,有0轴,1轴,2轴
读取数据
读取csv文件
np.loadtxt(frame ,dtype=np.float,delimiter=',',skiprows= 1,usecols = None,unpack=Flase)
转置
二维数组转置的几种方法:
t.swapaxes(1,0)
t.transpose()
t.T
数据的索引和切片
因为索引都是从0开始的
a[1:3] //取第二行和第三行
a[1] //取第二行
a[:,2] //取第三列
a[:2:4] //取第三列,第四列
a<10 //布尔索引,小于10的为true,大于的为false
np.where(a<10,0,10) //表示a中小于10的设置为0,大于10的设置为10
a.clip(10,18) //小于10的替换为10,大于18的替换为18
切片:
slice(2,7,2) 从索引2开始到索引7停止,间隔为2
数组的拼接
np.vstack((a,b)) //竖直拼接
np.hstack((a,b)) //水平拼接
行列交换
a[[1,2],:] = a[[2,1],:] //第二行和第三行交换
a[:,[0,2]] = a[:,[2,0]] //第一列和第三列交换
简单方法
(1)获得最大值和最小值的位置
np.argmax(t,axis=0) //返回每一行最大元素的位置
np.argmin(t,axis=1) //返回每一列最大元素的位置
(2)创建一个全为0的数组:
np.zeros((3,4))
(3)创建一个全为1的数组:
np.ones((3,4))
(4)创建一个对角线为1的正方形的数组(方阵):
np.eye(3)
生成随机数
copy和view
(1)a = b 完全不复制,a和b相互影响
(2)a = b[:],视图的操作,一种切片,会创建新的对象a,但是a的数据完全由b保管,他们两个的数据变化是一样的
(3)a = b.copy() ,复制,a和b互不影响。
nan和inf
nan:not a number 表示不是一个数字
(1)两个nan是不相等的
(2)np.nan !=np.nan
(3)利用以上特性可以判断数组中nan的个数
(4)通过np.isnan(a)来判断是不是nan,返回bool类型
(5)nan和任何值计算都是nan
inf表示正无穷,-inf表示负无穷
常用统计函数
求和:a.sun(axis=None)
均值:a.mean(axis=None)
中值:np.median(a,axis=None)
最大值:t.max(axis=None)
最小值:t.min(axis=None)
极值:np.ptp(t,axis=None) //最大值和最小值的差
标准差:t.std(axis=None)
Matplotlib
简介
Matplotlib是一个绘图工具,可以绘制折线图,直方图等,也可以将我们对图像进行的操作进行展示。
补充1:
语法:list1[start:stop:step]
参数一:表示截取的开始下标值,默认为0
参数二:表示截取的结束下标值,默认为列表末尾
参数三:表示截取的步长,默认为1,可指定
注意:1.截取区间[start, end),左闭右开
2.list1[::-1]可以获得倒叙的列表
补充2:
font = {'a':'1','b':'2','c':'3'}
通过 rc('font',**font)
使得a=1,b=2,c=3
折线图
#绘制图像
plt.plot(x,y,color='r',linestyle = '--',linewidth =5,alpha=0.5)
#导入包
from matplotlib import pyplot as plt
#figure图形图标的意思,这里指的是我们要画的图,使用figure实例,传入dpi使图像更加清晰。
fig = plt.figure(figsize=(20,8),dpi=80)
# 使用my_font存出一个加载的中文字体
my_font = fm.FontProperties(fname='C:\Windows\Fonts\YaHei.Consolas.1.12.ttf')
#(x,y)组成一个坐标
x = range(2,12,2)
y = [15,14,18,26,2]
plt.plot(x,y,label="自己的图") #绘制折线图
plt.savefig("sig_size2.png") #将折线图进行保存
plt.legend(prop=my_font) #将label添加到图形上面
plt.show() #展示图像
修改matplotlib的默认设置:
font = {'family' : 'monospace',
'weight' : 'bold' } #这种的都不用记,直接点进rc的定义里面就可以复制,然后根据自己的需求修改一下就行了
matplotlib.rc("font",**font)
修改坐标轴上的中文标签:
#调整x轴的刻度
_x = x
_xtick_lables = ["hellp,{}".format(i) for i in _x] #为x轴增加中文标注
plt.xticks(x,_xtick_lables,_xtick_lables[::3],rotation = 90) #rotation是旋转的度数,可以将标签竖直。
#调整生成图像的各种样式
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
x_data = ['2011', '2012', '2013', '2014', '2015', '2016', '2017']
# 定义2个列表分别作为两条折线的Y轴数据
y_data = [58000, 60200, 63000, 71000, 84000, 90500, 107000]
y_data2 = [52000, 54200, 51500,58300, 56800, 59500, 62700]
# 指定折线的颜色、宽度、线形
ln1, = plt.plot(x_data, y_data, color='red', linewidth=2.0,
linestyle='--', label='A书年销量')
ln2, = plt.plot(x_data, y_data2, color='blue', linewidth=2.0,
linestyle='-.', label='B书年销量')
# 使用my_font存出一个加载的中文字体
my_font = fm.FontProperties(fname='C:\Windows\Fonts\YaHei.Consolas.1.12.ttf')
# 赊着prop参数未该字体
plt.legend(loc='best', prop=my_font)
plt.show()
#绘制网格
plt.grid(alpha=0.4)
#alpha代表的透明度
散点图
import matplotlib.pyplot as plt
import numpy as np
from matplotlib import font_manager
x_1 = [1,2,3,4,5,9]
y = [7,6,8,1,5,3]
plt.scatter(x_1,y) #绘制散点图
plt.show()
对于散点图格式上的设置在折线图那一块都有。
条形图
#绘制对比条形图
import matplotlib.pyplot as plt
import numpy as np
from matplotlib import font_manager
x_1 = ["战狼1","战狼2","战狼3","战狼4","战狼5","战狼6"]
y = [7,6,8,1,5,3]
y_2 = [5,7,7,6,3,4]
bar_width = 0.3
a = list(range(len(x_1)))
b = [i+bar_width for i in a]
plt.bar(range(len(x_1)),y,width=bar_width) #绘制条形图
plt.bar(b,y_2,width=bar_width)
#plt.barh #绘制水平的条形图
plt.show()
直方图
import matplotlib.pyplot as plt
import numpy as np
from matplotlib import font_manager
a = [15,15,75,15,75,33,66,5,33,66,5,19,19,20,25]
bin_width = 3 #设置组距为3
num_bins = int((max(a)-min(a))/bin_width) #极差除以组距计算出来分多少组
plt.hist(a,num_bins)
plt.xticks(list(range(min(a),max(a)))[::bin_width],rotation = 45)
plt.grid(True,linestyle='-.',alpha = 0.5)
plt.show()
pandas
常用数据类型
1、series 一维,带标签的数组
创建Series数组:
法1:t = pd.Series([1,2,3],index=list("abc"))
法2:dic_1 = {"1":"a","2":"b","3":"c"}
t2 = pd.Series(dic_1)
访问Series:
访问index:t.index
访问value:t.values
2、DataFrame 二维,series容器
在其中,既有行索引,也有列索引
行索引,表明不同行,横向索引,叫 index,0轴,axis=0
列索引,表明不同列,纵向索引,叫columns,1轴,axis=1
创建DataFrame:
法一:t = pd.DataFrame(np.arange(12).reshape(3,4),index=list("abc"),columns=list(("wxyz")))
法2:d1 = {"name":["小明","小李"],"age":[12,15],"tel":[10056,10057]}
t1 = pd.DataFrame(d1)
基本属性:
df.shape #行数,列数
df.dtypes #列数据类型
df.ndim #数据维度
df.index #行索引
df.columns #列索引
df.values #对象值,二维ndarray数组
整体查询:
df.head(3) #查看前三行 ,默认是5行df.tail(3) #查看后三行,默认是5行
df.info() #相关信息概览:行数,列数,列索引,列非空值个数,行类型,列类型,内存占用
df.describe() #快速综合统计结果:计数,均值,标准差,最大值,最小值
df.sort_values(by="XXX",sdcending=True) #按照某一个属性进行升序排列(具体内容可以看源码)
对DataFrame进行索引:
# 根据loc函数进行选取指定行,loc是通过标签进行索引
print(df.loc["name",:])# 使用loc函数选取所有行 并对列上的数据进行筛选
print(df.loc[:,("人员1","人员2","人员3")])# 使用loc函数筛选行与列
print(df.loc["name",["人员1","人员2","人员3"]])
# 使用iloc函数对行与列的位置进行选取,iloc是通过位置来进行索引
# 使用iloc函数选取第三行第三列的数据
print(df.iloc[3,3])# 使用iloc函数选取第3行到第5行与第3列到第5列的数据
print(df.iloc[3:5,3:5])# 使用iloc函数选取1、2、5行与2、4、5列数据
print(df.iloc[[1,2,5],[2,4,5]])
#使用boolean index参数进行切片print(df[[True,True,False,True,True,False]]) #true是展示的行数,false是展示的列数
或者df[df["age"]>14]
#boolean index和loc进行结合使用
df.loc["age",:]>14]
读取外部数据
读csv文件和txt文件都是:
pd.read_csv("文件名")
字符串方法
cat 实现元素级字符串的连接操作
contains 返回表示各字符串是否含有指定模式的布尔型数组
lower,upper 转化大小写,相当于对各个元素执行x.lower()或x.upper()
replace 用指定字符串替换找到的模式
split 分割
strip,rstrip,lstrip 去除空白符,包括换行符。
缺失数据的处理
pd.isnull(t)
#判断t里面是否有non,有的位置就是True,没有的位置就是False
pd.notnull(t)
#判断t里面是否有non,有的位置就是False,没有的位置就是True
处理NaN:(1)删除NaN所在的行列 dropma(axis=0,how='any',inplace=False)
当how='any'的时候表示有一个NaN就删除
当how='all'的时候表示全都为NaN才会删除
(2)填充数据,三种方式:t.fillna(t.mean()),t.fiallna(t.median()),t.fillna(0)
处理数据为0:
t[t==0] = np.nan
0和NaN并不一样,计算平均值的时候,nan不参与计算,而0参与计算。
常用的统计方法
d.tolist() #将数组或矩阵转为列表。
max()返回最大值
argmax()返回的是函数中最大的x对应的y的值
np.unique() 去重,不过只能去相邻的重复元素,所以在使用unique之前要先对元素进行排序。 使用的时候直接 list1 = np.unique(list1)
set()函数也是去重操作,返回一个无序不重复的列表。
使用set函数的时候一般是 list1 = list(set(list1))
join是把行索引相同的数据合并到一起t1.join(t2)
merge是把列索引相同的数据合并到一起(1)t1.merge(t2,left_on="O",right_on="X",how="inner") #left_on=“O”代表的是t1中按照O的列,right_on="X"代表的是t2中按照X的列,表示t1中的O列和t2中的X列相同的元素的行合并,inner为默认参数,表示并集合并
(2)t1.merge(t2,left_on="O",right_on="X",how="outer") #交集合并,NaN补全
(3)t1.merge(t2,left_on="O",right_on="X",how="left") #左边为准
(4)t1.merge(t2,left_on="O",right_on="X",how="right") #右边为准
分组和聚合
组合:
group_1 = df.groupby(by="age") #根据age进行分组
count_1 = grouped["age"].count()
索引和复合索引
简单的索引:df.index
指定索引:df.index=['x','y']
重新设置索引:df.reindex(list("abcdefg"))
指定某一列作为index:df.set_index("Country",drop=False)
返回index中的唯一值:df.set_index("Country").index.unique()
对于嵌套列表的列表:可以用swaplevel()进行层级的交换