Cube成员公式¶
基础介绍¶
财务模型test的结构如图
使用电子表格简单填入以下数值
其中,UnitPrice表示货品单价,Discount表示折扣,ActualPrice表实际货品价格,SalesVolumn表销售额,TotalSales表总销售额。 显然:
ActualPrice = UnitPrice * (1 - Discount)
TotalSales = ActualPrice * SalesVolumn
我们只填入了必须录入的数据(UnitPrice, Discount, SalesVolumn),希望在保存时能够计算出关联单元格的值。
如果您读过之前的文档,您可能会想用FinancialCube来解决这个问题。这确实可以,这种方式一般需要以下处理步骤:
使用FinancialCube的
query
方法查询到参与计算的数据。把account的数据转移到列上
使用向量四则运算计算出所需数据
在这个简单的例子里,您并不需要写很复杂的代码,但是使用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。
进阶使用¶
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()
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()
3. 算法简介¶
进入fix语句块时内部的流程:
记录所有计算成员间的计算关系,保存所有维度成员的成员公式。
结合fix条件与with语句快内部所有计算条件,一次取出可能需要参与计算的数据行
仅对根据fix条件取出数据行进行赋值,源数据其他值不受影响。
仅提交公式左边出现的维度成员。