在财务模型的计算中,参与计算的数是被限定了一个范围,因此经常会遇到参与计算的数值为空的情况,如下例:
from deepcube.cube.cube import deepcube
def main():
# 实例一个deepcube对象,传参为cube元素名和path,如果cube元素名在应用中唯一,可以不传path
cube1 = deepcube('cube1', path='/Consolidation_App/Consolidation/Main_Model')
# 为了后续计算写法简单,在这里将cube的维度赋值给同名变量(注意这里cube1.year中的year是字段名)
year = cube1.year
period = cube1.period
scenario = cube1.scenario
version = cube1.version
entity = cube1.entity
account = cube1.account
# 从cube加载数据
cube1.init_data([year["2022"],
scenario["Budget"],
version["V1"]])
# 确定一个背景scope范围
cube1.scope(year["2022"],
scenario["Budget"],
version["V1"],
period["Q1"].Base(),
entity["TotalEntity"].Base()
)
cube1.loc[account['Total_Sales']] = cube1.loc[account['Volume']] * cube1.loc[
account['Price'], Period['BegBalance']] + cube1.loc[account['Sales_Adjs']]
# 将计算结果写入Cube
cube1.submit_calc()
当前脚本计算的Entity范围是所有的叶子节点,但并不代表所有的叶子节点都会参与计算。比如,Entity维度中有3个叶子节点 E1,E2,E3,E4。计算前财务模型中的数据如下:
Entity |
Year |
Period |
Scenario |
Version |
Account |
Product |
data |
---|---|---|---|---|---|---|---|
E1 |
2022 |
1 |
Budget |
V1 |
Volume |
Hamburg |
100 |
E1 |
2022 |
2 |
Budget |
V1 |
Volume |
Hamburg |
110 |
E1 |
2022 |
3 |
Budget |
V1 |
Volume |
Hamburg |
120 |
E1 |
2022 |
BegBalance |
Budget |
V1 |
Price |
Hamburg |
3 |
E1 |
2022 |
1 |
Budget |
V1 |
Volume |
Sandwich |
20 |
E1 |
2022 |
2 |
Budget |
V1 |
Volume |
Sandwich |
25 |
E1 |
2022 |
3 |
Budget |
V1 |
Volume |
Sandwich |
30 |
E1 |
2022 |
BegBalance |
Budget |
V1 |
Price |
Sandwich |
5 |
E2 |
2022 |
1 |
Budget |
V1 |
Volume |
Hamburg |
100 |
E2 |
2022 |
2 |
Budget |
V1 |
Volume |
Hamburg |
110 |
E2 |
2022 |
3 |
Budget |
V1 |
Volume |
Hamburg |
120 |
E3 |
2022 |
1 |
Budget |
V1 |
Sales_Adjs |
Hamburg |
50 |
E3 |
2022 |
2 |
Budget |
V1 |
Sales_Adjs |
Hamburg |
80 |
E3 |
2022 |
3 |
Budget |
V1 |
Sales_Adjs |
Hamburg |
-110 |
当Entity等于E1时,等号右侧获取了 account[‘Volume’]和[account[‘Price’], Period[‘BegBalance’]]上的值,但account[‘Sales_Adjs’]为空,因此计算的结果就是 cube1.loc[account[‘Volume’]] * cube1.loc[ account[‘Price’], Period[‘BegBalance’];
当Entity等于E2时,等号右侧首先查询到 account[‘Volume’] 的值,而并没有查询到[account[‘Price’], Period[‘BegBalance’]],因此不需要执行cube1.loc[account[‘Volume’]] * cube1.loc[ account[‘Price’], Period[‘BegBalance’]的计算;同时也没有查询到account[‘Sales_Adjs’],因此也不需要做 + cube1.loc[account[‘Sales_Adjs’]]的计算,即在E2上不产生任何计算结果。
当Entity等于E3时,等号右侧首先没有查询到 account[‘Volume’]和[account[‘Price’], Period[‘BegBalance’]],因此不需要执行 cube1.loc[account[‘Volume’]] * cube1.loc[ account[‘Price’], Period[‘BegBalance’]的计算;但查询到account[‘Sales_Adjs’]的值,因此需要执行 + cube1.loc[account[‘Sales_Adjs’]]的计算,因此E3上会产生计算结果。
当Entity等于E4时,等号右侧没有查询到任何值,因此对E4来说也不需要执行任何计算。
计算后的结果如下:
Entity |
Year |
Period |
Scenario |
Version |
Account |
Product |
data |
---|---|---|---|---|---|---|---|
E1 |
2022 |
1 |
Budget |
V1 |
Volume |
Hamburg |
100 |
E1 |
2022 |
2 |
Budget |
V1 |
Volume |
Hamburg |
110 |
E1 |
2022 |
3 |
Budget |
V1 |
Volume |
Hamburg |
120 |
E1 |
2022 |
BegBalance |
Budget |
V1 |
Price |
Hamburg |
3 |
E1 |
2022 |
1 |
Budget |
V1 |
Volume |
Sandwich |
20 |
E1 |
2022 |
2 |
Budget |
V1 |
Volume |
Sandwich |
25 |
E1 |
2022 |
3 |
Budget |
V1 |
Volume |
Sandwich |
30 |
E1 |
2022 |
BegBalance |
Budget |
V1 |
Price |
Sandwich |
5 |
E2 |
2022 |
1 |
Budget |
V1 |
Volume |
Hamburg |
100 |
E2 |
2022 |
2 |
Budget |
V1 |
Volume |
Hamburg |
110 |
E2 |
2022 |
3 |
Budget |
V1 |
Volume |
Hamburg |
120 |
E3 |
2022 |
1 |
Budget |
V1 |
Sales_Adjs |
Hamburg |
50 |
E3 |
2022 |
2 |
Budget |
V1 |
Sales_Adjs |
Hamburg |
80 |
E3 |
2022 |
3 |
Budget |
V1 |
Sales_Adjs |
Hamburg |
-110 |
E1 |
2022 |
1 |
Budget |
V1 |
Total_Sales |
Hamburg |
300 |
E1 |
2022 |
2 |
Budget |
V1 |
Total_Sales |
Hamburg |
330 |
E1 |
2022 |
3 |
Budget |
V1 |
Total_Sales |
Hamburg |
360 |
E1 |
2022 |
1 |
Budget |
V1 |
Total_Sales |
Sandwich |
100 |
E1 |
2022 |
2 |
Budget |
V1 |
Total_Sales |
Sandwich |
125 |
E1 |
2022 |
3 |
Budget |
V1 |
Total_Sales |
Sandwich |
150 |
E3 |
2022 |
1 |
Budget |
V1 |
Total_Sales |
Hamburg |
50 |
E3 |
2022 |
2 |
Budget |
V1 |
Total_Sales |
Hamburg |
80 |
E3 |
2022 |
3 |
Budget |
V1 |
Total_Sales |
Hamburg |
-110 |
由于一次计算,通常情况下NULL值是占绝大多数的,因此NULL值不会回写进系统!
NULL值不回写的逻辑会带来一个问题,比如,仍然使用上例中的MDX语句,但计算前财务模型的数据如下:
Entity |
Year |
Period |
Scenario |
Version |
Account |
Product |
data |
---|---|---|---|---|---|---|---|
E1 |
2022 |
1 |
Budget |
V1 |
Volume |
Hamburg |
100 |
E1 |
2022 |
2 |
Budget |
V1 |
Volume |
Hamburg |
110 |
E1 |
2022 |
3 |
Budget |
V1 |
Volume |
Hamburg |
120 |
E1 |
2022 |
BegBalance |
Budget |
V1 |
Price |
Hamburg |
3 |
E1 |
2022 |
1 |
Budget |
V1 |
Volume |
Sandwich |
20 |
E1 |
2022 |
2 |
Budget |
V1 |
Volume |
Sandwich |
25 |
E1 |
2022 |
3 |
Budget |
V1 |
Volume |
Sandwich |
30 |
E1 |
2022 |
BegBalance |
Budget |
V1 |
Price |
Sandwich |
5 |
E2 |
2022 |
1 |
Budget |
V1 |
Volume |
Hamburg |
100 |
E2 |
2022 |
2 |
Budget |
V1 |
Volume |
Hamburg |
110 |
E2 |
2022 |
3 |
Budget |
V1 |
Volume |
Hamburg |
120 |
E3 |
2022 |
1 |
Budget |
V1 |
Sales_Adjs |
Hamburg |
50 |
E3 |
2022 |
2 |
Budget |
V1 |
Sales_Adjs |
Hamburg |
80 |
E3 |
2022 |
3 |
Budget |
V1 |
Sales_Adjs |
Hamburg |
-110 |
E2 |
2022 |
1 |
Budget |
V1 |
Total_Sales |
Hamburg |
500 |
E2 |
2022 |
2 |
Budget |
V1 |
Total_Sales |
Hamburg |
650 |
E2 |
2022 |
3 |
Budget |
V1 |
Total_Sales |
Hamburg |
600 |
在财务模型中,由于各种原因(比如第一次计算是其实是有E2上的Price数据,但随后Price数据被用户删除了),已经存在了E2的account[“Total_Sales”]数据,这时再进行计算,会发现由于E2上不会产生任何计算结果,因此也不会写入任何E2的数据,因此计算后的财务模型的数据如下:
Entity |
Year |
Period |
Scenario |
Version |
Account |
Product |
data |
---|---|---|---|---|---|---|---|
E1 |
2022 |
1 |
Budget |
V1 |
Volume |
Hamburg |
100 |
E1 |
2022 |
2 |
Budget |
V1 |
Volume |
Hamburg |
110 |
E1 |
2022 |
3 |
Budget |
V1 |
Volume |
Hamburg |
120 |
E1 |
2022 |
BegBalance |
Budget |
V1 |
Price |
Hamburg |
3 |
E1 |
2022 |
1 |
Budget |
V1 |
Volume |
Sandwich |
20 |
E1 |
2022 |
2 |
Budget |
V1 |
Volume |
Sandwich |
25 |
E1 |
2022 |
3 |
Budget |
V1 |
Volume |
Sandwich |
30 |
E1 |
2022 |
BegBalance |
Budget |
V1 |
Price |
Sandwich |
5 |
E2 |
2022 |
1 |
Budget |
V1 |
Volume |
Hamburg |
100 |
E2 |
2022 |
2 |
Budget |
V1 |
Volume |
Hamburg |
110 |
E2 |
2022 |
3 |
Budget |
V1 |
Volume |
Hamburg |
120 |
E3 |
2022 |
1 |
Budget |
V1 |
Sales_Adjs |
Hamburg |
50 |
E3 |
2022 |
2 |
Budget |
V1 |
Sales_Adjs |
Hamburg |
80 |
E3 |
2022 |
3 |
Budget |
V1 |
Sales_Adjs |
Hamburg |
-110 |
E2 |
2022 |
1 |
Budget |
V1 |
Total_Sales |
Hamburg |
500 |
E2 |
2022 |
2 |
Budget |
V1 |
Total_Sales |
Hamburg |
650 |
E2 |
2022 |
3 |
Budget |
V1 |
Total_Sales |
Hamburg |
600 |
E1 |
2022 |
1 |
Budget |
V1 |
Total_Sales |
Hamburg |
300 |
E1 |
2022 |
2 |
Budget |
V1 |
Total_Sales |
Hamburg |
330 |
E1 |
2022 |
3 |
Budget |
V1 |
Total_Sales |
Hamburg |
360 |
E1 |
2022 |
1 |
Budget |
V1 |
Total_Sales |
Sandwich |
100 |
E1 |
2022 |
2 |
Budget |
V1 |
Total_Sales |
Sandwich |
125 |
E1 |
2022 |
3 |
Budget |
V1 |
Total_Sales |
Sandwich |
150 |
E3 |
2022 |
1 |
Budget |
V1 |
Total_Sales |
Hamburg |
50 |
E3 |
2022 |
2 |
Budget |
V1 |
Total_Sales |
Hamburg |
80 |
E3 |
2022 |
3 |
Budget |
V1 |
Total_Sales |
Hamburg |
-110 |
这种情况其实并不是我们希望的结果,因此,在计算前,我们推荐首先将可能的结果数据做清除,随后再进行计算。具体可以参考清数。
回到顶部
咨询热线