在使用loc计算时,目标集(等号左边)和来源集(等号右边)的loc中可以指定多个维度的维度成员或成员集合。
from deepcube.cube.cube import deepcube
def main():
# 实例一个deepcube对象,传参为cube元素名和path,如果cube元素名在应用中唯一,可以不传path
cube1 = deepcube('cube1', path='/Consolidation_App/Consolidation/Main_Model')
# 为了后续计算写法简单,在这里将cube的维度赋值给同名变量
year = cube1.year
period = cube1.period
scenario = cube1.scenario
version = cube1.version
entity = cube1.entity
partner = cube1.partner
account = cube1.account
movement = cube1.movement
# 从cube加载数据
cube1.init_data([year["2021"],
scenario["Actual"],
version["Working"],
period["8"]])
# 确定一个背景scope范围
cube1.scope(year["2021"],
scenario["Actual"],
version["Working"],
period["8"],
partner["TotalPartner"].Base(),
movement["CLO"].Base()
)
cube1.loc[account['A010101'], entity['B'].Base()] = cube1.loc[entity['NoEntity']
] * cube1.loc[account['A01'], partner['NoPartner']]
# 将计算结果写入Cube
cube1.submit_calc()
计算时,会将每个loc范围结合scope范围确定要计算的实际范围,我们将这一句计算的目标集和来源集完整的数据块维度信息罗列如下:
目标集 |
符号 |
来源集1 |
符号 |
来源集2 |
---|---|---|---|---|
year[“2021”] |
= |
year[“2021”] |
* |
year[“2021”] |
scenario[“Actual”] |
scenario[“Actual”] |
scenario[“Actual”] | ||
version[“Working”] |
version[“Working”] |
version[“Working”] | ||
period[“8”] |
period[“8”] |
period[“8”] | ||
movement[“CLO”].Base() |
movement[“CLO”].Base() |
movement[“CLO”].Base() | ||
partner[“TotalPartner”].Base() |
partner[“TotalPartner”].Base() |
partner[“NoPartner”] | ||
account[‘A010101’] |
account[‘A010101’] |
account[‘A01’] | ||
entity[‘B’].Base() |
entity[‘NoEntity’] |
entity[‘B’].Base() |
假设来源集1和来源集2从财务模型获取的原始数据如下:
来源集1原始数据 | ||||||||
---|---|---|---|---|---|---|---|---|
year |
period |
scenario |
version |
movement |
partner |
account |
entity |
data |
2021 |
8 |
Actual |
Working |
OPN |
P1 |
A010101 |
NoEntity |
100 |
2021 |
8 |
Actual |
Working |
OPN |
P2 |
A010101 |
NoEntity |
200 |
2021 |
8 |
Actual |
Working |
INC |
P1 |
A010101 |
NoEntity |
300 |
2021 |
8 |
Actual |
Working |
INC |
P2 |
A010101 |
NoEntity |
400 |
来源集2原始数据 | ||||||||
---|---|---|---|---|---|---|---|---|
year |
period |
scenario |
version |
movement |
partner |
account |
entity |
data |
2021 |
8 |
Actual |
Working |
OPN |
NoPartner |
A01 |
B1 |
2 |
2021 |
8 |
Actual |
Working |
OPN |
NoPartner |
A01 |
B2 |
3 |
2021 |
8 |
Actual |
Working |
OPN |
NoPartner |
A01 |
B3 |
4 |
2021 |
8 |
Actual |
Working |
INC |
NoPartner |
A01 |
B1 |
7 |
2021 |
8 |
Actual |
Working |
INC |
NoPartner |
A01 |
B2 |
8 |
2021 |
8 |
Actual |
Working |
INC |
NoPartner |
A01 |
B3 |
9 |
目标集完整笛卡尔积范围 | ||||||||
---|---|---|---|---|---|---|---|---|
year |
period |
scenario |
version |
movement |
partner |
account |
entity |
data |
2021 |
8 |
Actual |
Working |
OPN |
P1 |
A010101 |
B1 | |
2021 |
8 |
Actual |
Working |
OPN |
P1 |
A010101 |
B2 | |
2021 |
8 |
Actual |
Working |
OPN |
P1 |
A010101 |
B3 | |
2021 |
8 |
Actual |
Working |
OPN |
P2 |
A010101 |
B1 | |
2021 |
8 |
Actual |
Working |
OPN |
P2 |
A010101 |
B2 | |
2021 |
8 |
Actual |
Working |
OPN |
P2 |
A010101 |
B3 | |
2021 |
8 |
Actual |
Working |
INC |
P1 |
A010101 |
B1 | |
2021 |
8 |
Actual |
Working |
INC |
P1 |
A010101 |
B2 | |
2021 |
8 |
Actual |
Working |
INC |
P1 |
A010101 |
B3 | |
2021 |
8 |
Actual |
Working |
INC |
P2 |
A010101 |
B1 | |
2021 |
8 |
Actual |
Working |
INC |
P2 |
A010101 |
B2 | |
2021 |
8 |
Actual |
Working |
INC |
P2 |
A010101 |
B3 |
多维数据块间的计算,本质上是将每个来源集按照维度字段与目标集进行左连接(类似SQL中的left join),将每个维度的成员对齐,然后做数值的列间计算。
在左连接时,目标集和来源集同一个维度的维度成员之间存在以下四种关系,其中一对多是不被允许的(在多维计算中,一对多本身是一种不合理的场景,有些场景可能会出现将多个成员的和,或者多个成员的平均值赋值给单个成员的情况,这种本质上还是一对一,是支持的,可以参考计算函数章节):
维度成员关系 |
是否支持 |
---|---|
一对一 |
支持 |
多对一 |
支持 |
一对多 |
不支持 |
多对多 |
仅支持成员集合完全一致 |
在将来源集对齐至目标集时,
一对一的维度不论成员是否一致,都可以直接对应。(本例中的year,scenario,version,period,account)
多对一的维度会将单成员数据复制成多份,补齐到目标集成员的个数。(本例中的partner来源集2和entity来源集1)
多对多的维度,要求必须成员范围完全一致,成员一一对应。(本例中的partner来源集1,entity来源集2和movement)
两个来源集对齐到目标集之后的数据如下:
来源集1 对齐到目标集 | ||||||||
---|---|---|---|---|---|---|---|---|
year |
period |
scenario |
version |
movement |
partner |
account |
entity |
data |
2021 |
8 |
Actual |
Working |
OPN |
P1 |
A010101 |
NoEntity |
100 |
2021 |
8 |
Actual |
Working |
OPN |
P1 |
A010101 |
NoEntity |
100 |
2021 |
8 |
Actual |
Working |
OPN |
P1 |
A010101 |
NoEntity |
100 |
2021 |
8 |
Actual |
Working |
OPN |
P2 |
A010101 |
NoEntity |
200 |
2021 |
8 |
Actual |
Working |
OPN |
P2 |
A010101 |
NoEntity |
200 |
2021 |
8 |
Actual |
Working |
OPN |
P2 |
A010101 |
NoEntity |
200 |
2021 |
8 |
Actual |
Working |
INC |
P1 |
A010101 |
NoEntity |
300 |
2021 |
8 |
Actual |
Working |
INC |
P1 |
A010101 |
NoEntity |
300 |
2021 |
8 |
Actual |
Working |
INC |
P1 |
A010101 |
NoEntity |
300 |
2021 |
8 |
Actual |
Working |
INC |
P2 |
A010101 |
NoEntity |
400 |
2021 |
8 |
Actual |
Working |
INC |
P2 |
A010101 |
NoEntity |
400 |
2021 |
8 |
Actual |
Working |
INC |
P2 |
A010101 |
NoEntity |
400 |
来源集2 对齐到目标集 | ||||||||
---|---|---|---|---|---|---|---|---|
year |
period |
scenario |
version |
movement |
partner |
account |
entity |
data |
2021 |
8 |
Actual |
Working |
OPN |
NoPartner |
A01 |
B1 |
2 |
2021 |
8 |
Actual |
Working |
OPN |
NoPartner |
A01 |
B1 |
2 |
2021 |
8 |
Actual |
Working |
OPN |
NoPartner |
A01 |
B2 |
3 |
2021 |
8 |
Actual |
Working |
OPN |
NoPartner |
A01 |
B2 |
3 |
2021 |
8 |
Actual |
Working |
OPN |
NoPartner |
A01 |
B3 |
4 |
2021 |
8 |
Actual |
Working |
OPN |
NoPartner |
A01 |
B3 |
4 |
2021 |
8 |
Actual |
Working |
INC |
NoPartner |
A01 |
B1 |
7 |
2021 |
8 |
Actual |
Working |
INC |
NoPartner |
A01 |
B1 |
7 |
2021 |
8 |
Actual |
Working |
INC |
NoPartner |
A01 |
B2 |
8 |
2021 |
8 |
Actual |
Working |
INC |
NoPartner |
A01 |
B2 |
8 |
2021 |
8 |
Actual |
Working |
INC |
NoPartner |
A01 |
B3 |
9 |
2021 |
8 |
Actual |
Working |
INC |
NoPartner |
A01 |
B3 |
9 |
最后,将两列数值做计算,得到目标集的计算结果。
目标集 | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
year |
period |
scenario |
version |
movement |
partner |
account |
entity |
来源集1 |
来源集2 |
计算结果 |
2021 |
8 |
Actual |
Working |
OPN |
P1 |
A010101 |
B1 |
100 |
2 |
200 |
2021 |
8 |
Actual |
Working |
OPN |
P1 |
A010101 |
B2 |
100 |
3 |
300 |
2021 |
8 |
Actual |
Working |
OPN |
P1 |
A010101 |
B3 |
100 |
4 |
400 |
2021 |
8 |
Actual |
Working |
OPN |
P2 |
A010101 |
B1 |
200 |
2 |
400 |
2021 |
8 |
Actual |
Working |
OPN |
P2 |
A010101 |
B2 |
200 |
3 |
600 |
2021 |
8 |
Actual |
Working |
OPN |
P2 |
A010101 |
B3 |
200 |
4 |
800 |
2021 |
8 |
Actual |
Working |
INC |
P1 |
A010101 |
B1 |
300 |
7 |
2100 |
2021 |
8 |
Actual |
Working |
INC |
P1 |
A010101 |
B2 |
300 |
8 |
2400 |
2021 |
8 |
Actual |
Working |
INC |
P1 |
A010101 |
B3 |
300 |
9 |
2700 |
2021 |
8 |
Actual |
Working |
INC |
P2 |
A010101 |
B1 |
400 |
7 |
2800 |
2021 |
8 |
Actual |
Working |
INC |
P2 |
A010101 |
B2 |
400 |
8 |
3200 |
2021 |
8 |
Actual |
Working |
INC |
P2 |
A010101 |
B3 |
400 |
9 |
3600 |
movement |
partner |
account |
entity |
data |
来源集2 |
计算结果 |
---|---|---|---|---|---|---|
OPN |
NoPartner |
A01 |
B1 |
2 |
2 |
200 |
OPN |
NoPartner |
A01 |
B2 |
3 |
3 |
300 |
OPN |
NoPartner |
A01 |
B3 |
4 |
4 |
400 |
OPN |
NoPartner |
A01 |
B1 |
2 |
2 |
400 |
OPN |
NoPartner |
A01 |
B2 |
3 |
3 |
600 |
OPN |
NoPartner |
A01 |
B3 |
4 |
4 |
800 |
INC |
NoPartner |
A01 |
B1 |
7 |
7 |
2100 |
INC |
NoPartner |
A01 |
B2 |
8 |
8 |
2400 |
INC |
NoPartner |
A01 |
B3 |
9 |
9 |
2700 |
INC |
NoPartner |
A01 |
B1 |
7 |
7 |
2800 |
INC |
NoPartner |
A01 |
B2 |
8 |
8 |
3200 |
INC |
NoPartner |
A01 |
B3 |
9 |
9 |
3600 |
回到顶部
咨询热线