用于从文本文件中采样行的命令行界面
项目描述
subsample 是一个从大型、换行符分隔的数据集中采样数据的命令行工具(通常是类似CSV的文件)。
安装
subsample 与 pip 一同分发。一旦您安装了 pip,只需运行
> pip install subsample
然后 subsample 将被安装到您的Python环境中。
用法
subsample 需要一个参数,即输入文件。如果输入文件是 -,则将从标准输入读取数据(在这种情况下,只能使用水库和近似算法)。
简单示例
要从 big_data.csv 文件中抽取1000个样本,按照以下方式运行 subsample
> subsample -n 1000 big_data.csv
这将打印出文件中的1000条随机行到终端。
文件重定向
通常我们希望将样本保存到另一个文件中。 subsample 并未内置文件输出;相反,它依赖于终端的输出重定向功能。要将样本保存到 big_data_sample.csv,运行以下命令
> subsample -n 1000 big_data.csv > big_data_sample.csv
从标准输入采样
要使用标准输入作为源,请使用 - 作为文件名,例如
> subsample -n 1000 < big_data.csv > big_data_sample.csv
请注意,只有水库抽样支持stdin,因为其他抽样算法需要可定位的输入流。
标题行
CSV文件通常具有包含列名的标题行。您可以通过传递 -r 标志给 subsample 来保留标题行
> subsample -n 1000 big_data.csv -r > big_data_sample.csv
很少,您可能需要从具有跨越多行的标题的文件中进行抽样。 -r 参数可以指定要保留作为标题的行数
> subsample -n 1000 -r 3 data_with_header.csv > sample_with_header.csv
请注意,如果 -r 参数直接位于输入文件名之前,它必须有一个参数,否则它将尝试将输入文件名解释为标题行数,从而失败。将 -r 参数放在输入文件名之后可以避免这种情况。
随机种子
subsample 的输出是随机的,依赖于计算机的随机状态。有时您可能希望以可重复的方式抽样。您可以通过使用 -s 标志将随机种子传递给 subsample 来实现这一点。
> subsample -s 45906345 data_file.csv > reproducable_sample.csv
抽样算法
算法比较
subsample 实现了三种抽样算法,每种算法都有其自身的优缺点。
蓄水池 |
近似 |
两遍扫描 |
|
---|---|---|---|
标志 |
-res |
-app |
-tp |
stdin-兼容性 |
是 |
是 |
否 |
空间复杂度 |
O(ss*rs) |
O(1) |
O(1) |
固定样本大小 |
兼容 |
不兼容 |
兼容 |
分数样本大小 |
不兼容 |
兼容 |
兼容 |
样本顺序 |
随机 |
来源 |
来源 |
对于空间复杂度,ss 是样本中的记录数,而 rs 是记录的最大大小。
样本顺序是返回的记录的顺序。只有蓄水池抽样会以随机顺序给出结果;近似和两遍扫描以与源数据相同的顺序返回结果。
蓄水池抽样
蓄水池抽样(Random Sampling with a Reservoir (Vitter 85))是一种从未知大小的流中进行抽样的方法,其中样本大小是预先固定的。它是一个单遍算法,使用的空间与样本中的数据量成比例。
蓄水池抽样是 subsample 默认使用的算法。为了保持一致性,也可以使用 --reservoir 参数来调用。
在使用蓄水池抽样时,样本大小必须是固定的,而不是分数形式的。
示例
> subsample --reservoir -n 1000 big_data.csv > sample_data.csv
近似抽样
近似抽样简单地以样本比例给出的概率将每行包含在样本中。它是一个无状态的算法,空间要求最小。样本的大小平均为 fraction * population_size,但每次调用之间会有所不同。由于这个原因,近似抽样仅在样本大小不需要精确时才有用(因此得名)。
示例
> subsample --approximate -f 0.15 my_data.csv > my_sample.csv
等价地,通过将 -f 切换到 -p 来提供一个百分比而不是分数。
> subsample --approximate -p 15 my_data.csv > my_sample.csv
两遍扫描抽样
正如其名所示,两遍扫描抽样使用两遍:第一遍是统计记录数(即人口规模),第二遍是发出样本中的记录。因此,它不兼容作为输入的 stdin。
示例
> subsample --two-pass -n 1000 my_data.csv > my_sample.csv
两遍扫描抽样也接受分数或百分比形式的样本大小。
> subsample --two-pass -p 15 my_data.csv > my_sample.csv
测试
包含了一个简单的 GNU Make 驱动的测试脚本。在安装后,从 subsample 的基本目录中运行 make test 以运行一些回归测试。
由于随机抽样的固有随机性,测试仅限于检查在随机种子未改变时输出是否相同。这主要用来寻找未来更改引入的新错误,并不表示代码本身是正确的(即样本确实是随机的)。
项目详情
subsample-0.0.6.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 71f205c30b2ed5fff6abbfebccf33261f22b5307daf49281f1c55530a79dc98e |
|
MD5 | 151e05021661409ac0d242513100514a |
|
BLAKE2b-256 | 2186ff247222b81baa8b47a9970c76e6f930662d7b9336e669f7e4b39857e674 |