数学建模美赛大数据分析题必须要会的大数据处理技巧!!!

文章目录

  • 数值类型转换
  • 属性类型转换

使用Pandas 工具包可以处理千万级别的数据量,但读取过于庞大的数据特征时,经常会遇到内存溢出等问题。估计绝大多数读者使用的笔记本电脑都是8GB内存,没关系,这里教给大家一些大数据处理技巧,使其能够占用更少内存。

数值类型转换

这里我们读取20年C题的一个数据。

其数据已经上传到了这里,可以自行下载:数学建模美赛2020C题数据以及优秀o奖论文
数学建模美赛大数据分析题必须要会的大数据处理技巧!!!_第1张图片
输出结果显示这份数据读取进来后占用17.8MB内存,数据类型主要有2种,其中,float64类型有 5个特征,object类型有 10个特征。

对于不同的数据类型来说,其占用的内存相同吗?应该是不同的,先来计算一下各种类型平均占用内存∶

for dtype in ['float64','int64','object']:
    selected_dtype = df.select_dtypes(include =[dtype])
    mean_usage_b=selected_dtype.memory_usage(deep=True).mean() 
    mean_usage_mb = mean_usage_b / 1024**2
    print('平均内存占用',dtype,mean_usage_mb)


平均内存占用 float64 0.0001220703125
平均内存占用 int64 0.12043126424153645
平均内存占用 object 1.5534982681274414

循环中会遍历3种类型,通过select_dtypes()函数选中属于当前类型的特征,接下来计算其平均占用内存,最后转换成 MB 看起来更直接一些。从结果可以发现,float64类型比int64类型平均占用内存稍微少一些,而 object 类型占用的内存最多。

接下来就要分类型对数据进行处理,首先处理一下数值型,经常会看到有 int64、int32等不同的类型,它们分别表示什么含义呢?

数学建模美赛大数据分析题必须要会的大数据处理技巧!!!_第2张图片
输出结果分别打印了int8~int64可以表示的数值取值范围,int8和int16能表示的数值范围有点儿小,一般不用。int32看起来范围足够大了,基本任务都能满足,而int64能表示的就更多了。原始数据是int64类型,但是观察数据集可以发现,并不需要这么大的数值范围,用int32类型就足够了。所以我们完全可以将int64转换为int32
数学建模美赛大数据分析题必须要会的大数据处理技巧!!!_第3张图片

可以看到在进行向下转换的时候,程序已经自动地选择了合适类型,再来看看内存占用情况,原始数据占用0.72MB,转换后仅占用0.23MB,大幅减少了。由于int型数据特征并不多,差异还不算太大,转换 float 类型的时候就能明显地看出差异了。

其中 mem_usage()函数的主要功能就是计算传入数据的内存占用量,为了让程序更通用,写了一个判断方法,分别表示计算 DataFrame和 Series类型数据,如果包含多列就求其总和,如果只有一列,那就是它自身。

select_dtypes(include=【‘int64’)表示此时要处理的是全部int64格式数据,先把它们都拿到手。接下来对这部分数据进行向下转换,可以通过打印 coverted_int.info()来观察转换结果。

属性类型转换

最开始就发现 object 类型占用内存最多,也就是字符串,可以先看看各列 object类型的特征∶

数学建模美赛大数据分析题必须要会的大数据处理技巧!!!_第4张图片

其中 count 表示数据中每一列特征的样本个数(有些存在缺失值),unique表示不同属性值的个数,例如 day_of_week列表示当前数据是星期几,所以只有7个不同的值,但是默认 object类型会把出现的每一条样本数值都开辟一块内存区域,其内存占用情况如图所示。
数学建模美赛大数据分析题必须要会的大数据处理技巧!!!_第5张图片
若星期一和星期二出现了多次,它们只是一个字符串代表一种结果而已,所以共用一块内存就足够了。但是在 object类型中却为每一条数据开辟了单独的一块内存,若有上万条数据,但只有7个不同值,这样做岂不是浪费了好多?

所以还是要把object类型转换成 category类型。先来看看这种新类型的特性

数学建模美赛大数据分析题必须要会的大数据处理技巧!!!_第6张图片

数学建模美赛大数据分析题必须要会的大数据处理技巧!!!_第7张图片
数学建模美赛大数据分析题必须要会的大数据处理技巧!!!_第8张图片
在这里插入图片描述
对day_of_week列特征进行转换后,内存占用大幅下降,效果十分明显,其他列也是同理,但是,如果不同属性值比较多,效果也会有所折扣。接下来对所有 object 类型都执行此操作∶

数学建模美赛大数据分析题必须要会的大数据处理技巧!!!_第9张图片
首先对 object类型数据中唯一值个数进行判断,如果数量不足整体的一半(此时能共用的内存较多),就执行转换操作,如果唯一值过多,就没有必要执行此操作。最终的结果非常不错,内存只占用很小部分了。
本节向大家演示了如何处理大数据占用内存过多的问题,最简单的解决方案就是将其类型全部向下转换,这个例子中,内存从 17M 下降到10.3 MB,效果还是十分明显的。

如果加载千万级别以上数据源,还是有必要对数据先进行上述处理,否则会经常遇到内存溢出错误。

这只是一部分,新一部分马上就出,欢迎关注

  • 数学建模博客专栏
  • 数据分析专栏
  • Python基础专栏
  • 机器学习专栏
  • 深度学习专栏

你可能感兴趣的:(数据分析,数学建模,python,数据分析,机器学习,编程语言)