python - 计算多组数据的平均值(性能问题)

标签 python postgresql

我需要进行计算,例如按时间范围集合分组的所选数据的平均值。

例子: 存储数据的表有几个主要列,它们是: |时间戳 |外部 ID |值(value) |

现在我想计算 20(或更多)组日期范围的平均值: 1) 2000-01-01 00-00-00 -> 2000-01-04 00-00-00 2) 2000-01-04 00-00-00 -> 2000-01-15 00-00-00 ...

重要的是组之间没有间隔和交集,所以这意味着第一个日期和最后一个日期覆盖了整个时间范围。

另一件重要的事情是,在“date_from”到“date_to”的集合中,可以有集合外部的行(不需要的 external_id)。

我尝试了两种方法: 1) 在 SQL 查询中使用平均函数对每个“时间范围”步骤执行查询(但我不喜欢那样 - 它对所有查询都消耗了太多时间,而且执行多个查询听起来不是很好的方法)

2) 我已经选择了所有需要的行(在一个 SQL 请求中),然后我对结果进行了循环。问题是我必须检查当前日期时间属于“数据组”的每个步骤。这似乎是一种更好的方法(从 SQL 的角度来看),但现在由于循环中的循环,我的性能不太好。我需要弄清楚如何避免在主循环中执行循环(检查当前时间戳属于哪个组)。

任何建议都会很有帮助。

最佳答案

实际上这两种方法都很好,如果您有数据库中的 time_stamp 列的索引,它们都可以从中受益。我将尝试提供有关它们的建议:

  1. 多个查询并不是一个坏主意,您的数据看起来非常静态,您可以运行 20 select avg(value) from data where time_stamp between date_from and date_to-like在 20 个不同的连接中查询以加快总操作。您也无需将大量数据从数据库传输到您的客户端。缺点是您需要包含一个额外的 where 条件以排除具有不需要的 external_id 值的行。这会使查询变得复杂,并且如果这些值很多的话,处理速度可能会稍微慢一些。

  2. 在这里,您可以在发送之前按 time_stamp 索引对服务器上的数据进行排序,然后仅检查您当前的项目是否来自新的数据范围(因为排序,您将确定以后的项目将在以后的日期)。这会将内部循环减少为 if 语句。不过,我不确定这是这里的瓶颈。也许您想研究流式传输结果,而不是等待它们全部被提取。

关于python - 计算多组数据的平均值(性能问题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51333360/

相关文章:

postgresql - Postgres : Get numbers of affected rows in statement trigger

ruby-on-rails - 在 Rails/PostGreSQL 中对大表进行分析

windows - 不允许具有管理权限的用户执行 postgresql

python - 无法在 Python 3.5.2 中导入 itertools

python - 在 Python 中将句子更改为字典

python - 从 Pandas Dataframe 中的列表中提取元组

python 破折号 : Custom CSS

postgresql - 对 Greenplum 中的表列进行解聚合

sql - 在postgres中仅显示表中的重复行

python - 如何在 Airflow EmrCreateJobFlowOperator 中设置 job_flow_overrides 的动态名称?