对于两个多维数据集,指定了字段间的关联关系之后,可以进行跨cube计算。
跨cube计算时,非目标集cube要满足除了关联字段外的其他维度全部为单一成员,否则无法计算,因为会产生没有意义的笛卡尔积。同时,非目标集cube的loc范围内(含scope)的关联字段的成员集合也需要与目标集cube一致,或是只有单个成员。
跨cube计算时可以不指定非目标集cube的scope,因为对于非目标集cube,维度范围确认的优先级是
自身loc>自身scope>目标集loc>目标集scope,关联字段通常已经在目标集scope和loc中指定了,非关联字段只能为单成员,写在非目标集cube的loc中即可。from deepcube.cube.cube import deepcube
def main(p1, p2):
# 实例cube1对象
cube1 = deepcube('cube1')
year = cube1.year
period = cube1.period
scenario = cube1.scenario
version = cube1.version
account = cube1.account
movement = cube1.movement
view = cube1.View
entity = cube1.entity
# 实例cube2对象
cube2 = deepcube('cube2')
year2 = cube2.year
period2 = cube2.period
product2 = cube2.product
account2 = cube2.account
# 设置两个cube的关联关系,year,period,account字段分别一一对应
# add_relation的第二个参数是一个map,key是cube1的字段名,value是cube2对应的字段名
# cube2中除了product字段,其他三个字段都跟cube1关联
cube1.add_relation(cube2, {'year': 'year', 'period': 'period', 'account': 'account'})
# 从cube加载数据,需要指定取数的范围。
cube1.init_data({'year': year["2022"],
'scenario': scenario["Actual"],
'version': version["Working"]})
cube2.init_data({'year': year2["2022"],
'account': account2["price"]})
# 以下计算可以执行,关联字段的成员范围完全一致,cube2的非关联字段product只有单成员
cube1.scope(year["2022"],
scenario["Actual"],
version["Working"],
movement['OPN'],
period["TotalPeriod"].Base(),
entity['#root'].Descendant(with_parent=True), view['Periodic'])
cube1.clear_data(account["A010102"])
cube1.loc[account["A010102"]] = cube1.loc[account["A010101"]] * cube2.loc[
account2["price"], product2["P1"]]
# 以下计算可以执行,关联字段中period是多对一,cube2的非关联字段product只有单成员
cube1.scope(year["2022"],
scenario["Actual"],
version["Working"],
movement['OPN'],
period["TotalPeriod"].Base(),
entity['#root'].Descendant(with_parent=True), view['Periodic'])
cube1.clear_data(account["A010102"])
cube1.loc[account["A010102"]] = cube1.loc[account["A010101"]] * cube2.loc[
account2["price"], product2["P1"], period2["2"]]
# 以下计算写法有误,cube2的非关联字段product中出现了多个成员
cube1.scope(year["2022"],
scenario["Actual"],
version["Working"],
movement['OPN'],
period["TotalPeriod"].Base(),
entity['#root'].Descendant(with_parent=True), view['Periodic'])
cube1.clear_data(account["A010102"])
cube1.loc[account["A010102"]] = cube1.loc[account["A010101"]] * cube2.loc[
account2["price"], product2["P1", "P2"], period2["2"]]
# 将计算结果写入Cube
cube1.submit_calc()
利用跨cube计算,我们可以实现同cube互换维度后计算的场景。下例模拟了合并报表中,往来方科目抵消的简单场景,将entity和partner互换,计算B1对其他partner的应收科目减去其他partner对B1的应付科目的过程。(实际合并报表项目还是建议用统一的deepconsole调度,在rule里进行操作,这里仅提供思路参考。)
from deepcube.cube.cube import deepcube
from deepfos.options import OPTION
from deepcube.cube import function as fn
def main(p1, p2):
# 实例cube1对象
cube1 = deepcube('cube1')
year = cube1.year
period = cube1.period
scenario = cube1.scenario
version = cube1.version
account = cube1.account
movement = cube1.movement
view = cube1.View
entity = cube1.entity
partner = cube1.partner
value = cube1.value
# 从cube1中创建一个新的临时cube
cube2 = cube1.create_alias()
# 设置两个cube的关联关系,entity和partner互换,其他字段完全一致
cube1.add_relation(cube2, {'entity': 'partner', 'partner': 'entity', 'year': 'year', 'period': 'period',
'account': 'account', 'scenario': 'scenario', 'version': 'version',
'movement': 'movement', 'View': 'View', 'value': 'value'})
# 从cube加载数据,需要指定取数的范围。这里不需要再加载cube2的数据,两个cube会共用同一片内存数据
cube1.init_data({'year': year["2022"],
'scenario': scenario["Actual"],
'version': version["Working"]})
cube1.scope(year["2022"],
scenario["Actual"],
version["Working"],
movement['OPN'],
period["TotalPeriod"].Base(),
entity['B1'],
view['Periodic'],
value['EntityCurrency'],
partner['total'].Base()
)
# 将entity和partner互换,计算A010101-A010102
cube1.loc[account["A0102"]] = cube1.loc[account["A010101"]] - cube2.loc[
account["A010102"]]
# 将计算结果写入Cube
cube1.submit_calc()
回到顶部
咨询热线