Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python+;Postgresql:调用数据进行计算(滚动/扩展窗口)的理想方式&x2B;多线程?_Python_Multithreading_Postgresql_Pandas_Sqlalchemy - Fatal编程技术网

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

Python+;Postgresql:调用数据进行计算(滚动/扩展窗口)的理想方式&x2B;多线程?,python,multithreading,postgresql,pandas,sqlalchemy,Python,Multithreading,Postgresql,Pandas,Sqlalchemy,我有一个巨大的数据库(大约100个变量,有几百万行)由股票数据组成。我设法通过sqlalchemy(postgreql+psycopg2)将python与数据库连接起来。我在云上运行它 原则上我想做几件事: 1) 所有可能组合的回归:我正在对每个股票进行简单的回归,即XYZ上的ABC和ABC上的XYZ,这在n=100个股票中进行,结果是n(n+1)/2个组合。 ->我想到一个函数,它调用股票对,进行两次回归,比较结果,然后根据一些标准选择一个。 我的问题是:有没有一种有效的方法来调用“阶乘” 2

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

原则上我想做几件事: 1) 所有可能组合的回归:我正在对每个股票进行简单的回归,即XYZ上的ABC和ABC上的XYZ,这在n=100个股票中进行,结果是n(n+1)/2个组合。 ->我想到一个函数,它调用股票对,进行两次回归,比较结果,然后根据一些标准选择一个。 我的问题是:有没有一种有效的方法来调用“阶乘”

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

 1: 1D-30D
 2: 2D-31D and so on
这意味着我总是在第一天删除数据帧,并在数据帧的末尾添加另一行。这意味着我有两个步骤,第一天就放弃,然后从数据库中读取下一行。 我的问题:这是一种有意义的方式还是Python有更好的方法?你会怎么做

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

4) 当我在云上运行我的分析时(比我自己的pc多几个内核),事实上我可以使用多线程,发送“批处理”作业,并让Python并行处理。我想把我的数据分成4x25个股票,让它并行运行(垂直分割),还是最好水平分割?
此外,我正在使用Jupyter;我想知道如何在这里找到最好的方法,通常我有一个shell脚本,名为my_program.py。这里也是这样吗?

让我尝试明确地给出答案,并记下我的观察结果

  • 根据你的描述,我想你已经把每一张股票作为一个变量,并且你正在尝试在它们之间进行两两线性回归。这是个好消息,它是高度平行的。你所需要做的就是生成所有可能配对的唯一组合并执行回归,然后只保留那些符合你标准的模型
  • 现在,由于股票是变量,我假设行是它们的价格或类似的值,但肯定是一些时间序列数据。如果我的假设是正确的,那么滚动窗口方法存在问题。在创建这些滚动窗口时,隐式地使用名为“”的数据采样方法,该方法使用随机但重复的采样。但由于只是滚动数据,您没有使用随机抽样,这可能会给回归结果带来问题。最好的情况下,这种模式可能只是过度训练,最坏的情况下,我无法想象。因此,请放弃此方法。另外,如果它是一个时间序列数据,那么窗口的整个概念无论如何都是有问题的
  • 由于上述相同的原因,扩展窗口是不好的
  • 关于内存和可处理性-我认为这是一个很好的场景,可以使用。它正是为此目的而构建的,并且对python有极好的支持。数百万个数据点对Spark来说没什么大不了的。此外,您将能够大规模并行化您的操作。在云基础设施上,您还可以在可配置性和可扩展性方面获得优势,而无需头痛。我不知道为什么人们喜欢使用Jupyter,即使是对于像这样的批处理任务,但如果你下定决心要使用它,那么Jupyter也支持PySpark内核。垂直分割可能是正确的方法

  • 希望这些能够回答您的问题。

    ~100个变量,包含数百万行。
    您可能做错了。亲爱的Chadwick,非常感谢您的回答:1。是的,这就是我想做的。2.这是一种回溯测试;想象一下,你花了30天的时间去寻找一些关系,然后明天你开始用它做一些事情,假装你以特定的频率得到了一些数据点。但当然,过度装修是一个问题。4.所以我假设(不知何故不能点击链接)它不是Python中的spark模块,而是ApacheSpark本身,即从postgres中提取并迁移到AS?我不是在关注Jupyter,任何其他的都可以(只是除了RStudio和Matlab,从来没有使用过其他任何东西)@eternity1看起来标准时间序列模型(ARIMA系列)会更适合这样的任务,但是你更了解用例。至于ApacheSpark,是的,您必须使用Spark运行时和PySpark SDK。Spark可以连接到任何数据库并并行读取数据。。如果答案对你有帮助,请你也标出好吗?