Pandas-RFM会员价值度模型
文章目录
- 一. 会员价值度模型介绍
- 二. RFM计算与显示
- 1. 背景
- 2. 技术点
- 3. 数据
- 4. `代码`
- ① 导入模块
- ② 读取数据
- ③ `数据预处理`
- Ⅰ. 数据清洗, 即: 删除缺失值, 去掉异常值.
- Ⅱ. 查看清洗后的数据
- Ⅲ. 把前四年的数据, 拼接到一起
- ④ 计算RFM的原始值
- ⑤ 确定RFM划分区间
- ⑥ RFM计算过程
- ⑦ RFM图形展示
- 5. 结论
- ① 基于图形的交互分析
- ② RFM用户特征分析
- 6. 应用
- 7. 注意点
- 三. 保存dataframe数据
- 1. 将数据保存到Excel
- 2. 将数据保存到mysql数据库
一. 会员价值度模型介绍
-
会员价值度用来评估用户的价值情况,是区分会员价值的重要模型和参考依据,也是衡量不同营销效果的关键指标之一。
-
价值度模型一般基于交易行为产生,衡量的是有实体转化价值的行为。常用的价值度模型是RFM
-
RFM模型是根据会员
- 最近一次购买时间R(Recency)
- 购买频率F(Frequency)
- 购买金额M(Monetary)计算得出RFM得分
- 通过这3个维度来评估客户的订单活跃价值,常用来做客户分群或价值区分
- RFM模型基于一个固定时间点来做模型分析,不同时间计算的的RFM结果可能不一样
R | F | M | 用户类别 |
---|---|---|---|
高 | 高 | 高 | 重要价值用户 |
高 | 低 | 高 | 重要发展用户 |
低 | 高 | 高 | 重要保持用户 |
低 | 低 | 高 | 重要挽留用户 |
高 | 高 | 低 | 一般价值用户 |
高 | 低 | 低 | 一般发展用户 |
低 | 高 | 低 | 一般保持用户 |
低 | 低 | 低 | 一般挽留用户 |
-
RFM模型的基本实现过程:
- 设置要做计算时的截止时间节点(例如2017-5-30),用来做基于该时间的数据选取和计算。
- 在会员数据库中,以今天为时间界限向前推固定周期(例如1年),得到包含每个会员的会员ID、订单时间、订单金额的原始数据集。一个会员可能会产生多条订单记录。
- 数据预计算。从订单时间中找到各个会员距离截止时间节点最近的订单时间作为最近购买时间;以会员ID为维度统计每个用户的订单数量作为购买频率;将用户多个订单的订单金额求和得到总订单金额。由此得到R、F、M三个原始数据量。
- R、F、M分区。对于F和M变量来讲,值越大代表购买频率越高、订单金额越高;但对R来讲,值越小代表离截止时间节点越近,因此值越好。对R、F、M分别使用五分位法做数据分区(三分位也可以,分位数越多划分得越详细)。需要注意的是,对于R来讲需要倒过来划分,离截止时间越近的值划分越大。这样就得到每个用户的R、F、M三个变量的分位数值。
- 将3个值组合或相加得到总的RFM得分。对于RFM总得分的计算有两种方式,一种是直接将3个值拼接到一起,例如RFM得分为312、333、132;另一种是直接将3个值相加求得一个新的汇总值,例如RFM得分为6、9、6。
-
Excel实现RFM划分案例
-
以某电商公司为例
-
R:例如:正常新用户注册1周内交易,7天是重要的值,日用品采购周期是1个月,30天是重要的值
-
F:例如:1次购买,2次购买,3次购买,4~10次,10次以上
-
M:例如:客单价300,热销单品价格240 等
-
-
常见的确定RFM划分区间的套路
- 业务实际判断
- 平均值或中位数
- 二八法则
-
提取用户最近一次的交易时间,算出距离计算时间的差值
-
获取当前时间=TODAY()
-
计算时间间隔
-
根据天数长短赋予对应的R值,R值由我们自定,时间间隔越短R值越高
=IF(D2>60,1,IF(D2>30,2,IF(D2>14,3,IF(D2>7,4,5))))
-
从历史数据中取出所有用户的购买次数,根据次数多少赋予对应的F分值;购买次数越多、F值越大
=IF(F2>1000,5,IF(F2>500,4,IF(F2>300,3,IF(F2>230,2,1))))
-
分别求出RFM的中值,例如中位数,用中值和用户的实际值进行比较,高于中值的为高,否则为低
-
-
在得到不同会员的RFM之后,根据步骤⑤产生的两种结果有两种应用思路
- 思路1:基于3个维度值做用户群体划分和解读,对用户的价值度做分析
- 比如,RFM得分为212的会员的F是1,往往购买频率较低,那就可以针对购买频率低的客户应定期发送促销活动邮件
- 比如,RFM得分为321的会员虽然购买频率高但是订单金额低等,这些客户往往具有较高的购买黏性,可以考虑通过关联或搭配销售的方式提升订单金额。
- 思路2:基于RFM的汇总得分评估所有会员的价值度,并可以做价值度排名。同时,该得分还可以作为输入维度与其他维度一起作为其他数据分析和挖掘模型的输入变量,为分析建模提供基础。
- 思路1:基于3个维度值做用户群体划分和解读,对用户的价值度做分析
-
RFM小结:
- R就是距离自定义的时间点最近一次购买的时间间隔、间隔越小得分越高
- F就是自定义的时间范围内购买频率、次数越多得分越高
- M就是自定义的时间范围内购买总金额,总额越大得分越高
- RFM的区间和其对应的得分由我们自定义
二. RFM计算与显示
1. 背景
-
用户价值细分是了解用户价值度的重要途径,针对交易数据分析的常用模型是RFM模型
-
业务对RFM的结果要求
- 对用户做分组
- 将每个组的用户特征概括和总结出来,便于后续精细化运营不同的客户群体,且根据不同群体做定制化或差异性的营销和关怀
-
规划目标将RFM的3个维度分别做3个区间的离散化
- 用户群体最大有3×3×3=27个
- 划分区间过多则不利于用户群体的拆分
- 区间过少则可能导致每个特征上的用户区分不显著
-
交付结果
- 给业务部门做运营的分析结果要导出为Excel文件,用于做后续分析和二次加工使用
- RFM的结果还会供其他模型的建模使用,RFM本身的结果可以作为新的局部性特征,因此数据的输出需要有本地文件和写数据库两种方式
-
数据说明
- 案例的数据集为
data/sales.xlsx
- 选择近4年订单数据,从不同的年份对比不同时间下各个分组的绝对值变化情况,方便了解会员的波动
- 程序输出RFM得分数据写入本地文件sales_rfm_score.xlsx和MySQL数据库sales_rfm_score表中
- 案例的数据集为
2. 技术点
- 用到了6个库:time、numpy、pandas、pymysql、sklearn和pyecharts。
- time:用来记录插入数据库时的当前日期
- numpy:用来做基本数据处理等
- pandas:有关日期转换、数据格式化处理、主要RFM计算过程等
- pymysql:数据库连接工具,读写MySQL数据库。
- sklearn:使用其中的随机森林库
- pyecharts:展示3D柱形图
3. 数据
-
案例数据是某企业从2015年到2018年共4年的用户订单抽样数据,数据来源于销售系统
-
数据在Excel中包含5个sheet,前4个sheet以年份为单位存储为单个sheet中,最后一张会员等级表为用户的等级表
-
前4张表的数据概要如下。
- 特征变量数:4
-
数据记录数:
30774/41278/50839/81349
- 是否有NA值:有
-
是否有异常值:有
-
具体数据特征如下(前4张表的数据字段说明):
- 会员ID:每个会员的ID唯一,由纯数字组成,整型
- 提交日期:订单日提交日期
- 订单号:订单ID,每个订单的ID唯一,由纯数字组成,整型
- 订单金额:订单金额,浮点型数据
-
会员等级表中是所有会员的会员ID对应会员等级的情况,包括以下两个字段
- 会员ID:该ID可与前面的订单表中的会员ID关联
- 会员等级:会员等级以数字区分,数字越大,级别越高
4. 代码
① 导入模块
import time # 时间库
import numpy as np # numpy库
import pandas as pd # pandas库
from pyecharts.charts import Bar3D # 3D柱形图
② 读取数据
-
加载数据
# 1. 定义变量, 记录表名. sheet_names = ['2015', '2016', '2017', '2018', '会员等级']# 2. 读取5个excel表中的数据. sheet_datas = pd.read_excel('data/sales.xlsx', sheet_name=sheet_names) sheet_datas # 共计: 154385行, 2列.
type(sheet_datas) # 查看变量类型: dict, 结果是字典形式: 键: Excel表格名, 值: 该表格的数据.
dict
# 3. 查看下 2015年的数据 sheet_datas['2015']
-
查看数据基本情况
# 4. 遍历, 查看数据(每个表格)的基本情况 for i in sheet_names:print(f'==================" + {i} + "======================')print(sheet_datas[i].head())print('==================" + info + "======================')print(sheet_datas[i].info())print('==================" + describe + "======================')print(sheet_datas[i].describe())
==================" + 2015 + "======================会员ID 订单号 提交日期 订单金额0 15278002468 3000304681 2015-01-01 499.01 39236378972 3000305791 2015-01-01 2588.02 38722039578 3000641787 2015-01-01 498.03 11049640063 3000798913 2015-01-01 1572.04 35038752292 3000821546 2015-01-01 10.1==================" + info + "======================<class 'pandas.core.frame.DataFrame'>RangeIndex: 30774 entries, 0 to 30773Data columns (total 4 columns):# Column Non-Null Count Dtype --- ------ -------------- ----- 0 会员ID 30774 non-null int64 1 订单号 30774 non-null int64 2 提交日期 30774 non-null datetime64[ns]3 订单金额 30774 non-null float64 dtypes: datetime64[ns](1), float64(1), int64(2)memory usage: 961.8 KBNone==================" + describe + "======================会员ID 订单号 订单金额count 3.077400e+04 3.077400e+04 30774.000000mean 2.918779e+10 4.020414e+09 960.991161std 1.385333e+10 2.630510e+08 2068.107231min 2.670000e+02 3.000305e+09 0.50000025% 1.944122e+10 3.885510e+09 59.00000050% 3.746545e+10 4.117491e+09 139.00000075% 3.923593e+10 4.234882e+09 899.000000max 3.954613e+10 4.282025e+09 111750.000000==================" + 2016 + "======================会员ID 订单号 提交日期 订单金额0 39288120141 4282025766 2016-01-01 76.01 39293812118 4282037929 2016-01-01 7599.02 27596340905 4282038740 2016-01-01 802.03 15111475509 4282043819 2016-01-01 65.04 38896594001 4282051044 2016-01-01 95.0==================" + info + "======================<class 'pandas.core.frame.DataFrame'>RangeIndex: 41278 entries, 0 to 41277Data columns (total 4 columns):# Column Non-Null Count Dtype --- ------ -------------- ----- 0 会员ID 41278 non-null int64 1 订单号 41278 non-null int64 2 提交日期 41278 non-null datetime64[ns]3 订单金额 41277 non-null float64 dtypes: datetime64[ns](1), float64(1), int64(2)memory usage: 1.3 MBNone==================" + describe + "======================会员ID 订单号 订单金额count 4.127800e+04 4.127800e+04 41277.000000mean 2.908415e+10 4.313583e+09 957.106694std 1.389468e+10 1.094572e+07 2478.560036min 8.100000e+01 4.282026e+09 0.10000025% 1.934990e+10 4.309457e+09 59.00000050% 3.730339e+10 4.317545e+09 147.00000075% 3.923182e+10 4.321132e+09 888.000000max 3.954554e+10 4.324911e+09 174900.000000==================" + 2017 + "======================会员ID 订单号 提交日期 订单金额0 38765290840 4324911135 2017-01-01 1799.01 39305832102 4324911213 2017-01-01 369.02 34190994969 4324911251 2017-01-01 189.03 38986333210 4324911283 2017-01-01 169.04 4271359 4324911355 2017-01-01 78.0==================" + info + "======================<class 'pandas.core.frame.DataFrame'>RangeIndex: 50839 entries, 0 to 50838Data columns (total 4 columns):# Column Non-Null Count Dtype --- ------ -------------- ----- 0 会员ID 50839 non-null int64 1 订单号 50839 non-null int64 2 提交日期 50839 non-null datetime64[ns]3 订单金额 50839 non-null float64 dtypes: datetime64[ns](1), float64(1), int64(2)memory usage: 1.6 MBNone==================" + describe + "======================会员ID 订单号 订单金额count 5.083900e+04 5.083900e+04 50839.000000mean 2.882368e+10 4.332466e+09 963.587872std 1.409416e+10 4.404350e+06 2178.727261min 2.780000e+02 4.324911e+09 0.30000025% 1.869274e+10 4.328415e+09 59.00000050% 3.688044e+10 4.331989e+09 149.00000075% 3.923020e+10 4.337515e+09 898.000000max 3.954554e+10 4.338764e+09 123609.000000==================" + 2018 + "======================会员ID 订单号 提交日期 订单金额0 39229691808 4338764262 2018-01-01 3646.01 39293668916 4338764363 2018-01-01 3999.02 35059646224 4338764376 2018-01-01 10.13 1084397 4338770013 2018-01-01 828.04 3349915 4338770121 2018-01-01 3758.0==================" + info + "======================<class 'pandas.core.frame.DataFrame'>RangeIndex: 81349 entries, 0 to 81348Data columns (total 4 columns):# Column Non-Null Count Dtype --- ------ -------------- ----- 0 会员ID 81349 non-null int64 1 订单号 81349 non-null int64 2 提交日期 81349 non-null datetime64[ns]3 订单金额 81348 non-null float64 dtypes: datetime64[ns](1), float64(1), int64(2)memory usage: 2.5 MBNone==================" + describe + "======================会员ID 订单号 订单金额count 8.134900e+04 8.134900e+04 81348.000000mean 2.902317e+10 4.348372e+09 966.582792std 1.404116e+10 4.183774e+06 2204.969534min 2.780000e+02 4.338764e+09 0.00000025% 1.902755e+10 4.345654e+09 60.00000050% 3.740121e+10 4.349448e+09 149.00000075% 3.923380e+10 4.351639e+09 899.000000max 3.954614e+10 4.354235e+09 174900.000000==================" + 会员等级 + "======================会员ID 会员等级0 100090 31 10012905801 12 10012935109 13 10013498043 14 10014087899 4==================" + info + "======================<class 'pandas.core.frame.DataFrame'>RangeIndex: 154385 entries, 0 to 154384Data columns (total 2 columns):# Column Non-Null Count Dtype--- ------ -------------- -----0 会员ID 154385 non-null int641 会员等级 154385 non-null int64dtypes: int64(2)memory usage: 2.4 MBNone==================" + describe + "======================会员ID 会员等级count 1.543850e+05 154385.000000mean 2.980055e+10 2.259701std 1.365654e+10 1.346408min 8.100000e+01 1.00000025% 2.213894e+10 1.00000050% 3.833022e+10 2.00000075% 3.927932e+10 3.000000max 3.954614e+10 5.000000
-
结果说明
- 每个sheet中的数据都能正常读取,无任何错误
- 日期列(提交日期)已经被自动识别为日期格式,后期不必转换
- 订单金额的分布是不均匀的,里面有明显的极值
- 例如2016年的数据中,最大值为174900,最小值仅为0.1
- 极大极小值相差过大,数据会受极值影响
- 订单金额中的最小值包括0、0.1这样的金额,可能为非正常订单,与业务方沟通后确认
- 最大值的订单金额有效,通常是客户一次性购买多个大型商品
- 而订单金额为0.1元这类使用优惠券支付的订单,没有实际意义
- 除此0、0.1这样的金额之外,所有低于1元的订单均有这个问题,因此需要在后续处理中去掉
- 有的表中存在缺失值记录,但数量不多,选择丢弃或填充均可
③ 数据预处理
Ⅰ. 数据清洗, 即: 删除缺失值, 去掉异常值.
# 1.获取表名, 即: 2015 ~ 2018, 不要最后的"会员等级"
for i in sheet_names[:-1]:# 2. 删除缺失值.sheet_datas[i] = sheet_datas[i].dropna() # 删除缺失值.# 3. 去掉订单金额小于1的数据.sheet_datas[i] = sheet_datas[i][sheet_datas[i]['订单金额'] > 1]# 4. 创建新的字段, 用来记录每个sheet最后一笔消费的时间.# 其实就是每年的 12月31日sheet_datas[i]['max_year_date'] = sheet_datas[i]['提交日期'].max()
sheet_datas['2015']
Ⅱ. 查看清洗后的数据
# 1. 遍历表格名列表, 获取到每个表格名
for i in sheet_names:# 2. 查看是否还有 空值 数据.print(sheet_datas[i].isnull().sum()) # 统计空值数量, 都是0.# 3. 查看下每个表格, 订单金额列, 最小值都是 1元 以上的价格.print(sheet_datas[i].describe())
会员ID 0
订单号 0
提交日期 0
订单金额 0
max_year_date 0
dtype: int64会员ID 订单号 订单金额
count 3.057400e+04 3.057400e+04 30574.000000
mean 2.921327e+10 4.020442e+09 967.270965
std 1.384598e+10 2.630518e+08 2073.397861
min 2.670000e+02 3.000305e+09 1.500000
25% 1.961657e+10 3.885746e+09 59.700000
50% 3.754532e+10 4.117491e+09 142.000000
75% 3.923630e+10 4.234853e+09 899.000000
max 3.954613e+10 4.282025e+09 111750.000000
会员ID 0
订单号 0
提交日期 0
订单金额 0
max_year_date 0
dtype: int64会员ID 订单号 订单金额
count 4.100100e+04 4.100100e+04 41001.000000
mean 2.910772e+10 4.313582e+09 963.542790
std 1.388571e+10 1.094832e+07 2485.642632
min 8.100000e+01 4.282026e+09 1.500000
25% 1.943201e+10 4.309457e+09 65.000000
50% 3.740237e+10 4.317545e+09 149.000000
75% 3.923184e+10 4.321133e+09 898.000000
max 3.954554e+10 4.324911e+09 174900.000000
会员ID 0
订单号 0
提交日期 0
订单金额 0
max_year_date 0
dtype: int64会员ID 订单号 订单金额
count 5.045100e+04 5.045100e+04 50451.000000
mean 2.884214e+10 4.332469e+09 970.990793
std 1.408666e+10 4.404894e+06 2185.446995
min 2.780000e+02 4.324911e+09 1.500000
25% 1.870549e+10 4.328416e+09 65.000000
50% 3.692362e+10 4.331989e+09 155.000000
75% 3.923070e+10 4.337528e+09 899.000000
max 3.954554e+10 4.338764e+09 123609.000000
会员ID 0
订单号 0
提交日期 0
订单金额 0
max_year_date 0
dtype: int64会员ID 订单号 订单金额
count 8.080100e+04 8.080100e+04 80801.000000
mean 2.905571e+10 4.348372e+09 973.119528
std 1.402185e+10 4.185250e+06 2210.983968
min 2.780000e+02 4.338764e+09 1.500000
25% 1.919622e+10 4.345654e+09 68.000000
50% 3.749326e+10 4.349448e+09 151.700000
75% 3.923398e+10 4.351641e+09 925.000000
max 3.954614e+10 4.354235e+09 174900.000000
会员ID 0
会员等级 0
dtype: int64会员ID 会员等级
count 1.543850e+05 154385.000000
mean 2.980055e+10 2.259701
std 1.365654e+10 1.346408
min 8.100000e+01 1.000000
25% 2.213894e+10 1.000000
50% 3.833022e+10 2.000000
75% 3.927932e+10 3.000000
max 3.954614e+10 5.000000
Ⅲ. 把前四年的数据, 拼接到一起
# 1. 把前四年的数据, 拼接到一起.
# sheet_datas.values() 字典的values()方法, 用于获取字典中所有的值(每个值, 都是1个df对象, 对应1个sheet表格)
# list(sheet_datas.values()) 把上述的数据, 转成 列表形式
# list(sheet_datas.values())[0:-1] 获取到除了最后一张表(会员登记表)的所有数据.
# pd.concat() 把前四年的数据(4个df对象), 拼接到一起.
data_merge = pd.concat(list(sheet_datas.values())[0:-1])
data_merge
# 2. 验证下上述的数据, 看下每年具体多少条数据.
data_merge['max_year_date'].value_counts()
2018-12-31 80801
2017-12-31 50451
2016-12-31 41001
2015-12-31 30574
Name: max_year_date, dtype: int64
# 3. 给拼接后的数据, 新增一列 year, 表示: 数据的年份.
data_merge['year'] = data_merge['提交日期'].dt.year
# 4. 给拼接后的数据, 新增一列, 表示: 提交订单的间隔时间.
# 结果是: timedelta64[ns]类型, 即: 364 days 这样的数据.
data_merge['date_interval'] = data_merge['max_year_date'] - data_merge['提交日期']
# 5. 去掉 date_interval列的 日期单位, 从 364 days => 364
# 结果是: int64类型, 即: 364 这样的数据.
data_merge['date_interval'] = data_merge['date_interval'].dt.days
# 6. 查看处理后的数据
data_merge.info()
- 代码说明:
- 汇总所有数据: 将4年的数据使用pd.concat方法合并为一个完整的dataframe data_merge,后续的所有计算都能基于同一个dataframe进行,而不用写循环代码段对每个年份的数据单独计算
- 获取各自年份数据:
- 先计算各自年份的最大日期与每个行的日期的差,得到日期间隔
- 再增加一列新的字段,为每个记录行发生的年份,使用data_merge[‘提交日期’].dt.year实现
- 关于pandas的 datetime类型
- dt是pandas中Series时间序列datetime类属性的访问对象
- 除了代码中用到的year外,还包括:date、dayofweek、dayofyear、days_in_month、freq、days、hour、microsecond、minute、month、quarter、second、time、week、weekday、weekday_name、weekofyear等
- 转换日期间隔为数字:通过 .dt.days 方式获取时间差列中的间隔天数数字
④ 计算RFM的原始值
分组后聚合计算
# 基于year、会员ID列做分组之后,分别对date_interval、提交日期、订单金额做不同的运算
# as_index=False表示重置索引# 1. 根据年份, 会员id分组, 计算用户 最近一次购买的日期, 订单总数, 订单总金额.
rfm_gb = data_merge.groupby(['year', '会员ID'], as_index=False).agg({# R 求分组后date_interval列中最小值:计算当年该会员最后一次订单距离年末12月31日的间隔天数'date_interval': 'min', # F 订单频率,计算当年该会员一共消费多少次,对订单号列进行count计算'订单号': 'count',# M 计算订单总金额:计算当年该会员一共消费多少钱'订单金额': 'sum'
})
# 2. 修改列名
rfm_gb.columns = ['year', '会员ID', 'r', 'f', 'm']
rfm_gb.describe()
- 代码说明:
- 上面代码框中的第一行代码,是基于年份和会员ID,分别做RFM原始值的聚合计算
- 这里使用groupby分组,以year和会员ID为联合主键,设置as_index=False意味着year和会员ID不作为index列,而是普通的数据框结果列。后面的agg方法实际上是一个“批量”聚合功能的函数,它实现了对date_interval、提交日期、订单金额三列分别以min、count、sum做聚合计算的功能。否则,我们需要分别写3条goupby来实现3个聚合计算
⑤ 确定RFM划分区间
在做RFM划分时,基本逻辑是分别对R、F、M做离散化操作,然后再计算RFM。而离散化本身有多种方法可选,由于我们要对数据做RFM离散化,因此需要先看下数据的基本分布状态
查看数据分布
# rfm_gb.iloc[:,2:]表示只选择rfm_gb的rfm三类数据,并返回新df,
# 再做.describe().T操作,查看数据分布情况
rfm_gb.iloc[:, 2:].describe().T
⑥ RFM计算过程
⑦ RFM图形展示
5. 结论
① 基于图形的交互分析
② RFM用户特征分析
6. 应用
7. 注意点
三. 保存dataframe数据
1. 将数据保存到Excel
2. 将数据保存到mysql数据库
相关文章:
Pandas-RFM会员价值度模型
文章目录 一. 会员价值度模型介绍二. RFM计算与显示1. 背景2. 技术点3. 数据4. 代码① 导入模块② 读取数据③ 数据预处理Ⅰ. 数据清洗, 即: 删除缺失值, 去掉异常值.Ⅱ. 查看清洗后的数据Ⅲ. 把前四年的数据, 拼接到一起 ④ 计算RFM的原始值⑤ 确定RFM划分区间⑥ RFM计算过程⑦…...
Java基础知识面试题
1.Java语言的特点? 1.一面向对象(封装,继承,多态); 2.平台无关性( Java 虚拟机实现平台无关性);(类是一种定义对象的蓝图或模板)3.支持多线程( C 语言没有内…...
WebSocket监听接口
在Vue.js中使用WebSocket来监听接口其实相对简单。WebSocket是一种在单个TCP连接上进行全双工通信的协议,通常用于需要实时数据更新的场景,比如聊天应用、实时通知等。 以下是一个在Vue.js中使用WebSocket的示例: 1. 创建Vue项目 如果你还…...
Kotlin语言的编程范式
Kotlin语言的编程范式 Kotlin是一种现代的编程语言,旨在提高开发效率,减少代码复杂度。在过去几年中,Kotlin在Android开发中获得了极大的普及,同时也逐渐被用在服务器端、Web开发、数据科学等多个领域。本文将深入探讨Kotlin的编…...
【权限管理】Apache Shiro学习教程
Apache Shiro 是一个功能强大且灵活的安全框架,主要用于身份认证(Authentication)、授权(Authorization)、会话管理(Session Management)和加密(Cryptography)。它旨在为…...
网络安全 信息收集入门
1.信息收集定义 信息收集是指收集有关目标应用程序和系统的相关信息。这些信息可以帮助攻击者了解目标系统的架构、技术实现细节、运行环境、网络拓扑结构、安全措施等方面的信息,以便我们在后续的渗透过程更好的进行。 2.收集方式-主动和被动收集 ①收集方式不同…...
Java Web开发进阶——RESTful API设计与开发
随着分布式系统和微服务架构的流行,RESTful API已成为现代Web应用中后端与前端、第三方系统交互的重要方式。本节将深入探讨RESTful API的设计原则、实现方式以及如何使用Spring Boot开发高效、可靠的RESTful服务。 1. 理解RESTful API的设计原则 1.1 什么是RESTfu…...
图片已经在windows上旋转了,但是在linux上仍然显示不正常
公司接了一个linux产品的售后工作,我们现在的产品都是android。linux设备如果要播放竖屏的图片在linux主板上。需要将图片旋转下才能正常播放。 我拿到图片以后,就用window图片编辑器打开了图片如下图左。选择逆时针选择了90 然后另存图片为如下图右。 …...
关于大数据的基础知识(二)——国内大数据产业链分布结构
成长路上不孤单😊😊😊😊😊😊 【14后😊///计算机爱好者😊///持续分享所学😊///如有需要欢迎收藏转发///😊】 今日分享关于大数据的基础知识(二&a…...
Flutter鸿蒙化 在鸿蒙应用中添加Flutter页面
前言 今天这节课我们讲一下 在鸿蒙应用中添加Flutter页面。 作用: 之前有很多朋友和网友问我鸿蒙能不能使用Flutter开发,他们的项目已经用Flutter开发成熟了有什么好的方案呢,今天讲到这个就可以很好的解决他们的问题,例如我们正式项目中可能是一部分native 开发 一部分…...
【递归,搜索与回溯算法 综合练习】深入理解暴搜决策树:递归,搜索与回溯算法综合小专题(二)
优美的排列 题目解析 算法原理 解法 :暴搜 决策树 红色剪枝:用于剪去该节点的值在对应分支中,已经被使用的情况,可以定义一个 check[ ] 紫色剪枝:perm[i] 不能够被 i 整除,i 不能够被 per…...
Perl语言的语法
Perl语言概述及其应用 引言 Perl语言是一种通用的高级编程语言,由拉里沃尔(Larry Wall)于1987年首次发布。Perl语言的设计目标是简化文本处理和报告生成,同时也提供了强大的功能以用于系统管理、网络编程、数据库交互等多种场景…...
ELK+filebeat+kafka
ELKfilebeatkafka elkelk的架构数据流向ELK的部署 filebeatzookeeperkafkazopkeeprzookeeper的工作机制zookeeper的特点zookeeper的数据架构zookeeper的安装 kafka消息队列消息队列的应用场景消息队列的模式kafka组件的名称 elk elk的架构 elk:统一日志收集系统 …...
WPF系列九:图形控件EllipseGeometry
简介 EllipseGeometry用于绘制一个椭圆的形状。它通常与其他图形元素结合使用,比如 Path 或者作为剪切区域来定义其他元素的外形。 定义椭圆:EllipseGeometry 用来定义一个椭圆或者圆的几何形状。参与绘制:可以被用作 Path 元素的数据&…...
2025新年源码免费送
2025很开门很开门的源码免费传递。不需要馒头就能获取4套大开门源码。 听泉偷宝,又进来偷我源码啦👊👊👊。欢迎偷源码 🔥🔥🔥 获取免费源码以及更多源码,可以私信联系我 我们常常…...
离线录制激光雷达数据进行建图
目前有一个2D激光雷达,自己控制小车运行一段时间,离线获取到激光雷达数据后运行如下代码进行离线建图。 roslaunch cartographer_ros demo_revo_lds.launch bag_filename:/home/firefly/AutoCar/data/rplidar_s2/2025-01-08-02-08-33.bag实际效果如下 d…...
Scala分布式语言二(基础功能搭建、面向对象基础、面向对象高级、异常、集合)
章节3基础功能搭建 46.函数作为值三 package cn . itbaizhan . chapter03 // 函数作为值,函数也是个对象 object FunctionToTypeValue { def main ( args : Array [ String ]): Unit { //Student stu new Student() /*val a ()>{"GTJin"…...
AI中的神经元与权重矩阵之间的关系;神经元连接角度看行和列的意义
AI中的神经元与权重矩阵之间的关系 目录 AI中的神经元与权重矩阵之间的关系神经元连接角度看行和列的意义AI中的神经元概念 在人工智能领域,特别是神经网络中,神经元是基本的计算单元,它是对生物神经元的一种抽象模拟。就像生物神经元接收来自其他神经元的电信号,经过处理后…...
前端中常用的单位度量(px,rpx,rem,em,vw,vh)+图片自适应
文章目录 前端中常用的单位度量vw/vh 的场景应用px/rem/em 之间的转换关系项目中的rem 应用根元素 font-size 设置为16px 的应用惯例自适应之图片应用1. 使用 max-width 和 max-height2. 使用 object-fit 属性3. 使用 background-image 模拟图片展示 前端中常用的单位度量 px&…...
Attention计算中的各个矩阵的维度都是如何一步步变化的?
在Transformer模型中,各个矩阵的维度变化是一个关键的过程,涉及到输入、编码器、解码器和输出等多个阶段。以下是详细的维度变化过程: 输入阶段 输入序列:假设输入序列的长度为seq_len,每个单词或标记通过词嵌入&…...
Golang学习笔记_23——error补充
Golang学习笔记_20——error Golang学习笔记_21——Reader Golang学习笔记_22——Reader示例 文章目录 error补充1. 基本错误处理2. 自定义错误3. 错误类型判断3.1 类型断言3.2 类型选择 4. panic && recover 源码 error补充 1. 基本错误处理 在Go中,函数…...
DB-Engines Ranking 2025年1月数据库排行
DB-Engines Ranking 2025年1月数据库排行 DB-Engines排名根据数据库管理系统的受欢迎程度进行排名。排名每月更新一次。 2025年1月,共有423个数据库进入排行。 排行榜 Oracle Oracle 连续三月稳居榜首,排名稳定。2025 年 1 月分数较上月增 5.03&#x…...
积分与签到设计
积分 在交互系统中,可以通过看视频、发评论、点赞、签到等操作获取积分,获取的积分又可以参与排行榜、兑换优惠券等,提高用户使用系统的积极性,实现引流。这些功能在很多项目中都很常见,关于功能的实现我的思路如下。 …...
用 Python 绘制可爱的招财猫
✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ 招财猫,也被称为“幸运猫”,是一种象征财富和好运的吉祥物,经常…...
用 HTML5 Canvas 和 JavaScript 实现炫酷跨年烟花特效
一、引言 跨年夜,五彩斑斓、绚丽绽放的烟花是最令人期待的视觉盛宴之一。在网页端,我们能否通过技术手段复现这一梦幻场景呢?答案是肯定的。本文将深入剖析一段使用 HTML5 Canvas 和 JavaScript 实现的跨年烟花特效源码,带你领略前端技术创造的惊艳画面。 用 HTML5 Canvas…...
什么是数据湖?大数据架构的未来趋势
💖 欢迎来到我的博客! 非常高兴能在这里与您相遇。在这里,您不仅能获得有趣的技术分享,还能感受到轻松愉快的氛围。无论您是编程新手,还是资深开发者,都能在这里找到属于您的知识宝藏,学习和成长…...
Spring boot接入xxl-job
Spring boot接入xxl-job 导入maven包加入配置增加配置类创建执行器类(写job的业务逻辑)去控制台中配置job 导入maven包 <dependency><groupId>com.xuxueli</groupId><artifactId>xxl-job-core</artifactId><version>…...
Flutter pubspec.yaml 使用方式
Flutter pubspec.yaml 使用方式 pubspec.yaml 是 Flutter 项目中最重要的配置文件之一,用于管理应用的基本信息、依赖项、资源以及构建配置等内容。 1. 基本结构和字段 基本信息 name: my_flutter_app # 应用的名称 description: A new Flutter project …...
Elixir语言的学习路线
Elixir语言的学习路线 Elixir是一种动态、通用的编程语言,特别适合用于构建可扩展和维护性强的应用程序。它基于Erlang虚拟机(BEAM),因其高并发性和容错能力而广受欢迎。近年来,Elixir在Web开发(特别是与P…...
看不懂scatter、gather的来
1.torch.scatter 这是out-of-place版本(相对于in-place版本),它会返回一个新的张量。 torch.Tensor.scatter_ 就是in-place版本,它直接修改自身,返回的也是自身 Tensor.scatter_(dim, index, src, *, reduceNone) →…...
系统思考—问题分析
爱因斯坦说过:“如果我有1小时拯救世界,我会花55分钟去确认问题为何,只用5分钟寻找解决方案。” 这个看似简单的道理,却蕴藏着解决复杂问题的智慧。真正的问题,往往隐藏在现象的背后。解决问题的关键,不在…...
【C】编译与链接
在本文章里面,我们讲会讲解C语言程序是如何从我们写的代码一步步变成计算机可以执行的二进制指令,并最终执行的。C语言程序运行主要包括两大步骤 -- 编译和链接,接下来我们就来一一讲解。 目录 1 翻译环境和运行环境 2 翻译环境 1&#…...
如何用Python编程实现自动整理XML发票文件
传统手工整理发票耗时费力且易出错,而 XML 格式发票因其结构化、标准化的特点,为实现发票的自动化整理与保存提供了可能。本文将详细探讨用python来编程实现对 XML 格式的发票进行自动整理。 一、XML 格式发票的特点 结构化数据:XML 格式发票…...
深入探索OceanBase分布式数据库理论:开启数据管理新篇章
《深入探索OceanBase分布式数据库理论:开启数据管理新篇章》 在当今数字化转型风起云涌的时代,数据已然成为企业最为宝贵的资产之一。随着数据量呈爆炸式增长、业务场景愈发复杂多元,传统的集中式数据库在应对高并发、海量数据存储与处理时逐…...
如何用VS调试不属于解决方案的EXE和DLL程序-使用PDB和EXE文件-根据exe|pdb|源码文件进行调试分析
文章目录 1.问题2.基本点3.方法步骤3.1.新建一个空的解决方案3.2.构建源码项目3.3.添加pdb文件目录3.4.调试目标exe 4.源码断点 1.问题 如果你手里有一个现成的EXE, 以及EXE相关联PDB文件, 还有相关联的CPP文件和H文件. 你如何用VS调试? (当然你可以选择WinDbg.不过这里就讨论…...
2. CSS的元素显示模式
2.1什么是元素显示模式 作用:网页的标签非常多,在不同地方会用到不同类型的标签,了解他们的额特点可以更好的布局我们的网页。 元素显示模式就是元素(标签)以什么方式进行显示,比如<div>自己占一行…...
marktext 开源markdown安装
https://github.com/marktext/marktext 该 markdown 的免费安装, 在mac os 上 安装时, 出现无法安装的情况 使用如下的命令可以, 可以进行使用 https://github.com/marktext/marktext/issues/2983 This isn’t the recommended command si…...
/src/utils/request.ts:axios 请求封装,适用于需要统一处理请求和响应的场景
文章目录 数据结构解释1. 核心功能2. 代码结构分析请求拦截器响应拦截器 3. 改进建议4. 总结 console.log(Intercepted Response:, JSON.stringify(response));{"data": {"code": 0,"msg": "成功","data": {"id":…...
蓝桥杯 第十五届 研究生组 B题 召唤数学精灵
问题描述: 数学家们发现了两种用于召唤强大的数学精灵的仪式,这两种仪式分别被称为累加法仪式 A(n) 和累乘法仪式 B(n)。累加法仪式 A(n) 是将从 1 到 n 的所有数字进行累加求和,即:A(n)12⋯n累乘法仪式 B(n) 则是将从 1 到 n 的所…...
四种编译方式(make、cmake、configure、autogen.sh)
文章目录 一、make特征编译步骤(make)样例编译二、cmake特征编译步骤(cmake --> make)样例编译三、configure特征编译步骤(./configure --> make)样例编译四、autogen.sh特征编译步骤(./autogen.sh --> ./configure --> make)样例编译总结一、make 特征 …...
Cursor 实战技巧:好用的提示词插件Cursor Rules
你好啊,见字如面。感谢阅读,期待我们下一次的相遇。 最近在小红书发现了有人分享这款Cursor提示词的插件,下面给各位分享下使用教程。简单来说Cursor Rules就是可以为每一个我们自己的项目去配置一个系统级别的提示词,这样在我们…...
mysql事务及隔离机制
mysql总结 mysql事务特性: 原子性(Atomicity)一致性(Consistency)隔离性(Isolation)持久性(Durability) 并发访问数据库造成的问题: 脏读:读到…...
《护网行动与数字时代:如何应对日益复杂的网络威胁?》
什么是护网 1.什么是护网行动 护网行动是由公安部牵头组织的网络安全攻防演练活动,旨在评估和提升企事业单位的网络安全防护能力。 具体来说,护网行动通过模拟真实的网络攻击场景,组织攻防双方进行对抗演练,以检测企事业单位网…...
1月9日星期四今日早报简报微语报早读
1月9日星期四,农历腊月初十,早报#微语早读。 1、上海排查47家“俄罗斯商品馆”:个别店铺被责令停业,立案调查; 2、西藏定日县已转移受灾群众4.65万人,检测到余震646次; 3、国家发改委&#x…...
科大讯飞前端面试题及参考答案 (下)
除了 echarts 还了解其它画图工具吗? 除了 Echarts,还有不少优秀的画图工具可供选择使用。 Highcharts:它是一款功能强大且应用广泛的图表绘制工具,支持多种常见的图表类型,像柱状图、折线图、饼图、散点图等,同时也能创建较为复杂的图表,比如仪表盘图表、极坐标图等。H…...
linux创建服务,实现程序异常退出自启
以启动java程序进行示例,其他程序也可按照该方式进行配置 [Unit] DescriptionMy Java Service Afternetwork.target[Service] WorkingDirectory/opt/myapp # 设置你的 jar 文件所在目录 ExecStart/usr/bin/java -jar myapp.jar # 替换为你的 jar 启动命令 Restartalways Re…...
linux-28 文本管理(一)文本查看,cat,tac,more,less,head,tail
之前提到过linux的几个重要哲学思想,使用纯文本文件保存软件的配置信息是其中之一,所以大多数情况下,我们对整个系统的操作,都是通过编辑它的配置文件来完成,那也就意味着,处理文本文件是我们作为系统管理员…...
Springboot3巧妙运用拦截器阻断xss攻击
Springboot3巧妙运用拦截器阻断xss攻击 什么是xss跨站脚本攻击类型简单示例解决方法拦截器代码使用demo 什么是xss 人们经常将跨站脚本攻击(Cross Site Scripting)缩写为CSS,但这会与层叠样式表(Cascading Style Sheetsÿ…...
leetcode 2551. 将珠子放入背包中
题目如下 数据范围 示例 题目的意思是将一个长度为n的数组weight(简称w)分成k个小数组,同时计算这些小数组的边界和。 设i (0 < i < n - 1) 首先我们假设已经找到最大分数序列即划分的小数组最优 令 j1,j2,j3.....jk为这些小数组的左端点(不包括第一个小数组)。 则有…...
【Spring】SpringBoot整合ShardingSphere并实现多线程分批插入10000条数据(进行分库分表操作)。
??个人主页:哈__ 期待您的关注 目录 一、ShardingSphere简介 ?1.Sharding-JDBC 2.Sharding-Proxy? 3.Sharding-Sidecar(TBD)? 二、为什么用到ShardingSphere? 三、数据分片 四、SpringBoot整合ShardingSphere 1.创建我们的数据…...