原文首发:这里


这里主要分享数据分析过程中两个很小的陷阱。

concat比较耗时

背景是有上万个csv文件,想把他们整合到一个文件里,推荐整合后的格式保存为大数据里的.parquet,可以节省很多空间。

整合多文件时,不要着急用concat,而是先list到一起,最后统一concat。原因是concat的时候,需要考虑每个dataframe的index对齐,所以速度很慢。

我一开始的慢速写法:

def concat_high_freq(base_dir, output_name='test_combined'):# 无法容忍的龟速!!!res = pd.DataFrame()for file in tqdm(os.listdir(base_dir)):if file.endswith('.csv'):file_data = pd.read_csv(os.path.join(base_dir, file))file_data['id'] = file.split('_')[-1].replace('.csv', "")#file_data['spcTime'] = file.split('_')[-2]res = pd.concat([res, file_data], axis=0)

上万个文件concat,一下午都没跑完。主要就是因为每一次迭代都调用concat特别耗时。所以,尽量避免循环文件时每一步都concat,就快了几百倍,改进后的写法如下:

def concat_high_freq(base_dir, output_name='test_combined'):'''将高频数据的多个文件合并到一起,综合考虑到读取速度与储存大小,保存为parquet格式'''dfs = []for file in tqdm(os.listdir(base_dir)):if file.endswith('.csv'):file_data = pd.read_csv(os.path.join(base_dir, file))file_data['id'] = int(file.split('_')[-1].replace('.csv', ""))#file_data['spcTime'] = file.split('_')[-2]dfs.append(file_data)# res = pd.concat([res, file_data], axis=0)dfs.sort(key=lambda x: x.id[0])res = pd.concat(dfs)

多循环注意别特征列重复

第二个的背景是生成特征时的小技巧。机器学习任务需要反复实验,尤其是尝试新特征时,因此每次灵活选择特征是很重要的。我一般在特征开始时生成一个新list,然后每次尝试新增一组特征时,都把新加的特征列名扔进这个深拷贝的list里。
不过,今天却小翻车了一下,feature_cols就是我用来保存特征名字的列表,一开始的代码长这样:

def get_lag_feature(data, lag_length, lag_features, feature_cols=[]):qids = sorted(np.unique(data['QUEUE_ID']))data_out = pd.DataFrame()for qid in tqdm(qids):data_qid = data.loc[data['QUEUE_ID'] == qid].copy(deep=True)for i in range(lag_length):for col in lag_features:feature_col = '{}_lag{}'.format(col, i+1)data_qid[feature_col] = data_qid[col].shift(-i)feature_cols += [feature_col]data_qid.drop(columns=lag_features, inplace=True)data_qid = data_qid.iloc[:-10]  # 去掉最后10条NAdata_out = data_out.append(data_qid)data_out = data_out.reset_index(drop=True)print(data_out.shape)return data_out

这一段生成的数据保存,竟然足足有4G之多,内存直接爆炸后面都没法跑了。然后,找到问题改进以后,就只有130M了,改进后就是下面这段代码。

def get_lag_feature2(data, lag_length, lag_features, feature_cols=[]):temp = pd.DataFrame()qids = sorted(data['QUEUE_ID'].unique())for qid in tqdm(qids):  # 按QUEUE_ID进行处理queue = data[data['QUEUE_ID'] == qid].copy(deep=True)# 生成时间窗数据for i in range(lag_length):for sf in lag_features:new_f = '%s_%d' % (sf, i + 1)queue[new_f] = queue[sf].shift(-i)# 删除原来的列queue.drop(columns=lag_features, inplace=True)# 对于每个QUEUE_ID,丢弃最后10条有NAN值的数据queue = queue.head(queue.shape[0] - 10)temp = temp.append(queue)# 重设索引data = temp.reset_index(drop=True)return data

主要问题出在哪里呢?就是最后返回的时候,我们可以输出一下最后的维度

print(data_out[feature_cols].shape)

为了找到问题,看一下之前保存的数据维度是(495024, 1052), 之后保存的数据的维度是(495024, 40)。 所以数据巨大的原因其实出在了feature_cols上。由于这里有三层循环,最外层的循环是针对每一个ID的,由于有几百个ID,导致需要的列重复了几百遍,占有的空间也就增大了几百倍。想要解决这个问题,或者调整循环顺序,或者把feature_cols换一种数据结构:集合set。

大概这就是copy-paste代码,自己稍微一改就容易出错的原因吧。

联系方式

公众号搜索:YueTan

数据挖掘:分享两个Pandas使用小陷阱相关推荐

  1. 怎样压缩照片?分享两种压缩照片小技巧

    怎样压缩照片的大小呢?不管是我们使用手机还是电脑,都会经常需要使用到图片,加上现在数码科技的进步,往往一部手机拍出来的照片就有十几兆那么大,当这些图片的数量多起来,我们存储图片会占据很大内存,发送图片 ...

  2. 什么软件可以拍证件照电子版?分享两种拍证件照小妙招

    有什么软件可以直接拍出电子版证件照呢?相信大家已经发现现在办理很多业务或者是事情都会使用到证件照,大家的证件照很多都是拍了已经很久了,与现在的差别比较大不能用,又或者是证件照用完了又急需要用证件照,这 ...

  3. 怎么把模糊照片修复清晰?分享两个修复图片小技巧

    怎么把模糊的照片修复清晰呢?在日常生活中,我们经常会使用手机或者是相机来拍摄一些照片,用这种方式来记录成长过程或美好瞬间.对于家中的长辈也是如此,在他们年轻的时候能够拍摄照片格外珍贵,如果保存至今可能 ...

  4. 手机拍照翻译成中文怎么做?分享两个手机翻译小妙招

    如何用手机拍照就能够把英文翻译成中文呢?大家出门在外遇到路上贴的英语告示,看不懂的话就会很尴尬,不知道讲的是什么内容,这时候如果有能够直接拍照翻译的软件就会方便很多,今天给大家带来两个可以手机拍照翻译 ...

  5. PDF分割成一页一页的怎么做?分享两种分割页面小妙招

    如何将PDF文件分割成一页一页的呢?大家在使用PDF文件的过程中,肯定会遇到需要编辑文件的时候,有时是文件的内容出现了错误,有时是需要合并或者分割页面,就比如我们遇到需要将PDF文件分割成一页一页的时 ...

  6. Pandas数据探索分析,分享两个神器!

    在使用 pandas 进行数据分析时,进行一定的数据探索性分析(EDA)是必不可少的一个步骤,例如常见统计指标计算.缺失值.重复值统计等. 使用 df.describe() 等函数进行探索当然是常见操 ...

  7. 分享两个小技巧,让你的PPT看起来更高级

    你还在以纯色背景制作PPT?这样制作出来的PPT虽然可能没有差错,但是就很平平无奇吧?今天想跟大家分享两个小技巧,让你的PPT看起来更高级哦. 1.立体图片墙排版 这种排版通过透视围绕布局,营造出立体 ...

  8. android简单小程序学成语,分享3个成语游戏小程序,让你学习游戏两不误

    原标题:分享3个成语游戏小程序,让你学习游戏两不误 1.杜甫教成语 杜甫教成语,一个轻松简单的学成语小程序,是一个猜字型的小程序,是一个考验我们的成语词库深度的小程序.杜甫教成语其实是一个既可以玩游戏 ...

  9. PDF文件怎么转Word?分享两种转换小技巧

    如何将PDF文件转换成Word文档呢?PDF文件大家在日常的办公过程中经常会使用到,发送文件不仅非常方便,而且还会保证我们的文件格式不会出现错乱.但当我们想要编辑文件的时候,可以把它转换成Word文档 ...

最新文章

  1. java技术培训之File类中常用的构造方法
  2. 1024 鲲鹏开发者技术沙龙·福州站圆满收官!给程序员的福利你收到了吗?
  3. Crontab使用详解
  4. IP Cam须改原厂密码防黑客
  5. 【BUG记录】百度人脸识别采集黑屏
  6. Oracle不连续的值,如何实现查找上一条、下一条
  7. Flask 上下文源码解析
  8. 盘点世界上的巨无霸发电机
  9. .NET环境下生成JSON的类库 - JSON.NET
  10. Java架构师面试题系列之Mybatis面试专题(36题,含详细答案解析)
  11. java中介者模式例子_Java中介者模式(Mediator Pattern)
  12. poj 1696 Space Ant
  13. ElasticSearch学习(一):Linux环境准备
  14. MAC安装Securecrt
  15. 计算机术语中的cpu是指什么意思是,什么叫cpu_cpu是什么意思_电脑cpu意思介绍 - 系统家园...
  16. JS 案例 个人所得税计算器
  17. Java——aaa是文件夹,里面有bbb.txt,ccc.txt,ddd.txt这些文件,有eee这样的文件夹,eee中有fff.txt和ggg.txt,打印出层级来
  18. 01背包问题深度理解
  19. html手机上怎么修改,怎么用手机修改路由器密码?
  20. 4000块一晚,住进地下88米深坑,这是全国首家AI超五星酒店

热门文章

  1. redis 同步化操作
  2. 当我们在谈论multidex65535时,我们在谈论什么
  3. SpringMVC:学习笔记(5)——数据绑定及表单标签
  4. 遇到个鬼,在WIN08的DELL R710上安装CENTOS 63,无法格式化以前的硬盘分区,安装无法进行下去。...
  5. 在ARC工程中制定部分文件不适用ARC编译的方法【转】
  6. 三行代码实现阿拉伯数字转中文大小写转
  7. Java输入输出入门 A+B
  8. python3 开发面试题(collections中的Counter)6.7
  9. 有许多部分没有在cgroup中显示啊,current/high/low/min等等
  10. python字符串,列表,字典的常用方法