微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我应该在PostgreSQL中为ACIDity做数学吗?

这是我关于数据库管理堆栈交换的第一个问题.如果不是很好的方式,请善待..

我想知道我正在处理我的数据库的方式,以便尽可能地将其作为ACID.

我正在使用Flask Framework(Python)和Postgresql(9.4)数据库处理Web应用程序.我使用SQLAlchemy作为ORM.

我正在对我的对冲基金处理的股票进行财务分析.
我的工作分为3部分:

>每天更新数据库
>做动物数学
>寻找最好的结果
>在网络应用上展示结果

这是我的数据库

安全表(活动列仅表示是否应更新库存):

 id |   ticker       | active 
----+----------------+--------
  1 | 3993 HK Equity | t      
  2 | A2A IM Equity  | t      
  3 | AA UN Equity   | f      
  4 | AA/ LN Equity  | f      
  5 | AAL LN Equity  | t      
  6 | AALB NA Equity | t      

估价表

 security_id |    date    | px_close |  px_open |  px_high |  px_low | volume 
-------------+------------+----------+----------+----------+---------+--------
          42 | 2012-11-06 |   44.757 |   45.099 |   45.336 |  43.918 | 157295 
          42 | 2012-11-07 |   45.099 |   44.791 |   45.099 |  44.226 | 162671 
          42 | 2012-11-08 |   44.245 |   45.051 |    45.08 |  44.241 |  56763 
          42 | 2012-11-09 |   43.994 |   44.307 |   44.672 |  43.771 | 123424 
          43 | 2012-11-06 |  143.994 |  144.255 |  144.601 | 143.785 |  54598 
          43 | 2012-11-07 |  143.885 |  143.629 |  144.108 | 143.524 |  39380 
          43 | 2012-11-08 |  144.392 |  144.056 |  144.928 | 143.866 |  60509 
          43 | 2012-11-09 |  144.008 |  144.563 |   144.61 | 143.913 |  62784 

回归表(我有很多其他类似这样的表,例如polynomial_regression,learning_clustering,multiple_regression等,但它是用于示例):

 security_id | driver_id | security_field | driver_field | lag |     percentile   |      percentage    |      1w_change     |        r2
-------------+-----------+----------------+--------------+-----+------------------+--------------------+--------------------+-------------------
       10260 |       622 | px_open        | px_low       |   0 | 2.39085239085239 |  0.233283156908672 |  -1.65479076267458 |  0.76137019793836
       10260 |       622 | px_open        | best_eps     |   0 | 25.8333333333333 |  0.070876900435926 |   4.62480252764613 | 0.593456515505473
       10260 |       622 | px_high        | px_close     |   0 | 2.18295218295218 |  0.211301222947739 |  -7.67181960128018 | 0.756561105159073
       10260 |       622 | px_high        | px_open      |   0 | 3.01455301455301 |  0.173091398167856 |  -2.06843453731421 | 0.755248026072118
       10260 |       622 | px_high        | px_high      |   0 |  2.5987525987526 |  0.189682461742673 |  -10.5755212601686 | 0.748422363395702
       10260 |       622 | px_high        | px_low       |   0 |  2.5987525987526 |  0.206663840524837 |  -3.72904823112292 | 0.758691421914131
       10260 |       622 | px_high        | best_eps     |   0 | 26.7857142857143 | 0.0642618785351929 |  0.600880162491535 | 0.586932757156747
       10260 |       622 | px_low         | px_close     |   0 | 2.18295218295218 |  0.241074941757577 |  -3.72991088758724 | 0.758602680862882
       10260 |       622 | px_low         | px_open      |   0 | 3.01455301455301 |  0.193588738372212 | -0.616152379637857 | 0.753488068588711
       10260 |       622 | px_low         | px_high      |   0 | 2.80665280665281 |   0.21139288442443 |  -4.97343018089906 | 0.743185969928886

数据库上完成的主要操作是通过Flask应用程序完成的,但并非总是如此.这就是为什么我希望我的数据库尽可能“强大”(我的意思是ACID).更重要的是,我显然更信任Flask的Postgres.

每天凌晨3点更新我的数据库.插入前一天的新值,并且从时间开始(和其他股票,例如刚刚分红后的股票等)更新新的活跃股票.

然后,2小时后,更新完成后,Flask脚本将成对计算所有新回归,并插入结果.
问题是在更新值和更新回归之间,数据库不处于“稳定”状态:已插入新值,但尚未存在相应的回归.

您是否认为我应该将我的所有数学分析从Python翻译成sql,并创建触发器,只要插入新值,就会启动它?

>我的问题是,与其他语言相比,我在处理统计数据和数学时不知道sql的’速度’.我知道基本函数(相关性,R ^ 2,…)已经在sql中实现了,但是我使用了更多’高级'(我的意思是’复杂’这里……)函数(即使我还没有表示它)这里).
>如果您认为这不是一个好主意,您是否可以使用其他技巧来强调数据库的“良好行为”,尽管使用外部工具作为Python应用程序?

非常感谢你的建议,
爱德华

解决方法:

欢迎来到DBA Stack Exchange!

My problem is that I don’t kNow the ‘speed’ of sql when it deals with
stats and maths, compared to other language. I kNow that basic
functions (correlation, R^2, …) are already implemented in sql, but
I am using far more ‘advanced’ (I mean ‘complex’ here..) functions
(even if I have not represented it here).

根据经验,对于大型数据集(数百万行)的基本聚合(分组,连接,求和),sql性能会更好.我建议你在这里利用sql的优势使用混合方法.尽可能使用基本聚合准备数据,但将更高级别的数学和分析逻辑留在Python中.

Would you think I should translate all my mathematical analysis from
Python to sql, and create Triggers launching it whenever a new value
is inserted?

没有.

如前所述,您可以执行基本的聚合函数,但我希望您会发现这很乏味,如果不是完全不可能将更复杂的统计函数从Python等功能丰富的语言建模为sql等约束语言.这是一个探索这个概念的decent article.即使我们成功地将Python函数转换为sql,我们的成功也将高度依赖于数据库是否经过优化以提供插入时这些计算所需的所有数据输入的基于集合的表示.

The thing is that between the update of the values, and the update of
the regressions, the database is not in a ‘stable’ state: new values
have been inserted, but the corresponding regressions doesn’t exist
yet.

让我们确定我们不会以潜在的性能成本,以及与增加代码复杂性相关的可靠成本,以教条的方式推广数据库ACIDity.我理解ACIDity的重要性,但从你的描述来看,这听起来像是一个分析工作流程.我们有一个3AM的批量数据加载,随后在sql之外进行分析,然后重新插入数据库.

总结一下..YEs,sql在大型数据集的基本聚合上表现更好,但更高级别的统计分析最好留给Python.我不确定为了ACIDity而将Python函数转换为sql触发器的风险是值得的.

附:我知道这是对你的问题的迟到答案,所以让我们知道你最终决定实施的是什么!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐