在deepcube SDK中,维度相关的对象共有三个:维度对象,维度成员对象,维度成员集合对象。
其中维度对象便是我们从财务模型对象中通过 财务模型.字段名 的方式获取到的:如下例中的year,period等。
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’]_ 的格式获取一个维度成员对象。
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’…]。
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汇总节点的值会自动按照此逻辑只汇总有效后代,无需额外指定参数。
使用cube.loc进行计算或查询时,默认是不会过滤无效成员的。(对应先胜云平台维度元素的维度表达式第三个参数传0。)
使用表达式参数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)
deepcube中别名的使用,与维度表达式中稍有不同。因为deepcube中利用python高级语言的特性,维度成员名天然就是在一个单独的字符串中,因此别名也可以直接用字符串,不需要写两边的边界符。
需要注意两点,因为别名中可能含有单引号和双引号,因此在python中最稳妥的写法是用三引号包裹字符串,并且别名中如果出现转义符的话,每个转义符都需要写成两个转义符。
例如别名:entity维度的成员别名A‘“门店\@%,在deepcube中使用时,需要写entity[“””A‘“门店\@%”””]
与维度表达式中子集的函数名相同,deepcube中使用subset函数来使用维度子集。
例如要用entity维度子集A01,那么写法如下:entity.subset(“A01”),其中entity是deepcube的dimension对象,subset函数返回的是维度成员集合对象,可以与其他维度成员集合做集合间操作,例如:entity[“E1”].Base()+entity.subset(“A01”)。
回到顶部
咨询热线
