这里我们讨论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_max
