假设某预算项目客户需要在省级entity上填次年预算,需要系统根据上年每个城市的实际数据,将预算数据同比例分摊到每个城市。并且需要将客户在省级entity上填的数据向上汇总。
其中entity维度树形结构如下:
上年实际数如下:
省级的预算数据填在Version1上,Version1开启了自上而下。
脚本如下:
from deepcube.cube.cube import deepcube
def main(p1, p2):
# 获取表单传参的year,赋值到变量中
cur_year = p2['year']
cur_entity = p2['Entity_wb1']
# 实例一个deepcube对象,传参为cube元素名和path,如果cube元素名在应用中唯一,可以不传path
cube1 = deepcube('cube1', path='/cube')
# 为了后续计算写法简单,在这里将cube的维度赋值给同名变量(注意这里cube1.year中的year是字段名)
year = cube1.year
period = cube1.period
scenario = cube1.scenario
version = cube1.version
account = cube1.account
category = cube1.category
entity = cube1.entity
# 从cube加载数据,需要指定取数的范围。
cube1.init_data([year[cur_year].shift(-1),
scenario["Actual"],
version["Working"],
account["expenses", "income"],
category['NoCategory'],
entity[cur_entity].Base(),
period['TotalPeriod'].Base()],
[year[cur_year],
scenario["Budget"],
version["Version1"],
account["expenses", "income"],
category['NoCategory'],
entity['TotalRegion2'].Level(2,2),
period['TotalPeriod'].Base()],
[year[cur_year],
scenario["Budget"],
version["Working"],
account["expenses", "income"],
category['NoCategory'],
entity[cur_entity].Base(),
period['TotalPeriod'].Base()])
# 确定一个背景scope范围
cube1.scope(year[cur_year],
scenario["Budget"],
version["Working"],
category['NoCategory'],
period['TotalPeriod'].Base(),
account["expenses", "income"]
)
cube1.clear_data(entity[cur_entity].Base())
# 计算,循环每个省份,计算当前省份下所有城市=全省预算*上年实际数/上年全省实际数
for province in entity[cur_entity].Children():
cube1.loc[province.Base()] = cube1.loc[
province, version["Version1"]] * cube1.loc[
year[cur_year].shift(-1), scenario["Actual"]] / cube1.loc[year[cur_year].shift(-1), scenario["Actual"], province]
# 确定一个背景scope范围
cube1.scope(version["Version1"])
# 手动上卷汇总,从TotalRegion2往下两层开始汇总
cube1.rollup(entity['TotalRegion2'], 2)
# 将计算结果写入Cube
cube1.submit_calc()
结果如下:
回到顶部
咨询热线