用于从文本文件中采样行的命令行界面
subsample的Python项目详细描述
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
从stdin
取样要使用标准输入作为源,请使用-作为文件名,例如:
> 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实现了三种采样算法,每种算法都有自己的优点 以及弱点。
Reservoir | Approximate | Two-pass | |
---|---|---|---|
flag | ^{tt21}$ | ^{tt22}$ | ^{tt23}$ |
^{tt24}$-compatible | yes | yes | no |
space complexity | ^{tt25}$ | ^{tt26}$ | ^{tt26}$ |
fixed sample size | compatible | not compatible | compatible |
fractional sample size | not compatible | compatible | compatible |
sample order | random | source | source |
空间复杂度,^ {TT28 } $是样本中的记录数 {TT29 } $是记录的最大大小。
样本顺序是返回记录的顺序。仅储层取样 给出随机顺序的结果;近似和两遍返回结果 与源数据的顺序相同。
储层取样
储层取样(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到a-p:
> subsample --approximate -p 15 my_data.csv > my_sample.csv
近似抽样简单地包含样本中的每一行的概率 作为样本比例给出。它是一个具有最小空间的无状态算法 要求。样本的平均大小为fraction * population_size, 但每次调用都会有所不同。正因为如此,近似抽样 仅当样本大小不必精确(因此名称)时才有用。
示例:
> subsample --approximate -f 0.15 my_data.csv > my_sample.csv
等效地,通过切换 -f到a-p:
> subsample --approximate -p 15 my_data.csv > my_sample.csv
两次采样
顾名思义,双通采样使用两个pas塞斯:首先是数一数 记录的数量(即总体大小),第二个是发出记录 它们是样本的一部分。因此它与^{tt24}不兼容$ 作为输入。
示例:
> subsample --two-pass -n 1000 my_data.csv > my_sample.csv
两次抽样也接受样本量作为分数或百分比:
> subsample --two-pass -p 15 my_data.csv > my_sample.csv
测试
包括一个简单的gnu make驱动测试脚本。运行make testfrom subsample的基本目录,安装后运行一些回归测试。
由于随机抽样固有的随机性,测试仅限于 当随机种子不变时检查输出是否相同。 这主要是为了发现未来变化带来的新bug,以及 并不意味着代码本身是正确的(从示例的意义上说 确实是随机的)。