从表中随机选择行-Python Pandas读取SQL

时间:2019-03-06 11:04:08

标签: python pandas random amazon-redshift

我必须在给定的日期时间范围内从Post GRE表中随机选择行。我现在这样做的方式是查询日期时间范围内的表,然后随机选择行。(请参阅下文)由于查询范围内有10 GB的数据,这在查询方面变得非常低效。有一个更好的方法吗?请指教

sp = pd.read_sql("SELECT * FROM table1 WHERE timestamp >= '"+sampling_start_date+"' and timestamp <= '"+sampling_end_date+"'", con)

random_subset = sp.sample(n=300)

时间戳格式如下

sampling_start_date = "2018-08-17 20:00:00"

1 个答案:

答案 0 :(得分:0)

从表中选择随机的行数

可以使用随机数SQL函数选择行的随机样本。例如,在PostgreSQL中,它是random()

选择的行数取决于没有随机采样的情况下选择的行数以及采样概率,

例如,如果表包含5,000行并且采样概率小于0.1,则将选择约500行(5,000的10%)。

如果WHERE子句在没有随机抽样的情况下选择了1,500行,而抽样概率小于0.2,则将选择约300行(1,500的20%)。

请注意,使用此方法不能保证所选行的确切数目(这就是概率的本质...),因此,为了使行数接近所需的值,您必须适当选择概率

还要注意,如果您想重复此过程并每次都获得相同的结果,则必须为随机数生成器提供相同的值。您可以使用setseed()函数来做到这一点:

SELECT setseed(.123);

最后,random()函数存在于PostgeSQL中。其他数据库引擎可能对该函数使用不同的名称(例如,在MySQL和SQL Server中,我相信它是rand())。

有关某些示例,请参见以下select语句。

-- all rows
select count(*) from my_table;
--   5264

-- should get about half of all rows
select count(*) from my_table where random() < 0.5;
--  2734

-- should get about 10% of all rows
select count(*) from my_table where random() < 0.1;
--   513

-- all rows matching some criteria
select count(*) from my_table where id > 100000 and id < 400000;
-- 3023

-- about half of the rows matching the above criteria
select count(*) from my_table where id > 100000 and id < 400000 and random() < 0.5;
-- 1527

-- about 10% of the rows matching the above criteria
select count(*) from my_table where id > 100000 and id < 400000 and random() < 0.1;
-- 283