pandas object转float_pandas-数据处理之节省内存

该笔记来源于唐宇迪老师课程。我就做了搬运工,关于该数据,唐宇迪老师的github应该有提供的。

好了,开始还是加载数据,看一下数据,然后看一下数据信息。

import 

22b94e614e02c75af2a34532ddf5711c.png

查看数据量大小

gl.shape #(171907, 161)

查看数据占用内存大小,通过指定memory_usage='deep'参数来获得

gl.info(memory_usage='deep')

78cd57be8cb6f6af04bcfd30b6252603.png

不加参数显示如下:

gl.info()

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

查看一个各int类型的取值情况,取值范围越大,那么所占用内存越大。

import numpy as np
int_types = ['uint8','int8','int16','int32','int64']
for it in int_types:
    print (np.iinfo(it))

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

将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

比较一下对数值型变量进行转换后降低的内存大小:

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

降低的不是很明显。

对object类型变量进行降低内存操作

gl_obj = gl.select_dtypes(include = ['object']).copy()
gl_obj.describe()

ac5017cb8533baa946c668992d67d961.png
dow = gl_obj.day_of_week
dow.head()

1c2a7afda142fcc04825cce9748779f0.png

将day_of_week变量转为category类型,使得取同一特征值指向同一内存空间,降低内存开销。

dow_cat = dow.astype('category')
dow_cat.head()

dc69c1acef08c7d3153c51a4634feb5f.png

现在类型变为了category类型

dow_cat.head(10).cat.codes # 查看category编码格式

125cba594d3d701daea742a2acf6d535.png

查看一下day_of_week变量的内存降低情况

print (mem_usage(dow))
print (mem_usage(dow_cat))

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

对时间类型变量进行处理

date = optimized_gl.date
date[:5]

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

这里将字符型变量转为date后,好像内存增加了。那么就说明,如果本来是date类型的变量可以转为object类型降低内存。但在实际操作中,时间序列还是需要date类型变量的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值