Python:数据标准化
第一步:导入本地的目标数据集
使用pandas库中的read_excel()函数导入的数据格式会默认为dataframe(数据框),可以直接使用数据框支持的所有方法。
观察数据可以发现,数据后三列为数值型,但是各个数值的度量单位是不同的,housesize一般以平方米为单位,rental一般以元为单位,houseage一般以年为单位。
第二步:截取出需要进行标准化处理的列
第三步:进行数据标准化
方法一:最小-最大标准化
公式:
min指x所在列的最小值,max指x所在列的最大值。x'指标准化后的x。
代码如下:
注释:①标准化后的数据框d还是数据框格式~
②数据框下面的rename()方法可以用于对数据框的列名进行随意更改~采用字典格式进行列名修改。
colums = {'originalname1':'newname1','originalname3':'newname3'}无需修改的列名可以直接跳过。
inplace = True表示替换原来的列名,直接显示最新的列名。
最后,需要将标准化后的数据拼接到原数据中去。
注释:①这里采用的拼接方法concat()为直接拼接,即生硬的将两张表拼凑在一起。并没有根据某一列做匹配,与merge()方法是不一样的~
②pd.set_option('display.max_columns',50),设置显示的最大列数为50列,如果不设置该参数,直接print()会有很多列被省略无法看到完整的拼接结果。
③pd.set_option('display.width',1000),设置显示宽度为1000。如果不设置该参数,则最后几个列会换行显示。
④补充:pd.set_option('display.max_rows', 500) ,设置打印最大行数为500行。
在sklearn库中的preprocessing模块下的minmax_scale()函数可以直接实现最小最大标准化。
第一次尝试:
百度一下,发现,导入模块的方法不对,改正如下:
注意:使用该函数后,数据格式发生变化了!不是数据框,而是n维数组了!
那么,如何将n维数组转换为数据框并添加列名呢?
继续百度……
大神说,可以使用pandas库中的DataFrame()函数将数组转为数据框:
确实成功转换了~
但是,数据框的列名需要修改一下~
最后一步:把原始数据与标准化数据合并起来~本文之前做过,就不重复了~
方法二:Z-score标准化
其中,x表示具体数值,xbar表示x所在列的均值,σ 表示x所在列的标准差。
采用这种方法处理后的标准化数据特征为:标准差为1,均值为0。
手动Z-score标准化的代码如下:
同样,sklearn库中也有对应的函数可以实现Z-score标准化。
不过,仔细观察会发现,手动的结果和使用scale()函数的结果并完全不一样。
我对使用scale()函数的标准化后的数据进行标准差、均值的检测发现,标准差确实为1,但是均值不等于0,是无限接近0的一个小数。
方法三:小数定标规范化
目的:将任意一个较大的数字,转换为[-1,1]的小数。
如120,将它除以1000,则为0.12。困难在于,任意给定一组数,如何确定应该除以10的多少倍?
基本思路:先将所给的一组数取绝对值,找出这组数中绝对值最大的数,然后,利用对数+向上取整的思想来确定10的次方。
代码如下:
注释:①numpy库中有ceil()函数,表示向上取整。
②numpy库中log10()用于计算一个数以10为底数,对应的值是多少。
参考资料: