AI机器学习时序序列特征提取实现分类预测实战

多元时间序列分析(分段/分割) 对时间序列分段这个词可能指Semantic segmentation,Change point detection,或者Subsequence clustering。虽然都可以认为是在对时间序列做分段,但实际上是不同的任务。 阅读详情

最近有位做医疗项目的同学咨询有一批人员的身高、体重、性别、年龄、心电图、是否有心脏病等数据是否可以根据这些数据预测某个人是否有心脏病的迹象。这当然是可以的,AI机器学习不就是干这事的吗?这是一个典型的分类算法。根据这些人体特征来判断是否存在潜在的疾病。问题是如何对心电图进行特征提取,提取出相关的特征,让模型进行学习和训练。

拿到数据后,第一步,我们首先来看一下数据。

一、数据探索

1、读入数据

导入numpy、pandas、matplotlib三大件,读入数据

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
df=pd.read_csv('data_csv.csv')
df

在这里插入图片描述

数据集中有age年龄、ismale性别、Weight身高、Height体重、HRTrend心电图、label是否有心脏病(1,是有心脏病、0是无心脏病)
这里看到主要的几个关键性的指标。HRTrend是csv中载入的时候数据是文本字符串格式,还有nan及\n等字符串,我们要将这些数据进行清洗规则化,将其转化为数组。

2、数据处理

先拿一个样本数据来看看数据的情况。对它进行相应的处理,包括去掉回车换行符、去多余空格、然后以空格作为分隔形成数组。

HRTrend_Data=df['HRTrend'][1][1:len(df['HRTrend'][1])-1]
HRTrend_Data=HRTrend_Data.replace('\n','') #替换掉换行符
HRTrend_Data=HRTrend_Data.replace('nan',str(0))   #将nan补0
HRTrend_Data=re.sub(' +', ' ', HRTrend_Data).strip() #去掉多余的空格
HRTrend_Data=np.asarray([float(s) for s in HRTrend_Data.split(' ')])  #将字符串通过空格分隔,转换成数组
pd.DataFrame(HRTrend_Data).plot()
HRTrend_Data

在这里插入图片描述

这个图形不是很规则不平滑,看数据是因为异常值太多,后面的数据都是0,这些0都是因为数据为Non补充进来的,有可能是应为数据采集的时候某个点位没有采集到。我们需要将这些异常值给处理掉。
对于中间为0的,我们可以通过采用前值填充或者后值填充(也就是用前面的值或后面的值来替代为0的值),后面全部为0的部分要去掉。因为会影响到一些关键性的特征,如均值、50%的值、70%的值等。

df_HRTrend1=pd.DataFrame(HRTrend_Data)
df_HRTrend1.describe()

在这里插入图片描述

可以看到,这些异常值将会很大程度的影响一些关键特征,所以我们要处理异常值。

HRTrend_Data=np.trim_zeros(HRTrend_Data)  #去掉首尾的0
df_data1=pd.DataFrame(HRTrend_Data)
df_data1.replace(to_replace=0, method='ffill',inplace=True)  #用前值替换掉中间的异常0
df_data1.plot()
df_data1.describe()

在这里插入图片描述

把刚对一个样本处理的过程写成一个函数,应用到所有的样本数据。

def procdata(df_dataclumn):
    ary_data=df_dataclumn[1:len(df_dataclumn)-1]
    ary_data=ary_data.replace('\n','')
    ary_data=ary_data.replace('nan',str(0))
    ary_data=re.sub(' +', ' ', ary_data).strip()
    ary_data=np.asarray([float(s) for s in ary_data.split(' ')])
    ary_data=np.trim_zeros(ary_data)
    df_data=pd.DataFrame(ary_data)
    df_data.replace(to_replace=0, method='ffill',inplace=True)
    ary_data=df_data.values
    return ary_data

df['HRTrend']=df['HRTrend'].map(procdata)
df['Weight'].replace(to_replace=0, method='ffill',inplace=True) #去异常值
df['Height'].replace(to_replace=0, method='ffill',inplace=True) #去异常值
df

找前六个样本看看效果

fig,axes = plt.subplots(2,3,figsize=(12,4))
i=0
for x in range(2):
    for y in range(3):
        i=i+1
        axes[x,y].plot(df['HRTrend'][i])

在这里插入图片描述

二、特征工程及模型训练

方法一:通过描叙统计提取时序特征并进行模型训练

  • 特征提取

有量纲时序特征提取包括以内容。
在这里插入图片描述

可以看到,大部分内容都可以通过describe()获取。可以写个函数方法来获取相关的特征值。

def getdescribefeatures(data):
    df_feature=pd.DataFrame(data)
    df_feature=df_feature.describe().T
    range=df_feature['max'][0]-df_feature['min'][0]
    return range,df_feature['count'][0],df_feature['mean'][0],df_feature['std'][0],df_feature['min'][0],df_feature['25%'][0],df_feature['50%'][0],df_feature['75%'][0],df_feature['max'][0]

HRTrend_np=np.array(df['HRTrend'])
HRTrend_features_ary=[getdescribefeatures(d) for d in HRTrend_np]
df_HRTrend_features=pd.DataFrame(HRTrend_features_ary,columns=['HRTrend'+str(i) for i in range(len(HRTrend_features_ary[0]))])
df_HRTrend_features

在这里插入图片描述

将心电图提出的统计信息特征与年龄、性别、身高、体重等特征合并,形成特征集。

df_data=df[['age','ismale','Weight','Height','label']].join(df_HRTrend_features)

预留15个样本做最后的预测看效果。

df_train_data=df_data[0:len(df_data)-15]    #训练数据
df_predict_data=df_data[len(df_data)-15:len(df_data)]  #用于预测的数据
  • 模型训练
from sklearn.metrics import f1_score
from sklearn.metrics import recall_score
from sklearn.metrics import accuracy_score
from sklearn.svm import SVC
from sklearn.neighbors import KNeighborsClassifier

x_tt, x_validation, y_tt, y_validation = train_test_split(x, y, test_size=0.2)
# 将训练集再切分为训练集和测试集
x_train, x_test, y_train, y_test = train_test_split(x_tt, y_tt, test_size=0.25)

#将模型的名字和模型函数作为元组添加到列表当中存储;
models = []
models.append(("KNN",KNeighborsClassifier(n_neighbors=3))) #指定邻居个数
models.append(("SVM Classifier",SVC(C=1000)))
#可以通过参数C来控制精度,C越大要求精度越高;  C——错分点的惩罚度

#循环调用所有模型进行训练、预测
for clf_name, clf in models:
    clf.fit(x_train, y_train)
    xy_lst = [(x_train, y_train), (x_validation, y_validation), (x_test, y_test)]
    for i in range(len(xy_lst)):
        x_part = xy_lst[i][0]  # 为遍历中的第0部分
        y_part = xy_lst[i][1]  # 为遍历中的第1部分
        y_pred = clf.predict(x_part)
        print(i)  # i是下标,0表示训练集,1表示验证集,2表示测试集
        print(clf_name, "ACC:", accuracy_score(y_part, y_pred))
        print(clf_name, "REC:", recall_score(y_part, y_pred))
        print(clf_name, "F-score:", f1_score(y_part, y_pred))

结果如下:
在这里插入图片描述

SVM分类模型的效果要稍好于KNN的模型,但整体效果还不是很好。应该是提取的特征还是不够。我们来试下通过tsfresh提取时序特征并进行模型训练。

方法二:通过tsfresh提取时序特征并进行模型训练

  • 特征提取

tsfresh可以自动提取各种时间特征,可以参考官方文档,一般的取最大、最小、偏度、峰度等统计指标这些都自动化集成了。
https://tsfresh.readthedocs.io/en/latest/text/introduction.html
在这里插入图片描述

通过tsfresh提取时序特征代码如下:

from tsfresh import extract_features
from tsfresh import select_features
dfx_HRTrend=pd.DataFrame()
for i in df.index:
    df_i=pd.DataFrame(df['HRTrend'][i],columns=['HRTrend'])
    df_i['id']=i
    df_i['time']=np.array(range(1,len(df_i)+1))
    df_i['label']=df['label'][i]
    dfx_HRTrend=pd.concat(objs=[dfx_HRTrend,df_i])

dfx_xtracted_features = extract_features(dfx_HRTrend,column_id="id", column_sort="time")
dfx_xtracted_features

在这里插入图片描述

可以看到tsfresh自动提取了1574colums的特征,但是我们要选取与标签有相关性的特征。tsfresh可以自动做到这一点,通过tsfresh的select_features传入特征和标签来选择与标签有相关性的特征,

from tsfresh.utilities.dataframe_functions import impute
impute(dfx_xtracted_features)
df_HRTrend_features = select_features(dfx_xtracted_features, df['label'])
df_HRTrend_features

在这里插入图片描述

通过特征选择自动选取了有相关性的143个特征,比前面缩减了很多,有利于提高模型训练的效率和精度。
我们再来看一下模型训练的效果。
同样将心电图通过tsfresh提出的时序特征与年龄、性别、身高、体重等特征合并,形成特征集。

df_data=df[['age','ismale','Weight','Height','label']].join(df_HRTrend_features)

预留15个样本做最后的预测看效果。

df_train_data=df_data[0:len(df_data)-15]    #训练数据
df_predict_data=df_data[len(df_data)-15:len(df_data)]  #用于预测的数据

模型训练

from sklearn.metrics import f1_score
from sklearn.metrics import recall_score
from sklearn.metrics import accuracy_score
from sklearn.svm import SVC
from sklearn.neighbors import KNeighborsClassifier

x_tt, x_validation, y_tt, y_validation = train_test_split(x, y, test_size=0.2)
# 将训练集再切分为训练集和测试集
x_train, x_test, y_train, y_test = train_test_split(x_tt, y_tt, test_size=0.25)

#将模型的名字和模型函数作为元组添加到列表当中存储;
models = []
models.append(("KNN",KNeighborsClassifier(n_neighbors=3))) #指定邻居个数
models.append(("SVM Classifier",SVC(C=1000)))
#可以通过参数C来控制精度,C越大要求精度越高;  C——错分点的惩罚度

#循环调用所有模型进行训练、预测
for clf_name, clf in models:
    clf.fit(x_train, y_train)
    xy_lst = [(x_train, y_train), (x_validation, y_validation), (x_test, y_test)]
    for i in range(len(xy_lst)):
        x_part = xy_lst[i][0]  # 为遍历中的第0部分
        y_part = xy_lst[i][1]  # 为遍历中的第1部分
        y_pred = clf.predict(x_part)
        print(i)  # i是下标,0表示训练集,1表示验证集,2表示测试集
        print(clf_name, "ACC:", accuracy_score(y_part, y_pred))
        print(clf_name, "REC:", recall_score(y_part, y_pred))
        print(clf_name, "F-score:", f1_score(y_part, y_pred))

结果如下:
在这里插入图片描述

可以看到不管是KNN模型和SVM的模型都取得了不错的效果。

三、效果

最后我们来看一下,用预留的15个样本预测的效果。

pre_test_y=df_predict_data['label']
pre_test_x=df_predict_data.drop(columns='label')

for clf_name, clf in models:
    for i in pre_test_x.index:
        y_predict=clf.predict(pre_test_x.loc[[i]])
        predict_result='预测错误!'
        if y_predict==pre_test_y.loc[[i]].values:
            predict_result='预测正确!'
        print('第'+str(i)+'个样本'+clf_name+' 预测y='+str(y_predict)+'--实际 y='+str(pre_test_y.loc[[i]].values)+' - '+predict_result)
    print('-'*10)

先是通过描叙统计提取时序特征并进行模型训练后模型预测的结果:
在这里插入图片描述

还是有不少预测错误了。
再来看通过tsfresh提取时序特征并进行模型训练后模型预测的结果:
在这里插入图片描述

可以看到预留的15个样本都预测正确,取得了不错的效果!

本文通过心电图分类模型介绍了从数据处理、时序特征提取、模型训练和效果评估。验证了对于小数据量,通过tsfresh提取时序特征,往往能够取得很好的效果。


博客地址:http://xiejava.ishareread.com/

PyTorch深度学习入门 || 系列(六)——多元分类 文章目录0 写在前面1 softmax函数2 数据预处理2.1 scatter()函数的cmap属性3 激活函数4 模型搭建5 完整代码6 输出分析6.1 目标6.2 运行过程7 总结 0 写在前面 二分类问题是多分类问题的一种特殊情况,区别在于多分类用softmax代替sigmoid函数。 softmax函数将所有分类的分数值转化为概率,且各概率的和为1。 1 softmax函数 softmax函数首先对所有的输出值通过指数函数,将实数输出映射到正无穷 然后将所有的结果相加作为分母 2 数据预处 阅读详情

相关推荐

【时序列】时序列数据如何一步步分解成趋势(trend)季节性(seasonality)和误差(residual)- 详细理解python sm.tsa.seasonal_decompose

【时序列】时序列数据如何一步步分解成趋势(trend)季节性(seasonality)和误差(residual)- 详细理解python sm.tsa.seasonal_decompose 在做时序列分析的时候,好多教程都告诉你要把时序列分解成趋势,季节性,残差,然后画图看一下有没有趋势变化,有没有季节性。像这样: import statsmodels.api as sm decomposition = sm.tsa.seasonal_decompose(train['Count'] ,model='add

weixin_47442572的博客 2万+

时间序列数据处理2——时间序列聚类算法

 本文主要实现对时间序列聚类算法研究和相关搬运工作。 目录1. 时间序列聚类2. 时间序列聚类的步骤2.1 数据简化2.2 相似性/距离度量2.3 聚类方法2.4 评估聚类结果的标准参考资料 1. 时间序列聚类 时间序列的聚类方法: 时间序列是按照时间排序的一组随机变量,它通常是在相等间隔的时间段内,依照给定的采样率,对某种潜在过程进行观测的结果。 时间序列数据是实值型的序列数据,具有数据量大、数据维度高以及数据是不断更新的等特点。 时间序列聚类方法的分类: 什么是聚类?聚类是一种无监督学习方法,聚类就..

sinat_41354290的博客 4万+

时间序列分类任务---tsfresh

本文介绍了tsfresh库在时间序列分类任务中的应用。通过tsfresh提取时间序列的丰富特征,结合机器学习算法实现高效分类。实验表明,tsfresh显著提升了分类性能,为时间序列数据分析提供了便捷的特征提取与分类解决方案。

u012121721的博客 2281

Sequence-to-Sequence Knowledge Graph Completion and QuestionAnswering(2022 ACL)

论文笔记 Sequence-to-Sequence Knowledge Graph Completion and Question Answering

lft_happiness的博客 1346

AI模型在时序数据分析和预测中的应用创新

在当今数字化时代,时序数据无处不在,涵盖了金融市场的交易记录、气象观测的历史数据、工业生产过程中的传感器数据等众多领域。对这些时序数据进行准确的分析和预测具有重要的现实意义,例如帮助金融机构进行风险评估和投资决策,助力气象部门进行天气预测和灾害预警等。本文的目的在于深入探讨AI模型在时序数据分析和预测中的应用创新,详细介绍相关的核心概念、算法原理、实际应用场景等内容。

AGI×大数据,开启智能时代的认知跃迁;解码AGI,赋能数据驱动的智能革命。 847

时序大模型整理-论文+对比

Timer是一个由清华大学提出的大型时间序列模型(Large Time Series Model, LTSM),它基于Transformer的解码器-only结构,通过在大规模真实世界时间点上进行生成式预训练,获得了任务通用的时序分析模型。MOMENT是由卡内基梅隆大学(CMU)Auton实验室的研究团队开发的一款开源的时间序列基础模型,旨在解决时间序列分析中的一些挑战,特别是在数据多样性和预训练模型评估基准方面的挑战。能力,能够在没有微调的情况下处理复杂的时间序列任务。架构的时间序列预测基础模型,名为。

qq_42854305的博客 9833

使用机器学习/深度学习进行时间序列预测:第 2 部分 - ML&DL 的时间序列特征提取

当我们在讨论ML&DL 的时间序列特征提取时,我们具体在讨论什么?

qq_31117191的博客 1405

ARIMA 时间序列3: 使用tsfresh库进行分类任务

文章目录1. 查看数据2. 时间序列特征提取3. 用决策树训练,预测和评估模型 tsfresh是开源的提取时序数据特征的python包,能够提取出超过4000种特征 . 1. 查看数据 import matplotlib.pyplot as plt import seaborn as sns %matplotlib inline from tsfresh.example.robot_executi...

sanjianjixiang的博客 1870

卷积神经网络对时序信号的分类预测

Step4: 结构层设计,Matlab自带的库函数是处理图像的,因此输入层也是图片的输入格式,但是序列信号可以看作图像信息的特例,将其中的过程矩阵用行向量取代,本文介绍的CNN实例,包含四个卷积层,三个池化层,两个全连接层(即BP网络中的隐藏层),使用的激活函数为ReLU,全连接层的权系数节点丢弃率为0.2,同时设计softmax的多分类;%等价于 X(1,:,1,k) = (x(k,:) -mean(x(k,:))) / std(x(k,:));%滤波器长度为11,个数为4,输出的数据跟输入维度相同。

qq_58776428的博客 882

机器学习(ML)在AI驱动测试通过数据驱动的智能决策显著提升测试效率、覆盖率和准确性。

的角色,通过数据驱动的智能决策显著提升测试效率、覆盖率和准确性。机器学习(ML)在AI驱动测试中扮演着。:发现人类难以察觉的隐性模式。:分钟级生成上千测试用例。通过机器学习,测试从。:在代码提交前预测缺陷。

主攻大数据 人工智能 物联网 安全 低空经济等方向。mtsc 、gtest特邀分享嘉宾 973

企业AI Agent的时序数据预测平台设计

在当今数字化时代,企业面临着海量的时序数据,如销售数据、生产数据、金融数据等。准确的时序数据预测对于企业的决策制定、资源分配、风险评估等方面具有至关重要的意义。企业AI Agent的时序数据预测平台旨在利用先进的人工智能技术,对企业的时序数据进行分析和预测,为企业提供准确、可靠的预测结果,帮助企业更好地应对市场变化和挑战。本平台的范围涵盖了从数据采集、数据预处理、模型训练到预测结果展示的整个流程。支持多种类型的时序数据,包括单变量时序数据和多变量时序数据。

AI 算法实战派 611

【ELM时序预测】基于极限学习机ELM时序预测附matlab代码

时序预测在许多领域都有着广泛的应用,例如金融预测、天气预报和医疗诊断。极限学习机 (ELM) 是一种快速高效的神经网络算法,近年来在时序预测领域得到了广泛的应用。本文将探讨 ELM 在时序预测中的应用,并提供详细的步骤指南。极限学习机 (ELM)ELM 是一种单隐层前馈神经网络,其主要特点是:**随机隐层节点:**ELM 的隐层节点是随机生成的,不需要像传统神经网络那样进行迭代训练。**解析输出权重:**ELM 的输出权重可以通过解析公式计算,而不需要反向传播算法。

qq_59747472的博客 1050

Python 实现基于TSOA-CNN-GRU-Attention的数据分类预测的详细项目实例

然而,CNN在处理时间序列数据时她表她并不如预期,因此,结合时序优化算法、循环神经网络(GITU)和注意力机制来提高CNN她表她,她当前研究中她一个趋势。本项目她意义在她,基她TTOS-CNN-GITU-Sttfntion模型,我们能够在实际应用中对大量具有时序特征她数据进行精准她分类预测。本项目她主要目标她实她一个高效她分类预测模型,采用TTOS-CNN-GITU-Sttfntion她结合,通过多层次她特征提取和时序数据建模,提高数据分类预测她准确她。

优质创作者: 人工智能技术领域 对于有一定基础的 MATLAB和Python带具体需求都可以详谈 MATLAB和Python可以提供代码调试服务加油 谢谢 你的鼓励是我前行的动力 谢谢支持 加油 谢谢 894

Datawhale AI夏令营 使用机器学习方法入门时间序列预测

其中id为房屋id,dt为日标识,训练数据dt最小为11,不同id对应序列长度不同;type为房屋类型,通常而言不同类型的房屋整体消耗存在比较大的差异;target为实际电力消耗,也是我们的本次比赛的预测目标。

weixin_42291933的博客 1038

Creo报错代码-9?手把手教你重新生成许可证文件(基于Creo 10.0)

本文详细解析Creo报错代码-9的成因及解决方案,重点介绍如何重新生成许可证文件以应对网络环境变化导致的验证失败。通过分步指南和高级技巧,帮助用户有效管理多网络环境下的Creo许可证问题,提升工作效率。

weixin_30839881的博客 557

打开LWIP_DEBUG的打印信息调试

在lwip 2.1.2的版本,打开的debug 调试的步骤: 1.在debug.h 文件中找到debug打印的定义 默认LWIP_DEBUG这个宏没有定义, 2.在lwipopt.h 文件中或者其他文件定义 一下LWIP_DEBUG这个宏, 3.在opt.h 中可以打开各种宏的调试信息, /* --------------------------------------- ---------- Debugging options ---------- ---------...

haidscs的博客 9878

时间序列数据的特征提取

CDA数据分析师 出品 当你想对时间序列数据做分类时,有两种选择,一个是用时间序列特定的方法,比如说说LSTM模型。另外一种方法就是来从时间序列中提取特征从而将这些特征用在有监督的模型上。在这篇文章中,我们来看下如何使用tsfresh包自动的提取时间序列数据。 这份数据的来源是 。这个网站中提供对很多数据集有高精度的模型,如何有兴趣的,可以去详细了解一下。时间序列比一般标准的目标要难一些,这...

CDA数据分析师 9371

Ubuntu 上 1Panel 的安装与高效运维实践

本文详细介绍了在Ubuntu系统上安装和高效运维1Panel面板的完整实践指南。内容涵盖了一键安装、Docker容器可视化部署、计划任务自动化以及网站数据库管理等核心功能,并提供了安全加固、资源监控与数据备份等进阶技巧,旨在帮助用户快速搭建并管理一个强大易用的服务器环境。

weixin_29210759的博客 142

基于时间序列的回归问题(4)——时间序列预测的基本思路

前言: 大家好,这个系列之前以及写了几篇博客,都是对于时间序列回归预测的一些前期准备知识,相信很多人(包括笔者在内)第一次接触这种项目,可能大体的思路方案都不是很清楚,那么,这么博客将为大家梳理一下做基于时间序列数据回归预测问题的大体思路。 1、数据预处理 对于大多数基于数据挖掘的预测项目来说,得到的数据一般情况都会有噪声的,这时,就需要对数据进行预处理。 数据预处理包括对数据的清洗、数据规约等...

caoyuan666的博客 4753

Mac安装Weblogic教程

1.Weblogic的下载 这次安装的是最新版本12 官网下载地址: http://www.oracle.com/technetwork/middleware/weblogic/downloads/index.html 下载需要登录账号,如没有账号要注册一个 下载后的文件如下图,其中fmw_12.2.1.3.0_wls_quick.jar文件就是安装包了,注意现在不要对它进行解压 2.安装前的确...

weixin_40102675的博客 5061

GPU算力租用平台推荐

阿里云作为中国领先的云计算服务提供商,提供了丰富的GPU云服务器实例,包括NVIDIA Tesla V100、A100等多种高性能GPU型号。阿里云GPU云服务器适用于深度学习、科学计算、图形渲染等多种场景,能够满足不同用户的计算需求。

hong161688的博客 8171

智能工单分类系统AI参与环节拆解与技术选型

智能工单分类系统AI参与环节拆解与技术选型

嗨,欢迎来到我的 优快云 博客小天地!一名深耕多年的技术发烧友。在这里,我将把日常工作中积累的宝贵经验,从复杂架构设计的精妙之处,到代码优化的实战技巧,毫无保留地分享给大家。 6957

混合示教长短时记忆网络的车辆轨迹预测研究

论文"混合示教长短时记忆网络的车辆轨迹预测研究"中数据处理及MTF-LSTM模型实现代码,模型在Pytorch框架下实现。

ColinFhz的博客 1444
上一篇: Django+Celery+Flower实现异步和定时任务及其监控告警
下一篇: 网络安全保障之“三同步”
xiejava1018
xiejava1018 优质创作者: 人工智能技术领域 优质创作者: 人工智能技术领域
博客等级 码龄24年 4万+粉丝 289原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiejava1018

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值