当前位置: 首页 > 科技观察

6个Pandas新手错误_0

时间:2023-03-12 03:19:17 科技观察

这里我们讨论6个新手错误,这些错误与您使用的工具的API或语法无关,但与您的知识和经验水平直接相关。在实践中,如果出现这些问题,可能不会有任何错误提示,但是会给我们在应用中带来很多麻烦。1.使用Pandas自带的函数读取文件第一个错误与实际使用Pandas完成一些任务有关。具体来说,我们实际处理表的数据集是非常大的。使用pandas的read_csv读取大文件将是你最大的错误。为什么?因为它太慢了!查看我们加载TPSOctober数据集的测试,该数据集有100万行和大约300个特征,占用2.2GB的磁盘空间。importpandasaspd%%timetps_october=pd.read_csv("data/train.csv")Walltime:21.8sread_csv花费了大约22秒。你可能会说22秒并不多。但是在一个项目中,需要在不同阶段进行很多实验。我们为清理、特征工程、模型选择和其他任务创建了许多单独的脚本。多次加载数据等待20秒就变成了很长的时间。此外,数据集可以更大更长。那么更快的解决方案是什么?解决方案是在这个阶段放弃Pandas并使用其他为快速IO设计的替代方案。我最喜欢的是datatable,但你也可以选择Dask、Vaex、cuDF等。下面是用datatable加载同一个数据集所花费的时间:importdatatableasdt#pipinstalldatatble%%timetps_dt_october=dt.fread("data/train.csv").to_pandas()------------------------------------------------------------Walltime:2s只有2秒,10倍的差距2.没有矢量化函数式编程中最重要的规则之一是永远不要使用循环.似乎在使用Pandas时坚持这种“无循环”规则是加速计算的最佳方式。函数式编程用递归代替循环。虽然递归存在各种问题(我们这里不考虑这个),但是向量化是科学计算的最佳选择!Pandas和NumPy的核心是矢量化,它对整个数组而不是单个标量执行数学运算。Pandas已经有了一套广泛的矢量化函数,我们不需要重新发明轮子,只需关注我们的焦点是如何计算的。Pandas中的大多数Python算术运算符(+、-、*、/、**)都以矢量化方式工作。此外,您在Pandas或NumPy中看到的任何其他数学函数都已矢量化。为了验证速度的提升,我们将使用下面的big_function,它以三列作为输入并执行一些无意义的运算作为测试:defbig_function(col1,col2,col3):returnnp.log(col1**10/col2**9+np.sqrt(col3**3))首先,我们将此函数与Pandas最快的迭代器一起使用-apply:%timetps_october['f1000']=tps_october.apply(lambdarow:big_function(row['f0'],row['f1'],row['f2']),axis=1)---------------------------------------------------Walltime:20.1s操作耗时20秒。让我们使用核心NumPy数组以矢量化的方式做同样的事情:)------------------------------------------------------------------Walltime:82ms只用了82ms,快了大约250倍。事实上我们无法完全摆脱循环。因为并不是所有的数据操作都是数学运算。但是每当你发现自己需要使用一些循环函数(例如apply、applymap或itertuples)时,花点时间看看你想做的事情是否可以向量化是一个很好的习惯。3.数据类型,dtypes我们可以根据内存的使用来指定数据类型。pandas中最差最耗内存的数据类型是object,它也恰好限制了pandas的一些功能。这给我们留下了浮点数和整数。下表是pandas的所有类型:在Pandas的命名方式中,数据类型名称后面的数字表示该数据类型中每个数字将占用多少位内存。所以想法是将数据集中的每一列转换为尽可能小的子类型。我们只需要根据规则判断即可,这里是规则表:一般按照上表将浮点数转换为float16/32,将正负整数的列转换为int8/16/32。您还可以将uint8用于布尔值和纯正整数,以进一步减少内存消耗。这个函数你一定不陌生,因为它在Kaggle中被广泛使用。它根据上表将浮点数和整数转换为它们的最小子类型:defreduce_memory_usage(df,verbose=True):numerics=["int8","int16","int32","int64","float16",“float32”,“float64”]start_mem=df.内存使用情况()。sum()/1024**2forcolindf.列:col_type=df[col].dtypesifcol_typeinnumerics:c_min=df[col].min()c_max=df[col].max()ifstr(col_type)[:3]=="int":如果c_min>np。iinfo(np.int8).min和c_maxnp.iinfo(np.int16)。min和c_maxnp.iinfo(np.int32).min和c_maxnp.iinfo(np.int64).minandc_maxnp.finfo(np.float16).minandc_maxnp.finfo(np.float32).min和c_max>>reduce_memory_usage(tps_october)Mem。使用量减少到509.26Mb(减少76.9%)我们将数据集从原来的2.2GB压缩到510MB当我们将df保存到csv文件时,这种内存消耗的减少就会丢失,因为csv仍然保存为字符串,但如果使用pickle保存它就可以了。为什么要减少内存占用?在使用大型机器学习模型处理此类数据集时,内存占用和消耗起着重要作用。一旦你遇到一些OutOfMemory错误,你就会开始追赶并学习这样的技巧来让电脑愉快地工作(谁让Kaggle只给16G的内存,都是被逼出来的)。4.无样式Pandas最漂亮的功能之一是它能够在显示DF时为其设置不同的样式,在Jupyter中将原始DF渲染为带有一些CSS的HTML表格。Pandas允许通过style属性设置其DataFrame的样式。tps_october.sample(20,axis=1).describe().T.style.bar(subset=["mean"],color="#205ff2").background_gradient(subset=["std"],cmap="reds").background_gradient(subset=["50%"],cmap="coolwarm")我们随机选择20列,为它们创建一个5位数的摘要,并转置结果,根据它们的量级为均值、标准差和中值列着色。添加此类样式将使我们能够更轻松地发现原始数字中的模式,而无需使用额外的可视化库。其实不给df做样式也没什么错。但这是一个非常好的功能,对吧?5.以CSV格式保存文件正如读取CSV文件很慢一样,将数据保存回CSV文件也很慢。以下是将TPS十月数据保存到CSV所需的时间:%%timetps_october.to_csv("data/copy.csv")---------------------------------------Walltime:2min43s差不多用了3分钟。节省镶木地板、羽毛甚至泡菜的时间。%%timetps_october.to_feather("data/copy.feather")墙时间:1.05s--------------------------------------------------------------------------------%%timetps_october.to_parquet("data/copy.parquet")墙时间:7.84s6。不阅读文档实际上,对我来说最大的错误是没有阅读Pandas的文档。但通常没有人阅读文档,对吧?有时我们宁愿在Internet上搜索几个小时也不愿阅读文档。但是对于pandas来说,这是一个非常大的错误。因为它有像sklearn这样优秀的用户指南,涵盖了从基础知识到如何贡献代码,甚至如何设置更漂亮的主题的所有内容(也许它太多了,所以没有人看)。我今天提到的所有错误都可以在文档中找到。文档中甚至还有一个“大型数据集”部分,专门告诉您使用其他软件包(如Dask)来读取大型文件并远离Pandas。实际上,如果我有时间从头到尾阅读用户指南,我可能会犯50个新手错误,所以无论如何都要查看文档。7.总结今天,我们学习了新手在使用Pandas时最容易犯的六个错误。我们在这里提到的大多数错误都与大型数据集有关,并且可能只在处理千兆字节大小的数据集时出现。如果你还在处理泰坦尼克号这样的新手数据集,你可能感觉不到这些问题。但是当你开始使用真实世界的数据集时,这些概念会让别人认为你不是新手,而是有实际经验的人。