在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)
回到顶部
咨询热线