【python项目实践】ACVA航空公司客户价值分析

RFM模型原理详解与实操运用 RFM模型原理详解与实操运用RFM模型原理介绍为什么要使用RFM模型RMF模型原理介绍RFM模型用户细分RFM模型实例操作背景/数据介绍RFM模型异化构建代码实现结果分析 最近在运营课程中学习了RFM模型,又正正好在商务智能的课程中学习了使用K-Means聚类分析实现RFM的操作。知乎了一番后,写一下自己的学习收获(咱先起到总结作用哈)!有什么问题或者建议欢迎大家一起学习交流鸭~ 主要参考:中国矿业大学电子商务专业:电子商务运营、商务智能与数据挖掘课程;知乎:猴子 RFM模型原理介绍 为什么要使用RFM模型 阅读详情

title:
date: 2024-09-03 09:38:54
tags:
cover: https://picbed0521.oss-cn-shanghai.aliyuncs.com/blogpic/ACVA_COVER.png

原文见我的网站: www.supdriver.top

背景分析

航空公司现状

行业内竞争

民航的竞争除了三大航空公司之间的竞争外,还将加入新崛起的各类小型航空公司、民营航空公司,甚至国外航空巨头。航空产品生产过剩,产品同质化特征愈加明显,于是航空公司从价格、服务间的竞争逐渐转向对客户的竞争

行业外竞争

随着高铁、动车等铁路运输的兴建,航空公司受到巨大冲击

如上图所示,经过2010到2015年的发展,铁路运输对航空运输的冲击越发明显

航空公司数据特征说明

  • 目前航空公司已经积累了大量的会员档案信息和其乘坐航班记录
  • 就本项目已获取的数据,以2014-03-31为结束时间,选取宽度为两年的时间段作为分析观测窗口,抽取观测窗口内有乘机记录的所有客户的详细数据形成的历史数据,44个特征,总共62988条记录。

数据特征记录说明如下表所示:



结合数据的项目目标

结合目前航空公司的数据情况,可以实现以下目标

  • 借助航空公司客户数据,对客户进行分类
  • 对不同的客户类别进行特征分析,比较不同类别客户的客户价值
  • 对不同价值的客户类别提供个性化服务,制定相应的营销策略

了解客户价值分析

客户营销战略倡导者Jay & Adam Curry 从国外数百家公司进行了客户营销实施的经验中提炼了如下经验

  • 公司收入的80%来自顶端的20%客户
  • 20%的客户其利润率100%
  • 90%以上的收入来自现有客户
  • 大部分的营销预算经常被用在非现有客户上
  • 5%至30%的客户在客户金字塔中具有升级潜力
  • 客户金字塔中客户升级2%,意味着营销收入增加10%,利润增加50%

也许这些经验并不完全准确,但是它解释了新时代客户分化的趋势,也说明了对客户价值分析的迫切性和必要性

项目流程图

代码实现业务功能

系统架构

文件结构

这里主要用三个文件夹,分别储存代码,原始数据,临时文件

  • codes 代码文件夹
  • data_raw 原始数据文件夹
  • tmp 临时文件文件夹

代码结构

本业务系统采用一个main.py执行主要业务逻辑,封装多个模块和类实现具体业务,以达到主要业务逻辑清晰,代码封装性强,易于维护和复用的优点

主要的代码文件有:

  • main.py 执行主要逻辑
  • log.py 提供日志器
  • data_cleaner 实现清洗数据
  • LEDNX.py 构建和提取五大特征
  • radar_char.py 绘制结果雷达图

实现一个简单的日志器

一般日志器有日志等级,日志时间,和日志内容三大部分,不过本次业务与时间关联性不大,就只打印两个部分

log.py

###### 实现日志系统 ########

# 定义日志等级
LOG_INFO = "Info"
LOG_ERROR = "Error"
LOG_WANING = "Warning"
LOG_FATAL = "Fatal"

class Log:
    def __init__(self):
        return

    def __call__(self,level,*msgs): # 重载()运算符
        print("[", level, "]",end='')
        for msg in msgs:
            print(msg)
        # 本项目与时间关系不大,日志系统不打印时间

这里使用了__call__对()操作符的重载,和*mgs达到了传递任意数量参数的语法特性

这样以后打印日志可以方便地把对象当函数用

程序入口 & 从数据源提取数据

我们将main.py作为项目的程序入口

main.py

######### 主程序入口 #############
import numpy as np
import pandas as pd
from sklearn.cluster import KMeans
import time

from log import *
from data_clean import *
from LRFMC import *

if __name__ == '__main__':

    log = Log()  # 实例化一个日志器
    data_cleaner = DataCleaner() #实例化数据清洗器
    LRFMCobj = LRFMC()  # 实例化模型处理器

这里的数据源为.csv文件,所以我们要用到pandas模块读取文件到表格中

这里代码不多,就直接写在main.py里了

    # ...上略...
    #data_cleaner = DataCleaner() #实例化数据清洗器

    # 从数据源获取数据
    airline_data = pd.read_csv("../data_raw/air_data.csv",
        encoding="gb18030")  # 导入航空数据
    log(LOG_INFO,'原始数据的形状为:', airline_data.shape)

预处理航空公司数据

航空公司客户原始数据存在少量的缺失值和异常值,需要清洗后才能用于分析。

缺失值处理

通过对数据观察发现原始数据中存在票价为空值,票价最小值为0,折扣率最小值为0,总飞行公里数大于0的记录。票价为空值的数据可能是客户不存在乘机记录造成。

处理方法:丢弃票价为空的记录

具体实现: 考虑到与票价有关的特征有SUM_YR_1和SUM_YR_2两条,逻辑上两条特征数据都为0才算缺失值,所以分别提取两条对应的布尔值列表,并用逻辑与合并,用于数据表格的切片

我们先定义好成员函数,最后封装到DataCleaner类中

data_cleaner.py

    def notNull(self,airline_data):  # 缺失值处理:去除票价为空的记录
        exp1 = airline_data["SUM_YR_1"].notnull()
        exp2 = airline_data["SUM_YR_2"].notnull()
        exp = exp1 & exp2  # 按位逻辑与,获取所需的布尔值列表
        # airline_notnull = airline_data.loc[exp, :]  # exp提供布尔值竖列表, ':'默认无参时,切片所有行,完成去除操作
        airline_notnull = airline_data[exp] #  这是上一句的简化写法(使用更多的缺省参数

        return airline_notnull

异常值

其他的数据可能是客户乘坐0折机票或者积分兑换造成。由于原始数据量大,这类数据所占比例较小,对于问题影响不大,因此对其进行丢弃处理。

处理方法:丢弃票价为0,平均折扣率为0,总飞行公里数大于0的记录。

具体处理:采用index1和index2先保留总票价不为0的记录,然后用index3筛选出总里程SEG_KM_SUM``>0且平均折扣率avg_discount``!=0的记录,使用布尔值列表(index1 | index2) & index3进行筛选,保留所需数据

    def notOutlier(self,airline_data):
        index1 = airline_data["SUM_YR_1"].notnull()
        index2 = airline_data["SUM_YR_2"] != 0  # 效果和上一句的notnull()一样,都是生成bool array
        index3 = (airline_data["SEG_KM_SUM"] > 0) & \
                 (airline_data["avg_discount"] != 0)  # 折扣且总里程不为0的机票
        airline = airline_data[(index1 | index2) & index3]  # 丢弃票价为0,或折扣率为0,且总里程>0的异常值
        return airline

封装DataCleaner类

将用于清理数据的函数整合到一个类中,方便维护,添加或修改新的清理规则也很可以很方便地找到DataCleaner类,在里面集中维护s

data_cleaner.py

class DataCleaner:
    def __init__(self):
        return
    def notNull(self,airline_data):  # 缺失值处理:去除票价为空的记录
        exp1 = airline_data["SUM_YR_1"].notnull()
        exp2 = airline_data["SUM_YR_2"].notnull()
        exp = exp1 & exp2  # 按位逻辑与,获取所需的布尔值列表
        #airline_notnull = airline_data.loc[exp, :]  # exp提供布尔值竖列表, ':'默认无参时,切片所有行,完成去除操作
        airline_notnull = airline_data[exp] #  这是上一句的简化写法(使用更多的缺省参数
        return airline_notnull

    def notOutlier(self,airline_data):
        index1 = airline_data["SUM_YR_1"].notnull()
        index2 = airline_data["SUM_YR_2"] != 0  # 效果和上一句的notnull()一样,都是生成bool array
        index3 = (airline_data["SEG_KM_SUM"] > 0) & \
                 (airline_data["avg_discount"] != 0)  # 折扣且总里程不为0的机票
        airline = airline_data[(index1 | index2) & index3]  # 丢弃票价为0,或折扣率为0,且总里程>0的异常值
        return airline

RFM到LFRMC模型的介绍

RFM模型介绍

本项目的目标是客户价值分析,即通过航空公司客户数据识别不同价值的客户,识别客户价值应用最广泛的模型是RFM模型。

  • R(Recency)指的是最近一次消费时间与截止时间的间隔。通常情况下,最近一次消费时间与截止时间的间隔越短,对即时提供的商品或是服务也最有可能感兴趣。
  • F(Frequency)指顾客在某段时间内所消费的次数。可以说消费频率越高的顾客,也是满意度越高的顾客,其忠诚度也就越高,顾客价值也就越大。
  • M(Monetary)指顾客在某段时间内所消费的金额。消费金额越大的顾客,他们的消费能力自然也就越大,这就是所谓“20%的顾客贡献了80%的销售额”的二八法则。

RFM模型结果解读

RFM模型包括三个特征,使用三维坐标系进行展示,如图所示。X轴表示Recency,Y轴表示Frequency,Z轴表示Monetary,每个轴一般会分成5级表示程度,1为最小,5为最大

如图,不同的区域有有不同的营销策略

传统RFM模型在航空行业的缺陷

在RFM模型中,消费金额表示在一段时间内,客户购买该企业产品金额的总和,由于航空票价受到运输距离,舱位等级等多种因素影响,同样消费金额的不同旅客对航空公司的价值是不同的,因此这个特征并不适合用于航空公司的客户价值分析。

航空客户价值分析的LRFMC模型

为了弥补传统RFM模型在实际应用中的缺陷,本次项目使用了适用于航空客户价值分析的LRFMC模型

本项目选择客户在一定时间内累积的飞行里程M和客户在一定时间内乘坐舱位所对应的折扣系数的平均值C两个特征代替消费金额。此外,航空公司会员入会时间的长短在一定程度上能够影响客户价值,所以在模型中增加客户关系长度L,作为区分客户的另一特征。

构建航空客户价值分析的关键特征

这里依然使用模块封装和类封装,在LRFMC.py中封装LRFMC类来完成模型相关的数据处理

选取关键特征 和 构建L特征

我们首先选取上图相关特征的列到airline_selection中,用于构建L特征和后面选取后四列与L列合并

LRFMC.py

######## 构建 LRFMC模型 ########
import pandas as pd
from log import *

class LRFMC:
    def __init__(self):
        self.log = Log()
        return
    def getFeatures(self,airline):
        # 选取需求特征
        airline_selection = airline[["FFP_DATE","LOAD_TIME",
                                     "FLIGHT_COUNT","LAST_TO_END",
                                     "avg_discount","SEG_KM_SUM"]]
        # 构建L特征
        L = pd.to_datetime(airline_selection["LOAD_TIME"]) \
            - pd.to_datetime(airline_selection["FFP_DATE"])
        self.log(LOG_DEBUG,"\n",L[:5])  #测试前五行
        # 转成月份
        L = L.astype("str").str.split().str[0]
        L = L.astype("int")/30

        #合并特征
        airline_features = pd.concat([L,
                airline_selection.iloc[:,2:]],axis = 1)  #axis=1使函数按列合并,[:,2:]舍弃了原本的前两列
        airline_features =airline_features.rename(columns={0:"L"}) # 重命名没有名字的列
        self.log(LOG_DEBUG,"\n",airline_features.head())  #缺省参数为5,打印前五行
        return airline_features

标准化

完成五个特征的构建以后,对每个特征数据分布情况进行分析,其数据的取值范围如下表所示。从表中数据可以发现,五个特征的取值范围数据差异较大,为了消除数量级数据带来的影响,需要对数据做标准化处理。

这里使用 sklearn模块中的 StandardScaler类来自动标准化数据,然后我们将标准化后的数据再转成pandas表格,最后储存到临时文件airline_scale.xlsx中

LRFMC.py

    def storeStandData(self,airline_features):
        data = StandardScaler().fit_transform(airline_features)
        SDF = pd.DataFrame(data);  #获取 standardDataFrame(SDF)
        SDF = SDF.rename(columns={0:"L",1:"F",2:"R",3:"C",4:"M"})
        self.log(LOG_INFO,"标准化后的前五行的LRFMC五个特征为\n",SDF.head())
        SDF.to_excel("../tmp/airline_scale.xlsx")  ##储存值tmp文件夹

前五行标准化前后的结果如下

了解和使用K-Means聚类算法

即使经过了一系列预处理和模型建模,我们手上的数据依然还是比较原始,只有经过分类过的数据才更有分析价值,而自然数据一般都难以直接分类,需要用聚类算法进行分类,这里就用到了K-Means聚类算法

基本概念

K-Means聚类算法是一种基于质心的划分方法,输入聚类个数k,以及包含n个数据对象的数据库,输出满足误差平方和最小标准的k个聚类。算法步骤如下:

  • 从n个样本数据中随机选取k个对象作为初始的聚类中心。
  • 分别计算每个样本到各个聚类质心的距离,将样本分配到距离最近的那个聚类中心类别中。
  • 所有样本分配完成后,重新计算k个聚类的中心。
  • 与前一次计算得到的k个聚类中心比较,如果聚类中心发生变化,转(2),否则转(5)。
  • 当质心不发生变化时停止并输出聚类结果。

数据类型

K-Means聚类算法是在数值类型数据的基础上进行研究,然而数据分析的样本复杂多样,因此要求不仅能够对特征为数值类型的数据进行分析,还要适应数据类型的变化,对不同特征做不同变换,以满足算法的要求。

获取KMeans对象

sklearn的cluster模块提供了KMeans函数构建K-Means聚类模型

翻阅其源代码(下图),可以看到KMeans是一个类,且构造函数有大量缺省参数,因此实例化KMeans对象时,只需提供无缺省的参数,和调整关键缺省参数即可

这里我们只显式传参n_clusters和random_state,其中后一个参数用时间戳

因为本身KMeans就封装地很好,这部分代码就写在main.py的主逻辑中

main.py

    ## 对象实例化
    k = 5 ## 确定聚类中心数,这里我们预期聚类5类客户
    kmeans_model = KMeans(n_clusters=k,random_state=int(time.time()))  # 实例化对象
    kmeans_model = kmeans_model.fit(airline_scale)  # 用准备好的数据训练模型
    centers = kmeans_model.cluster_centers_
    log(LOG_INFO,"五个聚类中心为\n",centers)

    ## 统计不同类别样本的数目
    r1 = pd.Series(kmeans_model.labels_).value_counts()
    log(LOG_INFO,"最终每个类别的数目为\n",r1)

最后聚类的结果类似下表

至此数据的分析,建模和聚类已经完成,数据处理部分告一段落,接下来是可视化处理

可视化雷达图

这里使用matplotlib.pyplot模块作图,numpy二次处理数据,封装代码到RadarDrawer类中并用__call__重载()操作符

值得注意的是:

  • 因为这里使用了雷达图,所以绘制图形时使用极坐标会更方便
  • 因为这里使用了中文文字,而默认字体不支持中文,会报错,所以要提前设置中文字体

radar_chart.py

import matplotlib.pyplot as plt
import numpy as np

class RadarDrawer():
    def __init__(self):
        return

    def __call__(self, kmeans_moudel, n_clusters):
        # 设置支持中文的字体
        plt.rc("font",family="Microsoft YaHei")
        # 标签
        labels = np.array([u'ZL',u'ZR',u'ZF',u'ZM',u'ZC'])

        plot_data = kmeans_moudel.cluster_centers_
        # 指定颜色
        color = ['b','g','r','c','y']
        # 计算雷达图的角度
        angles = np.linspace(0,2*np.pi,n_clusters,endpoint=False)

        # 闭合(首尾列相同) 并用np把pandas的DataFrame转成原生数组
        plot_data = np.concatenate((plot_data,plot_data[:,[0]]),axis = 1)
        angles_org = angles
        angles = np.concatenate((angles,[angles[0]]))

        fig = plt.figure(figsize=(6,6),dpi = 160)
        #polar参数
        ax = fig.add_subplot(111, polar=True)  # 设置坐标为极坐标
        # 画若干个五边形
        floor = np.floor(plot_data.min())   # 大于最小值的最大整数
        ceil = np.ceil(plot_data.max())     # 小于最小值的最小整数
        n = len(labels)
        for i in np.arange(floor,ceil+0.5, 0.5):
            ax.plot(angles,[i] *(n+1),'-.',lw=0.5,color='black')
        # 话不同客户群的分割线
        for i in range(len(plot_data)):
            ax.plot(angles,plot_data[i],color = color[i],
                    label='客户群'+str(i+1),linewidth=2, linestyle='-.')
        ax.set_rgrids(np.arange(0,2.5, 0.5))  # 画出每层的权重
        ax.set_thetagrids(angles_org* 180/np.pi,labels)  # 设置显示的角度为度数制
        plt.legend(loc='lower right',bbox_to_anchor=(1.1, -0.1))  #设置图例位置在画布外
        #plt.legend()

        #ax.set_theta_zero_location('N')         # 设置极坐标的起点(即0°)在正北方向
        ax.spines['polar'].set_visible(False)   # 不显示极坐标最外面的圈
        ax.grid(False)                          # 不显示默认分割线
        plt.savefig("../tmp/ACVA_img.png")      # 储存图像的临时文件
        plt.show()

重新组织main.py

至此所有的功能已经实现,并封装到了各个模块和类中,所以我们再重新组织一次main.py,并最终定档其中的代码

main.py

######### 主程序入口 #############
import pandas as pd
from sklearn.cluster import KMeans
import time

from log import *
from data_clean import *
from LRFMC import *
from radar_chart import  *

if __name__ == '__main__':

    log = Log()  # 实例化一个日志器
    data_cleaner = DataCleaner() #实例化数据清洗器
    LRFMCobj = LRFMC() # 实例化模型处理器

    # 从数据源获取数据
    airline_data = pd.read_csv("../data_raw/air_data.csv",
        encoding="gb18030")  # 导入航空数据
    log(LOG_INFO,'原始数据的形状为:', airline_data.shape)

    #数据预处理
    ## 缺失值处理:去除票价为空的记录
    airline_notnull = data_cleaner.notNull(airline_data)
    log(LOG_INFO,'删除缺失记录后数据的形状为:', airline_notnull.shape)

    ## 异常值处理: 只保留票价非零的,或者平均折扣率不为0且总飞行公里数大于0的记录。
    airline = data_cleaner.notOutlier(airline_notnull)
    log(LOG_INFO,'删除异常记录后数据的形状为:', airline.shape)

    # 构建LRFMC五大特征
    airline_features = LRFMCobj.getFeatures(airline)
    LRFMCobj.storeStandData(airline_features)

    # 获取KMeans对象
    ## 准备数据
    airline_scale = pd.read_excel("../tmp/airline_scale.xlsx")
    airline_scale = airline_scale.iloc[:,1:]  # 切掉第一列的作为行数标志的数字

    ## 对象实例化
    k = 5 ## 确定聚类中心数,这里我们预期聚类5类客户
    kmeans_model = KMeans(n_clusters=k,random_state=int(time.time()))  # 实例化对象
    kmeans_model = kmeans_model.fit(airline_scale)  # 用准备好的数据训练模型
    centers = kmeans_model.cluster_centers_
    log(LOG_INFO,"五个聚类中心为\n",centers)

    ## 统计不同类别样本的数目
    r1 = pd.Series(kmeans_model.labels_).value_counts()
    log(LOG_INFO,"最终每个类别的数目为\n",r1)

    # 作出图样
    RadarDrawer()(kmeans_model,n_clusters=k)
    log(LOG_INFO,"完成作图")

可以看到,经过一系列封装,main.py只有寥寥50多行,确已经体现了主要的 业务逻辑

分析聚类结果

基于特征描述,本项目定义五个等级的客户类别:重要保持客户,重要发展客户,重要挽留客户,一般客户,低价值客户

模型应用

根据对各个客户群进行特征分析,采取下面的一些营销手段和策略,为航空公司的价值客户群管理提供参考

  • 会员的升级与保级:航空公司可以在对会员升级或保级进行评价的时间点之前,对那些接近但尚未达到要求的较高消费客户进行适当提醒甚至采取一些促销活动,刺激他们通过消费达到相应标准。这样既可以获得收益,同时也提高了客户的满意度,增加了公司的精英会员。
  • 首次兑换:采取的措施是从数据库中提取出接近但尚未达到首次兑换标准的会员,对他们进行提醒或促销,使他们通过消费达到标准。一旦实现了首次兑换,客户在本公司进行再次消费兑换就比在其他公司进行兑换要容易许多,在一定程度上等于提高了转移的成本。
  • 交叉销售:通过发行联名卡等与非航空类企业的合作,使客户在其他企业的消费过程中获得本公司的积分,增强与公司的联系,提高他们的忠诚度。

小结

本项目结合航空公司客户价值分析的案例,重点介绍了数据分析算法中K-Means聚类算法在客户价值分析中的应用。针对RFM客户价值分析模型的不足,使用K-Means算法构建了航空客户价值分析LRFMC模型,详细描述了数据分析的整个过程。

github项目文件 和 相关外部链接

戳我去github仓库🔗

戳我去KMeans源码🔗

戳我去pandas文档下载🔗

戳我去matplotlib的API文档🔗

戳我去numpy文档🔗

神经网络-LFR model CLDNN[1]不同的网络结构有不同的优势 - CNN擅长减少频率偏移 - LSTM擅长对时序信号进行建模 - DNN可以对特征做更高阶的抽象,更容易进行分类 CLDNN依次将CNN/LSTM/DNN进行串联组合成一个新的网络,相当于依次进行频域变化/时域关联/特征抽象,相比于单一的LSTM网络,可以获得性能的提升。delay constraint[2]对ctc模型来讲,在数据帧和输出l 阅读详情

相关推荐

Pandas入门教程(二十二):股票数据分析实战——yfinance 获取数据、技术指标与收益率分析

把 Pandas 用在真实场景,才能体会它的价值。本文以茅台股票为例,用 yfinance 获取历史行情,完成缺失值处理与列筛选,绘制收盘价曲线,计算 SMA 移动平均线与 RSI 相对强弱指数,并通过日收益率、累计收益率和波动率完成完整的量化分析流程。

Smell_of_earth的博客 335

AI全栈实战 | 3.9-01 爬虫入门:requests 加 BeautifulSoup 三分钟跑通,但 90% 的人栽在这 4 个“礼貌“问题上

⚠️:本文内容仅用于。请遵守目标站点的服务条款与相关法律法规,不得对目标服务造成负担,不得采集、传播个人隐私数据。技术是中性的,边界在你手里。爬虫的入门技术(requests 发请求 + BeautifulSoup 解析)三分钟就能学会。真正区分"会用爬虫"和"会做爬虫的人"的,是这篇我们跑通"请求→解析→存储"的最小闭环,然后重点把"合规与礼貌"这根弦给你绷上。

源码获取 | 运行部署 | 定制二开修改,如果回复不及时请耐心等待,请见谅。 415

如何处理动态语言(Python / JS)的“隐形”调用链?

本文揭示动态语言(Python/JS)中静态AST解析导致调用链“断链”的核心问题,提出通过运行时追踪补全图谱的解决方案。基于Code-Graph-RAG的cgr trace机制,分别利用pytest插件与V8 Profiler捕获真实调用路径,将动态边合并至静态图谱,并在权重体系中提升动态边优先级。实践表明,该方法可显著提升图谱覆盖率,实现“结构+行为”双视角理解代码,为MCP与Rerank系统提供可靠支持。

xianyinsuifeng的博客 415

从一段视频到可漫游的 4D 有声场景:思路拆解与最小复现手记

只需一段手机视频,你就能生成可"走进去"的 4D 有声场景:转头时狗叫声方向随之变化,走近时声音更清晰。本文拆解 Video-to-4DAVScene 的核心思路,手把手带你用几十行 Python 搭出最小管线,把视频中的运动物体变成带空间位置的声源,并附上三个真实踩坑的排障经验,代码可直接跑。🎧

helloagent的博客 235

AI 帮我写单测:pytest 覆盖率提升 40% 的协作日志

AI助力pytest测试覆盖率提升40%的实践总结 本文分享了作者通过AI协作提升Python项目测试覆盖率的实践经验。初始测试覆盖率仅45%的电商后端项目,通过系统化的AI协作策略(代码分析、场景矩阵设计、迭代优化)实现了显著改进。AI不仅生成312个高质量测试用例,更提供了测试设计思路和最佳实践建议。最终覆盖率提升至85%,发现并修复23个潜在bug,效率提升3倍。文章详细展示了用户服务、订单服务等核心模块的测试案例,以及分层Fixture设计、参数化测试等高级技巧。关键成功因素包括明确的协作边界、迭代

摘星编程的博客 3279

ADB详细(从下载安装到灵活运用)

ADB(Android Debug Bridge)是一种允许模拟器或已连接的 Android 设备进行通信的命令行工具,它可为各种设备操作提供便利,如安装和调试应用,并提供对 Unix shell(可用来在模拟器或连接的设备上运行各种命令)的访问。可以在Android SDK/platform-tools中找到 adb 工具或下载ADB Kits。

LiuYong_01的博客 10万+

【每天一个 Python 小案例30】Python 基础知识综合小项目:我的工具盒

作为系列收官,本篇把前 29 篇的知识点合成一个能直接用的命令行工具"我的工具盒":计算器(用 ast 解析表达式,不碰 eval)、单位换算与温度转换(一张换算表 + 特例分支)、记账与分类统计(Decimal + JSON 持久化)、以及用"字典当命令表"把菜单和业务逻辑解耦的主循环。文中对比了 eval 的安全隐患与 ast 白名单的做法,解释了 lambda 闭包在字典里的写法与晚绑定陷阱,并在最后给出整个系列的知识地图,把变量、数据结构、控制流、函数、类、异常、文件、标准库八块内容对应到具体篇目。

xinjiyaya的博客 427

深入解析SGLang框架:从架构设计到核心组件实现

本文深入解析了SGLang框架的架构设计与核心组件实现。SGLang是一个专为大语言模型推理设计的高效框架,其核心优势在于清晰的分层架构、高效的调度策略以及精细的内存管理。文章详细剖析了其客户端接入、服务器端调度、模型执行引擎及Tokenizer/Detokenizer管理器等关键组件,揭示了其实现高性能推理的内部机制。

coffee的博客 577

10分钟完成第一个Python小游戏

第一个项目不用找复杂的,‌直接选「猜数字小游戏」对应的教程‌就好——几乎所有入门教程都会讲这个项目,资料最多、遇到问题随便搜就能找到解决方法,不会卡壳,30分钟肯定能做完,非常容易建立信心。‌教程链接‌:直接搜标题👉 ‌《Python零基础入门项目:30分钟写完猜数字游戏》‌(优先选黑马程序员、鱼C-小甲鱼这两个UP主的版本,播放量都是百万级,口碑稳定)‌教程地址‌:打开菜鸟教程官网→找到「Python 实例」板块,直接在线写代码运行。全程不跳步,30分钟就能做完,做完能直接运行玩,成就感拉满。

mF44Job8l的博客 43

CMU的local_planner学习笔记

ros::Subscriber subOdometry = nh.subscribe//当接收到/state_estimation话题消息更新时启动odometryHandler回调函数 (消息格式:nav_msgs::Odometry消息内容:关于机器人或车辆的位置和方向(姿态)信息)pcl::PointCloud::Ptr freePaths(new pcl::PointCloud());

qq_35971623的博客 3878

STM32驱动电磁阀电路设计:从光耦选型到MOSFET驱动的实战解析

本文深入解析了STM32驱动24V电磁阀的完整电路设计,重点探讨了光耦选型与MOSFET驱动两大核心环节。针对电平转换与电气隔离需求,详细对比了EL357N与TLP2310等光耦在CTR、速度及耐压等关键参数上的差异与应用场景。同时,文章提供了MOSFET关键参数解读、驱动电路优化方案(如推挽驱动)以及完整的PCB布局、电源处理与调试避坑指南,旨在帮助工程师构建稳定可靠的工业控制电路。

weixin_29184371的博客 234

二进制木马免杀-Python 分离免杀与 Web 挂马

二进制木马免杀-Python 分离免杀与 Web 挂马

2503_94637398的博客 269

CCS环境下ADC采样波形的实时可视化调试技巧

本文详细介绍了在CCS环境下实现ADC采样波形实时可视化的调试技巧。通过数组缓存优化、多通道同步显示和波形测量工具的高级用法,帮助开发者高效调试嵌入式系统中的ADC采样问题,提升信号分析的准确性和效率。

weixin_33712987的博客 419

蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级 备考:莫队算法离线区间查询详解

备赛进行时:第十八届蓝桥杯软件赛报名已于 2026-10-08 10:00 开启、12-18 14:00 截止,省赛定在 2027-04-10(C/C++·Python 程序设计 9:00–13:00);中国电子学会 2026 年 12 月软件编程(C/C++ 一级至十级、Python 一级至六级)考级报名 9/23–12/2 16:00、统考 12-12;全国青少年信息素养大赛 2026—2027 赛季算法应用主题赛也已进入复盘练兵窗口。

IT_Scratch的博客 157

别再死记硬背公式了!用Multisim仿真软件,5分钟搞懂三极管放大电路的工作原理

本文介绍如何利用Multisim仿真软件快速掌握三极管放大电路的工作原理,避免死记硬背公式。通过动态实验和参数调整,直观理解三极管的工作状态和放大效果,提升学习效率和实践能力。

weixin_30566063的博客 568

华为OD机试真题 新系统 2026-08-02 C++ 实现【战士技能规划设计】

你为一款动作游戏设计战士角色的技能。战士每个技能会消耗不同能量,释放技能有两个约束:连续释放技能数量不能超过 m 个,技能能量总和不能超过能量上限 k;如果超过则必须中断当前技能,进入调息状态,也就是分段。

MISAYAONE的博客 75

我用 200 行代码写了个“代码屎山检测器“,扫完公司的老项目后我沉默了

这个工具不能帮你把屎山铲平,但至少能让你知道自己面对的是多大的山,也能在代码评审时用数据说话——“这个 PR 把圈复杂度从 12 推到了 18,能不能拆一下?毕竟,不能量化的东西,就没法改进。

xixiaoyunya的博客 247

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

魔塔社区微调训练Qwen2-1.5B-Instruct模型并烧录到‌RK3568开发板教程

本文基于Ubuntu 22.04 + CUDA 13.0.3环境,使用LLaMA-Factory框架对Qwen2-1.5B-Instruct模型进行LoRA微调,训练儿童故事生成专用模型。通过配置qwen模板、制作alpaca格式数据集、执行sft训练并合并LoRA权重,最终将模型转换为GGUF格式,并量化为Q4_K_M以适配RK3568嵌入式平台。全程支持国产镜像加速下载与显存优化,实现高效轻量化部署。

浅清秋慕夏的博客 187

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

【回眸】DeepSeek V4.1 Flash 快速上手与实战

本文介绍如何高效本地部署开源大模型,通过现代化工具链实现分钟级环境搭建。聚焦显存优化、一键安装、代码调用与多轮对话实现,解决“显存不足”“连接超时”等痛点,提供参数调优与结构化输出技巧,助力开发者在离线场景下快速构建稳定、高效的本地推理系统。

啤酒鸭的物联网开发记录博客 225

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

智叟云集-手机证据抓取系统的工程结构与应用入口

本文系统阐述手机证据抓取系统的工程结构与应用入口,涵盖四大层面:工程目录划分(Android、Python服务、Web页面、测试与构建工具);Android组件通过Manifest声明可启动页面,主界面由MainActivity管理;Python服务通过run.py解析参数并启动FastAPI应用,支持远程访问;浏览器页面采用HTML/CSS/JS分离架构,静态资源通过路径关联,实现动态交互。各模块分工明确,协同构建可运行的采集系统。

2301_77178996的博客 236

Java Arrays.asList 常见坑详解|UnsupportedOperationException、数组联动、基本类型 bug

解析 Arrays.asList 常见开发陷阱,演示 UnsupportedOperationException、底层数组引用共享、基本类型数组问题,区分 Arrays 内部 ArrayList 与 java.util.ArrayList,给出数组转 List 的各种场景正确代码。

weixin_42617033的博客 480

利用python中matplotlib.pyplot库绘制图

plt.plot(x,y) # x,y是每个点的坐标,plot()把每个点按顺序画折线。plt.subplots(2,2)表示绘制2*2的子图布局,axs[0,0]表示在第0行第0列绘制子图...coordinates_i[:,0]表示获取每一行(每一个spot)的第0列(x坐标)coordinates_i[:,1]表示获取每一行(每一个spot)的第0列(y坐标)plot.subplot(2,2,1) 表示子图布局是2*2的,开始绘制第一个。也可以导入数据绘制。可以设置color属性,设置颜色。

qq_46147236的博客 102

Spring Boot 自动配置原理

Spring Boot 自动配置由 @EnableAutoConfiguration 导入选择器,读取 jar 中 .imports 候选清单,经去重、排序、排除后逐类做条件判断,通过才注册 Bean。延迟导入让用户 Bean 优先,@ConditionalOnMissingBean 使默认配置让位。失效时查清单和 Negative matches。

2401_89855466的博客 378

【随笔】KV缓存量化:省下的显存,要付出多少数值误差

用可运行量化器解释位宽、比例信息、分组和离群值的关系,核算KV缓存实际载荷,并给出Transformers配置与容量、延迟、质量验收方法。

code2cat的博客 457

【每天一个 Python 小案例29】Python 实现商品购物车

本篇实现一个购物车:商品目录、加入商品、修改数量、移除商品、查看小计、计算满减与 VIP 折扣、结算扣库存。核心设计是"目录与购物车分离"——目录存商品主数据,购物车只存 {商品编号: 数量};金额一律用 Decimal 并做 ROUND_HALF_UP 舍入。折扣部分讲清阶梯满减的匹配顺序(阈值从高到低、命中即停)与叠加顺序(先满减、后打折),并用一次完整结算演示 706 元如何变成 613.70 元。

xinjiyaya的博客 215

Python的字典

Python字典是存储键值对的数据结构,通过键(key)快速查找对应的值(value)。可使用{}定义,支持增删改查操作:通过dict[key]查询或修改值,get()方法安全获取并设置默认值,del dict[key]删除键值对,keys()、values()和items()用于遍历。items()结合双变量循环可高效遍历所有键值对,提升代码可读性与灵活性。

qq_43010954的博客 197
上一篇: Ssystem V 共享内存
下一篇: Linux fork子进程,进程退出与等待
supdriver
博客等级 码龄3年 192粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值