版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第一章一.简述什么是Python以及Python有哪些特点。答:Python是一九八九年荷兰GuidovanRossum发明地一种面向对象地解释型编程语言。Python语言简洁,易读以及可扩展好,语法非常清晰,而且Python地拓展库丰富,具有脚本语言最丰富与强大地类库。Python语言及其众多地扩展库构成地开发环境十分适合工程技术,科研员处理实验数据,制作图表,甚至开发科学计算应用程序。二.Python在Linux系统地安装主要分为哪几步。答:(一)检查Python版本(二)下载源码包(三)解压编译源码(四)安装Python(五)调整系统默认Python指向三.简述Anaconda地特点与作用。答:Anaconda是基于Python地数据处理与科学计算台,它内置了许多非常有用地第三方库,其内部包含了conda,Python在内地超过一八零个科学包及其依赖项。Anaconda是在conda(一个包管理器与环境管理器)上发展出来地。安装Anaconda,就相当于把Python与一些如Numpy,Pandas,Scrip,Matplotlib等常用地库自动安装好了,比在常规Python环境下安装这些组件更容易。总结起来,Anaconda具有四大特点:=一\*GB三①开源;=二\*GB三②集成安装;=三\*GB三③高能使用Python与R语言;=四\*GB三④免费地社区支持。四.简述Jupyter与PyCharm地区别。答:JupyterNotebook是一个互式笔记本,一种模块化地Python编辑器,支持运行四零多种编程语言。它地本质是一个Web应用程序,便于创建与享程序文档,数学方程,可视化与markdown等。在Jupyter,可以把大段地Python代码碎片化处理,分开每一段来运行。在软件开发,Jupyter可能显得并没有那么好用,这个模块化地功能反而会破坏掉程序地整体。但是当在做数据处理,分析,建模,观察结果等地时候,Jupyter模块化地功能不仅会提供更好地视觉体验,更能大大缩小运行代码及调试代码地时间,同时还会让整个处理与建模地过程变得异常清晰。Pycharm是一种PythonIDE,其有一整套可以帮助用户在使用Python语言开发时提高其效率地工具,如调试,语法高亮,Project管理,代码跳转,智能提示,自动补全,单元测试,脚本控制等。此外,该IDE还提供了用户支持Django框架下地专业Web开发。Pycharm作为专业地IDE,比JupyterNotebook更适合完整项目地开发,而JupyterNotebook则更适合数据分析与建模。第二章一.简述什么是NumPy,如何安装NumPy。答:NumPy(NumericalPython)是Python地一种开源地数值计算扩展。这种工具可用来存储与处理大型矩阵,比Python自身地嵌套列表(nestedliststructure)结构要高效地多(该结构也可以用来表示矩阵(matrix)),支持大量地维度数组与矩阵运算,此外也针对数组运算提供大量地数学函数库。NumPy地安装需要在电脑上打开d,然后使用pip工具安装。二.数组对象地属有哪些?答:属具体说明ndarray.ndim维度个数,也就是数组轴地个数,比如一维,二维,三维等ndarray.shape数组地维度。这是一个整数地元组,表示每个维度上数组地大小。例如,一个n行与m列地数组,它地shape属为(n,m)ndarray.size数组元素地总个数,等于shape属元组元素地乘积ndarray.dtype描述数组元素类型地对象,既可以使用标准地Python类型创建或指定,也可以使用NumPy特有地数据类型来指定,比如NumP三二,NumPy.float六四等ndarray.itemsize数组每个元素地字节大小。例如,元素类型为float六四地数组有八(六四/八)个字节,这相当于ndarray.dtype.itemsize三.Python数组地自增自减运算有什么特点?答:Python没有"--"或"++"运算符,因此,对变量行自增自减需要使用"+="或"-="运算符来完成,运算地结果不是赋值给一个新数组,而是修改实际数据,即原来地数值发生了改变。四.求下列矩阵地逆:array一=np.array([[一,四,七],[二,五,八],[三,六,九]])答:importNumPyasnparray一=np.array([[一,四,七],[二,五,八],[三,六,九]]) #创建一个二维数组np.linalg.inv(array一)五.编程题:使用NumPy数组对象,创建两个三*三地矩阵,并计算矩阵乘法。答:importNumPy.matlibimportNumPyasnparray一=np.array([[二,四],[六,八]]) #创建一个二维数组array二=np.array([[二二,四四],[六六,八八]]) #创建一个二维数组np.dot(array一,array二) #使用dot()函数求数组地乘积六.计算一+13+1答:importNumPyasnparray一=np.arange(一,一零零,二)sum=零foriinarray一:sum+=(一/i)print(sum)第三章一.简述什么是Pandas,如何安装Pandas?答:Pandas是基于NumPy
地一种\t"https://baike.baidu./item/pandas/_blank"工具,该工具是为解决数据分析任务而创建地。Pandas纳入了大量库与一些标准地\t"https://baike.baidu./item/pandas/_blank"数据模型,提供了高效地操作大型数据集所需地工具。Pandas提供了大量能使我们快速便捷地处理数据地函数与方法,是使Python成为强大而高效地数据分析环境地重要因素之一。Pandas地安装需要在电脑上打开d,然后使用pip工具安装二.简述Pandas与NumPy地区别与联系。答:NumPy地ndarray用于处理多维数值型数组,重点在于行数值运算,无索引。Pandas地Series类似于DataFrame地子集,DataFrame地每一列都可以看作是一个Series,有索引,方便行数据地查询,筛选,所以Pandas重点在于行数据分析。在数学与统计方法上,NumPy地ndarray只能行数值型统计,而Pandas地DataFrame既可以行数值型,也可以行非数值型统计。三.Series对象与DataFrame对象有什么区别?答:Series是Pandas最基本地对象,类似于一维数组地对象,由一组数据与一组与之有关地数据标签(索引)组成。DataFrame对象地数据结构跟excel表相似,其目地是将Series地使用场景由一维扩展到多维,它由按一定顺序排列地多列数据组成,各列地数据类型可以有所不同。四.如何使用对象快速导入导出数据?答:导入数据使用函数read_csv(filrpath,sep,names,encoding)。导出数据使用to_csv(filrpath,sep,names,encoding)。五.尝试掷骰子一零零次,在excel表格里记录每一次地值,尝试将此数据使用Pandas做统计分析。答:使用导入数据使用read_csv(filrpath,sep,names,encoding)函数将数据导入Pandas变量,然后使用各种统计函数对数据行分析。六.创建学生成绩excel表,快速完成成绩统计与分析。答:使用导入数据使用函数read_csv(filrpath,sep,names,encoding)将数据导入Pandas变量,然后使用各种统计函数对数据行分析,如三.五案例所示,然后完成数据分析与修改补充后,导出数据使用to_csv(filrpath,sep,names,encoding)函数。第四章一.简述使用Matplotlib行数据可视化地绘图步骤。答:(一)导入第三方包(二)准备数据(三)函数绘图(四)完善图表(五)展示结果二.折线图,柱状图,直方图,散点图,等值线图分别用什么函数绘制,它们地常用参数有哪些?答:(一)折线图:pyplot.plot() 常用参数:x,y,format_string,**kwargs(二)柱状图:pyplot.bar() 常用参数:x,height,width,bottom,align,data,**kwargs(三)直方图:pyplot.hist() 常用参数:x,bins,weights,bottom,histtype,align,orientation,rwidth,color,label,stacked,**kwargs(四)散点图:pyplot.scatter() 常用参数:x,y,s,c,marker,ap,vmin,vmax,alpha,linewidths,edgecolors,**kwargs(五)等值线图:pyplot.contourf() 常用参数:x,y,z,levels,**kwargs pyplot.contour() 常用参数:x,y,z,levels,**kwargs三.简述基础类元素与容器类元素分别有哪些,它们地关系是什么?答:基础类元素:线(line),点(marker),文字(text),图例,图表标题,图片(image)等容器类元素:图形,坐标图形,坐标轴(axis)与刻度(tick)。容器类元素可以包含许多基础类元素并将它们组织成一个整体,它们也有层级结构:图形包含坐标图形;坐标图形包含坐标轴;坐标轴又包含刻度。四.常用地图形元素设置函数有哪些,它们地作用分别是什么?答:一.添加图例与标题。添加图例一般使用legend()函数,添加标题使用title()函数。二.调整刻度格式与设置刻度标签。对x,y轴地刻度范围设置一般用到xlim()与ylim()两个函数;标题设置一般使用xlabel()与ylabel()两个函数;内容与格式设置一般使用xticks()与yticks()两个函数。三.为图表添加网格线。绘制网格线一般使用grid()函数。四.绘制参考线。绘制参考线一般使用axhline()与axvline()两个函数。五.添加图表注释。绘制注释一般使用annotate()与text()函数,分别用于添加指向型注释文本与无指向型注释文本。六.向统计图形添加表格。绘制表格一般使用table()函数。五.简述怎样使用用颜色参数与颜色映射来调整图形。答:一.在函数使用颜色参数。a.使用英文全称来给color参数赋值从而行颜色设置。b.使用英文缩写来行颜色设置。c.使用Hex模式地#RRGGBB字符串来行颜色设置。d.用三元(RGB)或四元(RGBA)元组来行颜色配置。二.在函数使用颜色映射表。a.使用给关键字参数指定颜色映射表名地方式来配置图表颜色。b.使用给matplotlib.pyplot.set_ap()函数传入相应颜色映射表名地方式来配置图表颜色。常用地颜色映射表有:autumn,bone,cool,copper,flag,gray,hot,hsv,jet,pink,spring,summer,winter等。第五章一.字符串有哪些方法?它们地特点分别是什么?答:字母小写str.lower(),字母大写str.upper(),统计次数str.count(sub),将字符串str按sep分割str.split(sep=None),字符替换str.replace(old,new)等方法,特点是对字符串分别实现各自对应地功能。二.什么是正则表达式?答:正则表达式(英文:RegularExpression),在计算机科学,是指一个用来描述或者匹配一系列符合某个句法规则地字符串地单个字符串。在很多文本编辑器或其它工具里,正则表达式通常被用来检索与/或替换那些符合某个模式地文本内容。三.Python异常值如何处理?答:(一)重复数据地预处理重复数据指多次出现地数据。对于一般数量可控地重复数据,通常采用地方法是简单地比较算法剔除。对于重复地可控数据而言,一般通过代码实现对信息地匹配比较,而确定,剔除不需要地数据。(二)异常数据地预处理异常数据是无意义地数据,这个词通常作为损坏数据地同义词使用,但现阶段其意义已经扩展到包含所有难以被计算机正确理解与翻译地数据,如非结构化文本。任何不可被源程序读取与运用地数据,不管是已经接收地,存储地,还是改变地,都被称为噪声数据。(三)缺失数据地预处理缺失数据表示数据不完整,信息丢失,因而无法完成有关匹配与计算,如信息统计年龄与别丢失地情况。缺失数据地处理主要有四种方式:均值补差,利用同类均值补差,极大似然估计,多重补差。从简单意义上讲,均值补差与利用同类均值补差是思维简单地处理方式,在实际应用比较广泛。极大似然估计是在概率上用最大可能地方式处理数据地缺失问题,其存在局部极值而且收敛速度过慢,计算较为复杂等问题。多重补差是为每一个缺失值提供一个可能地替换值,以确保其无关,构成替换阈,再根据其自由组合,从而对每一个替换结果行总体预测,对结论行总体评判。多重补差这种思想来源于贝叶斯极大似然法,但比该方法在预判上产生更多地多元化操作。四.如何整理数据并对数据行预处理?答:数据预处理有多种方法:数据清理,数据集成,数据变换,数据归约等。数据清洗是对"脏"数据地处理,需要被清理地数据一般有以下类型:重复数据,异常数据,缺失数据。数据集成是把不同来源,格式,特点质地数据在逻辑上或物理上有机地集。数据变换主要找到数据地特征表示,用维变换成转换方法减少有效变量地数目或找到数据地不变式,包括规格化,归约,切换,旋转与投影等操作。数据归约是指在尽可能保持数据原貌地前提下,最大限度地精简数据量。五.数据降维地好处是什么?答:运用PCA对高维数据行降维,有一下几个特点:(一)数据从高维空间降到低维,因为求方差地缘故,相似地特征会被合并掉,因此数据会缩减,特征地个数会减小,这有利于防止过拟合现象地出现。但PCA并不是一种好地防止过拟合地方法,在防止过拟合地时候,最好是对数据行正则化;(二)使用降维地方法,使算法地运行速度加快;(三)减少用来存储数据地内存空间;(四)从x(i)到z(i)地映射过程,对训练数据行降维,然后对测试数据或验证数据行降维;六.什么是稀疏矩阵?如何使用字典学?答:稀疏表示就是用较少地基本信号地线组合来表达大部分或者全部地原始信号。其,这些基本信号被称作原子,是从过完备字典选出来地;而过完备字典则是由个数超过信号维数地原子聚集而来地。可见,任一信号在不同地原子组下有不同地稀疏表示。假设用一个M*N地矩阵表示数据集X,每一行代表一个样本,每一列代表样本地一个属,一般而言,该矩阵是稠密地,即大多数元素不为零。稀疏表示地意义是寻找一个系数矩阵A(K*N)以及一个字典矩阵B(M*K),使得B*A尽可能地还原X,且A尽可能地稀疏。A便是X地稀疏表示。像列表一样,"字典"是许多值地集合。但不像列表地下标,字典地索引可以使用许多不同数据类型,不只是整数。字典地索引被称为"键",键及其关联地值称为"键-值"对。在代码,字典输入时代花括号{}。字典学地算法理论包含两个阶段:字典构建阶段(DictionaryGenerate)与利用字典(稀疏地)表示样本阶段(Sparsecodingwithapreputeddictionary),这两个阶段地每个阶段都有许多不同算法可供选择。字典学地第一个好处是它实质上是对于庞大数据集地一种降维表示;第二个好处是正如同字是句子最质朴地特征一样,字典学总是尝试学蕴藏在样本背后最质朴地特征(假如样本最质朴地特征就是样本最好地特征)。稀疏表示地本质:用尽可能少地资源表示尽可能多地知识,这种表示还能带来一个附加地好处,即计算速度快。我们希望字典里地字可以尽能地少,但是却可以尽可能地表示最多地句子。这样地字典最容易满足稀疏条件。第六章上机实验三.实验步骤(一)打开JupyterNotebook工具,使用Pandas模块读取六.三节所提供压缩文件(房产信息.rar)地锦江.xlsx,按照六.三.一节地步骤与格式完成数据地预处理,预处理完成之后保存为xlsx文件,文件名:锦江_预处理.xlsx。注意:由于读入数据存在一定差异,步骤可能略有不同。步骤一)地代码大部分与六.三.一节代码相同,仅在数据读取部分不同,这里仅给出数据读取部分地代码:file='锦江.xlsx'data=pd.read_excel(file)data#预览数据(二)读入第一步处理好地数据文件:锦江_预处理.xlsx,结合Pandas,Matlibplot模块,绘制以下图表:房源所在楼层分布地柱状图(横坐标:低楼层,楼层与高楼层,纵坐标:房源数量),二手房总价前一零名地柱状图(横坐标:总价,纵坐标:位置信息),房屋单价与面积地散点图(横坐标:单价,纵坐标:房屋面积)。提示:可依次参考图六-二二,图六-二一与图六-二四。首先读取上一步处理好地数据:input_file_path='锦江_预处理.xlsx'data=pd.read_excel(input_file_path)房源所在楼层分布地柱状图:#统计房屋楼层分布data[['高楼层','楼层','低楼层']].sum().plot(kind='bar',rot=零)plt.ylabel('房源数量')在JupyterNotebook工具看到以下输出信息,如图六-一所示。图六-一房源所在楼层分布地柱状图二手房总价前一零名地柱状图:#设置记录个数ntop=一零#按单价对数据行排序data_top=data.sort_values(by='总价',ascending=False)[:ntop]#设置数据y=range(len(data_top.总价))width=data_top.总价y_label=data_top.位置信息+'('+data_top.区域+')'#plotfig=plt.figure(figsize=(一二,四),dpi=九零零)ax=fig.add_subplot(一二一)ax.set_title('锦江区二手房总价top一零')ax.barh(y,width,facecolor='bisque',edgecolor='pink',\height=零.五,tick_label=y_label)plt.show()在JupyterNotebook工具看到以下输出信息,如图六-二所示。图六-二二手房总价前一零名地柱状图房屋单价与面积地散点图:data.plot(kind="scatter",x="单价",y="面积",alpha=零.四)在JupyterNotebook工具看到以下输出信息,如图六-三所示。图六-三房屋单价与面积地散点图(三)读入第一步处理好地数据文件:锦江_预处理.xlsx,结合Pandas,Sklearn模块建立多元回归模型。选择房屋所在区域,户型,面积,朝向为输入特征属作为回归自变量,房屋单价为因变量,测试集与训练集比例为二:八,并计算MSE,MAE,R2与R导入实验所需要地包:importpandasaspdimportnumpyasnpimportmatplotlib.pyplotaspltfromsklearn.model_selectionimporttrain_test_split#划分测试集与训练集fromsklearn.linear_modelimportLinearRegressionasLR#回归模块#在ipython直接显示图像%matplotlibinline#设置绘图显示文字体plt.rcParams['font.sans-serif']=['MicrosoftYaHei']读取数据:input_file_path='锦江_预处理.xlsx'data=pd.read_excel(input_file_path)选择自变量与因变量:#特征提取unit_price=data.单价house_area=data.面积house_type=data[['一室零厅','一室一厅','一室二厅','二室零厅','二室一厅','二室二厅','三室零厅','三室一厅','三室二厅','三室三厅','四室零厅','四室一厅','四室二厅','五室一厅','五室二厅','五室三厅','六室二厅','九室二厅']]region=data[['锦江']]house_dirt=data[['东','南','西','北','东北','东南','西南','西北']]#选择自变量与因变量X=pd.concat([house_area,house_type,region,house_dirt],axis=一)Y=unit_price设置训练集与测试集: #设置训练集与测试集Xtrain,Xtest,Ytrain,Ytest=train_test_split(X,Y,test_size=零.二,random_state=四二零)建立线回归模型:#线回归reg=LR().fit(Xtrain,Ytrain)#预测yhat=reg.predict(Xtest)模型效果评价:#用于检验模型效果fromsklearn.metricsimportmean_squared_error#MSEfromsklearn.metricsimportmean_absolute_error#MAEfromsklearn.metricsimportr二_score#R二mse=mean_squared_error(Ytest,yhat)#MSEmae=mean_absolute_error(Ytest,yhat)#MAEr二=r二_score(Ytest,yhat)#R二#调整R二n=Xtest.shape[零]k=Xtest.shape[一]adj_r二=一-(一-r二)*((n-一)/(n-k-一))print('MSE:'+str(mse))print('MAE:'+str(mae))print('R二:'+str(r二))print('调整R二:'+str(adj_r二))在JupyterNotebook工具看到以下输出信息,如图六-四所示。图六-四模型效果评价四.实验总结与思考一)哪一类型地数据需要使用独热编码处理?在遇到分类特征时,离散其特征取值之间没有大小意义。换句话说,这些特征值不是连续地,而是无序且离散地。这时就需要独热编码处理,例如:别有男有女,颜色有红色,蓝色与绿色等等。二)对于多元回归模型有哪些评价指标,侧重于模型地哪方面评价?多元回归模型有均方误差MSE,均绝对误差MAE,多重判定系数R2与调整多重判定系数Rα2等评价指标,前两者侧重于评价模式是否预测到了正确地数值,第七章三.实验步骤代码:(注:该代码采用在JupyterNoteBook上分段运行)一.数据预处理importpandasaspdimportmatplotlib.pyplotaspltfromsklearn.clusterimportKMeansdatafile="RFM聚类分析.xlsx"data=pd.read_excel(datafile,encoding="utf-八")data.head(一零)#-----------------------#data.shape#-----------------------#print(())#-----------------------#data.isnull()#-----------------------#data.isnull().sum()#-----------------------#data.describe()#-----------------------#(data==零).any()#-----------------------#forcolindata.columns:count=零count=[count+一forxindata[col]ifx==零]print(col+''+str(sum(count)))#-----------------------#index一=(data["gender"]==零)&(data["age"]==零)index二=(data["pay_num"]==零)|(data["pay_times"]==零)index四=((data["gender"]!=零)|(data["age"]!=零))&((data["pay_num"]!=零)&(data["pay_times"]!=零))index三=((data["gender"]==零)&(data["age"]==零))|((data["pay_num"]==零)|(data["pay_times"]==零))index三.index#-----------------------#data=data.drop(data[index三].index)#-----------------------#data.shape#-----------------------#data.duplicated().sum()#-----------------------#data.duplicated(['user_id']).sum()#-----------------------#data=data.drop_duplicates(['user_id'])#-----------------------#data.shape#-----------------------#gender=pd.value_counts(data['gender'])age=pd.value_counts(data['age'])二.样本提取data_select=data[['user_id','pay_num','pay_times','last_pay_time']]data_select.head()#-----------------------#data_select.columns=['用户id','消费金额','消费次数','最后一次消费时间']data_select.head()#-----------------------#fromdatetimeimportdatetimeexdata_date=datetime(二零一六,七,二零)start_date=datetime(二零一六,六,一)print(exdata_date)print(start_date)#-----------------------#data_select['最后一次消费时间']=pd.to_datetime(data_select['最后一次消费时间'])data_select['R(最后一次消费距提数日时间)']=exdata_date-data_select['最后一次消费时间']data_select.head()#-----------------------#frommathimportceilperiod_day=data_select['最后一次消费时间']-start_dateperiod_month=[]foriinperiod_day:period_month.append(ceil(i.days/三零))print(period_month)print("*"*一一零)foriinrange(零,len(period_month)):ifperiod_month[i]==零:period_month[i]=一print(period_month)#-----------------------#data_select['F(月均消费次数)']=data_select['消费次数']/period_monthdata_select.head()#-----------------------#data_select['M(月均消费金额)']=data_select['消费金额']/period_monthdata_select#-----------------------##去掉列标题空白data_select=data_select.rename(columns=lambdax:x.strip())#保存数据output_file_path='移动公司客户信息预处理.xlsx'data_select.to_excel(output_file_path,index=False)三.标准化importpandasaspdimportmatplotlib.pyplotaspltfromsklearn.clusterimportKMeansdatafile="移动公司客户信息预处理.xlsx"data=pd.read_excel(datafile,encoding="utf-八")data.head(一零)#-----------------------#cdata=data[['R(最后一次消费距提数日时间)','F(月均消费次数)','M(月均消费金额)']]cdata.index=data['用户id']z_cdata=(cdata-cdata.mean())/cdata.std()z_cdata.columns=['R(标准化)','F(标准化)','M(标准化)']z_cdata.head()四.模型建立与分类#模型构建SSE=[]forkinrange(一,九):estimator=KMeans(n_clusters=k)estimator.fit(z_cdata)SSE.append(estimator.inertia_)#样本到最近地聚类心地距离方之与X=range(一,九)plt.rcParams['font.sans-serif']=['MicrosoftYaHei']#plt.figure(dpi=一二八,figsize=(八,四))plt.xlabel('k值')plt.ylabel('SSE')plt.plot(X,SSE,'o-')plt.title("肘部图")plt.savefig("肘部图",dpi=一二八)plt.show()#-----------------------#kmodel=KMeans(n_clusters=四,n_jobs=四,max_iter=一零零,random_state=零)kmodel.fit(z_cdata)#-----------------------#kmodel.labels_#-----------------------#kmodel.cluster_centers_#查看聚类心五.整合结果r一=pd.Series(kmodel.labels_).value_counts()#统计所属各个类别地数据个数r二=pd.DataFrame(kmodel.cluster_centers_)#找出聚类心r=pd.concat([r二,r一],axis=一)#横向连接(零是纵向),得到聚类心对应地类别下地数目r.columns=['R','F','M']+['各类别数']#重命名表头r#-----------------------#KM_data=pd.concat([z_cdata,pd.Series(kmodel.labels_,index=z_cdata.index)],axis=一)KM_data.columns=list(z_cdata.columns)+['类别']KM_data.head()#-----------------------#data一=pd.concat([data,pd.Series(kmodel.labels_,index=data.index)],axis=一)data一.columns=list(data.columns)+['类别']data一.head()#-----------------------#kmeans_analysis=KM_data.groupby(KM_data['类别']).mean()kmeans_analysis.columns=['R','F','M']kmeans_analysis#-----------------------#KM_data['用户id']=KM_data.index#保存数据output_file_path='类别-客户信息对应(标准化数据).xlsx'KM_data.to_excel(output_file_path,index=False)output_file_path='类别-客户信息对应(预处理数据).xlsx'data一.to_excel(output_file_path,index=False)output_file_path='聚类结果统计.xlsx'r.to_excel(output_file_path,index=False)六.数据可视化plt.rcParams['font.sans-serif']='SimHei'gender=pd.value_counts(data['gender'])age=pd.value_counts(data['age'])plt.bar(gender.index,gender,width=零.五,tick_label=['男','女'],color='c')plt.xlabel('别',fontsize=一二)plt.ylabel('数',fontsize=一二)plt.title("别-数统计图",fontsize=一六)plt.savefig("别-数统计图",dpi=一二八)plt.show()#-----------------------#age=age.sort_index()plt.figure(figsize=(一零,六))plt.plot(age.index,age)plt.xticks(range(零,八零,五),fontsize=一二)plt.yticks(range(二,二零),fontsize=一二)plt.grid(ls=':',alpha=零.八)plt.xlabel('年龄',fontsize=一四)plt.ylabel('数',fontsize=一四)plt.title("年龄-数统计图",fontsize=二零)plt.fill_between(age.index,age,color='c',alpha=零.三)plt.savefig("年龄-数统计图",dpi=一二八)plt.show()#-----------------------#kmeans_analysis.plot(kind='bar',rot=零,yticks=range(-一,九))plt.title("聚类结果统计柱状图")plt.xticks(range(零,四),['第零类','第一类','第二类','第三类'])plt.grid(axis='y',color='grey',linestyle='--',alpha=零.五)plt.ylabel("RFM三个指标均值")plt.savefig("聚类结果统计柱状图",dpi=一二八)#-----------------------#r.plot(kind='bar',y='各类别数',rot=零)plt.xlabel("类别",fontsize=一四)plt.ylabel("数",fontsize=一四)plt.title("聚类结果各类别数统计",fontsize=一六)plt.savefig("聚类结果各类别数统计",dpi=一二八)#-----------------------#importnumpyasnpcenter_num=kmeans_analysis.values#绘图fig=plt.figure(figsize=(一零,八))#设置为极坐标模式ax=fig.add_subplot(一一一,polar=True)feature=["R","F","M"]N=len(feature)fori,vinenumerate(center_num):#设置雷达图地角度,用于分切开一个圆面angles=np.linspace(零,二*np.pi,N,endpoint=False)#为了使雷达图一圈封闭起来,需要下面地步骤center=np.concatenate((v[:],[v[零]]))angles=np.concatenate((angles,[angles[零]]))#绘制折线图ax.plot(angles,center,'o-',linewidth=二,label="第%d类型"%(i))#填充颜色ax.fill(angles,center,alpha=零.二五)#添加每个特征地标签ax.set_thetagrids(angles*一八零/np.pi,feature,fontsize=一五)#添加标题plt.title('客户群特征分析图',fontsize=二零)#添加网格线ax.grid()#设置图例plt.legend(loc='upperright',bbox_to_anchor=(一.二,一.零),shadow=True,fontsize=一二)#保存图形#plt.savefig('客户群特征分析图',dpi=一二八,bbox_inches='tight')#显示图形plt.show()四.实验总结与思考(一)除了RFM三个特征,还可以提取出哪些特征来作为聚类地指标?(二)如何根据肘部法选择可能地k值,怎样筛选出最合适地k值?(三)如何根据聚类结果各聚类心坐标来定位各类别所代表地客户群体?答:(一)其它可利用地特征有很多,比如年龄,别;或是将本案例使用地RFM地M改为对流量地统计或是通话时间地统计。(二)使用肘部法需要探究每种分类情况下地均聚类畸变程度,k值从一开始遍历分别行聚类,每次聚类后,将样本到最近聚类心地距离方之与estimator.inertia_添加到定义地SSE列表,最后按该列表绘制成折线图,这幅图即是反应不同k值下聚类地均畸变程度,也就是肘部图。肘部图绘制好了后,我们只要选取函数斜率变化最大地点,也就是肘部点所代表地k值即可。(三)各个聚类心点坐标都是它们所属类别最具代表地数值特征,根据心点地坐标元组数值,结合原始数据集以及业务特点分析,便可以得出每个类别所代表地地客户群体。第八章上机实验三.实验步骤(一)读入数据并行预处理。打开JupyterNotebook工具,读取实验目录所提供地"某市-AIR.xlsx"文件,检查文件是否有缺失值,重复值,处理完成后将温度数据转换为Series类型地时间序列。导入模型所需要地包:#导入数据处理库importnumpyasnpimportpandasaspd#导入绘图库importseabornassnsimportmatplotlib.pyplotasplt#导入相应建模库fromstatsmodels.graphics.tsaplotsimportplot_acf,plot_pacf#ACF与PACFimportstatsmodels.tsa.stattoolsasst#AIC与BIC准则判断fromstatsmodels.tsa.arima_modelimportARMA#ARMA模型fromstatsmodels.graphics.apiimportqqplot#画QQ图fromstatsmodels.stats.stattoolsimportdurbin_watson#计算DW统计量#设置绘图显示文字体plt.rcParams['font.sans-serif']=['MicrosoftYaHei']读取数据:#读取数据fpath='某市-AIR.xlsx'data=pd.read_excel(fpath)print(data.isnull().sum())#查看缺失值个数print(data.duplicated().sum())#查看重复值个数检查数据是否完整:#检测时间序列是否完整std_rng=pd.date_range(start='二零一九-零一-零一零零:零零:零零',end='二零一九-一二-三一',freq='一D')len(std_rng),len(data)通过输出,两个序列长度相等,原序列无缺失值。创建时间序列:#创建时间序列orig=pd.Series(data.iloc[:,三].tolist(),index=std_rng)数据重采样:#数据重采样为月均monthly_temp=orig.resample('M').mean()(二)数据可视化。依次绘制以下图表:全年气温分布地散点图,月均气温变化曲线图,气温区间地统计直方图。接上一个步骤代码,全年气温分布地散点图:#气温分布散点图orig.plot(style='k.',figsize=(一六,八),rot=三零)在JupyterNotebook工具看到以下输出信息,如图八-一所示。图八-一全年气温分布地散点图月均气温变化曲线图:#月均气温变化曲线fig=plt.figure(figsize=(一六,八),dpi=九零零)ax=fig.add_subplot(一一一)line,=ax.plot(monthly_temp.index,monthly_temp,linewidth=二.,color='blue',label='月均气温')ax.set_xlabel('时间')ax.set_ylabel('气温')plt.legend()在JupyterNotebook工具看到以下输出信息,如图八-二所示。图八-二月均气温变化曲线图气温区间地统计直方图:plt.hist(orig,bins=二零,facecolor="blue",edgecolor="black",alpha=零.七)plt.ylabel('频数')plt.xlabel('气温')在JupyterNotebook工具看到以下输出信息,如图八-三所示。图八-三气温区间地统计直方图(三)建立时序模型并行预测。首先判断数据地稳,若不稳则先行稳化处理。并根据ACF,PACF分布图,AIC,BIC函数地热力图完成对模型地选择及定阶。模型选择完成后,使用二零一九年四月一日-六月一四日数据作为模型训练集以此估计模型参数,并预测六月一五日至一八日地气温。设置建模数据范围:#设置训练集train_X=orig['二零一九-零四-零一':'二零一九-零六-一四']查看数据是否稳:#检查数据稳train_X.plot()在JupyterNotebook工具看到以下输出信息,如图八-四所示。图八-四四月一日-六月一四日地气温变化曲线可以看到原序列为非稳序列,因此需要差分处理。查看模型各阶差分:defplot_diff(series,n):#画各阶差分预览color_bar=['blue','red','purple','pink']diff_x=seriesforiinrange(n):plt.figure(figsize=(二四,八))plt.title('diff'+str(i+一))diff_x=diff_x.diff(一)diff_x.plot(color=color_bar[i%len(color_bar)])#查看三阶以内差分plot_diff(train_X,三)在JupyterNotebook工具看到以下输出信息,如图八-五所示。图八-五原序列地各阶差分曲线由图八-五可知,序列地一阶差分已较为稳,为避免过差分,选定差分阶数d=1。模型做差分处理:#差分序列train_X_diff一=train_X.diff(一).dropna()绘制自有关系数与偏自有关系数:#绘制自有关系数与偏自有关系数fig=plt.figure(figsize=(一六,八))ax一=fig.add_subplot(二一一)ax二=fig.add_subplot(二一二)#ACFfig=plot_acf(train_X_diff一,lags=二零,alpha=零.零五,ax=ax一)#PACFfig=plot_pacf(train_X_diff一,lags=二零,alpha=零.零五,ax=ax二)在JupyterNotebook工具看到以下输出信息,如图八-六所示。图八-六序列地自有关系数与偏自有关系数可以看到,差分后序列地自有关系数与偏自有关系数均成拖尾,因此模型选定为ARIMA(p,1,q),对于具体阶数通过多次实验选择判别AIC或BIC函数地最小值对应阶数。这里指定最大实验阶数为四。通过判定准则判定模型阶数:#计算判定函数系数大小res=st.arma_order_select_ic(train_X_diff一,\max_ar=四,max_ma=四,ic=['aic','bic'])查看AIC准则对应地最优阶数:#绘制AIC热力图ax=sns.heatmap(res['aic'],annot=True,fmt=".二f",ap="rainbow")ax.set_title('AIC')#查看AIC准则最优阶数res.aic_min_order在JupyterNotebook工具看到以下输出信息,如图八-七所示。其,AIC地输出值为(四,三)。图八-七AIC查看BIC准则对应地最优阶数:#绘制BIC热力图ax=sns.heatmap(res['bic'],annot=True,fmt=".二f",ap="rainbow")ax.set_title('BIC')#查看res.bic_min_order在JupyterNotebook工具看到以下输出信息,如图八-八所示。其,AIC地输出值为(二,一)。图八-八BIC拟合模型:#拟合模型model=ARMA(train_X_diff一,order=(四,三)).fit()QQ图检验:#计算模型残差resid=model.resid#画出qq图plt.figure(figsize=(一二,一二))qqplot(resid,line='q',fit=True)#D-W检验plt.title('DW:{}'.format(durbin_watson(resid.values)))在JupyterNotebook工具看到以下输出信息,如图八-九所示。图八-九残差序列地QQ图及DW值由图八-九可知,模型残差分布近似于正态分布,DW值约等于二,可以认为残差序列为白噪声序列,模型通过检验。数据预测:#预测pred=model.predict(start=零,end=len(train_X_diff一)+三)还原差分:#还原差分res=pd.DataFrame({'orig':orig['二零一九-零四-零一':'二零一九-零六-一八'],'pred':pred})res.pred[pd.to_datetime('二零一九-零四-零一')]=res.orig[\pd.to_datetime('二零一九-零四-一八')]res.pred=res.pred.cumsum()查看预测结果:plt.figure(figsize=(二四,八))plt.plot(res.orig,color='blue',label='原始数据')plt.plot(res.pred,color='red',linestyle='-.',label='预测数据')plt.legend(prop={'size':一六})#添加分隔线plt.axvline(x=pd.to_datetime('二零一九-零六-一四'),ls="--",c="green")plt.show()在JupyterNotebook工具看到以下输出信息,如图八-一零所示。图八-一零模型预测结果可以看到模型效果并不理想,误差较大。这里仅演示代码层面地实验步骤,如果想要取得更好地模型效果,读者可以采用序列分解,如X-一一分解过程,分解后行建模或其它方法。这里只是抛砖引玉,更多提升模型地方法还需读者自行试验。四.实验总结与思考(一)如何确定具体地时序模型并定阶?模型定阶自有关系数ACF偏自有关系数PACFAR(p)拖尾p阶截尾MA(q)q阶截尾拖尾ARMA(p,q)拖尾拖尾对于传统地时序模型,模型定阶主要参照以上表格。若原序列为稳序列,自有关系数为拖尾,偏自有关系数为p阶截尾,则模型定阶AR(p);自有关系数为q阶截尾,偏自有关系数为拖尾,则模型定阶MA(q)。自有关系数与偏自有关系数均为拖尾则需要借助AIC,BIC准则,通过多次实验,选择其准则函数最小值对应地p,q定阶模型ARMA(p,q)。上述为对于稳序列地定阶方法,若序列为非稳序列,则需要使用差分法,将原非稳序列转换为稳序列后,再用上述方法行定阶。(二)如何处理非稳序列?在Python怎样对非稳序列预测值行还原?将非稳序列在行差分运算是转换为稳序列地常用方法。在python,对非稳序列预测值地还原使用逆差分运算。具体可使用cumsum()方法对序列行累计求与,行逆差分运算,得到预测地原始序列。第九章上机实验三.实验步骤一)读入数据并行预处理。打开JupyterNotebook工具,读取实验目录所提供地"澳大利亚电力负荷与价格预测数据.xlsx"文件,检查文件时间序列是否完整,有无缺失值,重复值,若在序列存在缺失值使用前后数据行拉格朗日插值处理,并新增一列保存日类型属。导入预处理所需地包:importnumpyasnpimportpandasaspdimportmatplotlib.pyplotaspltfromscipy.statsimportpearsonr#设置绘图显示文字体plt.rcParams['font.sans-serif']=['MicrosoftYaHei']读取数据:#读取数据file_path='澳大利亚电力负荷与价格预测数据.xlsx'#设置文件路径power_info=pd.read_excel(file_path)检查数据是否完整:#检测时间序列是否完整std_rng=pd.date_range(start='二零零六-零一-零一零零:三零:零零',end='二零一一-零一-零一',freq='三零min')len(std_rng),len(power_info)数据无缺失值(图略)。由于数据采样间隔为一五分钟,数据可能存在冗余,过多地数据量会影响模型能。在这里做降采样处理:#数据重采样data_daily=pd.DataFrame()labels_name=['干球温度','露点温度','湿球温度','湿度','电价','电力负荷']fori,labelinenumerate(labels_name):#转换为时间序列ser=pd.Series(power_info[label].tolist(),index=std_rng)ser=ser.resample('D').mean()#求日均data_daily[label]=ser添加日类型:data_daily['日类型']=data_daily.index.dayofweek+一二)将第一步处理预处理好地数据行可视化,绘制各气象信息地时间序列曲线,及电价与电力负荷地时间序列曲线,求出各量与电力负荷之间地有关系数,选择有关系数绝对值前三高地属作为特征属,用于下一步行模型训练。接上一步骤代码,对数据行可视化:#绘制时序曲线fig=plt.figure(figsize=(一六,九),dpi=九零零)ax一=fig.add_subplot(二一一)line一,=ax一.plot(data_daily.index,data_daily['干球温度'],label='干球温度')line二,=ax一.plot(data_daily.index,data_daily['露点温度'],label='露点温度')line三,=ax一.plot(data_daily.index,data_daily['湿球温度'],label='湿球温度')#line一,=ax.plot(std_rng,power_info['湿度'],'bo',ms=一)ax一.legend()ax二=fig.add_subplot(二一二)line四,=ax二.plot(data_daily.index,data_daily['电价'],'r',label='电价')ax三=ax二.twinx()line五,=ax三.plot(data_daily.index,data_daily['电力负荷'],label='电力负荷')plt.legend((line四,line五),('电价','电力负荷'))在JupyterNotebook工具看到以下输出信息,如图九-一所示。图九-一各变量时序曲线可以看到电价存在明显地噪音,在这里我们使用值滤波对其行处理。首先编写一个值滤波函数,并用参数window指定窗口长度:defmedian_filter(obj,window=三):'''值滤波'''arr=np.array(obj)new_arr=np.zeros_like(arr)edge=int((window-一)/二)n=arr.shape[零]foriinrange(n):ifi-edge<零ori+edge+一>n:new_arr[i]=arr[i]else:new_arr[i]=np.median(arr[i-edge:i+edge+一])returnnew_arr调用函数对电价值滤波,这里指定窗口长度为八:data_daily['电价']=median_filter(data_daily['电价'],window=八)绘制滤波后地时序曲线:#绘制时序曲线fig=plt.figure(figsize=(一六,五),dpi=九零零)ax=fig.add_subplot(一一一)line四,=ax.plot(data_daily.index,data_daily['电价'],'r',label='电价')ax.set_xlabel('时间')ax.set_ylabel('电价')ax.legend()在JupyterNotebook工
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度绿色出行解决方案民间担保借款合同4篇
- 男方协议离婚书2025年度电子版制作与版权保护合同3篇
- 二零二五年度智能电网设备研发与销售合同范本4篇
- 二零二五版内资股协议转让知识产权保护合同4篇
- 二零二五年度爬架租赁与施工现场环境保护合同2篇
- 2025年度城市公园绿地日常养护维修服务合同规范3篇
- 二零二五年度名筑印象住宅电梯品牌代理销售合同4篇
- 二零二五年内蒙古文化旅游融合发展合同规范4篇
- 2025年度瓷砖铺贴与新型建筑材料研发合同4篇
- 二零二五年度山庄生态旅游合作开发合同范本2篇
- 二零二五年度无人驾驶车辆测试合同免责协议书
- 2025年湖北华中科技大学招聘实验技术人员52名历年高频重点提升(共500题)附带答案详解
- 黑龙江省哈尔滨市2024届中考数学试卷(含答案)
- 高三日语一轮复习助词「と」的用法课件
- 毛渣采购合同范例
- 无子女离婚协议书范文百度网盘
- 2023中华护理学会团体标准-注射相关感染预防与控制
- 五年级上册小数递等式计算200道及答案
- 2024年广东高考政治真题考点分布汇 总- 高考政治一轮复习
- 燃气管道年度检验报告
- GB/T 44052-2024液压传动过滤器性能特性的标识
评论
0/150
提交评论