该笔记来源于唐宇迪老师课程。我就做了搬运工,关于该数据,唐宇迪老师的github应该有提供的。
好了,开始还是加载数据,看一下数据,然后看一下数据信息。
import
![22b94e614e02c75af2a34532ddf5711c.png](https://img-blog.csdnimg.cn/img_convert/22b94e614e02c75af2a34532ddf5711c.png)
查看数据量大小
gl.shape #(171907, 161)
查看数据占用内存大小,通过指定memory_usage='deep'参数来获得
gl.info(memory_usage='deep')
![78cd57be8cb6f6af04bcfd30b6252603.png](https://img-blog.csdnimg.cn/img_convert/78cd57be8cb6f6af04bcfd30b6252603.png)
不加参数显示如下:
gl.info()
![1efd33e0c1e74f12fe7d778d2fc222b5.png](https://img-blog.csdnimg.cn/img_convert/1efd33e0c1e74f12fe7d778d2fc222b5.png)
从中可以看到,差别就是指定参数可以明确获得内存大小,而不加参数则获得一个大于某个值的内存提示。
查看各数据类型所占用的内存大小
for dtype in ['float64','int64','object']:
selected_dtype = gl.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)
![2422bc4dcf2ef7fe5dc361af3513d1ef.png](https://img-blog.csdnimg.cn/img_convert/2422bc4dcf2ef7fe5dc361af3513d1ef.png)
查看一个各int类型的取值情况,取值范围越大,那么所占用内存越大。
import numpy as np
int_types = ['uint8','int8','int16','int32','int64']
for it in int_types:
print (np.iinfo(it))
![e479481e4529fccea4a232b1dc5c1970.png](https://img-blog.csdnimg.cn/img_convert/e479481e4529fccea4a232b1dc5c1970.png)
为了降低内存消耗,我们对数据集进行相应类型转换操作,如可用int8存储的数据则不用int16进行存储。
# 计算内存占用大小
def mem_usage(pandas_obj):
if isinstance(pandas_obj,pd.DataFrame):
usage_b = pandas_obj.memory_usage(deep=True).sum()
else:
usage_b = pandas_obj.memory_usage(deep=True)
usage_mb = usage_b/1024**2
return '{:03.2f} MB'.format(usage_mb)
gl_int = gl.select_dtypes(include = ['int64'])
# 通过指定downcast参数降低内存,unsigned意思是找到看最合适的存储类型
coverted_int = gl_int.apply(pd.to_numeric,downcast='unsigned')
print ("未进行转换的内存占用:{}".format(mem_usage(gl_int)))
print ("进行转换的内存占用:{}".format(mem_usage(coverted_int)))
![bcf33d39ba34a6d9eba81d9063147656.png](https://img-blog.csdnimg.cn/img_convert/bcf33d39ba34a6d9eba81d9063147656.png)
将float64数值类型转换为float类型存储
gl_float = gl.select_dtypes(include=['float64'])
converted_float = gl_float.apply(pd.to_numeric,downcast='float')
print(mem_usage(gl_float))
print(mem_usage(converted_float))
![d763ea40f7d39f0c5fcd435dbf2e3740.png](https://img-blog.csdnimg.cn/img_convert/d763ea40f7d39f0c5fcd435dbf2e3740.png)
比较一下对数值型变量进行转换后降低的内存大小:
optimized_gl = gl.copy()
optimized_gl[coverted_int.columns] = coverted_int
optimized_gl[converted_float.columns] = converted_float
print(mem_usage(gl))
print(mem_usage(optimized_gl))
![6d5b4f9757e775bb30ee971f72dd24f0.png](https://img-blog.csdnimg.cn/img_convert/6d5b4f9757e775bb30ee971f72dd24f0.png)
降低的不是很明显。
对object类型变量进行降低内存操作
gl_obj = gl.select_dtypes(include = ['object']).copy()
gl_obj.describe()
![ac5017cb8533baa946c668992d67d961.png](https://img-blog.csdnimg.cn/img_convert/ac5017cb8533baa946c668992d67d961.png)
dow = gl_obj.day_of_week
dow.head()
![1c2a7afda142fcc04825cce9748779f0.png](https://img-blog.csdnimg.cn/img_convert/1c2a7afda142fcc04825cce9748779f0.png)
将day_of_week变量转为category类型,使得取同一特征值指向同一内存空间,降低内存开销。
dow_cat = dow.astype('category')
dow_cat.head()
![dc69c1acef08c7d3153c51a4634feb5f.png](https://img-blog.csdnimg.cn/img_convert/dc69c1acef08c7d3153c51a4634feb5f.png)
现在类型变为了category类型
dow_cat.head(10).cat.codes # 查看category编码格式
![125cba594d3d701daea742a2acf6d535.png](https://img-blog.csdnimg.cn/img_convert/125cba594d3d701daea742a2acf6d535.png)
查看一下day_of_week变量的内存降低情况
print (mem_usage(dow))
print (mem_usage(dow_cat))
![258e641d757a10435057a1e075c29e2d.png](https://img-blog.csdnimg.cn/img_convert/258e641d757a10435057a1e075c29e2d.png)
将object类型变量转为category类型
converted_obj = pd.DataFrame()
for col in gl_obj.columns:
num_unique_values = len(gl_obj[col].unique())
num_total_values = len(gl_obj[col])
if num_unique_values / num_total_values < 0.5:
converted_obj.loc[:,col] = gl_obj[col].astype('category')
else:
converted_obj.loc[:,col] = gl_obj[col]
print(mem_usage(gl_obj))
print(mem_usage(converted_obj))
![3767e8d45641437aebb25d9aab163f96.png](https://img-blog.csdnimg.cn/img_convert/3767e8d45641437aebb25d9aab163f96.png)
对时间类型变量进行处理
date = optimized_gl.date
date[:5]
![8a1d6b90b446ee98f5055481f3c78d6b.png](https://img-blog.csdnimg.cn/img_convert/8a1d6b90b446ee98f5055481f3c78d6b.png)
print (mem_usage(date)) # 0.66 MB
将字符型变量转为date类型变量
optimized_gl['date'] = pd.to_datetime(date,format='%Y%m%d')
print (mem_usage(optimized_gl['date'])) # 1.31 MB
optimized_gl['date'][:5]
![6a3dfc6f77d21906ff1ad0a111883b27.png](https://img-blog.csdnimg.cn/img_convert/6a3dfc6f77d21906ff1ad0a111883b27.png)
这里将字符型变量转为date后,好像内存增加了。那么就说明,如果本来是date类型的变量可以转为object类型降低内存。但在实际操作中,时间序列还是需要date类型变量的。