Python + Postgresql:调用数据进行计算(滚动/扩展窗口)+多线程的理想方法?

时间:2018-03-11 23:26:15

标签: python multithreading postgresql pandas sqlalchemy

我有一个庞大的数据库(包含数百万行的约100个变量),由库存数据组成。我设法通过sqlalchemy(postgreql + psycopg2)将python与数据库连接起来。我在云上运行它。

原则上我想做一些事情: 1)所有可能组合的回归:我正在运行每个股票的简单回归,即XYZ上的ABC和ABC上的XYZ,这在n = 100股票中,产生n(n + 1)/ 2个组合。 - >我想到了一个调用股票对的函数,两个回归并比较结果并根据某些标准选择一个。 我的问题:是否有一种有效的方式来调用“阶乘”?

2)滚动窗口:为了避免数据过载,我想只调用调查数据帧,即30天,然后每天滚动,这意味着我的句点是:

 1: 1D-30D
 2: 2D-31D and so on

含义我总是在第一天删除并在数据帧的末尾添加另一行。这意味着我有两个步骤,第一天放弃并从我的数据库中读取下一行。 我的问题:这是一种有意义的方式还是Python有更好的东西?你会怎么做?

3)扩展窗口:我保留30天并添加另外30天,然后运行我的回归,而不是删除第一行并添加另一行。问题在这里,在某些时候我会接受所有可能对内存来说太大的数据? 我的问题:这里的解决方法是什么?

4)当我在云上运行我的分析(比我自己的电脑多一些内核)时,实际上我可以使用多线程,发送“批处理”作业并让Python并行处理。我想把我的数据集拆分成4x25股票并让它并行运行(所以垂直分割),还是我应该更好地水平分割? 另外我使用的是Jupyter;我想知道如何最好地接近这里,通常我有一个调用my_program.py的shell脚本。这是一样的吗?

1 个答案:

答案 0 :(得分:1)

让我试着断然给出答案,并注意我的观察。

  1. 根据您的描述,我认为您已将每个股票代码作为一个变量,并且您正尝试在它们之间执行pairwaise线性回归。关于这一点的好消息 - 它是高度平行的。您需要做的就是生成所有可能配对的唯一组合并执行回归,然后只保留符合您标准的模型。
  2. 现在因为股票是你的变量,我假设行是他们的价格或类似的值,但肯定是一些时间序列数据。如果我的假设是正确的,则滚动窗口方法存在问题。在创建这些滚动窗口时,您隐含所做的是使用名为“bootstrapping”的数据采样方法,该方法使用随机但重复的采样。但由于只是滚动数据,您不会使用随机抽样,这可能会给您的回归结果带来问题。最好的模型可能只是过度训练,最糟糕的是,我无法想象。因此,放弃这个appraoch。此外,如果它是时间序列数据,那么整个窗口概念无论如何都会有问题。
  3. 由于上述原因,扩展窗户并不好。
  4. 关于内存和可处理性 - 我认为这是一个很好的场景,可以使用Spark。它正是为此目的而构建的,并且对python有很好的支持。数百万的数据点对Spark来说没什么大不了的。此外,您还可以大规模并行化您的运营。在云基础架构上,您还可以轻松获得可配置性和可扩展性。我不知道为什么人们喜欢使用Jupyter,即使是像这样的批处理任务,但如果你一直都在使用它,那么PyPark内核也得到了Jupyter的支持。垂直分割可能是正确的方法。
  5. 希望这些能回答你的问题。