我有一个大约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
我猜我用错了索引,但我不知道出了什么问题,它基本上和前面一样,但不是求结果列,而是计算行的总和。。。有道理吗?在