数据科学技术
第二章 多维数据结构与运算
2.1.1.一维数组对象
import numpy as np
names= np.array(['王伟','李兆欣','齐一迪'])
/1 查看数组的属性
names.ndim//数组维度
names.size//数组元素个数 names.dtype//数组数据类型
/2 数组切片
names[[0,2,4]]//这是找到索引为0,2,4的元素
names[0:2:4]//这是数组切片,start=0,end=2,step=4
2.1.2 二维数组对象
1.查看数组属性
多了一个scores.shape//查看数组的行数和列数
2.二维数组切片
arr[row , column] //访问第n行m列的元素
scores[[1,3],[0,1]]==array([60,82])//注意!!这个是访问(1,0)和(3,1)
scores[[1,3]]//访问了第一行和第三行的全部元素,后面列的:可以省略
scores[:, [0,1]]//访问了0列和1列的全部元素
scores[ [0,3] , 1:4]//访问了第0行和第3行里 1-3列的全部元素
scores[[1,3]][:,[0,1 )
2.1.3 创建多维数组的常用方法
-
arange() 函数:生成指定范围的数组
np.arange(0,11)=[0,1,2,3,4,5,6,7,8,9,10]
np.arrage(3,11,2)=[3,5,7,9]
np.arrange(0.3,1.5,0.3)=[0.3,0.6,1.2]
-
reshape()函数:将一维数组转换成指定的多维数组
np.arange(0,15).reshape(3,5)=[[0,1,2,3,4],[5,6,7,8,9],[10,11,12,13,14]]
-
zeros(),ones():生成指定大小的0 ,1数组
np.zeros((3,4))=[[0.,0.,0.,0.],[0.,0.,0.,0.],[0.,0.,0.,0.],[0.,0.,0.,0.]]
2.2 多维数组运算
2.2.1基本算术运算
1.二维数组与标量运算
scores+5//整体加5
scores*2//整体乘2
2.二维数组与一维数组运算
bonus=np.array([3,4,5,3,6,7,2])
scores+bonus
3.选定元素运算
scores[names=='李兆欣',subjects=='English']+5
2.2.2 函数与矩阵运算
1.通用函数
一元函数:
abs,fabs(float绝对值);sqrt;square;exp(计算各元素指数);log,log10;sign(计算各元素正负号);ceil(大于等于该值的最小整数),floor(小于等于该值的最大整数); cos,cosh,sin,sinh,tan,tanh;
使用方法:np.abs(scores)
二元函数:
add(scores,5); substract(scores,5); multiply; divide; power(A,B)//A的B次方;
mod;copysign(把第二个数组中的值的符号复制给第一个数组中的值);equal,not_equal(A,B)
2.聚集函数
sum,mean,min,max,argmin(最小值索引),argmax,cumsum(从0开始向前累加各元素),cumprod(从0开始累乘)
eg. scores.sum(axis=0)//按列相加 =1按行相加
scores[names=='李兆欣'].mean()
查询英语成绩最高的学生姓名: names[scores[:,subjects=='English'].argmax()]
2.2.3 随机数组生成函数
random //随机生成[0,1)之间的浮点值
randint//随机生成范围内的一组整数 eg. np.random.randint(0,2,size=(5,6))//范围是0-1的5行6列数组
uniform//随机生成范围内服从均匀分布的一组浮点数
choice//在给定序列内随机选择元素( 相关参数:
-
size:从元组,列表,数组中取多少个数据,不写,默认为1个
-
replace:是否可以取相同元素:True:可以,False:不可以,默认是True
-
p:实际是个数组,大小与数组相同,用来规定选取数组中每个元素的概率,默认为概率相同。注意:概率相加等于1 )
normal//随机生成一组服从给定均值和方差的正态分布随机数(
normal
(loc=0.0, scale=1.0, size=None),
更一般的形式,返回均值为loc,标准差为scale的正态分布,shape由size参数决定。)
np.random.normal(a,b,size=?)//a是均值,b是方差
2.3 随机游走轨迹模拟
steps=10 rndwlk=np.random.randint=(0,2,size=(2,steps)) >>>rndwlk array([[0,1,1,1,1,1,1,0,0,1],[0,1,0,1,0,0,0,0,1,0]]) rndwlk=np.where(rndwlk>0,1,-1) '''np.where(condition,x,y) 当where内有三个参数时,第一个参数表示条件,当条件成立时where方法返回x,当条件不成立时where返回y''' >>>rndwlk array([[-1,1,1,1,1,1,1,-1,-1,1],[-1,1,-1,1,-1,-1,-1,-1,1,-1]]) #计算每步游走后的位置 position=rndwlk.cumsum(axis=1)#按照行求累加和 >>>position array([[-1,0,1,2,3,4,5,4,3,4],[-1,0,-1,0,-1,-2,-3,-4,-3,-4],dtype=int32]) #计算每步游走后距离原点的距离 dist=np.sqrt(position[0]**2+position[1]**2) np.set_printoptions(precision=4)#显示四位小数 #计算游走后距离原点最大值,最小值和均值 >>>dists.max() dists.min() dists.mean() #统计游走过程中离原点大于平均距离的次数 >>>(dists>dists.mean().sum()) #绘图展示游走轨迹 import matplotlib.pyplot as plt plt.plot(x,y,c='g',marker='*')#画折线图 plt.scatter(0,0,c='r',marker='o')#单独画原点 plt.text(.1,-.1,'origin')#添加原点说明文字 plt.scatter(x[-1],y[-1],c='r',marker='o')#单独画终点 plt.text(x[-1]+.1,y[-1]-.1,'stop')#添加终点说明文字 plt.show()
第三章 数据汇总与统计
from pandas import Series,DataFrame
Series:
height=Series([187,190,185,178,185],index=['13','14','7','2','9']) //height1=Series({'13':187,'14':190,'7':185,'2':178,'9':185}) >>>height[height.values>=186] #添加新球员 a=Series([190,187],index=['23','5']) newheight = height.append(a) #删除离队球员 newheight = height.drop(['13','9']) #更改球员球衣号码 #注意!!当Series对象的index本身就为数字,基于位置序号的访问需要使用iloc实现 >>>height.iloc[0]
DataFrame:
1.创建方式:DataFrame(data,index=[...],columns=[...])
2.数据选取:
#基于索引 obj[col]#选取某列 obj[colList]#选取某几列 obj.loc[index,col]#选取某行某列 obj.loc[indexlist,collist] #基于位置序号 obj.iloc[iloc,colc]#选取某行某列 obj.iloc[iloclist,colist] obj.iloc[a:b,c:d] #条件筛选 obj.loc[condition,collist]#条件和索引 obj.iloc[condition,cloclist]#条件和位置序号
3.增加行/列
增加行:
eg1. students.loc[4,:]=[20,188,75,2000]
eg2. new_data = {'Name': 'David', 'Age': 28} # 使用 append 方法追加新的行 df = df.append(new_data, ignore_index=True)
eg3. new_row = pd.Series(['David', 28], index=df.columns) # 使用 append 方法追加新的行 df = df.append(new_row, ignore_index=True)
增加列:
eg1. df['City'] = ['New York', 'San Francisco', 'Los Angeles']
eg2. # 创建一个 Series city_series = pd.Series(['New York', 'San Francisco', 'Los Angeles'], name='City') # 将 Series 添加到 DataFrame df['City'] = city_series
4.删除学生信息
students.drop(1,axis=0)#删除第一行
students.drop('expense',axis=1,inplace=true)#删除expense列 inplace=true代表彻底删除
students.drop([1,2],axis=0)#删除多行
3.3 数据文件读写
3.3.1
import pandas as pd
1.读取CSV文件
pd.read_csv(file,sep=',',header='infer',index_col(数字,用来作为行索引的列序号),skiprows(需要忽略的行数))
2.读取TXT文件
3.读取CSV文件
pd.to_csv(file,sep,mode,index(是否导出行索引,默认为TRUE),header(是否导出列索引))
3.3.2读取Excel文件
pd.read_excel(file,sheetname...)
3.4数据清洗
3.4.1缺失数据处理
1.数据滤除
DataFrame.dropna(axis,how='all',thresh(只留下有效数据个数大于等于thresh的值),....)
eg. data.dropna(subset=['name', 'age', 'citizenship'], how='all', inplace=True)
2.数据填充
DataFrame.fillna(value,method('ffill'表示用同列前一行(forward)的数据填充缺失值,'bfill'用后一行(behind)),inplace(是否修改原始数据的值,默认为false), ...)
3.4.2去除重复数据
DataFrame.drop_duplicates()
3.5 数据规整化
3.5.1 数据合并
1.行数据追加
pd.concat(objs,axis, ...)
eg. newstu=pd.concat([stu1,stu2],axis=0)
2.列数据连接
pd.merge(x,y,how,left_on(左数据要连接的键),right_on)
参数说明:how定义了四种合并方式:
inner:内连接,连接两数据对象键值交集的行
outer:并集
left:左连接,取出x的全部行,连接y中匹配的键值行
right:右连接,取出y的全部行连接x中匹配的
3.5.2 数据排序
1.排序
DataFrame.sort_values(by(列索引), ascending(True升序FALSE降序) , inplace)
2.排名
DataFrame.rank(axis,method(并列取值,min,max,mean),ascending)
3.6 统计分析
3.6.1通用函数与运算
df.T #DataFrame转置 df1+df2 #按照行列索引相加得到并集,NaN填充 df1.add(df2,fill_value = 0) #按照行列索引相加,NaN用指定值填充 df1.add/sub/mul/div df-sr #DataFrame的所有行 df*n
3.6.2 统计函数
sr.value_counts() #统计频数 sr.describe() #返回基本统计量和分位数 sr1.corr(sr2) #sr1和sr2的相关系数 df.count() #统计每列数据的个数 df.max(),df.min() df.idmax(),df.idmin() df.sum() #按行或列求和 df.mean(),df.median() df.quantile()#四分位 df.var()#方差 df.std()#标准差 df.mode() #众数 df.cumsum() #从0开始向前累加各元素 df.cov() #计算协方差矩阵 pd.crosstab(df[col1],df[col2])#pandas函数,交叉表,计算分组的频数 group=pd.groupby([collist])#分组分析 group.aggregate({'身高':np.mean,'月生活费':np.max}) pd.crosstab(tab1(分组列),tab2(计数列))
3.6.3相关性分析
stu['身高'].corr(stu['体重'])
0.6757399
stu[['身高','体重','成绩']].corr()
身高 体重 成绩
身高 1.0000 XX XX
体重 XX 1.0000 XX
成绩 XX XX 1.0000
df.isnull() # 查看空缺值,可以识别 null / None / Nan df.isnull().any(axis=0) # 查看每行是否有空缺值 df.isnull().any(axis=1) # 查看每列是否有空缺值 df.isnull().sum() # 统计每行空缺值的个数 df.isnull().sum(axis=1) # 统计每列有空缺值的个数 df.isnull().sum().sum() # 统计整个df的缺失值 df['列名'].isnull().sum(axis=0) # 统计某一列的缺失值 df[df.isnull().values==True] # 查看有缺失值的行,不去重 df[df.isnull().T.any()] # 查看有缺失值的行,去重
第四章 数据可视化
4.1
import matplotlib.pyplot as plt
from pandas import DataFrame
DataFrame.plot()函数的常用函数 kind:line(折线图,默认值),bar(垂直柱状图),barh(水平柱状图),hist(直方图),box(箱型图),pie(饼图),scatter(散点图) title color:'b':blue marker xlim,ylim legend(添加图例说明)
2.多子图
plt.figure()
ax1=figure.add_subplot(numsRows(绘图区域被分成几行),numCols(几列),plotNum(绘制的ax1图在哪个区域))
3.设置图元属性和说明
plt.title
plt.xlabel,ylabel
plt.xlim,ylim(设置x,y轴刻度范围)
plt.xticks,yticks(设置x轴y轴刻度值)
plt.legend(图例说明)
plt.grid(显示网格线)
plt.text(添加注解文字)
plt.annotate(添加注释)
4.保存图表到文件
figure.savefig(filename,dpi(图片分辨率,默认为100),bbox_inches(图表需要保存的部分,设置为'tight'可以剪除当前图表周围的空白部分))
savefig()需在show()之前才能保存
4.2 可视化图形探索
4.2.1 绘制常用图形
eg.绘制y = sin(x),y=e的x次方函数图
import numpy as np x= np.linspace(0,6.28,50) y=np.sin(x) plt.plot(x,y,color='r') plt.plot(x,np.exp(-x),c='b')
-
散点图
散点图描述两个一维数据序列之间的关系,可以表示两个指标的相关关系。通过散点图可以分析两个数据序列之间是否具有线性关系。
DataFrame.plot.scatter(x,y,title,grid,xlim,ylim,lable....)
散点图矩阵:
pd.plotting.scatter_matrix(data,diagonal, ...)
3.柱状图
柱状图用多个柱体描述单个总体处于不同状态的数量,并按状态序列的顺序排序。
pandas使用plot()函数绘制柱状图,格式如下:
DataFrame.plot(kind=('bar'为垂直柱状图,’barh'为水平柱状图), xerr,yerr ,stacked(是否为堆叠图))
4.折线图
折线图用线条描述事物的发展变化和趋势
kind='line' 详见4.1
5.直方图
用于描述总体的频数分布情况。每个区间上长方形的高度表示该区间样本的频率,面积表示频数。
Series.plot(kind='hist', bins(横坐标区间个数),...)
在直方图中分箱的数量与数据集大小和分布有关,通过改变bins数量可以改变分布的离散化程度。
6.密度图
采用平滑的峰值函数来拟合概率密度函数,对真实的概率分布曲线进行模拟。密度图常和直方图画在一起,这时直方图需要标准化(在原有基础上加上normed/density=Ture)。
7.饼图
清楚的反映出部分与部分,部分与整体之间的数量关系
Series.plot(kind='pie',explode(列表,表示各扇形块离开中心的距离。)startangle(起始绘图角度),autopct(百分比格式'%1.1f%%指小数点前后各一位')
8.箱型图
适合表达数据的分位数分布,帮助找到异常值。异常值用'o'表示。
kind='box'
可以用.plot,也可以用.boxplot(by(分组的列名),...)
第五章 机器学习建模分析
import numpy as np import pandas as pd data=pd.read_csv('data\advertising.csv',index_col=0) X=data.iloc[:,0:3].values.astype(float) y=data.iloc[:,3].values.astype(float) from sklearn.linear_model import LinearRegression linreg=LinearRegression() linreg.fit(X,y) print(linreg.intercept_,linreg.coef_)#截距和回归系数 import joblib joblib.dump(linreg,'linreg.pkl')#将回归模型保存至文件 import numpy as np load_linreg = joblib.load('linreg.pkl')#从文件读取模型 new_X = np.array([[130.1,87.8,69.2]]) print("预期销售:",load_linreg.predict(new_X)) #5.2.3回归性能评估分析 from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.35, random_state=1) #0.35是测试集的比例,1代表每次得到相同样本划分 linregTr = LinearRegression() linregTr.fit(X_train, y_train) print(linregTr.intercept_,linregTr.coef_) from sklearn import metrics y_train_pred = linregTr.predict(X_train) y_test_pred = linregTr.predict(X_test) train_err = metrics.mean_squared_error(y_train, y_train_pred) test_err = metrics.mean_squared_error(y_test, y_test_pred) #计算决定系数,评估性能 predict_score = linregTr.score(X_test,y_test)
5.3.2 决策树
实现函数格式为:
clf.tree.DecisionTreeClassifier()
clf.fit(X,y)
clf.score(X,y)
predicted_y = clf.predict(X)
metrics.confusion_matrix(y,predicted_y)#混淆矩阵计算
metrics.classification_report(y , predicted_y)#分类性能报告