用 papermill 参数化和自动化 Jupyter

Python-Papermill是用于参数化执行和分析JupyterNotebooks的工具 立即下载

你是否曾经创建过 Jupyter notebook 并希望可以使用一组不同的参数生成notebook?这样做的话你可能至少执行了以下操作之一:

•编辑单元格中的变量并重新运行notebook,根据需要保存副本。•保存了notebook的副本,并且可能修改了代码以直接在 .ipynb 文件中编辑值并重新运行notebooks•构建了一些自定义代码以使用从数据库或配置文件加载的数据设置变量,然后重新运行notebook

这个问题有一个很好的解决方案,可以将交互式笔记本参数化并与自动化作业很好地共存,这就是所谓的papermill。

动机

许多notebook用户使用在其notebook顶部附近指定一个单元格作为全局变量的标准做法。然后修改单元格中的值并运行整个notebook以获得不同的结果。为了保持输出,作者将手动下载另一种格式的notebook或将其另存为不同的notebook文件。但是仅使用notebook服务器和这些手动方法很快就会变得混乱且难以跟踪,更不用说容易出错了。你编辑的是哪个notebook? Papermill 有助于解决这个问题。在这篇文章中,我将介绍 papermill 和基本用法,通过一个参数化的例子,最后谈谈使用 cron 完全调度和自动化 notebook 执行的方法。

对于papermill,notebook中的一个特殊单元格被指定为参数。当 papermill 通过命令行界面 (CLI) 或使用 Python API 执行参数化notebook时,参数会传入并在后续单元中执行。这允许notebook以不同的参数快速运行多次。然后可以将生成的执行后的notebook保存在各种位置,包括本地或云存储。

安装

要安装 papermill,请使用 pip。我建议使用 virtualenv 或 conda 的虚拟环境。我经常推荐使用 pyenv 来安装最新的 Python 版本并创建一个 virtualenv虚拟环境。

pip install papermill

如果您想使用各种输入和输出选项,如 Amazon 的 s3 或 Microsoft 的 azure,您可以安装所有依赖项。我不会在这里详细介绍,但文档涵盖了这些选项,你甚至可以扩展 papermill 为notebooks的输入/输出 (I/O) 添加其他处理程序。

pip install papermill[all]

基本使用

大多数用户想要用 papermill 做的第一件事就是参数化notebook。一旦您运行了 Jupyter 并打开了一个notebook,您需要做的就是将参数标签添加到包含参数的单元格中。

保存notebook,现在您可以使用 papermill 执行它了。对于示例notebook,请使用 CLI 运行notebook,并提供您自己的名称。

papermill -p name Matt papermill_example1.ipynb papermill_matt.ipynb

此命令告诉 papermill 执行输入 notebook papermill_example1.ipynb 并将输出写入 papermill_matt.ipynb,同时将参数名称设置为值 Matt。如果您打开生成的notebook,将在带有注入参数标签的参数标记之后包含一个新单元格,如下所示。

您现在应该看到如何根据需要添加尽可能多的参数,以便从现有notebook制作新notebook。将主notebook(在我们的例子中是papermill_example1.ipynb)想象成一个模板,您可以使用它通过快速注入参数来制作任意数量的副本。

API 的基本使用

您可能希望使用 Python 代码获取或构建您注入的参数,因此还可以使用 Python API 来执行 papermill。我们可以在 Python 脚本中实现与上述完全相同的结果(或在notebook中,它在那里也能很好地工作 - 并且会动态地向您显示进度)。

import papermill as pm
name = "Matt"
res = pm.execute_notebook(
    'papermill_example1.ipynb',
    'papermill_{name}.ipynb',
    parameters = dict(name=name)
)
{"version_major":2,"version_minor":0,"model_id":"cf8280b216094bf6a75a9536b6505051"}

更多参数传递

到目前为止,我们只传递了一个参数,并使用了 -p 选项来实现这一点。您可以通过几种方式传递参数。

命令行

您可以使用示例notebook运行所有这些内容,然后自己查看结果。首先,您可以从 CLI 指定多个参数。即使notebook中尚不存在参数,也可以传入和创建参数。在这种情况下,papermill 将创建一个注入参数单元并在notebook顶部执行它。

这是一个例子。

papermill -p name Matt -p level 5 -p factor 0.33 -p alive True papermill_example1.ipynb papermill_matt.ipynb

或者用长选项代替......

papermill --parameters name Matt --parameters level 5 --parameters factor 0.33 --parameters alive True papermill_example1.ipynb papermill_matt.ipynb

请注意, -p 或 --parameters 选项将尝试解析整数和浮点数,因此如果您希望将它们解释为字符串,请使用 -r 或 --raw 选项以字符串形式获取所有值。

papermill -r name Matt -r level 5 -r factor 0.33 -r alive True papermill_example1.ipynb papermill_matt.ipynb

您还可以使用 yaml 来指定参数。这可以通过文件(-f 或 --parameters_file)、字符串(-y 或 --parameters_yaml)或 base64 编码字符串(-b 或 --parameters_base64)传入。这允许您传入更复杂的数据,包括列表和字典。

papermill papermill_example1.ipynb papermill_matt.ipynb -y "
name: Matt
level: 5
factor: 0.33
alive: True
sizes:
    - 1.0
    - 2.5
    - 3.7
params:
    x: 3
    y: 4"

您可以很容易地对字符串进行 base64 编码。(在 Mac 或 Linux 或 Windows WSL 上notebook文件所在目录中的 shell 中运行此命令)。

echo  "
name: Matt
level: 5
factor: 0.33
alive: True
sizes:
    - 1.0
    - 2.5
    - 3.7
params:
    x: 3
    y: 4" > params.yaml

现在您可以运行文件版本。

papermill papermill_example1.ipynb papermill_matt.ipynb -f params.yaml

或者base64版本

PARAMS=$(cat params.yaml| base64) # makes the base64 version of the yaml file
papermill papermill_example1.ipynb papermill_matt.ipynb -b $PARAMS

无论哪种方式,你都应该了解可以从命令行和 API 将复杂数据传递到notebook中。这些示例都使用本地文件系统进行notebook的输入和输出,但也可以从 Amazon s3、Azure、Google Cloud Storage 或 Web 服务器读取和写入notebook。

检查notebook

可以从 CLI 检查notebook的可用参数。

$ papermill --help-notebook papermill_example1.ipynb
Usage: papermill [OPTIONS] NOTEBOOK_PATH [OUTPUT_PATH]
Parameters inferred for notebook 'papermill_example1.ipynb':
  name: Unknown type (default "Joe")

或者使用 Python API。

pm.inspect_notebook('papermill_example1.ipynb')
{'name': {'name': 'name',
  'inferred_type_name': 'None',
  'default': '"Joe"',
  'help': ''}}

执行完整的工作流程

papermill的典型工作流程是拥有一个参数化notebook,使用多个值运行它,然后将生成的notebook转换为另一种格式以供审查或报告。让我们通过一个示例来了解如何设置。

首先,我们有一个使用 Yahoo! 金融 API 来获取股票价格并绘制股票历史最高价的数据(或者至少是过去两年的最高价,因为我此时只获取那么多数据)。

如果要运行此示例,则需要确保已安装 yfinance API 和 matplotlib。如果需要,您可以使用 pip 安装两者。

我们可以使用papermill  CLI 来检查参数。

$ papermill --help-notebook papermill_example2.ipynb
Usage: papermill [OPTIONS] NOTEBOOK_PATH [OUTPUT_PATH]
Parameters inferred for notebook 'papermill_example2.ipynb':
  symbol: Unknown type (default 'AAPL')

我们将用几个符号运行这个notebook 。我选择为此使用 shell 脚本,以便我可以通过计划的 cron 程序运行它。如果需要,这可以使用简单的 Python 脚本轻松完成。但是,如果您使用的是虚拟环境,您最终可能需要一个脚本来确保正确加载 virtualenv。在这种情况下,在整个过程中使用 shell 脚本可能会更容易。

我还将使用 jupyter nbconvert(或者您可以将其作为 jupyter-nbconvert 运行)命令将notebook转换为 html 文件,以便通过 Web 浏览器查看。就像 papermill一样,nbconvert 可通过命令行或使用 Python API 获得。

自动化脚本

#!/bin/bash
set -eux
# activate our virtualenv (this was created using pyenv-virtualenv, yours will be elsewhere)
source /Users/mcw/.pyenv/versions/3.8.6/envs/pandas/bin/activate
# get to the script directory if running via cron
cd $(dirname "${BASH_SOURCE[0]}")
for S in AAPL MSFT GOOG FB
do
        papermill -p symbol $S papermill_example2.ipynb papermill_${S}.ipynb
        jupyter-nbconvert --no-input --to html papermill_${S}.ipynb
done

您可以从 shell 运行此命令(在调整激活虚拟环境的行之后)。您还可以很容易地安排它在 cron 中定期运行。例如,您可以像下面这样(使用您自己的路径)在每个工作日的下午 4 点运行此报告。

00 16 * * mon-fri /Users/mcw/projects/python_blogposts/tools/run_papermill.sh

扩展示例

只需多一点创意(和 nbconvert 上的软件配置),您就可以将notebooks 输出为 PDF 或其他格式,通过电子邮件发送,或将它们上传到服务器,以便每天更新报告。

请注意,每个符号的notebooks 都保存到本地磁盘。如果需要调试或进一步工作,它们可以在 Jupyter 服务器中打开并轻松重新执行。请注意,如果您正在运行一个自动化作业,那么每次运行时都会更换notebook。理想情况下,在主模板notebook上工作,然后通过自动化为每个符号生成新版本。

另一个技巧是papermill可以读写标准输入和输出。这意味着如果您有其他工具将notebook文件作为输入,则不必将文件写入磁盘。例如,在上面的 shell 脚本中,我们可以防止为每个符号写出每个单独的notebook文件,而是在循环中执行以下操作。

papermill -p symbol $S papermill_example2.ipynb | jupyter-nbconvert --stdin --no-input --to html --output report_${S}.html

请注意,如果您这样做,则需要打开主notebook (papermill_example2.ipynb) 并编辑参数以调试问题。但是,如果您需要节省磁盘空间并且不需要单独调试每个notebook的能力,那么这可能更可取。

总结

Papermill 是一个用于参数化和执行 Jupyter notebook的库。您可以使用它来自动执行您的notebook,其中包含您可以想到的任何参数集。接着使用 nbconvert 转换notebook,以提供可读且有用的notebook版本。

notebook自动化还有很多事情要做,但是从 Papermill 开始作为执行和参数化notebook的工具是一个很好的构建平台。

强烈推荐李沐等人的《动手学深度学习》最新版!

完整中文版 PDF 终于 在10月 5 日更新 可下载:


内容简介

此书的结构:


以下是主要目录:




????添加AI派团队程序媛小姐姐微信获取资料哦????
添加微信记得备注【深度学习】哦!
不然小姐姐又要向我抱怨了????


添加微信记得备注【深度学习】哦!

觉得有趣就点亮在看吧

papermill-mlflow:ju使用jupyter,papermill和mlflow进行简单的数据科学实验和跟踪 造纸厂 简单数据的科学实验与jupyter , papermill和mlflow 相关博客文章: 快速开始 克隆此仓库 git clone git@github.com:eugeneyan/papermill-mlflow.git 设置virtualenv cd papermill-mlflow # Create virtualenv based on requirements.txt python3 -m venv venv source venv/bin/activate pip install -r requirements.txt # Install kernelspec for Jupyter notebooks (the name argument must be identical) python -m ipykernel install --user --name=pap 立即下载

相关推荐

避开这5个坑!ADNI数据库下载实操经验分享(含断点续传方案)

本文分享了ADNI数据库下载的5个常见陷阱及解决方案,包括高级搜索策略优化、断点续传技巧和数据完整性验证。特别针对大文件下载中断问题,提供了wget断点续传和分卷下载的实操方法,帮助研究者高效获取神经影像数据,避免重复下载和时间浪费。

git9versioner的博客 374

开启数据科学新篇章:papermill—你的Jupyter笔记本参数化执行神器

在当今的数据科学领域中,Jupyter Notebook作为首选的研究和开发工具之一,其强大的交互式环境让无数数据分析和机器学习任务变得直观且高效。然而,随着项目复杂度的提升和个人工作流程需求的变化,单纯的手动修改并运行Notebook已逐渐不能满足用户的期待。正因如此,我们非常激动地向您介绍一款名为papermill的开源工具,它将彻底改变你使用Jupyter Notebook的方式。 ## ...

gitblog_00560的博客 689

lgv20刷twrp_LG港版v20 root

这是LG港版v20 root,整理了一下有关LG港版v20的官方固件包了,有没有需要的呢,这里把固件包整理一下也是方便大家以后好下载了,因此有一些机友还是不知道在哪里下载官方的rom包,在这里说的固件rom包也就是原版的系统包了,大家可以放心的使用,这些系统包也都是支持线刷的,大家下载下来解压出来根据里面的相关教程来操作就可以了,很简单的,如果你也需要的话就一起来看看吧。软件提示注意!! 此过程会...

weixin_33212263的博客 5388

探索Papermill:自动化notebook处理的利器

是一个强大的Python库,它专注于执行Jupyter Notebook,并记录其运行结果。该项目由nteract团队开发,旨在提供一种可重复使用的、基于代码的工作流程,让数据科学家和研究者能够轻松地在Notebook之间进行参数化执行和大规模实验。 ## 技术分析 Papermill的核心功能是通过参数化输入 Notebook(`.ipynb` 文件)并生成新的 Notebook 输出。它与...

gitblog_00064的博客 744

Ubuntu20.04 安装 MATLAB R2023b 常见问题及解决方案

本文提供了Ubuntu20.04系统上安装MATLAB R2023b的完整指南,包括系统要求检查、依赖项安装、详细安装步骤及常见问题解决方案。特别针对GTK模块加载失败、OpenGL图形加速问题和中文显示乱码等常见问题提供了有效解决方法,帮助用户顺利完成安装并优化使用体验。

weixin_42619061的博客 487

Pixhawk+OpenMV实战:如何用Apriltag实现无人机自动降落(附避坑指南)

本文详细介绍了如何利用Pixhawk飞控和OpenMV摄像头,通过Apriltag视觉标签实现无人机的精准降落系统。从硬件搭建、参数配置到视觉处理代码优化,提供了完整的实战指南和避坑建议,帮助开发者快速实现厘米级精度的自动降落功能。

weixin_27076351的博客 483

通过Papermill+Airflow来调度运行Jupyter-Notebook(.ipynb)文件-实战

通过Parpermill+Airflow来运行Jupyter-Notebook(.ipynb)文件实战 在完成数据处理和数据科学代码时,通常我们会使用jupyter-notebook来进行开发,我们可以会开发很多个notebook文件(.ipynb),notebook文件之间可能还存在依赖关系。notebook一多管理起来就会比较麻烦,对上线和任务调度更是一个不小的挑战。 Parpermill是一...

zg_hover的专栏 3062

1.3 重叠因子:希尔伯特变换趋势线(Hilbert Transform - Instantaneous Trendline)概念与Python实战

希尔伯特变换趋势线(Hilbert Transform - Instantaneous Trendline)是一种基于希尔伯特变换的高级技术分析工具。它使用数字信号处理技术来识别价格的主导周期,并生成一条平滑的趋势线。这种方法可以有效过滤市场噪音,提供更准确的趋势信号。

Kewin的博客 2087

如何使用 Papermill:参数化、执行与分析 Jupyter 笔记本的完整指南

Papermill 是一款强大的开源工具,能够帮助开发者轻松实现 Jupyter 笔记本的参数化、执行和分析。通过 Papermill,你可以高效地管理和运行笔记本,提升数据科学工作流的自动化水平和可重复性。 ## 快速安装 Papermill 安装 Papermill 非常简单,只需在命令行中执行以下命令: ```bash python3 -m pip install papermill

gitblog_00442的博客 595

ESP8266-Arduino网络编程实例-异步TCP客户端

本次实例将使用ESPAsyncTCP库实现一个简单的客户端。

视觉与物联智能 1741

Dify知识库文档批量下载神器:一键导出所有文件到本地

在使用Dify进行知识库管理的过程中,我们经常遇到一个实际问题:如何将已上传到知识库中的文档批量下载到本地?目前Dify的管理界面虽然功能强大,但暂时没有提供直接的UI界面来批量导出或下载知识库内的文档。这意味着如果我们需要将知识库中的文件备份到本地或进行离线处理,只能通过API接口来实现。本文将详细介绍如何利用Dify的REST API构建一个完整的知识库文档下载解决方案,这也是目前实现知识库文件批量下载到本地的唯一可行路径。🎉进入大模型应用与实战专栏 | 🚀查看更多专栏内容首先,我们需要在Dify的

羊城迷鹿的博客 3474

如何用 Papermill 轻松实现 Jupyter 笔记本参数化与自动化执行

Papermill 是一款强大的开源工具,专门用于参数化、执行和分析 Jupyter 笔记本。通过 Papermill,你可以轻松实现笔记本的自动化运行,灵活调整参数,极大提升数据科学工作流的效率。无论是生成定期报告、运行批量实验还是构建复杂数据管道,Papermill 都能成为你的得力助手。 ## 🚀 为什么选择 Papermill? 传统 Jupyter 笔记本在处理重复任务时往往需要手

gitblog_00207的博客 431

【电路设计】SERDES与pcie

明确通信接口需要达到什么样的数据速率、信号完整性以及系统中各个部件的互相作用。2.

数字人生 4568

终极Jupyter Notebook自动化工具Papermill:参数化执行完整指南 [特殊字符]

想要摆脱重复运行Jupyter Notebook的繁琐工作吗?Papermill正是你需要的终极解决方案!这款强大的工具专为参数化、执行和分析Jupyter Notebook而设计,让数据科学工作流程实现真正的自动化。📊 Papermill能够让你通过简单的参数配置,自动运行不同场景的Notebook,彻底告别手动复制粘贴的时代。无论你是数据科学家、分析师还是工程师,这款工具都将显著提升你的工

gitblog_00971的博客 910

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Papermill快速入门:10分钟学会Jupyter Notebook批量处理

Papermill是一个强大的Jupyter Notebook参数化与批量执行工具,能够让你轻松实现笔记本的参数化、批量执行和自动化分析。如果你经常需要处理大量相似的数据分析任务,Papermill绝对是你的救星!🚀 ## 为什么选择Papermill? 在数据科学和机器学习工作中,我们经常需要**批量处理Jupyter Notebook**,比如: - 使用不同的参数运行同一个财务报告

gitblog_00656的博客 1139

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Papermill CLI命令完全指南:从基础到高级用法

Papermill是一个强大的Jupyter Notebook参数化、执行和分析工具,通过其命令行界面(CLI),您可以快速自动化笔记本工作流程。本终极指南将带您从基础使用到高级技巧,掌握Papermill CLI的强大功能!🚀 ## 📋 Papermill CLI基础入门 ### 快速安装与验证 首先安装Papermill并验证安装: ```bash pip install pape

gitblog_00883的博客 427

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Papermill:Jupyter Notebook参数化与执行革命

Papermill是一个革命性的开源工具,专门为Jupyter Notebook的参数化、执行和分析而设计,彻底改变了数据科学家和工程师使用Notebook的方式,将交互式探索转变为可重复、可扩展的生产级工作流。该项目解决了传统Jupyter Notebook在生产环境中面临的四大挑战:缺乏参数化能力、执行环境限制、结果追踪困难和工作流集成复杂。通过智能参数化系统、多语言支持、分布式存储支持和强大...

gitblog_00610的博客 511

Papermill在金融行业的应用:自动化报告与风险分析

**Papermill**作为一款专业的Jupyter Notebook参数化与执行工具,正在金融行业掀起一场效率革命!📈 这款强大的工具让金融从业者能够自动化执行复杂的数据分析流程,大幅提升风险管理、投资决策和监管报告的效率。通过参数化执行金融分析报告,Papermill为银行、券商、基金公司等金融机构提供了可靠的技术解决方案。 ## 🔍 为什么金融行业需要Papermill? 金融行业

gitblog_01078的博客 918

Papermill与scikit-learn集成:机器学习模型自动化训练终极指南

如何快速实现机器学习模型的自动化训练和参数调优?Papermill为你提供了完美的解决方案!作为一款强大的Jupyter Notebook参数化执行工具,Papermill能够与scikit-learn无缝集成,帮助数据科学家和机器学习工程师构建高效、可重复的模型训练工作流。本指南将为你展示如何利用Papermill实现scikit-learn模型的自动化训练、超参数调优和批量实验管理,让你的机器

gitblog_00629的博客 858

Papermill参数化技术终极指南:从简单变量到复杂数据结构的完整教程

Papermill是一个强大的工具,专门用于参数化、执行和分析Jupyter Notebooks。通过Papermill参数化技术,您可以将静态的notebook转换为可重用的模板,实现批量自动化执行。🚀 ## 什么是Papermill参数化? Papermill参数化技术允许您将notebook中的特定变量标记为参数,然后在执行时动态地传入不同的值。这意味着您可以用同一个notebook处

gitblog_00683的博客 503

Papermill与Streamlit集成:从Notebook到Web应用的快速转化

想要将你的Jupyter Notebook快速转化为交互式Web应用吗?📊 通过Papermill与Streamlit的完美集成,你可以轻松实现这一目标!Papermill作为专业的Notebook参数化与执行工具,结合Streamlit的快速Web应用开发能力,为你提供从数据分析到产品展示的完整解决方案。 ## 为什么选择Papermill + Streamlit组合? Papermill

gitblog_01139的博客 880

Jupyter Notebook定时任务执行Miniconda脚本

通过Miniconda、papermill与cron的组合,实现Jupyter Notebook在生产环境中的定时自动化执行。方案解决了依赖隔离、参数化运行和周期调度三大核心问题,兼顾开发效率与运维可靠性,适用于模型重训、数据清洗等场景。

weixin_42284380的博客 628

Python自动化:Windows下不用任务管理器也可以轻松定时执行任务

也许您有一份财务报告,您希望在一个月的第一天或最后一天或一年的开始或结束时使用不同的值运行,使用参数可以使这项任务更容易。你想运行一个 Notebook 并根据它的结果,选择一个特定的 Notebook 来运行吗?如果你只是在 Python 代码里定时一个或者多个工作,你并不需要 papermill,使用 papermill,是为了可以方便地定时执行你的 Notebook。我们即可以像上面的例子那样以 API 的方式使用,也可以以命令行的方式来运行,例如, 运行本地。把结果保存到 AWS 的 s3 上,

Python数据挖掘 1209

pydata-book自动化报告:使用Jupyter Notebook生成动态报告

pydata-book是Wes McKinney编写的《Python for Data Analysis》一书的源代码仓库,书中涵盖了使用pandas、NumPy和其他相关库进行数据处理和分析的实践案例和技术指南。通过Jupyter Notebook,用户可以轻松创建包含代码、文本、图表的动态报告,实现数据可视化与分析的无缝集成。 ## 为什么选择Jupyter Notebook生成报告? J

gitblog_00843的博客 849

Papermill与FastAPI集成:构建Notebook API服务的终极指南

📊 想要将Jupyter Notebook转换为可扩展的API服务吗?Papermill与FastAPI的完美结合让这变得简单快捷!本文将带你从零开始,构建一个强大的Notebook API服务,让你的数据科学工作流实现自动化部署。✨ ## 什么是Papermill参数化执行? Papermill是一个强大的Python工具,专门用于参数化、执行和分析Jupyter Notebook。通过参

gitblog_01196的博客 341
上一篇: 超全的 100 个 Pandas 函数汇总,建议收藏
下一篇: B站崩了上热搜,A站跟着躺枪!微信、支付宝:跟我们比起来这是小问题
Wang_AI
博客等级 码龄12年 996粉丝 162原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值