python处理300万数据_在大型数据集上使用PostgreSQL进行功能工程(约300万个条目)...

我有一个大约300万个棋局的数据集(现有的列包括玩家姓名、日期、结果和比赛名称)。我想用随机森林来预测棋局的结果。在

为此,我想做一些功能工程。我认为有几个变量是强有力的预测因素,例如,目前为止的比赛成绩,比赛前90天的比赛次数。在

列:- date DATE

- namew TEXT

- nameb TEXT

- whiterank INTEGER

- blackrank INTEGER

- tournament TEXT

- t_round INTEGER

- result REAL

- id BIGINT

- chess_data2_pkey(id)

指标:

^{pr2}$

不幸的是,我的查询相当慢(我写了14个,并在一个较小的数据集上测试了它们,甚至没有1个在8天内完成)。下面是一个简化的版本,我在2小时前安装了它,但仍然没有结果。在SELECT Sum(result)

INTO temp

FROM chess_data2 t1

WHERE id IN (SELECT t2.id

FROM chess_data2 t2

WHERE t1.tournament = t2.tournament

AND t1.namew = t2.namew

AND t1.date < t2.date)

我的问题:我可以用SQL更快地完成这项工作吗(与在i7-4710HQ和12gb内存上一样,在不到10天的时间内完成14个类似的查询?)。也许通过事先明确的分类?在

还有什么方法可以让我更快地实现目标?我试图用Python中的循环来天真地编写这个代码,性能甚至更差,但我听说C更适合这种东西——但究竟有多好呢?在

我使用Python3.5进行估算,使用psycopg2处理SQL。在

编辑:感谢所有有帮助的回复。我成功地使用索引使一些查询非常快速,例如:# Number of points that the white player has so far accrued throughout the tournament

(SELECT coalesce(SUM(result),0) from chess_data2 t2

where (t1.namew = t2.namew) and t1.tournament = t2.tournament

and t1.date > t2.date and t1.date < t2.date + 90)

+ SELECT coalesce(SUM(1-result),0) from chess_data2 t2

where (t1.namew = t2.nameb) and t1.tournament = t2.tournament

and t1.date > t2.date and t1.date < t2.date + 90 ) AS result_in_t_w

from chessdata2 t1

现在只需要大约60秒,这是可以接受的。但是,由于某些原因,像这样的计数选择需要半个多小时(我没有等更长时间)来计算:# Number of games that the white player has so far played in the tournament

(SELECT count(*) from chess_data t2 where (t1.namew = t2.namew) and

t1.tournament = t2.tournament and t1.date > t2.date and t1.date < t2.date + 90)

+ (SELECT coalesce(count(*),0) from chess_data2 t2

where (t1.namew = t2.nameb) and t1.tournament = t2.tournament

and t1.date > t2.date and t1.date < t2.date + 90) AS games_t_w from chess_data2 t1

我猜我用错了索引,但我不知道出了什么问题,它基本上和前面一样,但不是求结果列,而是计算行的总和。。。有道理吗?在

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值