全部文档
文档中心财务模型deepcubedeepcube语法loc计算空值处理

空值处理

在财务模型的计算中,参与计算的数是被限定了一个范围,因此经常会遇到参与计算的数值为空的情况,如下例:

Copy
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,则当做0处理,如果两方都是NULL,则结果也是NULL。

由于一次计算,通常情况下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

这种情况其实并不是我们希望的结果,因此,在计算前,我们推荐首先将可能的结果数据做清除,随后再进行计算。具体可以参考清数

回到顶部

咨询热线

400-821-9199

我们使用 ChatGPT,基于文档中心的内容以及对话上下文回答您的问题。

ctrl+Enter to send