在deepcube SDK中,维度相关的对象共有三个:维度对象,维度成员对象,维度成员集合对象。
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
实际场景中,我们很少会对维度对象本身做操作,更多的是通过维度对象操作维度成员,维度成员集合。
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月
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
以下为所有集合函数的用法:
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进行字段值过滤:
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函数,从一个维度成员集合中移除另一个维度成员集合中的成员),&计算交集:
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或者其他属性:
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()]
	
from deepcube.cube.cube import deepcube
def main():
    # 如果财务模型entity字段管理的维度是多版本实体维,则可以直接获取多版本实体维对象
	cube1 = deepcube('cube1')
    entity = cube1.entity
需要注意:此前可以直接由VerEntityDim对象实例化多版本实体维,但V2.4.3这种方式得到的多版本实体维功能是不完整的,无法使用enable_filter参数,不建议使用这种形式,建议从cube.维度中得到多版本实体维。
def main(p1, p2):
    # 不建议以下写法
    from deepcube.dimension.dimension import VerEntityDim
    entity = VerEntityDim('Entity', path='/dimension')
在deepcube中,使用cube.loc进行计算或查询时,查询到的entity汇总节点的值会自动按照此逻辑只汇总有效后代,无需额外指定参数。
使用表达式参数enable_filter=True,可以在计算或查询时只查询有效的entity成员。(对应先胜云平台维度元素的维度表达式第三个参数传2。)
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')
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)
回到顶部
咨询热线
