CatBoost的Java端推理

TensorFlow、LightGBM与CatBoost处理不平衡数据的实战差异 不平衡数据是机器学习在风控、医疗、工业等场景落地的核心障碍,其本质在于模型优化目标(如准确率)与业务目标(如高召回率)错位。解决该问题需深入理解算法底层机制:深度学习框架依赖损失函数设计(如Focal Loss)和端到端可调性;梯度提升树(如LightGBM)通过分裂增益加权(scale_pos_weight)干预树构建过程;而CatBoost则将类别特征编码与类别权重耦合,实现隐式平衡。技术价值不仅在于提升AUC或PR曲线,更在于支撑可解释决策、时序建模与业务规则融合。本文聚焦金融欺诈检测等真实低频正样本 阅读详情

CatBoost模型的Java推理相比LightGBM会简单许多,无需转换成pmml格式,直接用官方的Java-package即可。

最主要的是,它直接支持字符串类型的类别特征,无需做各种编码转换,简直不要太6。

参考文档:https://catboost.ai/en/docs/concepts/java-package

014de0c0445dfc551db919956c537ac2.png

一,Java项目添加Maven依赖

注意version与python中的一致

<!-- https://mvnrepository.com/artifact/ai.catboost/catboost-prediction -->
<dependency>
    <groupId>ai.catboost</groupId>
    <artifactId>catboost-prediction</artifactId>
    <version>1.0.6</version>
</dependency>

二,Python端训练CatBoost模型

此处以adult数据集的二分类问题为例。

from sklearn.datasets import fetch_openml
from sklearn.model_selection import train_test_split 
import datetime 

import numpy as np 
import pandas as pd 
import plotly.express as px 


import catboost as cb 
def printlog(info):
    nowtime = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    print("\n"+"=========="*8 + "%s"%nowtime)
    print(info+'...\n\n')
    
    
#================================================================================
# 一,准备数据
#================================================================================
printlog("step1: preparing data...")


adult = fetch_openml(name = "adult",version=1,as_frame=True)

label_col = "target"
dfdata = adult["data"]
dfdata["target"] = (adult["target"]==">50K").astype("float")

cat_features = dfdata.drop("target",axis=1
                ).select_dtypes("category").columns.values.tolist()
cat_features.sort()

num_features = [col for col in dfdata.columns if col not in cat_features+[label_col]]
num_features.sort() 

dfdata[cat_features] = dfdata[cat_features].astype(str)
dfdata[cat_features].fillna("missed") 

dfdata = dfdata[num_features+cat_features+[label_col]]

dftrain_val,dftest = train_test_split(dfdata,test_size=0.3)
dftrain,dfval = train_test_split(dftrain_val,test_size=0.3)

# 整理成Pool
pool_train = cb.Pool(data = dftrain.drop(label_col,axis=1), 
                     label = dftrain[label_col], cat_features=cat_features)
pool_val = cb.Pool(data = dfval.drop(label_col,axis=1), 
                     label = dfval[label_col], cat_features=cat_features)
pool_test = cb.Pool(data = dftest.drop(label_col,axis=1), 
            label = dftest[label_col], cat_features=cat_features)


#================================================================================
# 二,设置参数
#================================================================================
printlog("step2: setting parameters...")
                               
iterations = 1000
early_stopping_rounds = 200

params = dict(
    loss_function = "Logloss",
    eval_metric = "AUC",
    random_seed = 42,
    logging_level = 'Silent',
    use_best_model = True,
    nan_mode = 'Min',
    ###
    learning_rate = 0.05,
    depth = 6,
    min_data_in_leaf = 10,
    one_hot_max_size = 5,      #类别数量多于此数将使用ordered target statistics
    boosting_type = "Ordered", #Ordered 或者Plain
    max_ctr_complexity = 2,    #特征组合的最大特征数量,设置为1取消特征组合,
)



model = cb.CatBoostClassifier(
        iterations = iterations,
        early_stopping_rounds = early_stopping_rounds,
        **params
    )


#================================================================================
# 三,训练模型
#================================================================================
printlog("step3: training model...")


model.fit(
    pool_train,
    eval_set=pool_val,
    plot=True
)



#================================================================================
# 四,评估模型
#================================================================================
printlog("step4: evaluating model ...")


#feature importance 
dfimportance = model.get_feature_importance(prettified=True) 
dfimportance = dfimportance.sort_values(by = "Importances").iloc[-20:]
fig_importance = px.bar(dfimportance,x="Importances",y="Feature Id",title="Feature Importance")

display(dfimportance)
display(fig_importance)


#score distribution
y_test_prob = model.predict_proba(dftest.drop(label_col,axis = 1))[:,-1]
fig_hist = px.histogram(
    x=y_test_prob,color =dftest[label_col],  nbins=50,
    title = "Score Distribution",
    labels=dict(color='True Labels', x='Score')
)
fig_hist.show() 



#================================================================================
# 五,使用模型
#================================================================================
printlog("step5: using model ...")

y_pred_test = model.predict(dftest)
y_pred_test_prob = model.predict_proba(dftest)

print("y_pred_test:\n",y_pred_test[:10])
print("y_pred_test_prob:\n",y_pred_test_prob[:10])


#================================================================================
# 六,保存模型
#================================================================================
printlog("step6: saving model ...")

model_dir = 'adult_model.cbm'
model.save_model(model_dir)
model_loaded = cb.CatBoostClassifier()
model.load_model(model_dir)

得到的adult_model.cbm放入到java项目的resource目录下.

三,Java端推理预测封装

推理代码封装如下

package com.example.model;

import ai.catboost.CatBoostModel;
import ai.catboost.CatBoostPredictions;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.InputStream;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Map;

public class CatBoostClassifier {

    public CatBoostModel model;

    private static Logger LOG= LoggerFactory.getLogger(CatBoostClassifier.class);

    public CatBoostClassifier(String model_path) {
        try{
            InputStream model_file = Thread.currentThread()
                    .getContextClassLoader()
                    .getResourceAsStream(model_path);
            this.model = CatBoostModel.loadModel(model_file);

        }catch (Exception err){
            LOG.error("catboost-init-error", err);
            System.out.println(err.toString());
        };

    }

    public Double predict(Map<String,Double> num_features,Map<String,String> cat_features){
        try {
            String[] feature_names = this.model.getFeatureNames();
            assert (num_features.size() + cat_features.size()) == feature_names.length;

            float[] num_arr = new float[num_features.size()];
            String[] cat_arr = new String[cat_features.size()];

            int i = 0;
            int j = 0;
            for (String name : feature_names) {
                if (num_features.keySet().contains(name)) {
                    num_arr[i] = num_features.get(name).floatValue();
                    i += 1;
                } else {
                    assert cat_features.keySet().contains(name);
                    cat_arr[j] = cat_features.get(name);
                    j += 1;
                }
            }
            CatBoostPredictions prediction = this.model.predict(
                    num_arr,
                    cat_arr);
            Double prob = 1.0 - 1.0 / (1.0 + Math.exp(prediction.get(0, 0)));
            return prob;
        }catch (Exception err){
            LOG.error("catboost-predict-error", err);
            return null;
        }
    }
}

四,预测调用测试代码

import java.util.*;
import com.example.model.CatBoostClassifier;

public class CatBoostTest {
    public void testCatBoostClassifier(){
        CatBoostClassifier clf = new CatBoostClassifier("adult_model.cbm");
        
        Map<String,Double> num_features = new HashMap<String,Double>();
        Map<String,String> cat_features = new HashMap<String,String>();
        
        num_features.put("fnlwgt",236379.0);
        num_features.put("education-num",11.0);
        
        
        cat_features.put("workclass","Private");
        cat_features.put("sex","Male");
        cat_features.put("relationship","Husband");
        cat_features.put("race","White");
        cat_features.put("occupation","Craft-repair");
        cat_features.put("native-country","United-States");
        cat_features.put("marital-status","Married-civ-spouse");
        cat_features.put("hoursperweek","2");
        cat_features.put("education","Assoc-voc");
        cat_features.put("capitalloss","0");
        cat_features.put("capitalgain","0");
        cat_features.put("age","1");

        Double model_prob = clf.predict(num_features,cat_features);
        System.out.println(model_prob);
        System.out.println("sucessed!");
    }

}

f2bb77ad8d50224cd048efc00515520a.png

[学习笔记]机器学习——算法及模型(六):Catboost CatboostCatboost是什么?Catboost 的原理类别型特征Greedy TS特征组合解决预测偏移 Catboost是什么? CatBoost是俄罗斯的搜索巨头Yandex在2017年开源的机器学习库,是Categorical Features(类别型特征)+Gradient Boosting(梯度提升) ,也是基于梯度提升决策树的机器学习框架。 大多数流行的梯度提升算法利用决策树作... 阅读详情

相关推荐

最详细的Catboost参数详解与实例应用

集成学习的两大准则:基学习器的准确性和多样性。 算法:串行的Boosting和并行的Bagging,前者通过错判训练样本重新赋权来重复训练,来提高基学习器的准确性,降低偏差!后者通过采样方法,训练出多样性的基学习器,降低方差。 文章目录1.CatBoost简介1.1CatBoost介绍1.2CatBoost优缺点1.3CatBoost安装2.参数详解2.1通用参数:2.2默认参数2.3性能参数2.4参数调优3.CatBoost实战应用3.1回归案例3.2使用Pool加载数据集并进行预测3.3多分类案例..

代码届的小白的博客 5万+

训练日志刷屏使我痛苦,我开发了VLog

训练日志刷屏使我痛苦,我开发了VLog,可以在任意训练代码中轻松使用~例如,通过callback嵌入到lightgbm/catboost/transformers/ultralytics,乃至keras库的训练代码流程中~before:after:为什么不用tensorboard或者wandb?tensorboard需要开端口权限,服务器开发环境有时候没有端口权限~wandb需要联网,有时候网速很...

Python_Ai_Road的博客 489

CatBoost处理教育数据的实战边界与交叉验证必要性

CatBoost是一种专为高基数类别特征设计的梯度提升算法,其核心优势在于内置有序目标编码(Ordered Target Encoding)和对半结构化文本的原生支持,避免了传统One-Hot导致的维度爆炸与LabelEncoder引发的语义失真。在教育AI场景中,学生行为数据普遍具有时间混乱、标签两极分化、缺失值富含业务语义等特点,CatBoost凭借对类别变量的鲁棒建模能力与低预处理依赖,显著缩短特征工程周期并提升模型稳定性。交叉验证在此类分布易漂移的数据中并非可选优化项,而是识别训练集偏差、暴露样本代

abo1977的博客 446

如何在Java应用里集成Spark MLlib训练好的模型做预测

前言 昨天媛媛说,你是不是很久没写博客了。我说上一篇1.26号,昨天3.26号,刚好两个月,心中也略微有些愧疚。今天正好有个好朋友问,怎么在Java应用里集成Spark MLlib训练好的模型。在StreamingPro里其实都有实际的使用例子,但是如果有一篇文章讲述下,我觉得应该能让更多人获得帮助 追本溯源 记得我之前吐槽过Spark MLlib的设计,...

allwefantasy的专栏 1781

CatBoost交叉验证实战:教育数据建模的特征处理与调优

梯度提升树(GBDT)是处理结构化业务数据的核心算法,其原理在于通过多轮残差拟合构建强集成模型,技术价值体现在对高维稀疏特征、类别变量及缺失值的天然鲁棒性。在教育数据分析场景中,学生行为日志普遍具备离散特征多、样本不均衡、时间依赖性强等特点,亟需适配目标编码、分层时序分割与F2-score加权评估等定制化策略。CatBoost凭借有序目标编码、缺失值语义化处理和GPU加速下的稳定特征重要性,成为该领域优于XGBoost与LightGBM的实践优选。本文聚焦教育数据建模全流程,涵盖CatBoost交叉验证、特

weixin_33816821的博客 632

从零搭建短视频推荐系统:Hadoop+协同过滤+CatBoost实战指南

推荐系统是现代互联网平台连接海量内容与用户兴趣的核心技术引擎。其核心原理是通过分析用户历史行为数据,挖掘用户偏好与物品之间的潜在关联,从而预测用户可能感兴趣的内容。在工程实践中,一个完整的推荐系统通常采用分层架构,包含离线计算与在线服务两大模块。离线层负责处理海量数据、训练模型,而在线层则需在毫秒级延迟内响应用户请求。这种架构设计能够有效平衡计算复杂度与实时性要求,广泛应用于电商、资讯、短视频等场景。以短视频推荐为例,系统首先通过协同过滤等算法从海量内容中快速召回候选集,再借助CatBoost等梯度提升树模

weixin_30613727的博客 343

2021工业AI实战五模型:随机森林/XGBoost/LightGBM/CatBoost选型指南

机器学习模型选型本质上是工程约束下的最优解匹配,而非单纯追求指标排名。在真实工业场景中,数据噪声大、样本稀疏、算力受限、可解释性要求高,使得传统教科书模型常面临部署失效、推理延迟、维护困难等挑战。本文聚焦2021年企业级AI落地关键阶段,围绕随机森林的决策冗余机制、XGBoost的正则化工程意义、LightGBM的直方图内存权衡、CatBoost的有序编码物理适配等核心能力展开技术解析,强调模型与数据质量、硬件资源、运维能力的深度耦合。适用于设备故障预测、传感器时序分析、边缘智能部署等典型工业AI任务,为算

culuo8053的博客 1258

表格学习实战指南:梯度提升树与深度学习如何选型

表格学习指在结构化数据(如数据库、Excel、CRM导出表)上构建预测模型的技术范式,其核心挑战在于处理离散与连续混合特征、高频缺失值、强业务逻辑耦合及分布偏斜。梯度提升树(如LightGBM、CatBoost)凭借内置缺失处理、原生类别支持和稳定可解释性,成为工业界默认首选;而深度学习(如TabNet、DeepFM)则在高维稀疏ID交互、长尾模式挖掘等特定场景展现优势。二者差异不在理论能力,而在数据预处理成本、超参数鲁棒性、推理延迟与监管可解释性等工程维度。本文聚焦真实生产生命周期——从SQL特征获取、实

weixin_31534091的博客 229

10个生产级回归算法实战选型与避坑指南

回归模型是机器学习落地最广泛的技术之一,其核心在于平衡预测精度、可解释性、鲁棒性与工程约束。从线性回归到LightGBM、CatBoost等树模型,不同算法在异常值敏感度、缺失值处理、类别特征支持、内存占用和增量训练能力上存在本质差异。实际业务中,传感器噪声、时间序列泄漏、高维稀疏特征、边缘设备资源限制等现实约束,远比理论假设复杂。本文基于工业设备寿命预测、电商GMV归因、金融风控评分卡等真实场景,系统梳理Huber回归的δ参数调优、LightGBM的categorical_feature显式声明、Rand

weixin_30527423的博客 303

PySpark MLlib:企业级机器学习管道的工程化底座

机器学习管道(ML Pipeline)是现代数据系统中连接特征工程、模型训练与部署的核心范式,其本质是将数据处理逻辑封装为可复现、可追踪、可伸缩的声明式工作流。基于Spark引擎的分布式实现,如PySpark MLlib,通过原生集成Catalyst优化器与Tungsten内存管理,显著降低序列化开销与故障恢复成本,并天然支持Delta Lake等现代数据湖格式。相比Dask或Ray等外部框架,MLlib以稳定性、确定性与运维友好性见长,尤其适合需满足合规审计、亿级数据吞吐与端到端血缘追溯的生产场景。本文聚

weixin_30291791的博客 422

XGBoost实战手记:参数协同原理与工业级调优指南

XGBoost作为最成熟的梯度提升树框架,其核心价值不在于理论新颖性,而在于对结构化数据建模的工程可控性与部署鲁棒性。它通过显式正则化(gamma、lambda)、二阶泰勒近似分裂增益、加权分位数草图等机制,在精度、速度与可解释性之间取得独特平衡。相比LightGBM的直方图加速或CatBoost对类别特征的原生支持,XGBoost更依赖参数间的协同约束——如learning_rate与early_stopping_rounds的倒数关系、gamma与min_child_weight构成的双重剪枝逻辑。这些

weixin_34268753的博客 374

10个工业级回归算法实战选型与避坑指南

回归模型是机器学习落地最广泛的基础任务,其核心在于平衡预测精度、计算效率与业务可解释性。从线性模型的正则化原理,到树模型的过拟合控制机制,再到梯度提升框架对类别特征的差异化处理逻辑,不同算法在数据规模、特征结构和部署约束下表现出显著性能分层。尤其在真实业务场景中,Ridge/Lasso依赖特征标准化,XGBoost需规避类别编码陷阱,LightGBM与CatBoost原生支持高维稀疏输入——这些关键差异直接决定模型能否稳定上线。本文聚焦工业实践中的10个高性价比回归算法,覆盖小样本稳健建模、大数据实时预测及

weixin_34248487的博客 440

ML之CatBoost:CatBoost算法的简介、安装、案例应用之详细攻略

ML之CatBoost:CatBoost算法的简介、安装、案例应用之详细攻略 目录 CatBoost算法的简介 1、算法原理 2、优缺点 3、与XGBoost、LightGBM相比,CatBoost的创新点有: (1)、CatBoost、LightGBM、XGBoost、H2O算法性能对比 CatBoost算法的安装 CatBoost算法的案例应用 CatBoost算法的简介 CatBoost,即Categorical和Bo...

头部AI社区如有邀博主AI主题演讲请私信—心比天高,仗剑走天涯,保持热爱,奔赴向梦想!低调,专注,谦虚,自律,反思,成长,还算比较正能量的博主,公益免费传播…内心特别想在AI界做出一些可以推进历史进程影响力的技术(兴趣使然,有点小情怀,也有点使命感呀 5733

机器学习工程师成长路径:从本科生到工业级ML系统构建

机器学习工程师不是单纯掌握算法或调参的岗位,而是一个融合数据工程、模型工程与系统工程的复合型技术角色。其核心能力源于真实问题驱动的学习闭环——通过最小可行问题倒逼知识获取,在实践中识别并规避典型工程陷阱(如特征泄露、训练-推理不一致、服务内存泄漏)。技术价值体现在将模型转化为稳定、可观测、可迭代的业务服务,支撑推荐、风控、搜索等关键场景。本文基于作者在Towards AI持续输出47篇工业级技术笔记的真实经历,系统拆解一条可复现的成长路径:以数据管道为基座,以模型生命周期管理为中枢,以服务网格化为高阶能力,

weixin_30240349的博客 513

LPDDR5/5X BG mode,8B mode和16B mode

LPDDR5/5X 器件,协议上支持多个bank架构可静态配置;配置在MR3:模式说明协议要求速率要求BLBG模式每CH 4BG, 4BALPDDR5/5X>3200MbpsBL16 & 328B模式每CH 8BALPDDR5任何速率BL3216B模式每CH 16BALPDDR5/5X<=3200MbpsBL16 & 32。

hemlok的博客 8865

Ubuntu22.04 网络图标消失与连接故障排查指南(附实战修复流程)

本文详细介绍了Ubuntu22.04系统中网络图标消失与连接故障的排查与修复方法。通过ifconfig、dhclient等命令诊断问题,提供从紧急恢复网络连接到深度排查的完整解决方案,帮助用户快速恢复网络功能并预防类似问题再次发生。

weixin_28481133的博客 289

XGBoost在工业场景中的不可替代性:稳健性、可解释性与工程落地

XGBoost作为一种基于梯度提升的决策树集成模型,其核心价值不在于理论新颖性,而在于对现实工业场景中数据噪声、小样本偏移、线上低延迟和业务可解释等多重约束的综合平衡。它通过二阶泰勒展开优化、内置缺失值处理、原生类别特征支持及SHAP高效归因等机制,在统计稳健性与计算确定性之间取得独特优势。相比LightGBM的直方图近似或深度学习对GPU与标准化的强依赖,XGBoost在CPU环境下的轻量部署、跨平台结果一致性及模型文件JSON化等能力,使其持续成为金融风控、供应链预测与IoT边缘推理等关键系统的主干模型

weixin_34414650的博客 362

别再乱改grub.cfg了!手把手教你用GRUB2自定义多系统启动菜单(含UEFI/BIOS双模式配置)

本文详细介绍了如何安全、高效地使用GRUB2自定义多系统启动菜单,涵盖UEFI/BIOS双模式配置。通过避免直接编辑grub.cfg文件,采用正确的配置方法和命令,帮助用户打造稳定且美观的启动环境,特别适合Linux多系统用户和开发者。

weixin_42553471的博客 590

为什么Python是机器学习项目最不费劲、最扛事的语言

Python作为机器学习主流开发语言,其核心价值不在于底层性能,而在于极低的认知负荷与超高开发效率。它通过简洁语法、动态类型和交互式探索(如Jupyter)显著缩短‘想法→可运行代码’路径;依托NumPy、PyTorch等C/CUDA加速库,将计算瓶颈外包,自身专注流程调度与实验迭代。在数据清洗、特征工程、模型验证等占全流程70%以上的非训练环节,Python凭借pandas、scikit-learn等开箱即用的生态,实现分钟级反馈与无缝工具链切换。这种‘人效优先’的设计哲学,使其成为算法验证、MLOps落

weixin_34375251的博客 444

某东x-api-eid-token风控参数分析与破解

x-api-eid-token是京东的风控参数,在接口当中,如果没有该参数,有一定的概率能请求成功,但是在请求一段时间后,会报403权限失败的,该参数主要通过jsTk.do这个接口生成,并且会将其存储到cookie当中。

zhouzhou_98的博客 1553

使用 Python 爬虫获取中国证券市场公司公告数据

本文详细介绍了如何使用 Python 爬虫技术从中国证券市场(如巨潮资讯网)爬取公司公告数据。通过分析网页结构,编写爬虫脚本,抓取并存储公告信息,我们实现了从网页抓取数据的全过程。此外,本文还展示了如何应对反爬虫机制,并介绍了数据分析与可视化的基本方法。未来,我们可以通过机器学习等技术进一步挖掘公告中的潜在信息,例如,通过情感分析对公告内容进行情绪分类,或者预测某些公告类型对股市走势的影响等。希望本文能帮助你理解如何使用 Python 爬虫技术获取和处理证券市场的数据,并为你的数据分析项目提供帮助。

2201_76125261的博客 1888

AI技术选型实战地图:符号AI、连接主义与混合智能落地指南

人工智能不是单一技术,而是涵盖符号推理、统计学习、行为交互等多范式的工程体系。理解符号AI的可解释性优势、连接主义对非结构化数据的强拟合能力,以及混合智能在可信性与泛化性之间的平衡,是企业技术落地的前提。这些范式决定了模型是否可审计、部署是否依赖GPU、响应能否满足毫秒级要求,并直接影响金融风控的合规性、工业质检的稳定性及边缘设备的功耗表现。本文基于23个已交付项目实测数据,系统梳理七类主流AI技术在数据需求、硬件门槛、可解释性与典型延迟上的真实差异,为业务需求匹配最适配、最低风险、最高ROI的技术路径。

weixin_33743248的博客 505

人形机器人开源资源大盘点(四):硬件开源平台

开源人形机器人平台推动技术民主化 本期聚焦四大开源人形机器人平台:斯坦福的ToddlerBot以6000美元低成本实现30自由度运动,支持仿真到现实的零样本迁移;法国Reachy2被HuggingFace收购,融合开源AI与硬件,适配医疗、工业等场景;国内OriginMan基于ROS2全开源,集成大模型能力,支持深度改造;OAN框架则为经典NAO机器人注入开源活力,扩展交互功能。这些平台通过不同路径降低研发门槛,推动人形机器人技术走向开放共享的未来。

Studying…… 370

端到端数据科学实战:从业务问题到可部署模型的闭环训练

端到端数据科学指从真实业务问题出发,贯穿数据溯源、脏数据处理、可解释建模、生产部署与效果归因的完整链路。其核心原理在于打破‘调参即交付’的碎片化实践,强调技术决策必须响应业务约束(如300ms延迟、0.8%误拒率)和业务语义(如‘跳出率飙升’需映射到埋点与性能指标对齐)。这种能力具有显著技术价值:提升模型在复杂现实环境中的鲁棒性与可维护性,并支撑数据驱动的业务动作落地。典型应用场景包括电商用户流失预警、银行实时欺诈拦截、临床试验患者匹配等高约束、多源异构、强合规需求领域。本文聚焦10个经企业验证的端到端项目

weixin_30635053的博客 329

【WorkBuddy专栏19】技能的创造与迁移——从零开始打造你的AI工作流

【WorkBuddy专栏19】技能的创造与迁移——从零开始打造你的AI工作流

AI人人懂 379

SAPFiori Elements Analytical List Page 概述

ALP(Analytical List Page)是SAP Fiori提供的一种复合页面类型,结合了分析(图表/KPI)与事务(表格/操作)功能,适用于需要分析后立即执行处理的业务场景(如采购价格监控、销售逾期处理等)。其核心价值在于让用户在同一页面完成从数据洞察到事务处理的闭环,减少应用切换带来的效率损耗。 页面结构包含页头KPI标签、交互式图表和明细表格,通过联动过滤、选择同步等机制实现数据钻取与即时操作。支持标准过滤和可视化过滤,并依赖OData注解(SelectionVariant/Presenta

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 272
上一篇: 3k+星星的eat_pytorch_in_20_days更新啦
下一篇: 30行代码用streamlit构建你的机器学习模型应用
算法美食屋
博客等级 码龄9年 2万+粉丝 154原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值