最近参加了国赛,大湾区金融数学建模,美赛。由于都选择了数据处理的题目,所以经常会使用到数据预处理的代码,然而每一次都会忘记,都要重新去查找代码,因此开贴记录一下常用的代码。
excel的读取
数模中最常用的数据存储格式是excel,而我一般常用的编程语言是python和matlab,因此记录一下两个语言的数据读取形式。
python
python读取数据主要是使用了pandas库中read_excel()这个函数,这个函数会在python中生成与excel形式类似的表格dataframe。主要参数及特点如下:
io文件路径,把在同文件夹中的xlsx的名称输入即可
sheet_name= 可以从0开始传入数字,也可以传入字符就是excel中sheet1的具体名称
header= 默认是0就是将第一行作为列索引(列名),可以是其他行,也可以是None,就是默认用012345...来作为列索引
names= 这个参数很有意思,说起来挺鸡肋的,大概就是重新设置列索引,然后功能是覆盖掉header(从这个角度来看,header的作用就是选择哪一行开始作为数据集)
index_col= 这个跟header用法基本一致,只不过是行索引,但是默认值是None
例子如下:
import pandas as pd
df = pd.read_excel('Problem_C_Data_Wordle.xlsx', sheet_name=0, header=0, index_col=None)
很普通的excel读入,基本excel已经操作好了,纯粹就是读入到python中
matlab
matlab读入需要掌握的原因是我的bp神经网络,svm分类器代码都是用matlab跑的,因此也需要掌握一下matlab的excel读取操作,需要注意的是,数值矩阵没有需要设置的索引。
matlab读入的数据结构就是单纯的数值矩阵,使用函数xlsread进行读取,参数如下
filename 文件路径
sheetname sheet的名称
range 利用excel的行列索引来选取
例子如下:
x = xlsread('数据分析.xlsx','bp结果','A2:G124');
matlab还有一个方法使用数据,将excel的数据复制到变量区,再另存为mat格式,对于matlab来说就非常容易提取
两种数据结构的索引
上一段落讲述了如何利用编程语言将excel中的数据转换成为dataframe和数值矩阵两种数据结构,下面介绍两种数据结构的常见索引方式,索引是我认为数据分析的必备过程,熟练掌握索引才能对数据进行筛选提取
dataframe
dataframe的索引无疑是非常灵活好用的,但是我认为对于自己这样的初学者来说是较难上手的,下面介绍几种常用的筛选,以及一些常用的操作。
dataframe自身属性的调用
df.values 这是对dataframe中的数据进行ndarray的转换,去掉行列索引,剩下的数据转换成二维ndarray,经常用于对数据进行分析
df.index 显示行索引
df.columns 显示列索引
df.info() 可以查询每一列的数据结构,重要的是统计了每一列的缺失值
df.describe() 探索性分析,主要就是基础的均值方差的基础数据描述
dataframe的切片索引
首先,dataframe是不能直接使用python的切片索引,如果想实现类似操作,应该使用df.values将数据以ndarray的形式呈现,再使用切片索引
dataframe最基础的索引是使用df.loc以及df.iloc函数继续操作
df.loc[] 这个是最接近切片思想的索引器
df.iloc[] 这个是跟dataframe自己设置行列索引配合的索引器,使用是非常灵活的
dataframe的布尔索引
这个内容是我个人觉得是最有意思的部分,非常体现python的代码思想的一个步骤,我的学校只是开设了c++的课程,因此当我开始自学python的时候才发现python的功能封装是非常完善的,很多程序设计的代码思维基本就是我们思考问题的思维。
对于df['column']这样选择了特定列的dataframe, 对其进行逻辑判断,其结果是返回一个布尔类型的series,例子:
df_demo[df_demo['gender'] == '男'] = 1
如果再用df[]中使用这个布尔类型的series,就可以实现布尔索引的过程,使用时非常方便的。常用于字符的数字化,或者是一些特定的值筛选。
dataframe的拼接
数据list直接拼接
df['column'] = list
dataframe拼接
采用merge或者其他的拼接函数,较复杂,不是很喜欢用
serious
serious自身属性的调用
unique()
value_counts()
数值矩阵
数值矩阵的索引思想和python的切片思想一致,唯一的区别也是值得注意的区别是,matlab的索引是(),而python的索引是[]。
对于matlab来说数据的查看都是直观的
[m, n] = size(x);
可以提取数值矩阵的行和列
excel的写入
python
excel的写入主要用到了dataframe中的df.to_excel()函数,也就是说,一般想将数据写入excel中,首先需要将数据转换成为dataframe的数据结构。
df.to_excel()具体的参数如下:
文件路径
sheet_name= 保存在excel的sheet的名称或者序号
columns= 可选择dataframe的特定列写入
header= 默认是True,将列索引写在excel第一行
index= 默认是True,将行索引卸载excel第一列,如果没设置特定的行索引,建议参数传入False,因为excel本身就有行索引
matlab
matlab中将数据传入excel中使用的函数是xlswrite()
需要传入的参数如下:
文件路径
数据内容
sheetname
range
数模中数据分析的代码思想
参加过几次数模比赛后,我从一开始的只会复制粘贴,到自己学会调试更改别人的代码,再到自己学会分块编写代码,面向过程这一编程思想是我最主要运用的思想,因此接下来的篇幅,我想记录一下自己作为非计算机专业自学编程的一些感悟。
首先是数据分析的一些常见过程,数据提取,缺失值,异常值处理,数据标准化,数据归一化,分类变量的数字化,等等,这些内容的有些可以使用代码块完成,有些可以借助一些软件直接操作,例如excel,spss等。当利用代码块的时候,对编程中的数据结构就要十分清晰,否则调试代码的过程中,就会需要耗费大量时间。
因此,在数模比赛,我认为将数据分类处理是非常重要的,每一问都要有相应的文件夹,以及相应的原始数据,对于处理数据过程中产生的新数据的存储格式也要十分清晰。
在对数据使用函数时,应该尽量使用新变量去接收,这样防止别的代码会因为原始数据的改动而跑不通。所以写每一个函数的输入和输出也需要十分清晰。
以上过程综合起来,建议先使用流程图将数据处理的过程标注,这样可以提高整天编程的效率,当有改动的时候也会十分方便。