将公式存储在表中以便稍后计算?

时间:2017-09-26 14:03:24

标签: postgresql pandas

在数据库中存储指标公式的最佳方法是什么?最初,我只是将原始列投入可视化工具,并为我计算了指标。我很快就知道由于客户要求等原因,标准规则有很多(有效)例外。我现在正在考虑是否应该在ETL /数据库层期间创建分子和分母列,或者在我将数据发送到可视化工具。

我正在考虑使用Python evaluate来读取一个存储在Postgres表中的字符串:

https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.eval.html

原谅格式化,但我在下面有三列。一列与特定项目绑定,然后是两个示例指标。

id                          productive_time                        productive_status
165 "productive_time = talk_time + hold_time + after_call_work_time"    "productive_status = status_3_time + status_4_time + status_5_time"
1911    "productive_time = talk_time + hold_time + after_call_work_time + ring_time"    "productive_status = status_7_time + status_8_time"

然后,在可视化层中,与可能进行数十次计算相比,度量计算将只是SUM(productive_time) / SUM(call_count)

这是否有意义,还有其他最佳做法吗?

我想,另一种方法是使用大量的CASE WHEN语句。但实际上有几百个 - 超过一千个ID要覆盖。其中95%将是相同的。

编辑:

enter image description here

for x in range(0, len(df['inbound_time_formula'].unique())):
    df.loc[df['inbound_time_formula'] == df['inbound_time_formula'].unique()[x], 'inbound_time'] = df.eval(df['inbound_time_formula'].unique()[x], inplace=True)

我尝试了df.eval数据框,但它似乎适用于整个数据框而不仅仅是公式所在的行。

1 个答案:

答案 0 :(得分:0)

规则:

t=# create table rl(id serial,tm text, sm text);
CREATE TABLE
t=# insert into rl(tm,sm) values('a+b-c','a*b +c');
INSERT 0 1

数据:

t=# create table dt(i serial,a int,b int, c int);
CREATE TABLE
t=# insert into dt(a,b,c) select 1,2,3;
INSERT 0 1

示例:

t=# create or replace function rlf(rid int,did int) returns table (rsm int,rtm int) as $$
begin
return query execute format('select '||(select sm from rl where id=rid)||', '||(select tm from rl where id=rid)||' from dt where i=%s',did);
end;
$$ language plpgsql
;
CREATE FUNCTION
t=# select * from rlf(1,1);
 rsm | rtm
-----+-----
   5 |   0
(1 row)

这种方法非常值得怀疑,因为你无法按照定义避免注入 - 你不会解析规则 - 按原样执行它......