从文本文件中采样行的命令行界面
项目描述
sample是一个从大型、以换行符分隔的数据集中采样数据的命令行工具(通常类似于CSV文件)。
安装
sample与pip一起分发。一旦您安装了pip,只需运行
> pip install sample-cli
然后sample将被安装到您的Python环境中。
使用方法
sample需要一个参数,即输入文件。如果输入文件是-,则数据将从标准输入读取(在这种情况下,只能使用水库和近似算法)。
简单示例
要从文件big_data.csv中采样1000个样本,按以下方式运行sample
> sample -n 1000 big_data.csv
这将在终端打印出文件中的1000行随机数据。
文件重定向
通常我们希望将样本保存到另一个文件中。sample没有内置文件输出;相反,它依赖于您终端的输出重定向功能。要将数据保存到big_data_sample.csv,请运行以下命令
> sample -n 1000 big_data.csv > big_data_sample.csv
标题行
CSV文件通常具有带有列名的标题行。您可以通过传递-r标志到sample来保留标题行
> sample -n 1000 big_data.csv -r > big_data_sample.csv
很少,您可能需要从具有跨越多行的标题的文件中采样。-r参数可以指定要保留作为标题的行数
> sample -n 1000 -r 3 data_with_header.csv > sample_with_header.csv
注意:如果参数-r直接位于输入文件名之前,它必须有一个参数,否则它将尝试将输入文件名解释为标题行数,并失败。将参数-r放置在输入文件名之后可以避免这种情况。
随机种子
sample的输出是随机的,依赖于计算机的随机状态。有时您可能想要以一种可以重现的方式进行抽样。您可以通过使用-s标志将随机种子传递给sample,以实现这一点。
> sample -s 45906345 data_file.csv > reproducable_sample.csv
抽样算法
算法比较
sample实现了三种抽样算法,每种算法都有其自身的优点和缺点。
水库抽样 |
近似 |
两次遍历 |
|
---|---|---|---|
标志 |
--res |
--app |
--tp |
与stdin兼容 |
是 |
是 |
否 |
空间复杂度 |
O(ss * rs) |
O(1) |
O(ss) |
固定样本大小 |
兼容 |
不兼容 |
兼容 |
分数样本大小 |
不兼容 |
兼容 |
兼容 |
对于空间复杂度,ss是样本中的记录数,而rs是记录的最大大小。
水库抽样
水库抽样(使用水库的随机抽样(Vitter 85))是一种从未知大小的流中进行抽样的方法,其中样本大小预先固定。它是一个单遍历算法,使用与样本中的数据量成比例的空间。
水库抽样是sample默认使用的算法。为了保持一致性,也可以使用参数--reservoir来调用它。
如果使用水库抽样,样本大小必须是固定的,而不是分数。
示例
> sample --reservoir -n 1000 big_data.csv > sample_data.csv
近似抽样
近似抽样简单地以给定的样本比例的概率包括每个行到样本中。它是一个无状态算法,空间需求最小。样本的平均大小将是fraction * population_size,但它在每次调用之间会有所不同。因此,近似抽样仅当样本大小不需要精确时才有用(因此得名)。
示例
> sample --approximate -f 0.15 my_data.csv > my_sample.csv
等效地,通过将-f切换到-p来提供一个百分比而不是分数。
> sample --approximate -p 15 my_data.csv > my_sample.csv
两次遍历抽样
两次遍历抽样允许两次遍历,第一次是计算记录数(即,总体大小),第二次是输出样本中的记录。因此,它不兼容stdin作为输入。
由于两次遍历抽样知道总体大小,它将接受分数或固定数量的元素作为样本大小。
示例
> sample --two-pass -p 15 my_data.csv > my_sample.csv
两次遍历抽样使用的内存与样本中的元素数量成比例。