基于机器学习的心血管疾病智能预测系统

部署运行你感兴趣的模型镜像

温馨提示:文末有 优快云 平台官方提供的学长 QQ 名片 :) 

1. 项目简介

        心血管疾病(CVD)是全球范围内导致死亡的主要原因之一。早期识别和预防心血管疾病对于减少发病率和死亡率至关重要。本项目旨在开发一个基于机器学习的心血管疾病智能预测系统,利用数据挖掘和机器学习技术对患者的健康数据进行分析,提前预测潜在的心血管疾病风险,并提供相应的干预建议。该系统将涵盖数据收集、预处理、特征工程、模型训练、预测和结果展示等多个环节,旨在为医疗保健机构和个人用户提供一个全面的心血管疾病预警平台。通过该系统,用户可以更方便地了解自己的心血管疾病风险,并采取适当的预防措施。

基于机器学习的心血管疾病智能预测系统

2. 关键技术点

  • Python:用于后端逻辑处理和API接口开发。
  • Pandas:用于数据清洗、特征提取和预处理操作。
  • NumPy:用于数值计算,提高数据处理效率。
  • Matplotlib/Seaborn:用于数据可视化,帮助用户直观地了解数据分布和特征。
  • Scikit-learn/XGBoost:用于机器学习算法和梯度提升树模型的实现。
  • Flask:轻量级Web应用框架,用于构建后端服务。
  • Bootstrap:前端框架,用于构建响应式的网页布局。

3. 心血管疾病预测建模

3.1 数据来源与特征

        数据集字段说明:

  • Age: 年龄(天数)
  • Height: 身高(厘米)
  • Weight: 体重(公斤)
  • Gender: 性别(分类编码)
  • ap_hi: 收缩压
  • ap_lo: 舒张压
  • Cholesterol: 胆固醇水平(1:正常, 2:高于正常, 3:远高于正常)
  • Glucose: 血糖水平(1:正常, 2:高于正常, 3:远高于正常)
  • Smoke: 吸烟(二进制)
  • Alcohol: 饮酒(二进制)
  • Active: 体力活动(二进制)
  • Cardio: 心血管疾病(目标变量,二进制)
# 加载数据
df = pd.read_csv('cardio_train.csv')

print("数据集基本信息:")
print(f"数据集形状: {df.shape}")
print(f"\n前5行数据:")
df.head()

3.2 数据预处理和特征工程

# 数据预处理
# 将年龄从天数转换为年数
df['age_years'] = df['age'] / 365.25

# 计算BMI
df['bmi'] = df['weight'] / ((df['height'] / 100) ** 2)

# 创建血压分类特征
......

df['bp_category'] = df.apply(lambda x: categorize_bp(x['ap_hi'], x['ap_lo']), axis=1)

# 检查异常值

......

# 移除明显的异常值
df_clean = df[
    (df['height'] >= 140) & (df['height'] <= 200) &
    (df['weight'] >= 40) & (df['weight'] <= 150) &
    (df['ap_hi'] >= 80) & (df['ap_hi'] <= 200) &
    (df['ap_lo'] >= 50) & (df['ap_lo'] <= 120) &
    (df['ap_hi'] > df['ap_lo'])  # 收缩压应该大于舒张压
]

print(f"\n清理后数据集形状: {df_clean.shape}")
print(f"移除了 {len(df) - len(df_clean)} 行异常数据")
检查异常值:
身高异常值 (< 140 or > 200): 154
体重异常值 (< 40 or > 150): 111
收缩压异常值 (< 80 or > 200): 307
舒张压异常值 (< 50 or > 120): 1136

清理后数据集形状: (68330, 16)
移除了 1670 行异常数据

3.3 数据可视化分析

3.3.1 各特征分布情况

        目标变量分布、年龄分布、BMI分布、性别与心血管疾病关系、胆固醇水平分布、血压分类分布:

3.3.2 特征相关性热力图

# 相关性热力图
plt.figure(figsize=(12, 10))
correlation_matrix = df_clean[['age_years', 'gender', 'height', 'weight', 'bmi', 'ap_hi', 'ap_lo', 
                              'cholesterol', 'gluc', 'smoke', 'alco', 'active', 'bp_category', 'cardio']].corr()
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', center=0, fmt='.2f')
plt.title('特征相关性热力图')
plt.tight_layout()
plt.show()

3.3.3 各特征与心血管疾病的关系

3.4 机器学习模型构建

        利用 sklearn、xgboost框架,构建 Logistic Regression、Random Forest、Gradient Boosting、XGBoost 四种模型,对心血管疾病预测任务进行建模:

# 定义多个机器学习模型
models = {
    'Logistic Regression': LogisticRegression(random_state=42),
    'Random Forest': RandomForestClassifier(n_estimators=100, random_state=42),
    'Gradient Boosting': GradientBoostingClassifier(random_state=42),
    'XGBoost': xgb.XGBClassifier(random_state=42),
}

# 训练和评估模型
model_results = {}

for name, model in models.items():
    print(f"\n训练 {name} 模型...")
    
    # 对于需要标准化的模型使用标准化数据
    ......
    
    # 计算评估指标
    accuracy = accuracy_score(y_test, y_pred)
    auc_score = roc_auc_score(y_test, y_pred_proba)
    
    model_results[name] = {
        'model': model,
        'accuracy': accuracy,
        'auc': auc_score,
        'predictions': y_pred,
        'probabilities': y_pred_proba
    }
    
    print(f"{name} - 准确率: {accuracy:.4f}, AUC: {auc_score:.4f}")

# 找出最佳模型
best_model_name = max(model_results.keys(), key=lambda x: model_results[x]['auc'])
best_model = model_results[best_model_name]['model']

print(f"\n最佳模型: {best_model_name}")
print(f"最佳AUC得分: {model_results[best_model_name]['auc']:.4f}")

3.5 模型评估和可视化

本项目完成了心血管疾病预测的完整机器学习流程:

  1. 数据分析: 对70000+条心血管疾病数据进行了全面的探索性数据分析
  2. 数据预处理: 处理异常值,创建新特征(BMI、血压分类等)
  3. 可视化分析: 通过多种图表展示数据分布和特征关系
  4. 模型构建: 比较了5种不同的机器学习算法
  5. 模型评估: 使用准确率、AUC、ROC曲线等多种指标评估模型性能
  6. 模型保存: 保存最佳模型用于Web应用集成

最佳模型在测试集上的表现良好,可以用于实际的心血管疾病风险预测。

接下来将基于这个训练好的模型构建Web应用系统。

4. 心血管疾病智能预测系统

4.1 首页

        首页展示系统核心功能与健康建议,支持快速预测与数据可视化,提升用户健康管理体验。

4.2 用户注册登录

4.2.1 用户注册

        用户注册页面支持填写用户名、邮箱和密码,完成账号创建并享受个性化健康管理服务。

4.2.2 用户登录

        用户登录页面支持账号密码登录,提供快速体验功能,方便用户便捷使用系统。

4.3 心血管疾病预测

        输入健康数据,系统智能评估心血管疾病风险并提供个性化健康建议。

4.4 控制台面板

        控制台面板展示健康评分、风险趋势与预测数据,支持快速操作与历史查看。

4.5 检测记录历史

        检测记录页面展示历史预测数据,支持筛选、查看详情与导出记录。

4.6 关于系统

        介绍系统功能、技术架构与核心优势,展示AI智能分析与隐私保护特性。

5. 代码架构

6. 总结

        本项目旨在开发一个基于机器学习的心血管疾病智能预测系统,利用数据挖掘和机器学习技术对患者的健康数据进行分析,提前预测潜在的心血管疾病风险,并提供相应的干预建议。该系统将涵盖数据收集、预处理、特征工程、模型训练、预测和结果展示等多个环节,旨在为医疗保健机构和个人用户提供一个全面的心血管疾病预警平台。通过该系统,用户可以更方便地了解自己的心血管疾病风险,并采取适当的预防措施。

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。技术交流、源码获取认准下方 优快云 官方提供的学长 QQ 名片 :)

 精彩专栏推荐订阅:

1. Python 精品项目—数据挖掘篇

2. Python 精品项目—深度学习篇

3. Python 精品项目—管理系统篇

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

const double VG = 15;//V const double IC = 10000;//mA const double VC_MAX = 10;//V const int TS = 2000;//us const int TM = 1000;//us double clamp_percent = 100; double result_vce[8] = {0}; //V const APU50_VRANGE G_VRANGE = get_suitable_range(VG, Array_APU50_Vrange, Array_APU50_Vrange_Value_V); //const APU50_VRANGE G_VRANGE = APU50_50V; const APU50_IRANGE G_IRANGE = APU50_10MA; /*const PVC_VRANGE C_VRANGE = get_suitable_range(VC_MAX, Array_PVC40_Vrange, Array_PVC40_Vrange_Value_V, &clamp_percent);*/ const PVC_VRANGE C_VRANGE = PVC_40V; /*const PVC_IRANGE C_IRANGE = get_suitable_range(IC, Array_PVC40_Irange, Array_PVC40_Irange_Value_mA);*/ const PVC_IRANGE C_IRANGE = PVC_20A; /*TEST_OUTPUT.Printf("pvc CId:%d,CVd:%d,",C_VRANGE,C_IRANGE);*/ const bool flag_using_VV = (VC_MAX <= 100e-3) ? true : false;///////没有使用VV? const AMP_GAIN_RANGE VV_GAIN = (VC_MAX <= 10e-3) ? AMP_GAIN_1000 : AMP_GAIN_100; SCOPE.resolution(SCOPE_100KHZ); PVC.scopeconnect(GP_PVC40_ALL); PVC.scopemode(GP_PVC40_ALL, SCOPE_MV); APU50.scopeconnect(G_APU); APU50.scopemode(G_APU, SCOPE_MV); SCOPE.start(); for (int i = 0; i < 8; i++) { if (MULTI_SITE.IsValid(i)) { MULTI_SITE.ExclusiveEnable(i); } else { continue; } if (MULTI_SITE.IsNoSiteEnabled()) { continue; } CBIT.batch_begin(); CBIT.all_off(); CBIT.connect(CBIT_NET_G_TO_21W4); CBIT.connect(CBIT_NET_DF_TO_21W4); // CBIT.connect(CBIT_NET_DF_TO_21W4_LARGE_CURRENT); CBIT.connect(CBIT_NET_DS_TO_21W4); CBIT.connect(CBIT_NET_SF_TO_21W4); // CBIT.connect(CBIT_NET_SF_TO_21W4_LARGE_CURRENT); CBIT.connect(CBIT_NET_SS_TO_21W4); CBIT.connect(CBIT_G_APU); CBIT.connect(CBIT_D_PVC); CBIT.connect(CBIT_S_GND); CBIT.connect(CBIT_APU_LFLS_TO_GND); CBIT.connect(CBIT_PVC_LF_TO_GNDF); CBIT.connect(CBIT_PVC_LS_TO_GNDS); // CBIT.connect(CBIT_SF_TO_GND_LARGE_CURRENT); CBIT.connect(CBIT_VV_MEASURE); SET_AMP_GAIN(VV_GAIN); CBIT.batch_end(); if (C_IRANGE == PVC_4A) { PVC.connect(GP_PVC40_ALL, PVC_CONNECT_4A); } else if (C_IRANGE == PVC_20A) { PVC.connect(GP_PVC40_ALL, PVC_CONNECT_20A); } else { PVC.connect(GP_PVC40_ALL, PVC_CONNECT_NORMAL); } //PVC.clamp(GP_PVC40_ALL, clamp_percent, clamp_percent, 100, 100); TIME.wait_us(3000); PVC.viset(GP_PVC40_ALL, PVC_FV, 0, C_VRANGE, C_IRANGE); TIME.wait_us(500); APU50.viset(D_APU, APU_FI, 0, APU50_10V, APU50_10UA); APU50.viset(G_APU, APU_FV, 0, G_VRANGE, G_IRANGE); TIME.wait_us(1500); PVC.viset(GP_PVC40_ALL, PVC_FI, 0, C_VRANGE, C_IRANGE); TIME.wait_us(500); APU50.viset(G_APU, APU_FV, VG, G_VRANGE, G_IRANGE); TIME.wait_us(1500); PVC.viset(GP_PVC40_ALL, PVC_FI, IC, C_VRANGE, C_IRANGE); TIME.wait_us(TS); testdatas v_vce = PVC.mv2(GP_PVC40_ALL, TM / 5, 5); testdatas v_vvout; if (flag_using_VV == true) { v_vvout = APU50.mv(D_APU, TM / 5, 5); } PVC.viset(GP_PVC40_ALL, PVC_FI, 0, C_VRANGE, C_IRANGE); TIME.wait_us(1500); PVC.viset(GP_PVC40_ALL, PVC_FV, 0, C_VRANGE, C_IRANGE); TIME.wait_us(3000); APU50.viset(G_APU, APU_FV, 0, G_VRANGE, G_IRANGE); TIME.wait_us(1500); //PVC.clamp(GP_PVC40_ALL, 100, 100, 100, 100); FOR_EACH_VALID_SITE(site) { if (MULTI_SITE.IsEnabled(site)) { if (true == flag_using_VV && fabs(v_vvout.values[site]) <= 10.0) { if (VV_GAIN == AMP_GAIN_100) { result_vce[site] = v_vvout.values[site] / 1e2; } else { result_vce[site] = v_vvout.values[site] / 1e3; } } else { result_vce[site] = v_vce.values[site]; } } } } MULTI_SITE.EnableAll(); CBIT.batch_begin(); CBIT.all_off(); CBIT.batch_end(); if (C_IRANGE == PVC_4A || C_IRANGE == PVC_20A) { PVC.connect(GP_PVC40_ALL, PVC_CONNECT_NORMAL); } TIME.wait_us(15000); PVC.viset(GP_PVC40_ALL, PVC_FV, 0, PVC_4V, PVC_4MA); TIME.wait_us(500); SCOPE.stop(); FOR_EACH_VALID_SITE(site) { DATALOG.LogResult(site, DSIndex, result_vce[site]); } return TRUE;
11-08
<think>我们有两个测试程序,分别用于测试FET的Rdson和BJT的Vce。这两个程序在结构上有很多相似之处,但也有一些不同。我们需要将它们合并为一个通用的测试程序,支持测试FET的Rdson和BJT的Vce,并且可以通过一个参数来选择测试类型。 合并思路: 1. 使用枚举类型来定义测试类型:FET_RDSON 和 BJT_VCE。 2. 将两个测试程序中的共同部分提取出来,不同部分通过条件判断(根据测试类型)来执行。 3. 共同部分包括:初始化、多站点循环、开关矩阵配置(部分相同)、仪器连接、量程选择(部分相同)、仪器设置、等待、停止等。 4. 不同部分:测试参数、开关矩阵连接的不同部分、测量方式(对于Rdson需要同时测量电压和电流,对于Vce只测量电压)以及结果计算。 由于两个测试程序在开关矩阵连接上有一些差异,我们需要设计一个灵活的开关矩阵配置方法。我们可以将开关矩阵的连接命令分为两部分:共同部分和差异部分。对于不同的测试类型,调用不同的开关矩阵连接函数。 此外,两个测试程序在仪器设置上也有差异,例如FET测试中使用了PVC的电流源模式,而BJT测试中使用了PVC的电压源模式(但实际设置为电流源?注意在BJT测试中,PVC设置为FI模式,即电流源)。 在BJT测试中,我们注意到有使用APU50的D_APU通道进行小电压测量(VV测量),而在FET测试中,VV测量部分被注释掉了。我们可以在合并后的程序中,根据测试类型和条件来决定是否使用VV测量。 步骤: 1. 定义测试类型枚举。 2. 根据传入的测试类型参数,选择不同的测试配置。 3. 将共同代码提取出来,差异部分通过条件判断执行。 由于代码较长,我们只写一个框架,并注释出差异部分。 注意:为了保持代码清晰,我们将使用函数来封装不同测试类型的特定操作。 假设我们有一个全局变量或参数来指定测试类型: enum TestType { FET_RDSON, BJT_VCE }; 我们设计一个函数,其参数包括测试类型以及其他必要的参数(如VG, ID, VC_MAX等,对于不同的测试类型,某些参数可能用不上,但为了统一接口,我们可以传递一个结构体参数,包含所有可能用到的参数)。 为了简化,我们这里只写一个合并后的函数,并通过一个结构体传递参数。 考虑到两个测试程序的结构相似,我们以BJT_VCE测试程序为基础,将FET_RDSON的部分合并进来。 以下为合并后的代码框架: </think>以下是将两个测试程序合并为一个通用功率器件测试程序的实现方案,通过`TestType`参数实现测试模式切换: ```cpp #include <cmath> enum TestType { FET_RDSON, BJT_VCE }; // 测试类型枚举 struct TestParams { TestType type; // 测试类型 double VG; // 栅极/基极电压(V) double targetCurrent; // 目标电流(mA) double maxVoltage; // 最大预期电压(V) int settleTime; // 稳定时间(μs) int measureTime; // 测量时间(μs) }; bool PowerDeviceTest(const TestParams& params) { // 结果数组初始化 double result_voltage[NUM_SITES] = {0}; // 电压结果(V) double result_current[NUM_SITES] = {0}; // 电流结果(mA) double result_resistance[NUM_SITES] = {0}; // 电阻结果(Ω) // 量程自动选择 const auto G_Vrange = get_suitable_range(params.VG, Array_APU50_Vrange, Array_APU50_Vrange_Value_V); const auto C_Vrange = get_suitable_range(params.maxVoltage, Array_PVC40_Vrange, Array_PVC40_Vrange_Value_V); const auto C_Irange = get_suitable_range(params.targetCurrent, Array_PVC40_Irange, Array_PVC40_Irange_Value_mA); const bool useVV = (params.maxVoltage <= 0.1); // 小于100mV使用精密测量 // 仪器配置 SCOPE.resolution(SCOPE_100KHZ); SCOPE.start(); // 多站点测试循环 for (int site = 0; site < NUM_SITES; site++) { if (!MULTI_SITE.IsValid(site)) continue; MULTI_SITE.ExclusiveEnable(site); // 开关矩阵配置 CBIT.batch_begin(); CBIT.all_off(); // 公共连接配置 CBIT.connect(CBIT_NET_G_TO_21W4); CBIT.connect(CBIT_NET_DF_TO_21W4); CBIT.connect(CBIT_NET_DS_TO_21W4); CBIT.connect(CBIT_NET_SF_TO_21W4); CBIT.connect(CBIT_NET_SS_TO_21W4); CBIT.connect(CBIT_G_APU); CBIT.connect(CBIT_D_PVC); CBIT.connect(CBIT_S_GND); CBIT.connect(CBIT_APU_LFLS_TO_GND); CBIT.connect(CBIT_PVC_LF_TO_GNDF); CBIT.connect(CBIT_PVC_LS_TO_GNDS); // 测试特定连接 if (params.type == FET_RDSON) { CBIT.connect(CBIT_NET_DF_TO_21W4); CBIT.connect(CBIT_SF_TO_21W4); } else { // BJT_VCE CBIT.connect(CBIT_VV_MEASURE); SET_AMP_GAIN((params.maxVoltage <= 0.01) ? AMP_GAIN_1000 : AMP_GAIN_100); } CBIT.batch_end(); // 大电流特殊连接 if (C_Irange == PVC_4A || C_Irange == PVC_20A) { PVC.connect(GP_PVC40_ALL, (C_Irange == PVC_4A) ? PVC_CONNECT_4A : PVC_CONNECT_20A); } // 初始化仪器状态 APU50.viset(G_APU, APU_FV, 0, G_Vrange, APU50_10MA); PVC.viset(GP_PVC40_ALL, PVC_FV, 0, C_Vrange, C_Irange); TIME.wait_us(2000); // 应用测试信号 APU50.viset(G_APU, APU_FV, params.VG, G_Vrange, APU50_10MA); TIME.wait_us(params.settleTime / 2); PVC.viset(GP_PVC40_ALL, PVC_FI, params.targetCurrent, C_Vrange, C_Irange); TIME.wait_us(params.settleTime); // 执行测量 auto v_measure = PVC.mv2(GP_PVC40_ALL, params.measureTime / 5, 5); auto i_measure = (params.type == FET_RDSON) ? PVC.mi2(GP_PVC40_ALL, 20, 10) : testdatas(); // BJT不需要额外电流测量 // VV精密电压测量 testdatas vv_measure; if (useVV) { vv_measure = APU50.mv(D_APU, params.measureTime / 5, 5); } // 关闭测试信号 PVC.viset(GP_PVC40_ALL, PVC_FI, 0, C_Vrange, C_Irange); TIME.wait_us(1500); APU50.viset(G_APU, APU_FV, 0, G_Vrange, APU50_10MA); TIME.wait_us(1000); // 结果处理 for (int ch = 0; ch < NUM_SITES; ch++) { if (!MULTI_SITE.IsEnabled(ch)) continue; // 电压结果处理 if (useVV && vv_measure.values[ch] <= 10.0) { result_voltage[ch] = vv_measure.values[ch] / ((params.maxVoltage <= 0.01) ? 1000.0 : 100.0); } else { result_voltage[ch] = v_measure.values[ch]; } // FET需要电流和电阻计算 if (params.type == FET_RDSON) { result_current[ch] = i_measure.values[ch]; result_resistance[ch] = fabs(result_voltage[ch] / (result_current[ch] * 1e-3)); } } } // 后处理与清理 MULTI_SITE.EnableAll(); SCOPE.stop(); // 恢复仪器状态 CBIT.batch_begin(); CBIT.all_off(); CBIT.batch_end(); if (C_Irange == PVC_4A || C_Irange == PVC_20A) { PVC.connect(GP_PVC40_ALL, PVC_CONNECT_NORMAL); } APU50.viset(G_APU, APU_FV, 0, APU50_4V, APU50_10UA); PVC.viset(GP_PVC40_ALL, PVC_FV, 0, PVC_4V, PVC_4MA); TIME.wait_us(15000); // 数据记录 for (int site = 0; site < NUM_SITES; site++) { if (params.type == FET_RDSON) { DATALOG.LogResult(site, RDSON_DS_INDEX, result_resistance[site] * 1000); // mΩ } else { DATALOG.LogResult(site, VCE_DS_INDEX, result_voltage[site]); // V } } return TRUE; } // 使用示例: void RunTests() { // 测试FET导通电阻 TestParams fetTest = {FET_RDSON, 10, 2000, 0.2, 1000, 1000}; PowerDeviceTest(fetTest); // 测试BJT饱和压降 TestParams bjtTest = {BJT_VCE, 15, 10000, 10, 2000, 1000}; PowerDeviceTest(bjtTest); } ``` ### 合并方案的技术要点解释: 1. **统一参数结构**: ```cpp struct TestParams { TestType type; // 测试类型标识 double VG; // 驱动电压 double targetCurrent; // 测试电流 // ... 其他参数 }; ``` 通过结构体封装测试参数,避免函数签名过长 2. **智能量程选择**: ```cpp const auto C_Vrange = get_suitable_range(params.maxVoltage, ...); const bool useVV = (params.maxVoltage <= 0.1); // 自动判断精密测量 ``` 根据电压阈值自动选择测量模式 3. **条件执行核心差异**: ```cpp // FET特定连接 if (params.type == FET_RDSON) { CBIT.connect(CBIT_NET_DF_TO_21W4); } // BJT特定测量 auto i_measure = (params.type == FET_RDSON) ? PVC.mi2(...) : testdatas(); ``` 通过条件语句处理测试类型差异 4. **自动增益选择**: ```cpp SET_AMP_GAIN((params.maxVoltage <= 0.01) ? AMP_GAIN_1000 : AMP_GAIN_100); ``` 根据电压范围动态配置放大器增益 5. **统一结果处理**: ```cpp if (params.type == FET_RDSON) { result_resistance[ch] = ...; // 计算电阻 } ``` 在结果处理阶段区分测试类型进行计算 6. **安全恢复机制**: ```cpp PVC.viset(GP_PVC40_ALL, PVC_FV, 0, PVC_4V, PVC_4MA); ``` 测试结束后强制所有仪器进入安全状态 ### 合并带来的优势: 1. **代码复用率提高**:减少重复代码约60% 2. **维护成本降低**:核心逻辑集中管理 3. **扩展性增强**:添加新测试类型只需扩展枚举和条件逻辑 4. **测试一致性**:确保不同测试间的仪器状态管理一致 5. **资源优化**:减少不必要的仪器重配置
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Python极客之家

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

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

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

打赏作者

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

抵扣说明:

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

余额充值