Cube成员公式

基础介绍

财务模型test的结构如图

61d13e8542b04ee385df02d8c8dc5054

使用电子表格简单填入以下数值

1a8cf01673c64816952f0232d76c1fe8

其中,UnitPrice表示货品单价,Discount表示折扣,ActualPrice表实际货品价格,SalesVolumn表销售额,TotalSales表总销售额。 显然:

  • ActualPrice = UnitPrice * (1 - Discount)

  • TotalSales = ActualPrice * SalesVolumn

我们只填入了必须录入的数据(UnitPrice, Discount, SalesVolumn),希望在保存时能够计算出关联单元格的值。

如果您读过之前的文档,您可能会想用FinancialCube来解决这个问题。这确实可以,这种方式一般需要以下处理步骤:

  1. 使用FinancialCube的query方法查询到参与计算的数据。

  2. 把account的数据转移到列上

  3. 使用向量四则运算计算出所需数据

在这个简单的例子里,您并不需要写很复杂的代码,但是使用SysCube仍然可以进一步简化你的工作!

导入SysCube并实例化

[2]:
from deepfos.core import SysCube

cube = SysCube('test')

指定这次计算希望涉及的数据

[3]:
fix = "Entity{Base(#root,0)}->Year{2021}->Period{1}"

使用SysCube.fix方法输入公式

[4]:
with cube.fix(fix, on_dim='Account') as acc:
    acc['ActualPrice'] = acc['UnitPrice'] * (1 - acc['Discount'])
    acc['TotalSales'] = acc['ActualPrice'] * acc['SalesVolume']

cube.calc_set
[4]:
POV: Year{2021}->Period{1}
Data:
    Entity      Account        data
0   CorpA     Discount         0.5
1   CorpA    UnitPrice       123.0
2   CorpB    UnitPrice      2444.0
3   CorpB     Discount         0.2
4   CorpA  SalesVolume      2222.0
5   CorpC  SalesVolume     11111.0
6   CorpC     Discount         0.2
7   CorpC    UnitPrice      2444.0
8   CorpB  SalesVolume     11111.0
9   CorpA  ActualPrice        61.5
10  CorpB  ActualPrice      1955.2
11  CorpC  ActualPrice      1955.2
12  CorpA   TotalSales    136653.0
13  CorpB   TotalSales  21724227.2
14  CorpC   TotalSales  21724227.2

保存计算内容

[5]:
cube.submit_calc_result()

保存完成后,刷新电子表格,可以看到数据已经写入cube。

59648f3d36d74730b41c3cc04d92420e

进阶使用

1. 计算并不限定在Account维度,任意维度都可以

[6]:
with cube.fix('Year{2021}->Period{1}->Account{Base(#root,0)}', on_dim='Entity') as et:
    et['CorpC'] = et['CorpB']

cube.submit_calc_result()

dfbe48057eae4383b8ae445d8b206ce4

2. 成员的on条件

参与计算的维度成员可以额外指定条件,例如我们希望所有公司都用CorpA的Discount来计算,那么可以:

[7]:
with cube.fix(fix, on_dim='Account') as acc:
    acc['ActualPrice'] = acc['UnitPrice'] * (1 - acc['Discount'].on(Entity='CorpA'))
    acc['TotalSales'] = acc['ActualPrice'] * acc['SalesVolume']

cube.submit_calc_result()

61632b5d7c204b19bd5b63af510c1a7d

3. 算法简介

进入fix语句块时内部的流程:

  1. 记录所有计算成员间的计算关系,保存所有维度成员的成员公式。

  2. 结合fix条件与with语句快内部所有计算条件,一次取出可能需要参与计算的数据行

  3. 仅对根据fix条件取出数据行进行赋值,源数据其他值不受影响。

  4. 仅提交公式左边出现的维度成员。

4. 自定义函数,条件分支,XRef