二手车交易价格预测task2

该博客探讨了二手车交易数据,包括SaleID、汽车型号、品牌、车身类型、燃油类型等31个字段,并进行了初步的数据观察和EDA探索,旨在预测二手车交易价格。
摘要由CSDN通过智能技术生成
## 基础工具
import numpy as np
import pandas as pd
import warnings
import matplotlib
import matplotlib.pyplot as plt
import seaborn as sns
from scipy.special import jn
from IPython.display import display, clear_output
import time
import csv
warnings.filterwarnings('ignore')
%matplotlib inline

## 模型预测的
from sklearn import linear_model
from sklearn import preprocessing
from sklearn.svm import SVR
from sklearn.ensemble import RandomForestRegressor,GradientBoostingRegressor

## 数据降维处理的
from sklearn.decomposition import PCA,FastICA,FactorAnalysis,SparsePCA

import lightgbm as lgb
import xgboost as xgb

## 参数搜索和评价的
from sklearn.model_selection import GridSearchCV,cross_val_score,StratifiedKFold,train_test_split
from sklearn.metrics import mean_squared_error, mean_absolute_error
def read_file(path,count=None):
    '''
    定义读取文件的函数
        path: 文件路径
        count: 读取行数
    '''
    # 1
#     list = []
#     with open(path,"r",encoding='UTF-8') as f: #以只读的方式打开文件
#         read_scv=csv.reader(f) #调用csv的reader方法读取文件并赋值给read_scv变量
#         for i,line in enumerate(read_scv):
#             if i == count:
#                 break
#             list.append(line) #将读取到的数据追加到list列表里面
#     list = pd.DataFrame(list)
#     list.columns=['id','heartbeat_signals','label']
#     return list[1:] #返回列表数据
    # 2
    return pd.read_csv(path,sep=' ',nrows = count)
Train_data = read_file('used_car_train_20200313.csv')
TestA_data = read_file('used_car_testA_20200313.csv')

数据字段

  • SaleID 交易ID,唯一编码
  • name 汽车交易名称,已脱敏
  • regDate 汽车注册日期,例如20160101,2016年01月01日
  • model 车型编码,已脱敏
  • brand 汽车品牌,已脱敏
  • bodyType 车身类型:豪华轿车:0,微型车:1,厢型车:2,大巴车:3,敞篷车:4,双门汽车:5,商务车:6,搅拌车:7
  • fuelType 燃油类型:汽油:0,柴油:1,液化石油气:2,天然气:3,混合动力:4,其他:5,电动:6
  • gearbox 变速箱:手动:0,自动:1
  • power 发动机功率:范围 [ 0, 600 ]
  • kilometer 汽车已行驶公里,单位万km
  • notRepairedDamage 汽车有尚未修复的损坏:是:0,否:1
  • regionCode 地区编码,已脱敏
  • seller 销售方:个体:0,非个体:1
  • offerType 报价类型:提供:0,请求:1
  • creatDate 汽车上线时间,即开始售卖时间
  • price 二手车交易价格(预测目标)
  • v_0’, ‘v_1’, ‘v_2’, ‘v_3’, ‘v_4’, ‘v_5’, ‘v_6’, ‘v_7’, ‘v_8’, ‘v_9’, ‘v_10’, ‘v_11’, ‘v_12’, ‘v_13’,‘v_14’(根据汽车的评论、标签等大量信息得到的embedding向量)匿名特征,包含v0-14在内15个匿名特征

数据观察

# 数据纵览
Train_data.head().append(Train_data.tail())
# TestA_data.head().append(TestA_data.tail())
SaleIDnameregDatemodelbrandbodyTypefuelTypegearboxpowerkilometer...v_5v_6v_7v_8v_9v_10v_11v_12v_13v_14
007362004040230.061.00.00.06012.5...0.2356760.1019880.1295490.0228160.097462-2.8818032.804097-2.4208210.7952920.914762
1122622003030140.012.00.00.0015.0...0.2647770.1210040.1357310.0265970.020582-4.9004822.096338-1.030483-1.7226740.245522
221487420040403115.0151.00.00.016312.5...0.2514100.1149120.1651470.0621730.027075-4.8467491.8035591.565330-0.832687-0.229963
337186519960908109.0100.00.01.019315.0...0.2742930.1103000.1219640.0333950.000000-4.5095991.285940-0.501868-2.438353-0.478699
4411108020120103110.051.00.00.0685.0...0.2280360.0732050.0918800.0788190.121534-1.8962400.9107830.9311102.8345181.923482
14999514999516397820000607121.0104.00.01.016315.0...0.2802640.0003100.0484410.0711580.0191741.988114-2.9839730.589167-1.304370-0.302592
14999614999618453520091102116.0110.00.00.012510.0...0.2532170.0007770.0840790.0996810.0793711.839166-2.7746152.5539940.924196-0.272160
1499971499971475872010100360.0111.01.00.0906.0...0.2333530.0007050.1188720.1001180.0979142.439812-1.6306772.2901971.8919220.414931
149998149998459072006031234.0103.01.00.015615.0...0.2563690.0002520.0814790.0835580.0814982.075380-2.6337191.4149370.431981-1.659014
1499991499991776721999020419.0286.00.01.019312.5...0.2844750.0000000.0400720.0625430.0258191.978453-3.1799130.031724-1.483350-0.342674

10 rows × 31 columns

#数据行列信息
print('Train data shape:',Train_data.shape)
print('Test data shape:',TestA_data.shape)

Train data shape: (150000, 31)
Test data shape: (50000, 30)
# 数据信息查看
# 通过info来了解数据每列的type
# Train_data.info()
TestA_data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 50000 entries, 0 to 49999
Data columns (total 30 columns):
 #   Column             Non-Null Count  Dtype  
---  ------             --------------  -----  
 0   SaleID             50000 non-null  int64  
 1   name               50000 non-null  int64  
 2   regDate            50000 non-null  int64  
 3   model              50000 non-null  float64
 4   brand              50000 non-null  int64  
 5   bodyType           48587 non-null  float64
 6   fuelType           47107 non-null  float64
 7   gearbox            48090 non-null  float64
 8   power              50000 non-null  int64  
 9   kilometer          50000 non-null  float64
 10  notRepairedDamage  50000 non-null  object 
 11  regionCode         50000 non-null  int64  
 12  seller             50000 non-null  int64  
 13  offerType          50000 non-null  int64  
 14  creatDate          50000 non-null  int64  
 15  v_0                50000 non-null  float64
 16  v_1                50000 non-null  float64
 17  v_2                50000 non-null  float64
 18  v_3                50000 non-null  float64
 19  v_4                50000 non-null  float64
 20  v_5                50000 non-null  float64
 21  v_6                50000 non-null  float64
 22  v_7                50000 non-null  float64
 23  v_8                50000 non-null  float64
 24  v_9                50000 non-null  float64
 25  v_10               50000 non-null  float64
 26  v_11               50000 non-null  float64
 27  v_12               50000 non-null  float64
 28  v_13               50000 non-null  float64
 29  v_14               50000 non-null  float64
dtypes: float64(20), int64(9), object(1)
memory usage: 11.4+ MB
EDA数据探索性分析
# import pandas_profiling
# Train_data_report = pandas_profiling.ProfileReport(Train_data.sample(n=1000))
Train_data.sample(n=1000)
SaleIDnameregDatemodelbrandbodyTypefuelTypegearboxpowerkilometer...v_5v_6v_7v_8v_9v_10v_11v_12v_13v_14
133959133959141522007040863.002.01.00.014015.0...0.2477910.0004110.1310530.0744920.0876442.397437-2.0134651.0821900.337956-0.498149
368043680413004199909117.050.00.00.07515.0...0.2570880.0824130.0192840.0284610.072921-1.9931261.307589-2.9339130.388731-0.581585
43852438521382362003030155.0170.01.00.011615.0...0.2461990.0000140.0031120.0625420.1150713.031704-1.451162-1.6014631.974878-1.162737
138366138366988851999000230.061.00.0NaN015.0...0.2392930.0000000.1173560.0296860.0833813.9620040.064650-3.0856570.2044150.369803
1367511367511523232010061165.014.01.00.014012.5...0.2749750.0005450.0532380.1068180.0319341.285200-3.7665703.279240-0.2062680.219337
..................................................................
541895418926287199903128.002.00.00.015015.0...0.2632540.0950750.1029010.0411040.029092-3.3398191.166773-0.642460-1.0651730.311333
150921509230112001040765.010.00.00.010215.0...0.2692310.1169300.0863520.0377560.018960-4.8622941.569527-0.709982-1.380195-0.696717
92299229162281200612080.000.01.00.010515.0...0.2607800.0004590.0963130.0830450.0484582.146483-2.4253641.503840-0.0967531.015214
14764714764761281999110544.003.01.00.010215.0...0.2719190.1107200.0935850.0274040.023803-4.4149841.352092-1.310048-1.758741-0.614666
39775397758062000060377.003.01.00.011615.0...0.2657840.1105790.0847670.0326770.049479-4.4505371.296043-1.124556-0.882583-0.355871

1000 rows × 31 columns

# Train_data_report.to_file('Train_data_report.html')
# 通过 .columns 查看列名
# Train_data.columns
TestA_data.columns
Index(['SaleID', 'name', 'regDate', 'model', 'brand', 'bodyType', 'fuelType',
       'gearbox', 'power', 'kilometer', 'notRepairedDamage', 'regionCode',
       'seller', 'offerType', 'creatDate', 'v_0', 'v_1', 'v_2', 'v_3', 'v_4',
       'v_5', 'v_6', 'v_7', 'v_8', 'v_9', 'v_10', 'v_11', 'v_12', 'v_13',
       'v_14'],
      dtype='object')
# 通过 .describe() 可以查看数值特征列的一些统计信息
# 个数count、平均值mean、方差std、最小值min、中位数25% 50% 75% 、以及最大值
# Train_data.describe()
TestA_data.describe()
SaleIDnameregDatemodelbrandbodyTypefuelTypegearboxpowerkilometer...v_5v_6v_7v_8v_9v_10v_11v_12v_13v_14
count50000.00000050000.0000005.000000e+0450000.00000050000.00000048587.00000047107.00000048090.00000050000.00000050000.000000...50000.00000050000.00000050000.00000050000.00000050000.00000050000.00000050000.00000050000.00000050000.00000050000.000000
mean174999.50000068542.2232802.003393e+0746.8445208.0562401.7821850.3734050.224350119.88362012.595580...0.2486690.0450210.1227440.0579970.062000-0.017855-0.013742-0.013554-0.0031470.001516
std14433.90106761052.8081335.368870e+0449.4695487.8194771.7607360.5464420.417158185.0973873.908979...0.0446010.0517660.1959720.0292110.0356533.7479853.2312582.5159621.2865971.027360
min150000.0000000.0000001.991000e+070.0000000.0000000.0000000.0000000.0000000.0000000.500000...0.0000000.0000000.0000000.0000000.000000-9.160049-5.411964-8.916949-4.123333-6.112667
25%162499.75000011203.5000001.999091e+0710.0000001.0000000.0000000.0000000.00000075.00000012.500000...0.2437620.0000440.0626440.0350840.033714-3.700121-1.971325-1.876703-1.060428-0.437920
50%174999.50000052248.5000002.003091e+0729.0000006.0000001.0000000.0000000.000000109.00000015.000000...0.2578770.0008150.0958280.0570840.0587641.613212-0.355843-0.142779-0.0359560.138799
75%187499.250000118856.5000002.007110e+0765.00000013.0000003.0000001.0000000.000000150.00000015.000000...0.2653280.1020250.1254380.0790770.0874892.8327081.2629141.7643350.9414690.681163
max199999.000000196805.0000002.015121e+07246.00000039.0000007.0000006.0000001.00000020000.00000015.000000...0.2916180.1532651.3588130.1563550.21477512.33887218.85621812.9504985.9132732.624622

8 rows × 29 columns

# 提取数值类型特征列名
numerical_cols = Train_data.select_dtypes(exclude = 'object').columns
numerical_cols
Index(['SaleID', 'name', 'regDate', 'model', 'brand', 'bodyType', 'fuelType',
       'gearbox', 'power', 'kilometer', 'regionCode', 'seller', 'offerType',
       'creatDate', 'price', 'v_0', 'v_1', 'v_2', 'v_3', 'v_4', 'v_5', 'v_6',
       'v_7', 'v_8', 'v_9', 'v_10', 'v_11', 'v_12', 'v_13', 'v_14'],
      dtype='object')
categorical_cols = Train_data.select_dtypes(include = 'object').columns
categorical_cols
Index(['notRepairedDamage'], dtype='object')
Train_data.head()
SaleIDnameregDatemodelbrandbodyTypefuelTypegearboxpowerkilometer...v_5v_6v_7v_8v_9v_10v_11v_12v_13v_14
007362004040230.061.00.00.06012.5...0.2356760.1019880.1295490.0228160.097462-2.8818032.804097-2.4208210.7952920.914762
1122622003030140.012.00.00.0015.0...0.2647770.1210040.1357310.0265970.020582-4.9004822.096338-1.030483-1.7226740.245522
221487420040403115.0151.00.00.016312.5...0.2514100.1149120.1651470.0621730.027075-4.8467491.8035591.565330-0.832687-0.229963
337186519960908109.0100.00.01.019315.0...0.2742930.1103000.1219640.0333950.000000-4.5095991.285940-0.501868-2.438353-0.478699
4411108020120103110.051.00.00.0685.0...0.2280360.0732050.0918800.0788190.121534-1.8962400.9107830.9311102.8345181.923482

5 rows × 31 columns

# 选择特征列
feature_cols = [col for col in numerical_cols if col not in ['SaleID','name','price']]
# feature_cols = [col for col in feature_cols if 'Type' not in col]
feature_cols
['regDate',
 'model',
 'brand',
 'bodyType',
 'fuelType',
 'gearbox',
 'power',
 'kilometer',
 'regionCode',
 'seller',
 'offerType',
 'creatDate',
 'v_0',
 'v_1',
 'v_2',
 'v_3',
 'v_4',
 'v_5',
 'v_6',
 'v_7',
 'v_8',
 'v_9',
 'v_10',
 'v_11',
 'v_12',
 'v_13',
 'v_14']
x_Train_data = Train_data[feature_cols]
# 一个异常值处理的代码
def outliers_proc(data, col_name, scale=3):
    """
    用于清洗异常值,默认用 box_plot(scale=3)进行清洗
    :param data: 接收 pandas 数据格式
    :param col_name: pandas 列名
    :param scale: 尺度
    :return:
    """

    def box_plot_outliers(data_ser, box_scale):
        """
        利用箱线图去除异常值
        :param data_ser: 接收 pandas.Series 数据格式
        :param box_scale: 箱线图尺度,
        :return:
        """
        iqr = box_scale * (data_ser.quantile(0.75) - data_ser.quantile(0.25))
        val_low = data_ser.quantile(0.25) - iqr
        val_up = data_ser.quantile(0.75) + iqr
        rule_low = (data_ser < val_low)
        rule_up = (data_ser > val_up)
        return (rule_low, rule_up), (val_low, val_up)

    data_n = data.copy()
    data_series = data_n[col_name]
    rule, value = box_plot_outliers(data_series, box_scale=scale)
    index = np.arange(data_series.shape[0])[rule[0] | rule[1]]
    print("Delete number is: {}".format(len(index)))
    data_n = data_n.drop(index)
    data_n.reset_index(drop=True, inplace=True)
    print("Now column number is: {}".format(data_n.shape[0]))
    index_low = np.arange(data_series.shape[0])[rule[0]]
    outliers = data_series.iloc[index_low]
    print("Description of data less than the lower bound is:")
    print(pd.Series(outliers).describe())
    index_up = np.arange(data_series.shape[0])[rule[1]]
    outliers = data_series.iloc[index_up]
    print("Description of data larger than the upper bound is:")
    print(pd.Series(outliers).describe())
    
    fig, ax = plt.subplots(1, 2, figsize=(10, 7))
    sns.boxplot(y=data[col_name], data=data, palette="Set1", ax=ax[0])
    sns.boxplot(y=data_n[col_name], data=data_n, palette="Set1", ax=ax[1])
    return data_n
x_Train_data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 149795 entries, 0 to 149794
Data columns (total 28 columns):
 #   Column      Non-Null Count   Dtype  
---  ------      --------------   -----  
 0   regDate     149795 non-null  int64  
 1   model       149794 non-null  float64
 2   brand       149795 non-null  int64  
 3   bodyType    145301 non-null  float64
 4   fuelType    141120 non-null  float64
 5   gearbox     143831 non-null  float64
 6   power       149795 non-null  int64  
 7   kilometer   149795 non-null  float64
 8   regionCode  149795 non-null  int64  
 9   seller      149795 non-null  int64  
 10  offerType   149795 non-null  int64  
 11  creatDate   149795 non-null  int64  
 12  price       149795 non-null  int64  
 13  v_0         149795 non-null  float64
 14  v_1         149795 non-null  float64
 15  v_2         149795 non-null  float64
 16  v_3         149795 non-null  float64
 17  v_4         149795 non-null  float64
 18  v_5         149795 non-null  float64
 19  v_6         149795 non-null  float64
 20  v_7         149795 non-null  float64
 21  v_8         149795 non-null  float64
 22  v_9         149795 non-null  float64
 23  v_10        149795 non-null  float64
 24  v_11        149795 non-null  float64
 25  v_12        149795 non-null  float64
 26  v_13        149795 non-null  float64
 27  v_14        149795 non-null  float64
dtypes: float64(20), int64(8)
memory usage: 32.0 MB
# x_Train_data = outliers_proc(x_Train_data,'model', scale=3)
# x_Train_data = outliers_proc(x_Train_data,'bodyType', scale=3)
# x_Train_data = outliers_proc(x_Train_data,'fuelType', scale=3)

Delete number is: 81
Now column number is: 149795
Description of data less than the lower bound is:
count    0.0
mean     NaN
std      NaN
min      NaN
25%      NaN
50%      NaN
75%      NaN
max      NaN
Name: fuelType, dtype: float64
Description of data larger than the upper bound is:
count    81.000000
mean      5.444444
std       0.500000
min       5.000000
25%       5.000000
50%       5.000000
75%       6.000000
max       6.000000
Name: fuelType, dtype: float64

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H8dzwFxM-1618581223314)(output_21_1.png)]

x_Train_data['price']
0         1850
1         3600
2         6222
3         2400
4         5200
          ... 
149790    5900
149791    9500
149792    7500
149793    4999
149794    4700
Name: price, Length: 149795, dtype: int64
#训练样本
x_train = Train_data[feature_cols]
y_train = Train_data['price']

#测试样本
x_test = TestA_data[feature_cols]
print('X train shape:',x_train.shape)
print('X test shape:',x_test.shape)
X train shape: (150000, 27)
X test shape: (50000, 27)
x_train = x_train.fillna(-1)
x_test = x_test.fillna(-1)
# 统计标签的基本分布信息
y_train.describe()
count    150000.000000
mean       5923.327333
std        7501.998477
min          11.000000
25%        1300.000000
50%        3250.000000
75%        7700.000000
max       99999.000000
Name: price, dtype: float64
def reduce_mem_usage(df):
    start_mem = df.memory_usage().sum() / 1024**2 
    print('Memory usage of dataframe is {:.2f} MB'.format(start_mem))
    
    for col in df.columns:
        col_type = df[col].dtype
        
        if col_type != object:
            c_min = df[col].min()
            c_max = df[col].max()
            if str(col_type)[:3] == 'int':
                if c_min > np.iinfo(np.int8).min and c_max < np.iinfo(np.int8).max:
                    df[col] = df[col].astype(np.int8)
                elif c_min > np.iinfo(np.int16).min and c_max < np.iinfo(np.int16).max:
                    df[col] = df[col].astype(np.int16)
                elif c_min > np.iinfo(np.int32).min and c_max < np.iinfo(np.int32).max:
                    df[col] = df[col].astype(np.int32)
                elif c_min > np.iinfo(np.int64).min and c_max < np.iinfo(np.int64).max:
                    df[col] = df[col].astype(np.int64)  
            else:
                if c_min > np.finfo(np.float16).min and c_max < np.finfo(np.float16).max:
                    df[col] = df[col].astype(np.float16)
                elif c_min > np.finfo(np.float32).min and c_max < np.finfo(np.float32).max:
                    df[col] = df[col].astype(np.float32)
                else:
                    df[col] = df[col].astype(np.float64)
        else:
            df[col] = df[col].astype('category')

    end_mem = df.memory_usage().sum() / 1024**2 
    print('Memory usage after optimization is: {:.2f} MB'.format(end_mem))
    print('Decreased by {:.1f}%'.format(100 * (start_mem - end_mem) / start_mem))
    
    return df
x_train = reduce_mem_usage(x_train)
x_test = reduce_mem_usage(x_test)

Memory usage of dataframe is 30.90 MB
Memory usage after optimization is: 7.87 MB
Decreased by 74.5%
Memory usage of dataframe is 10.30 MB
Memory usage after optimization is: 2.62 MB
Decreased by 74.5%
import lightgbm as lgb
from sklearn.metrics import mean_squared_error
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(x_train, y_train, test_size=0.2)
# 创建成lgb特征的数据集格式
lgb_train = lgb.Dataset(X_train, y_train)
lgb_eval = lgb.Dataset(X_test, y_test, reference=lgb_train)
# 将参数写成字典下形式
params = {
    'task': 'train',
    'boosting_type': 'gbdt',  # 设置提升类型
    'objective': 'regression',  # 目标函数
    'metric': {'l2', 'auc'},  # 评估函数
    'num_leaves': 127,  # 叶子节点数
    'learning_rate': 0.01,  # 学习速率
    'feature_fraction': 0.9,  # 建树的特征选择比例
    'bagging_fraction': 0.8,  # 建树的样本采样比例
    'bagging_freq': 5,  # k 意味着每 k 次迭代执行bagging
    'verbose': 1  # <0 显示致命的, =0 显示错误 (警告), >0 显示信息
}
# 训练 cv and train
gbm = lgb.train(params, lgb_train, num_boost_round=20, valid_sets=lgb_eval, early_stopping_rounds=5)
# 保存模型到文件
gbm.save_model('model.txt')
# 预测数据集
y_pred = gbm.predict(X_test, num_iteration=gbm.best_iteration)
# 评估模型
print('The rmse of prediction is:', mean_absolute_error(y_test, y_pred))
[LightGBM] [Warning] Auto-choosing col-wise multi-threading, the overhead of testing was 0.090954 seconds.
You can set `force_col_wise=true` to remove the overhead.
[LightGBM] [Info] Total Bins 4977
[LightGBM] [Info] Number of data points in the train set: 120000, number of used features: 25
[LightGBM] [Info] Start training from score 5919.941275
[1]	valid_0's auc: 1	valid_0's l2: 5.65302e+07
Training until validation scores don't improve for 5 rounds
[2]	valid_0's auc: 1	valid_0's l2: 5.54992e+07
[3]	valid_0's auc: 1	valid_0's l2: 5.44915e+07
[4]	valid_0's auc: 1	valid_0's l2: 5.35056e+07
[5]	valid_0's auc: 1	valid_0's l2: 5.25345e+07
[6]	valid_0's auc: 1	valid_0's l2: 5.15829e+07
Early stopping, best iteration is:
[1]	valid_0's auc: 1	valid_0's l2: 5.65302e+07
The rmse of prediction is: 4966.258600208158
lgb_test = gbm.predict(x_test, num_iteration=gbm.best_iteration)
lgb_test
array([6159.74936094, 5866.91656302, 5924.70077607, ..., 5916.21964354,
       5961.24691629, 5900.2553832 ])
sub = pd.read_csv('used_car_sample_submit.csv')

sub
SaleIDprice
01500000
11500010
21500020
31500030
41500040
.........
499951999950
499961999960
499971999970
499981999980
499991999990

50000 rows × 2 columns

sub['price'] = lgb_test
sub
SaleIDprice
01500007878.594467
11500015685.291192
21500025999.232414
31500035999.232414
41500045685.291192
.........
499951999955805.003001
499961999965685.291192
499971999976100.446686
499981999986100.446686
499991999995882.450434

50000 rows × 2 columns

sub.to_csv('sub_sample.csv',index=False)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值