全部文档
文档中心财务模型deepcubedeepcube语法维度相关对象操作

维度相关对象操作

在deepcube SDK中,维度相关的对象共有三个:维度对象,维度成员对象,维度成员集合对象。

维度对象

其中维度对象便是我们从财务模型对象中通过 _财务模型.字段名_ 的方式获取到的:如下例中的year,period等。
Copy
from deepcube.cube.cube import deepcube

def main():
    # 实例一个deepcube对象,传参为cube元素名和path,如果cube元素名在应用中唯一,可以不传path
	cube1 = deepcube('cube1')
    
    # 通过 财务模型.字段名(注意这里cube1.year中的year是财务模型上配置的字段名)
    year = cube1.year
    period = cube1.period
    scenario = cube1.scenario
    version = cube1.version
    product = cube1.product
    account = cube1.account

实际场景中,我们很少会对维度对象本身做操作,更多的是通过维度对象操作维度成员,维度成员集合。

维度成员对象

我们可以通过 _ 维度['维度成员code']_ 的格式获取一个维度成员对象。
Copy
from deepcube.cube.cube import deepcube

def main():
    # 实例一个deepcube对象,传参为cube元素名和path,如果cube元素名在应用中唯一,可以不传path
	cube1 = deepcube('cube1')
    
    # 通过 财务模型.字段名(注意这里cube1.year中的year是财务模型上配置的字段名)
    period = cube1.period
	# 通过  维度['维度成员code'] 的格式,获取维度成员2月
    period['2']
	# 维度成员.属性名  可以获取该维度成员对应的属性,返回的数据类型是字符串(属性名为维度_td表的字段名)
    period['2'].name
    period['2'].aggweight
    period['2'].ud1

	# 维度成员.parent可以得到该成员的父级成员,返回的是一个维度成员对象
    period['2'].parent
	# period['2'].parent 等价于 period['Q1']
    print(period['2'].parent == period['Q1']) #结果为True

	# 维度成员.shift()用于获得维度成员的偏移成员,正数表示向后偏移,负数表示向前偏移
    period['2'].shift(-1) #结果为维度成员1月
    period['2'].shift(3) #结果为维度成员5月

维度成员集合对象

维度成员集合,是指同一个维度的若干个维度成员组成的集合。我们通常有以下两种途径得到一个维度成员集合对象, 通过 _维度成员.集合函数_ 获取,通过 _维度['维度成员1code', '维度成员2code'...]_。
Copy
from deepcube.cube.cube import deepcube

def main():
    # 实例一个deepcube对象,传参为cube元素名和path,如果cube元素名在应用中唯一,可以不传path
	cube1 = deepcube('cube1')
    
    # 通过 财务模型.字段名(注意这里cube1.year中的year是财务模型上配置的字段名)
    period = cube1.period
	# 通过维度成员.集合函数获取,例如:
	period['Q1'].Base()

	# 通过  维度['维度成员1code','维度成员2code'...] 获取
    period['1', '2', '3']
    # period['Q1'].Base() 等价于 period['1', '2', '3']
    print(period['Q1'].Base() == period['1', '2', '3']) #结果为True

以下为所有集合函数的用法:

Copy
from deepcube.cube.cube import deepcube

def main():
    # 实例一个deepcube对象,传参为cube元素名和path,如果cube元素名在应用中唯一,可以不传path
	cube1 = deepcube('cube1')
    
    # 通过 财务模型.字段名(注意这里cube1.year中的year是财务模型上配置的字段名)
    period = cube1.period

	# 维度成员.Base() 可以得到该成员的所有末级节点组成的维度成员集合对象
	period['Q1'].Base()
    # 维度成员.IBase() 可以得到该成员的所有末级节点组成的维度成员集合对象,包含自身
	period['Q1'].IBase()
    # 维度成员.Children() 可以得到该成员的所有子代节点组成的维度成员集合对象
	period['Q1'].Children()
    # 维度成员.IChildren() 可以得到该成员的所有子代节点组成的维度成员集合对象,包含自身
	period['Q1'].IChildren()
    # 维度成员.Descendant() 可以得到该成员的所有后代节点组成的维度成员集合对象
	period['Q1'].Descendant()
    # 维度成员.Descendant() 可以得到该成员的所有后代节点组成的维度成员集合对象,包含自身
	period['Q1'].IDescendant()
	# 维度成员.Level函数。传入两个参数,表示以当前成员为基础,获取一定层级范围内的成员。
	# 负数表示向上,正数表示向下,0代表自身
	period['Q1'].Level(-2,1)  #[TotalPeriod,Hy1,Q1,1,2,3]
	period['Q1'].Level(0,1)  #[Q1,1,2,3]
	period['Q1'].Level(1,1)  #[1,2,3]
	period['Hy1'].Level(2,2)  #[1,2,3,4,5,6]
	period['Hy1'].Level(-1,2)  #[TotalPeriod,Hy1,Q1,Q2,1,2,3,4,5,6]
    # 维度成员.Ancestor(),可以得到该成员的所有先祖
    period['1'].Ancestor()  #[Q1,Hy1,TotalPeriod,#root]
    # 如果当前成员有共享节点,可以通过include_shared参数获取所有共享和非共享节点的先祖
	period['1'].Ancestor(include_shared=True)

需要注意的是,Base()函数与平台维度元素的Base()表达式有一定的差异,deepcube中如果对一个末级节点使用Base()函数,不会返回自身。period[‘1’].Base()不会返回1月,而是会返回一个空的维度成员集合。

维度成员集合可以使用loc进行字段值过滤:

Copy
from deepcube.cube.cube import deepcube

def main():
    # 实例一个deepcube对象,传参为cube元素名和path,如果cube元素名在应用中唯一,可以不传path
	cube1 = deepcube('cube1')
    
    # 通过 财务模型.字段名(注意这里cube1.year中的year是财务模型上配置的字段名)
    period = cube1.period

	# 获取Q1的base节点中,ud1是Y的成员集合
	period_mbrs = period['Q1'].Base()
    period_mbrs.loc[period_mbrs.attr('ud1') == 'Y']

	# 需要注意的是,如果不使用中间变量,一步写完的话,需要在loc里写入相同的成员集合对象
	# 以下写法与上面两行得到的结果等价
	period['Q1'].Base().loc[period['Q1'].Base().attr('ud1') == 'Y']

    # 第一种写法更不容易出错,推荐使用第一种写法。
	# loc中的判断条件可以组合使用,下例表示获取Q1的base节点中,ud1是Y并且ud2是3的成员集合
	period_mbrs = period['Q1'].Base()
    period_mbrs.loc[(period_mbrs.attr('ud1') == 'Y') & (period_mbrs.attr('ud2') != '3')]

	# 下例表示获取Hy1的所有后代节点中,ud1是N或者is_base是True的成员集合
	period_mbrs = period['Hy1'].Descendant()
    period_mbrs.loc[(period_mbrs.attr('ud1') == 'N') | (period_mbrs.attr('is_base') == True)]

多个成员集合之间,可以使用+号计算并集,-号计算差集(对应维度表达式的remove函数,从一个维度成员集合中移除另一个维度成员集合中的成员),&计算交集:

Copy
from deepcube.cube.cube import deepcube

def main():
    # 实例一个deepcube对象,传参为cube元素名和path,如果cube元素名在应用中唯一,可以不传path
	cube1 = deepcube('cube1')
    
    # 通过 财务模型.字段名(注意这里cube1.year中的year是财务模型上配置的字段名)
    period = cube1.period

	# 以下两个成员集合相加,取并集,返回一个新的成员集合对象,其成员包括 [Q1,1,2,3,4,5,6]
	period['Q1'].IBase() + period['Q2'].Base()

	# 以下两个成员集合相减,取差集,返回一个新的成员集合对象,其成员包括 [Hy1,Q1,Q2,1,2,3]
	period['Hy1'].IDescendant() - period['Q2'].Base()

	# 以下两个成员集合取交集,返回一个新的成员集合对象,其成员包括 [2,4,6]
	period['Hy1'].IDescendant() & period['2','4','6','8']

	# 以下代码用于判断成员1是否在period['Q1'].IBase()中,返回结果为True/False
	period['1'].is_in(period['Q1'].IBase())

	# 以下结果集成员包括 [Q1,2,3,Q2]
	period['Q1'].IBase() + period['Q2'] - period['1']

    # 以下结果集成员包括 [2,Q2]
	(period['Q1'].IBase() + period['Q2']) & period['2','Q2','Hy2']

某些特殊场景下,我们需要获取维度成员集合的name或者其他属性:

Copy
from deepcube.cube.cube import deepcube

def main():
    # 实例一个deepcube对象,传参为cube元素名和path,如果cube元素名在应用中唯一,可以不传path
	cube1 = deepcube('cube1')
    
    # 通过 财务模型.字段名
    entity = cube1.entity

	# 以下代码可以得到entity['Total'].Base()这个集合范围内所有成员name组成的列表,数据类型是list
	entity['Total'].Base().attr("name").collect()


	# 对于合并常见的需要用entity成员筛选partner维度范围的场景,可以用如下写法
	partner[entity["TotalEntity"].Base().attr("name").collect()]

	

特殊:多版本实体维以及父点子成员

对于维度类型是多版本实体维的维度,因为使用场景中有过滤实体激活表和父点子两种特殊需求,所以在使用时需要额外了解一些用法:

1、获取多版本实体维

获取多版本实体维可以从财务模型对象.维度名获取:
Copy
from deepcube.cube.cube import deepcube

def main():
    # 如果财务模型entity字段管理的维度是多版本实体维,则可以直接获取多版本实体维对象
	cube1 = deepcube('cube1')
    entity = cube1.entity

需要注意:此前可以直接由VerEntityDim对象实例化多版本实体维,但V2.4.3这种方式得到的多版本实体维功能是不完整的,无法使用enable_filter参数,不建议使用这种形式,建议从cube.维度中得到多版本实体维。

Copy
def main(p1, p2):
    # 不建议以下写法
    from deepcube.dimension.dimension import VerEntityDim
    entity = VerEntityDim('Entity', path='/dimension')

2、多版本实体维的自动汇总

如果财务模型中多版本实体维的列作用设置的是“通用类”,则此维度的父级节点会自动汇总。并且多版本实体维的父级节点在汇总时只会汇总有效的后代值。

在deepcube中,使用cube.loc进行计算或查询时,查询到的entity汇总节点的值会自动按照此逻辑只汇总有效后代,无需额外指定参数。

3、过滤实体激活表

使用cube.loc进行计算或查询时,默认是不会过滤无效成员的。(对应先胜云平台维度元素的维度表达式第三个参数传0。)

使用表达式参数enable_filter=True,可以在计算或查询时只查询有效的entity成员。(对应先胜云平台维度元素的维度表达式第三个参数传2。)

Copy
from deepcube.cube.cube import deepcube


def main(p1, p2):
    cube1 = deepcube('CUBE1', path='/cube')

    # 为了后续计算写法简单,在这里将cube的维度赋值给同名变量(注意这里cube1.year中的year是字段名)
    year = cube1.Year
    period = cube1.Period
    scenario = cube1.Scenario
    account = cube1.Account
    Value = cube1.Value
    entity = cube1.Entity
    View = cube1.View
    Movement = cube1.Movement

    cube1.init_data([year['2024'],
                     period['TotalPeriod'].IDescendant(),
                     scenario["Actual"],
                     account["A02"],
                     Value['CNY'],
                     entity['Total'].IDescendant(),
                     Movement['INC']
                     ])
    cube1.scope(year['2024'],
                scenario["Actual"],
                account["A02"],
                Value['CNY'],
                Movement['INC']
                )

    # 默认情况下,enable_filter=False,查询和计算不会过滤无效entity成员
    cube1.loc[entity['A'].IDescendant(), period['1']].display_data()
    
    # enable_filter=True时,查询和计算会过滤掉无效的entity成员
    cube1.loc[entity['A'].IDescendant(enable_filter=True), period['1']].display_data()

    # 如果需要某个指定管控维组合下的表达式结果,可以从cube拿到entity维度,使用multi_loc过滤成员
    mbrs = entity['A'].IDescendant(enable_filter=True).multi_loc(
            year='2024',
            period='1')

4、获取父点子成员

Copy
from deepcube.cube.cube import deepcube

def main():
    # 如果财务模型entity字段管理的维度是多版本实体维,则可以直接获取多版本实体维对象
	cube1 = deepcube('cube1')
    entity = cube1.entity

	# 直接指定父点子成员
	cur_entity = entity['[A].[B]']
	# 多版本实体维的维度成员,.name得到的是纯子name,.qualname得到的是父点子格式name
	print(cur_entity.name)      #打印得到B
	print(cur_entity.qualname)  #打印得到[A].[B]

	# 获取A的所有base节点成员,并以父点子形式返回
	entity['A'].Base(with_parent=True)

回到顶部

咨询热线

400-821-9199

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

ctrl+Enter to send