数据预处理

数据预处理

目录

​编辑

数据清洗

缺失值处理

寻找缺失值(ismissing / isnan)

选择处理方法(填充、删除或插值)

删除

填充

插值

一维插值

二维插值(网络节点)

二维插值(散乱节点)

异常值处理

查找异常值

方法1:箱线图(Box Plot)

基于分位数的方法

Z-Score 方法

离群点检测算法

数据分布分析

数据转换

进行处理

删除(与缺失值同样)

替换(与缺失值同样)

截断

转换

重复值处理

数据变换

简单函数变换

对数变换(Log Transformation):

幂函数变换(Power Transformation):

平方根变换(Square Root Transformation):

指数变换(Exponential Transformation):

反函数变换:

归一化(Normalization):

中心化(Centering):

离散化(Discretization):

归一化(Normalization):

标准化处理

常用方法:

Z-score标准化(零均值标准化)

Min-Max标准化

其他方法:

分类变量处理(数据编码)

常用方法

二进制编码(Binary Encoding):

独热编码(One-Hot Encoding):

标签编码(Label Encoding):

整数编码(Integer Encoding):

有序编码(Ordinal Encoding):

WOE编码(Weight of Evidence):

其他方法

频率编码(Frequency Encoding):

目标编码(Target Encoding):

连续变量离散化(离差标准化)

解释:

目的:

常用方法:

等宽离散化(等距离散化):

等频离散化:

基于聚类的离散化:

基于分位数的离散化:


数据清洗

检测并处理数据中的缺失值,可以通过填充、删除或插值等方式进行处理。

A:为输入数组,可以是向量、矩阵或多维数组等。 TF :为输出的逻辑数组,指示数组或表中的哪些元素包含缺失值。 ​ TF 的大小与 A的大小相同。 ‘1’代表缺失值,‘0’则不是。

如果某个变量或某个样本缺失了 70%以上的数据,那么此时对数据进行填补的话会引入更多的噪声,反而会降低模型的性能,故此时一般直接将该变量或样本删除; 如果缺失的不多,我们可以考虑对缺失值进行填补。

样本缺失了 70%以上的数据

          • 代码:[R, TF] = rmmissing(A, dim)

A :为输入数组,可以是向量、矩阵或多维数组等。 dim: 运算维度,默认为 1,删除缺失值所在行,设为 2 则删除缺失值所在列。 R :为删除缺失值条目后的数据。 TF:为已删除条目的指示符。 rmmissing 这个函数比较简单粗暴,只要有缺失值就把缺失值所在行删了,谨慎使用

A:输入的数据矩阵或向量,其中可能包含缺失值(NaN)。 method:指定填充缺失值的方法。可以使用以下方法之一:        'constant':用指定的常数填充缺失值。需要提供额外的参数 'constantValues',指定填充的常数值。        'previous':使用前一个非缺失值填充缺失值。        'next':使用后一个非缺失值填充缺失值。 fillmissing 函数将根据指定的填充方法对输入数据进行处理,并返回一个新的矩阵或向量 F,其中缺失值已经被填充。

该方法的思想是在缺失值前后开一个“窗口”,用“窗口”内的数据的均值或中位数进行填充 方法(movmethod)说明 ​‘movmean’窗口长度为 window 的移动均值 ​‘movmedian’窗口长度为 window 的移动中位数

所有的插值方法都要求x是单调的,并且xi不能够超过x的范围

 yi——xi处的插值结果 x,y——给定的数据点 xi——被插值点 'method'——插值方法         ‘nearest’     最邻近插值         ‘ linear’    线性插值          ‘spline’     三次样条插值          ‘cubic’     立方插值          缺省时      分段线性插值

要求x,y单增的;cx,cy可取为矩阵,或cx取行向量,cy取为列向量;而z和cz则为矩阵。cx,cy的值分别不能超出x,y的范围。

            • 代码:cz=interp2(x,y,z,cx,cy,’method’)

 cz——cy处的插值结果 x,y,z——给定的数据点 cx,cy——被插值点 'method'——插值方法          ‘nearest’   最邻近插值          ‘linear’    双线性插值           ‘cubic’ 双三次样条插值           缺省时,    双线性插值

'method'——插值方法            ‘nearest’      最邻近插值             ‘linear’      双线性插值             ‘cubic’       双三次插值             'v4‘  Matlab提供的插值             缺省时,       双线性插值

是在数据集中与其他数据明显不同的值,异常值可能对数据分析和建模产生影响,因此在数据处理过程中,通常需要对异常值进行处理。

箱线图是一种可视化方法,可以帮助识别数据集中的异常值。箱线图通过显示数据的中位数、四分位数和离群点来呈现数据的分布情况。离群点被认为是异常值。

基于分位数的方法使用数据的分位数来识别异常值。例如,可以定义一个阈值,超出该阈值的数据被认为是异常值。

            • 代码
              • threshold = 2.5;% 设置阈值,超出阈值的数据将被视为异常值
              • outliers = abs(A - median(A)) > threshold * iqr(A);
          • Z-Score 方法

Z-Score 是一种标准化数据的方法,通过计算数据点与均值之间的差异来识别异常值。Z-Score 超过设定阈值的数据点被认为是异常值。

            • 代码:TF = isoutlier(A, method)

A:输入的数据向量或矩阵,用于检测其中的异常值。 method:可选参数,指定用于检测异常值的方法。它可以是字符串或字符向量,并且支持以下值:        ‘quartiles’:在数据分析中,常用的异常值检测方法之一是基于四分位数的方法常见的异常值检测方法基于 IQR,根据以下规则来判断是否存在异常值:        'gesd':Generalized Extreme Studentized Deviate (GESD) 方法。此方法基于 Z-Score,用于检测一组数据中的单个异常值。        'grubbs':Grubbs 方法。此方法用于检测一组数据中的单个异常值。        'median':基于中位数的方法。此方法用于检测中位数附近的异常值。        'mean':基于均值的方法。此方法用于检测均值附近的异常值。        'percentiles':基于分位数的方法。此方法用于检测超出一组数据的上下分位数的异常值。        'movmedian':基于移动窗口中位数的方法。此方法用于检测一组数据中的单个异常值,可在时间序列或滑动窗口数据上使用。        'movmean':基于移动窗口均值的方法。此方法用于检测一组数据中的单个异常值,可在时间序列或滑动窗口数据上使用。 isoutlier 函数返回一个逻辑数组 TF,其大小与输入数据 A 相同。TF 中的元素为 true 表示对应位置的数据被认为是异常值,为 false 表示对应位置的数据不是异常值。 使用 isoutlier 函数可以快速检测数据中的异常值,方便进行数据处理和分析。根据具体需求和数据特点,可以选择合适的方法来检测异常值。

离群点检测算法是使用机器学习或统计学方法来自动识别异常值。常见的离群点检测算法包括 Isolation Forest、Local Outlier Factor (LOF)、One-Class SVM 等。

可以通过绘制数据的直方图、密度图等来分析数据的分布情况,从而判断是否存在异常值。

            • 代码
              • % 假设数据存储在名为 "data" 的变量中
              • histogram(data); % 绘制直方图
          • 数据转换

有时候可以对数据进行转换,使得异常值在转换后更符合正态分布或其他合适的分布。例如,可以进行对数转换或归一化处理。

简单粗暴的方法是直接删除包含异常值的数据点。这种方法适用于异常值数量较少或对结果影响较小的情况。但是,删除异常值可能会导致数据信息损失。

          • 代码

在上述代码中,isoutlier 函数用于检测异常值,它返回一个逻辑数组 TF,其中 true 表示对应位置的数据是异常值。然后,我们使用逻辑索引 TF 来删除 A 中的异常值,从而得到删除异常值后的数据。

            • % 假设数据存储在名为 "A" 的变量中
            • % 使用 isoutlier 函数检测异常值(使用默认的 'gesd' 方法)
            • TF = isoutlier(A);
            • % 删除包含异常值的数据
            • A(TF) = [];
      • 替换(与缺失值同样)

将异常值替换为合理的值,可以使用以下方法: 将异常值替换为缺失值(例如 NaN 或 NA),然后使用插值方法填充缺失值。 用数据集的中位数、均值或众数替换异常值,以保持数据集整体的分布特征。 使用回归模型或其他预测模型来预测异常值,并进行替换。

          • 代码:B = filloutliers(A,fillmethod,findmethod)

A 是输入的数据数组,可能包含异常值。 fillmethod 是替换异常值的方法,可以选择以下值之一:        'linear':使用线性插值替换异常值。        'movmedian':使用移动中位数替换异常值。        'nearest':使用最近邻插值替换异常值。        'previous':使用前一个非异常值替换异常值。        'next':使用后一个非异常值替换异常值。        value:可以指定一个具体的数值,用该数值替换异常值。 findmethod 是用于查找异常值的方法,可以选择以下值之一:        'gesd':使用 Generalized Extreme Studentized Deviate 检测异常值(默认方法)。        'grubbs':使用 Grubbs 检测异常值。 函数返回一个新的数组 B,其中包含已经替换了异常值的数据。原始数组 A 不受影响。 使用 filloutliers 函数可以方便地将异常值替换为合理的值,使得数据分析更加稳健。

将异常值限制在某个合理范围内。例如,将超出合理范围的异常值截断为该范围的边界值。

          • 代码
            • % 假设数据存储在名为 "A" 的变量中
            • lower_bound = 0; % 截断下界
            • upper_bound = 100; % 截断上界
            • % 将超出截断范围的异常值设为边界值
            • A(A < lower_bound) = lower_bound;
            • A(A > upper_bound) = upper_bound;
        • 转换

对数据进行转换,使得异常值在转换后更符合正态分布或其他合适的分布。

查找重复值的示例代码 ​% 假设数据存储在名为 "data" 的变量中 % 使用 unique 函数查找重复值 [unique_data, ~, idx] = unique(data); % 使用 histcounts 函数统计每个元素在原始数据中出现的次数 counts = histcounts(idx, numel(unique_data)); % 找出重复值的索引位置 duplicate_indices = find(counts > 1); % 输出重复值及其索引 duplicates = unique_data(duplicate_indices); duplicate_indices

        • % 返回 A 中所有唯一值
        • C = unique(A)
        • % 添加参数‘rows’,返回 A 中所有不重复的唯一行
        • C = unique(A, ‘rows’)
  • 数据变换

提高数据的质量和模型的性能,使得数据分析和建模更加准确和有效

标准化的目的是消除不同特征或不同样本之间由于量纲不同而引起的偏差,使得数据更容易被处理和解释。

当然,也可以尝试不同的标准化方法,然后通过交叉验证等方式来评估模型在不同标准化方式下的性能,选择最合适的方法。

如果数据特征之间的尺度差异较大,建议使用 Z-score标准化

          • 方法:将每个元素减去其所在列的均值,然后再除以其所在列的标准差。
          • 优点:保留了数据原有的分布形态,适用于处理有偏态分布的数据。
          • 缺点:标准化后的数据的范围不固定,可能出现负数。
        • Min-Max标准化

如果希望将数据缩放到特定范围内,可以选择 Min-Max标准化

          • 方法:将每个元素减去其所在列的最小值,然后再除以所在列的最大值与最小值之差。
          • 优点:将数据线性缩放到指定范围内,常用于模型对数据范围敏感的情况。
          • 缺点:可能使得数据的分布形态变化较大,不适用于处理有偏态分布的数据。
        • 代码
          • % 示例数据
          • A = [10, 20, 30; 5, 15, 25; 100, 200, 300];
          • % Z-score标准化(按列标准化)
          • N_zscore_col = normalize(A, 1, 'zscore');
          • disp('Z-score标准化后的数据(按列标准化):');
          • disp(N_zscore_col);
          • % Min-Max标准化(按行标准化,范围[0, 1])
          • N_minmax_row = normalize(A, 2, 'range');
          • disp('Min-Max标准化后的数据(按行标准化,范围[0, 1]):');
          • disp(N_minmax_row);
          • % Min-Max标准化(按列标准化,范围[-1, 1])
          • N_minmax_col_custom = normalize(A, 1, 'range', [-1, 1]);
          • disp('Min-Max标准化后的数据(按列标准化,范围[-1, 1]):');
          • disp(N_minmax_col_custom);
      • 其他方法:

        • N = normalize(A, dim, method, methodtype);
          • 参数说明:
          • A:待标准化的输入矩阵或向量。
          • dim:可选参数,表示在哪个维度上进行标准化。dim=1 表示按列标准化,dim=2 表示按行标准化。默认值是 dim=2。
          • method:标准化方法,有以下可选值:
          • 'zscore':使用Z分数(标准差标准化)进行标准化,默认方法。
          • 'minmax':使用最小-最大缩放进行标准化,将数据缩放到指定的范围(默认为[0, 1])。
          • 'range':使用指定的范围进行标准化,可以通过第4个参数methodtype指定范围。
          • 'center':使用中心化进行标准化,将数据的均值减去指定的中心(默认为0)。
          • methodtype:指定标准化方法的特定类型。例如,当method'range'时,methodtype可指定范围的上限和下限值,格式为[lower, upper]。如果省略该参数,默认范围为[0, 1]。

在数据挖掘过程中,算法可以直接处理数值型变量,但是算法一般无法直接处理 分类变量。 分类变量没有好坏多少之分,多用 0,1,2,等数值代表一个类型,如 果直接引入模型中计算容易让计算机误以为这是一个数值型变量,从而出现错误。

是一种数据编码方法,用于将类别型数据转换为二进制形式的数值型数据。它适用于具有多个类别的特征,并且每个类别之间不存在特定的顺序关系。

考虑一个分类问题,特征中包含了颜色属性,如红、绿、蓝等。这些颜色是类别型数据,不是数值型数据。在这种情况下,可以使用独热编码(One-Hot Encoding)将颜色属性转换为数值型特征,方便机器学习算法处理。

          • 步骤:将分类变量的不同类别用数字进行编码,通常采用整数编码,将每个类别映射到一个整数值。
          • 目的:将分类变量转换为数值形式,使得算法和模型能够正确处理这些数据。但需要注意,标签编码并不适用于所有分类变量,因为它会引入一个人为的有序关系,有时会产生误导性的影响。
        • 标签编码(Label Encoding):

考虑一个房地产数据集,其中包含房屋的大小、所在地区、是否有花园等特征。其中,地区是类别型数据,而大小是数值型数据。对于地区这个特征,可以使用标签编码(Label Encoding)将其转换为数值型数据。而对于大小这个特征,不需要编码,可以直接保留为数值型数据。

          • 步骤:将分类变量的每个类别都转换为一个独立的二元特征,其中只有一个特征为1,其余特征为0。
          • 目的:避免了标签编码引入的有序关系,同时保留了分类变量之间的无序性。独热编码适用于多类别分类问题,使得算法可以在每个类别之间进行无歧义的判断。
        • 整数编码(Integer Encoding):

考虑一个自然语言处理问题,特征中包含了词汇,如"apple"、"banana"等。这些词汇是类别型数据。在这种情况下,可以使用整数编码(Integer Encoding)将词汇转换为数值型特征,以便输入到自然语言处理模型进行处理

          • 步骤:
            • 对于分类变量的每个类别,将其映射为一个唯一的整数值。
            • 可以使用字典或映射表来存储每个类别和对应的整数值。
          • 目的:
            • 将分类变量转换为数值形式,使得算法和模型能够正确处理这些数据。
            • 整数编码保留了分类变量的信息,但不引入类别之间的有序关系,适用于类别之间没有明确的顺序关系的情况。
        • 有序编码(Ordinal Encoding):

在某个回归模型中,特征中包含了风力等级,如小风、中风、大风。这些风力等级是有序的类别型数据。在这种情况下,可以使用有序编码(Ordinal Encoding)将风力等级转换为有序的数值型特征,保留其顺序信息,以更好地适应回归模型。

          • 步骤:
            • 对于具有明确顺序关系的分类变量,可以使用有序编码将其映射为有序的整数值。
            • 可以根据类别的顺序进行手动编码或使用字典进行映射。
          • 目的:
            • 将分类变量转换为有序的数值形式,保留了类别之间的顺序关系,适用于具有明确顺序关系的分类变量。
            • 有序编码在一定程度上可以捕捉分类变量的序列信息,对于一些算法(例如,决策树)可能具有更好的解释性。
        • WOE编码(Weight of Evidence):

WOE编码主要适用于二分类问题,如二元分类或二元响应变量。

          • 步骤:
            • 计算每个类别在目标变量中的分布: 对于分类变量的每个类别,计算该类别在目标变量中的两种可能取值(例如,1和0)的分布比例。
            • 计算WOE值: 计算每个类别在目标变量中取值为1的比例和取值为0的比例,然后计算其自然对数的差值,得到该类别的WOE值。
            • 替换原始值: 将所有类别的WOE值用于替换原始的分类变量值,从而得到WOE编码后的数据。
          • 目的:
            • 可解释性: WOE值能够直观地表示不同类别对目标变量的影响程度,WOE值越大表示该类别越有可能导致目标变量取值为1,WOE值越小表示该类别越有可能导致目标变量取值为0。因此,WOE编码使得特征具有更好的可解释性。
            • 解决类别不平衡: 在风险评分和信用评分等领域中,往往存在类别不平衡的问题,即某个类别的样本数量远多于其他类别。WOE编码能够通过计算WOE值来平衡不同类别对模型的影响。
            • 缓解特征维度灾难: WOE编码将原始的分类变量转换成数值型特征,从而将分类变量的维度从多个类别降低为一个特征,有助于缓解特征维度灾难。
        • 代码:
            • % 假设目标变量target,表示每个水果是否是好的(1代表好,0代表不好)
            • target = [1, 0, 1, 0, 1];
            • % 计算每个类别在目标变量中的分布
            • class_counts = histcounts(fruits, unique(fruits));
            • % 计算每个类别在目标变量为1和0的情况下的分布比例
            • class_counts_1 = histcounts(fruits(target == 1), unique(fruits));
            • class_counts_0 = histcounts(fruits(target == 0), unique(fruits));
            • % 计算每个类别的WOE值
            • class_ratio_1 = class_counts_1 ./ sum(target);
            • class_ratio_0 = class_counts_0 ./ (numel(target) - sum(target));
            • WOE = log(class_ratio_1 ./ class_ratio_0);
            • % 将WOE值用于替换原始的类别值,得到WOE编码后的结果
            • WOE_encoding = WOE(unique(fruits));
            • % 显示结果
            • disp('Original Fruits:');
            • disp(fruits);
            • disp('WOE Encoded Fruits:');
            • disp(WOE_encoding);
        • 示例代码:
          • % 假设有一个类别型特征fruits,包含四个类别:苹果、香蕉、橙子、草莓
          • fruits = {'苹果', '香蕉', '橙子', '草莓', '苹果'};
          • %二进制编码
            • integer_encoding = grp2idx(fruits);% 将类别型特征进行整数编码
            • binary_encoding = dec2bin(integer_encoding);% 将整数编码转换为二进制形式
            • encoded_fruits = str2double(binary_encoding(:,:));% 将二进制编码后的数据存储在新的特征矩阵中
            • disp('二进制编码:');disp(encoded_fruits);% 输出结果
          • % 独热编码(One-Hot Encoding)
            • encoded_fruits_onehot = dummyvar(categorical(fruits));
            • disp('独热编码:');
            • disp(encoded_fruits_onehot);
          • % 标签编码(Label Encoding)
            • encoded_fruits_label = double(categorical(fruits));
            • disp('标签编码:');
            • disp(encoded_fruits_label);
          • % 有序编码(Ordinal Encoding)
            • encoded_fruits_ordinal = ordinal(fruits, {'苹果', '香蕉', '橙子', '草莓'});
            • disp('有序编码:');
            • disp(encoded_fruits_ordinal);
          • % 整数编码(Integer Encoding)
            • encoded_fruits_integer = grp2idx(fruits);
            • disp('整数编码:');
            • disp(encoded_fruits_integer);
      • 其他方法

        • 频率编码(Frequency Encoding):
          • 步骤:用每个类别在数据集中出现的频率替换分类变量中的原始值。
          • 目的:将分类变量的类别用其在数据集中出现的频率来表示,可以保留分类变量的信息,并不引入有序关系。频率编码常用于特征工程,可以有效捕捉类别变量的重要性。
        • 目标编码(Target Encoding):
          • 步骤:用目标变量(预测变量)的平均值或其他统计指标替换分类变量中的原始值。
          • 目的:在特征工程中,目标编码可用于将分类变量与目标变量之间的关系编码成数值,增强分类变量的信息。
    • 连续变量离散化(离差标准化)

      • 解释:

        • 连续属性离散化是将连续型属性(也称为数值型属性)转换成离散型属性的过程。在数据预处理中,连续属性的离散化常常用于将数值范围划分为若干个离散的区间或类别,从而将连续数据转换为离散的取值,方便后续的数据分析和建模。
      • 目的:

        • 减少数据复杂度:对于大量连续型数据,离散化可以将数据压缩成少数几个离散的类别,降低了数据的维度和复杂度。
        • 降低数据噪声影响:离散化可以将数据归类到离散的类别中,使得数据变得更加稳定,减少了噪声对结果的影响。
        • 更好地适用于某些模型:一些机器学习算法和数据挖掘方法更适合处理离散型数据,因此将连续属性离散化可以提高模型的性能。
      • 常用方法:

        • 等宽离散化(等距离散化):
          • 将数据的取值范围划分成若干个等宽的区间,每个区间的取值范围相等。适用于数据较为均匀分布的情况。
          • 适用情况:数据较为均匀分布,且对数据分布的精细度要求较低的情况。
          • 限制条件:可能会导致某些区间内的数据分布不均匀,对于数据分布不均匀的情况效果不佳。
          • 优点:简单易行,适用于处理数据分布较为均匀的情况。
          • 缺点:可能忽略数据的分布特点,不适用于数据分布不均匀或者有异常值的情况。
          • 代码:
            • % 假设数据存储在向量 A 中,将 A 等宽离散化成 5 个区间
            • num_bins = 5;
            • edges = linspace(min(A), max(A), num_bins+1);
            • discretized_A = discretize(A, edges);
        • 等频离散化:
          • 将数据按照频率分布划分成若干个区间,使得每个区间内的数据数量相等。适用于数据分布不均匀的情况。
          • 适用情况:数据分布不均匀,希望每个区间内的数据数量相等的情况。
          • 限制条件:可能导致区间边界不合理,对于数据分布不平滑的情况效果较差。
          • 优点:能够处理数据分布不均匀的情况,保证每个区间内的数据数量相等。
          • 缺点:可能对数据分布较为均匀的情况效果不佳,对于重复值较多的数据,可能失去部分信息。
          • 代码:
            • % 假设数据存储在向量 A 中,将 A 等频离散化成 5 个区间
            • num_bins = 5;
            • discretized_A = discretize(A, num_bins, 'categorical');
        • 基于聚类的离散化:
          • 使用聚类算法将数据聚类成若干个簇,然后每个簇代表一个离散的类别。适用于数据分布复杂的情况。
          • 方法:使用聚类算法(如 K-Means)将数据聚类成若干个簇,然后每个簇代表一个离散的类别。
          • 适用情况:适用于数据分布复杂的情况,能够发现数据的内在结构。
          • 限制条件:需要事先确定聚类的簇数,对于高维数据或大规模数据,计算成本较高。
          • 优点:能够根据数据的内在结构进行划分,适用于处理复杂数据。
          • 缺点:对于高维数据或大规模数据,可能计算成本较高。
          • 代码:
            • % 假设数据存储在向量 A 中,使用 kmeans 聚类算法将 A 离散化成 5 个区间
            • num_bins = 5;
            • [idx, centroids] = kmeans(A, num_bins);
            • discretized_A = idx;
        • 基于分位数的离散化:
          • 根据数据的分位数将数据划分成若干个区间,使得每个区间内的数据占据一定的百分比。适用于需要保留数据分布特点的情况。
          • 适用情况:需要保留数据分布特点的情况,希望离散化后的数据符合原始数据的分布情况。
          • 限制条件:对于极端值的处理可能较为复杂,需要灵活设置分位数的数量和边界。
          • 优点:能够保留数据分布特点,较好地反映原始数据的分布情况。
          • 缺点:对极端值敏感,分位数数量选择,不连续性,模型复杂度,可解释性
          • 代码:
            • % 假设数据存储在向量 A 中,使用 quantile 将 A 离散化成 5 个区间
            • num_bins = 5;
            • edges = quantile(A, num_bins-1);
            • edges = [-inf edges inf]; % 添加负无穷和正无穷,确保所有数据都在某个区间内
            • discretized_A = discretize(A, edges);
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值