本节使用的代码片段如下:
#加载所需软件库 Import needed library
import pandas as pd
#数据集
csv = "https://raw.githubusercontent.com/nytimes/covid-19-data/master/us-counties.csv"
#加载整个数据集
data = pd.read_csv(csv)
data.info(verbose=False, memory_usage="deep")
#创建数据子集
df = data[["county", "cases"]]
df.info(verbose=False, memory_usage="deep")
#加速所需的两列数据
df_2col = pd.read_csv(csv , usecols=["county", "cases"])
df_2col.info(verbose=False, memory_usage="deep")
代码地址: https://gist.github.com/SaraM92/3ba6cac1801b20f6de1ef3cc4a18c843#file-column_selecting-py
- 操作数据类型
另一个降低数据内存使用量的方法是截取数值项。例如将 CSV 加载到 DataFrame,如果文件中包含数值,那么一个数值就需要 64 个字节存储。但可通过使用 int 格式截取数值以节省内存。
- int8 存储值的范围是 -128 到 127;
- int16 存储值的范围是 -32768 到 32767;
- int64 存储值的范围是 -9223372036854775808 到 9223372036854775807。
如果可预先确定数值不大于 32767,那么就可以使用 int16 或 int32 类型,该列的内存占用能降低 75%。
假定每个州的病例数不超过 32767(虽然现实中并非如此),那么就可截取该列为 int16 类型而非 int64。
- 稀疏列
如果数据集的一或多个列中具有大量的 NaN 空值,那么可以使用稀疏列表示降低内存使用,以免空值耗费内存。
假定州名这一列存在一些空值,我们需要跳过所有包含空值的行。该需求可使用 pandas.sparse 轻松实现(译者注:原文使用 Sparse Series,但在 Pandas 1.0.0 中已经移除了 SparseSeries)。
有损压缩如果无损压缩并不满足需求,还需要进一步压缩,那么应该如何做?这时可使用有损压缩,权衡内存占用而牺牲数据百分之百的准确性。
有损压缩有两种方式,即修改数值和抽样。
- 修改数值:有时并不需要数值保留全部精度,这时可以将 int64 截取为 int32 甚至是 int16。
- 抽样:如果需要确认某些州的新冠病例数要高于其它州,可以抽样部分州的数据,查看哪些州具有更多的病例。这种做法是一种有损压缩,因为其中并未考虑到所有的数据行。
另一个处理大规模数据集的方法是数据分块。将大规模数据切分为多个小分块,进而对各个分块分别处理。在处理完所有分块后,可以比较结果并给出最终结论。
本文使用的数据集中包含了 1923 行数据。