Python R(数据挖掘算法)中的前瞻时间分析

Python R(数据挖掘算法)中的前瞻时间分析,python,r,perl,machine-learning,data-analysis,Python,R,Perl,Machine Learning,Data Analysis,我有一个文件(几十列和数百万行),基本上如下所示: customerID VARCHAR(11) accountID VARCHAR(11) snapshotDate Date isOpen Boolean ... 1,100,200901,1,... 1,100,200902,1,... 1,100,200903,1,... 1,100,200904,1,... 1,100,200905,1,... 1,100,200906,1,... ... 1,100,201504,1,... 1,10

我有一个文件(几十列和数百万行),基本上如下所示:

customerID VARCHAR(11)
accountID VARCHAR(11)
snapshotDate Date
isOpen Boolean
...
1,100,200901,1,...
1,100,200902,1,...
1,100,200903,1,...
1,100,200904,1,...
1,100,200905,1,...
1,100,200906,1,...
...
1,100,201504,1,...
1,100,201505,1,...
1,100,201506,1,...
>date --date='201106' "+%s"
1604642400
文件中的一条记录可能如下所示:

customerID VARCHAR(11)
accountID VARCHAR(11)
snapshotDate Date
isOpen Boolean
...
1,100,200901,1,...
1,100,200902,1,...
1,100,200903,1,...
1,100,200904,1,...
1,100,200905,1,...
1,100,200906,1,...
...
1,100,201504,1,...
1,100,201505,1,...
1,100,201506,1,...
>date --date='201106' "+%s"
1604642400
当账户关闭时,可能会发生两件事。通常,数据中不存在该记录的其他快照。偶尔会继续添加更多记录,但isOpen标志将设置为0

我想添加一个额外的布尔列,称为“closedInYr”,该列的值为0,除非帐户在快照日期后一年内关闭

我的解决方案又慢又粗糙。它接受每条记录,在12个月内向前计数,如果发现一条记录的customerID、accountID和isOpen设置为1,则在“closedInYr”字段中用0填充该记录,否则用1填充该字段。它可以工作,但性能是不可接受的,我们有许多这样的文件要处理

关于如何实现这一点有什么想法吗?我使用R,但我愿意用Perl、Python或除COBOL或VB之外的任何语言编写代码


谢谢

我建议使用Linux“date”命令将日期转换为unix时间戳。 Unix时间戳是自1970年1月1日以来经过的秒数。所以基本上一年是60秒,60米,24小时,256d秒。因此,如果时间戳之间的差异大于这个数字,那么它就超过了一年

它将是这样的:

customerID VARCHAR(11)
accountID VARCHAR(11)
snapshotDate Date
isOpen Boolean
...
1,100,200901,1,...
1,100,200902,1,...
1,100,200903,1,...
1,100,200904,1,...
1,100,200905,1,...
1,100,200906,1,...
...
1,100,201504,1,...
1,100,201505,1,...
1,100,201506,1,...
>date --date='201106' "+%s"
1604642400

因此,如果您使用perl,这是一种非常酷的文件处理语言,您将在几行中解析整个文件,如果给定记录的所有快照都显示在一行中,并且在同一时间段内打开的记录具有相同的长度,则使用eval“you date command”

(即,定期拍摄快照),那么一种可能是基于行长度进行过滤。如果最长的开放行长度为N,一年的记录长度为M,那么您知道一个N-M行是开放的,最长的,比最长的少一年……这种方法无法处理快照不断增加的情况,尽管开放标志设置为0,但它可能允许您使用c是否至少通过减少每行需要进行的搜索数量来减少搜索数量

至少,这是一个想法。更一般地说,从年底开始搜索isOpen==1的最后一年可能会减少搜索量


当然,所有这些都假设每条记录都在一行中。如果不是这样,可能会先进行熔化?

一个可复制的示例将提高找到解决方案的机会。Python可能是您的最佳选择,因为我觉得它更有效,尤其是在数据挖掘方面。另外,可复制的数据是一个加号。这是一个比您想象的更简单的解决方案建议添加一列记录帐户关闭的年份。然后您可以执行简单的行操作来确定ClosedInYr“一个比您建议的更简单的解决方案是添加一列记录帐户关闭的年份。”是的,问题是我不知道该帐户关闭的年份,我只知道该帐户不再出现在文件中。您如何查找不存在的内容?此外,要求还提供添加布尔季度和月份列以及年份列,因此我需要一个适用于任意时间的通用解决方案句号:一个可重复的示例将提高找到解决方案的机会。“我理解。我不是在寻找解决方案,而是在寻找算法。我的文件无法放入内存,因此我希望一个方法一次最多只需要加载12条记录。