文章目录

  • 什么是RFM模型
  • RFM模型的作用
  • 数据源
  • 数据清洗
    • 统计各字段信息
    • 描述性统计信息
  • 模型分析
    • Recency描述性统计
    • Frequency描述性统计
    • Monetary描述性统计
    • 确定R、F、M值并对用户分类
  • 基于统计模型来分类RFM模型
    • K-means Clustering
  • RFM模型的局限

什么是RFM模型

首先,RFM是三个指标的缩写

Recency:最近一次消费距离现在的时间,该值越小越好

Frequency:某段时间内的消费次数,这个值越大越好

Monetary:某段时间内的消费金额,对于企业来说,消费自然越多越好

这三个维度需要根据实际业务确定。

RFM模型的作用

RFM模型通常用来衡量客户的价值和客户的创利能力,我们把3个指标按价值从低到高排序,并把三个指标作为XYZ轴,就可以把空间分为8部分,进而把用户划分为8类。这样就可以对不同价值的用户采用不同的营销策略,对症下药,最大化挖掘用户的价值,同时最大程度的节省公司资源,即实现所谓的精细化运营

数据源

数据来源于英国在线零售数据。数据里涵盖了从2010年12月1号到2011年12月9号期间在英国注册的在线零售店发生的所有交易。该公司主要销售一些通用的节日礼品,其客户许多都是批发商。

主要字段信息:

info name info name
InvoiceNo 发票编号
c开头,表示取消
StockCode 产品代码
Description 产品名 Quantity 产品数量
InvoiceDate 发票日期 UnitPrice 单价
英镑单位的产品价格
CustomerID 客户编码 Country 每个客户所在的国家

数据清洗

from pandas import DataFrame,read_csv,Series,value_counts,concat
from sklearn.preprocessing import StandardScaler
from datetime import datetime
from copy import deepcopy
import numpy as np
import matplotlib.pyplot as plt
datas = read_csv("./datasets/Online Retail.csv")
datas.head()
InvoiceNo StockCode Description Quantity InvoiceDate UnitPrice CustomerID Country
0 536365 85123A WHITE HANGING HEART T-LIGHT HOLDER 6 2010/12/1 8:26 2.55 17850.0 United Kingdom
1 536365 71053 WHITE METAL LANTERN 6 2010/12/1 8:26 3.39 17850.0 United Kingdom
2 536365 84406B CREAM CUPID HEARTS COAT HANGER 8 2010/12/1 8:26 2.75 17850.0 United Kingdom
3 536365 84029G KNITTED UNION FLAG HOT WATER BOTTLE 6 2010/12/1 8:26 3.39 17850.0 United Kingdom
4 536365 84029E RED WOOLLY HOTTIE WHITE HEART. 6 2010/12/1 8:26 3.39 17850.0 United Kingdom
datas.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 541909 entries, 0 to 541908
Data columns (total 8 columns):#   Column       Non-Null Count   Dtype
---  ------       --------------   -----         0   InvoiceNo    541909 non-null  object        1   StockCode    541909 non-null  object        2   Description  540455 non-null  object        3   Quantity     541909 non-null  int64         4   InvoiceDate  541909 non-null  datetime64[ns]5   UnitPrice    541909 non-null  float64       6   CustomerID   406829 non-null  object        7   Country      541909 non-null  object
dtypes: datetime64[ns](1), float64(1), int64(1), object(5)
memory usage: 33.1+ MB

统计各字段信息

def calc_info(datas):columns=["Types","Counts","Distincts","Nulls","Missing_ratio","Uniques","Skew","Kurt"]df = DataFrame(0,columns=columns,index=datas.columns)df.Types         = datas.apply(np.dtype)df.Counts        = datas.count()#总计df.Distincts     = datas.apply(value_counts).count()#唯一值出现次数df.Nulls         = datas.isnull().sum()#缺失值df.Missing_ratio = datas.isnull().sum()/datas.shape[0]*100df.Uniques       = datas.apply(Series.unique,axis=0)#唯一值df.Skew          = datas[["Quantity","UnitPrice"]].skew()#偏度df.Kurt          = datas[["Quantity","UnitPrice"]].kurtosis()#峰度return df.sort_values("Counts")
df1 = calc_info(datas)
df1
Types Counts Distincts Nulls Missing_ratio Uniques Skew Kurt
CustomerID object 406829 4372 135080 24.926694 [17850.0, 13047.0, 12583.0, 13748.0, 15100.0, ... NaN NaN
Description object 540455 4223 1454 0.268311 [WHITE HANGING HEART T-LIGHT HOLDER, WHITE MET... NaN NaN
InvoiceNo object 541909 25900 0 0.000000 [536365, 536366, 536367, 536368, 536369, 53637... NaN NaN
StockCode object 541909 4070 0 0.000000 [85123A, 71053, 84406B, 84029G, 84029E, 22752,... NaN NaN
Quantity int64 541909 722 0 0.000000 [6, 8, 2, 32, 3, 4, 24, 12, 48, 18, 20, 36, 80... -0.264076 119769.160031
InvoiceDate datetime64[ns] 541909 23260 0 0.000000 [2010-12-01T08:26:00.000000000, 2010-12-01T08:... NaN NaN
UnitPrice float64 541909 1630 0 0.000000 [2.55, 3.39, 2.75, 7.65, 4.25, 1.85, 1.69, 2.1... 186.506972 59005.719097
Country object 541909 38 0 0.000000 [United Kingdom, France, Australia, Netherland... NaN NaN

描述性统计信息

datas.describe()
Quantity UnitPrice
count 541909.000000 541909.000000
mean 9.552250 4.611114
std 218.081158 96.759853
min -80995.000000 -11062.060000
25% 1.000000 1.250000
50% 3.000000 2.080000
75% 10.000000 4.130000
max 80995.000000 38970.000000
redatas = datas.dropna()
redatas.shape
(406829, 8)
redatas = redatas[(redatas.Quantity>0)&(redatas.UnitPrice>0)]
redatas.shape
(397884, 8)
df2 = calc_info(redatas)
df2
Types Counts Distincts Nulls Missing_ratio Uniques Skew Kurt
InvoiceNo object 397884 18532 0 0.0 [536365, 536366, 536367, 536368, 536369, 53637... NaN NaN
StockCode object 397884 3665 0 0.0 [85123A, 71053, 84406B, 84029G, 84029E, 22752,... NaN NaN
Description object 397884 3877 0 0.0 [WHITE HANGING HEART T-LIGHT HOLDER, WHITE MET... NaN NaN
Quantity int64 397884 301 0 0.0 [6, 8, 2, 32, 3, 4, 24, 12, 48, 18, 20, 36, 80... 409.892972 178186.243253
InvoiceDate datetime64[ns] 397884 17282 0 0.0 [2010-12-01T08:26:00.000000000, 2010-12-01T08:... NaN NaN
UnitPrice float64 397884 440 0 0.0 [2.55, 3.39, 2.75, 7.65, 4.25, 1.85, 1.69, 2.1... 204.032727 58140.396673
CustomerID object 397884 4338 0 0.0 [17850.0, 13047.0, 12583.0, 13748.0, 15100.0, ... NaN NaN
Country object 397884 37 0 0.0 [United Kingdom, France, Australia, Netherland... NaN NaN

模型分析

为了方便后面对消费金额(M)的分析,我们根据销售数量和单价新增销售额(amount)字段

Recency描述性统计

本数据集的交易时间范围(InvoiceDate):2010/12/1-2011/12/9

将当前时间定义为2011/12/10,那么Recency为客户最后一次购买时间距离当前时间的间隔

4338个客户的Recency的描述性统计信息如下:最后一次购买时间距离当前时间的最小值为1天,最大值为374天,平均值为92天。

df = redatas.InvoiceDate.to_frame()
df.index = redatas.CustomerID
df.head()
InvoiceDate
CustomerID
17850 2010-12-01 08:26:00
17850 2010-12-01 08:26:00
17850 2010-12-01 08:26:00
17850 2010-12-01 08:26:00
17850 2010-12-01 08:26:00
ids = set(list(df.index))
gdatas = df.groupby(by="CustomerID")
now = datetime.strptime("2011/12/10","%Y/%m/%d")
Recency = DataFrame(columns=ids,index=["recency"])
for ii in ids:Recency[ii] = -(df[df.index==ii]-now).max()[0].days
Recency
16384 16385 16386 16387 16389 16392 16393 16394 16395 16398 ... 16369 16370 16372 16374 16376 16377 16378 16379 16380 16383
recency 90 61 29 323 54 270 3 57 61 155 ... 19 83 34 67 9 268 248 5 62 75

1 rows × 4338 columns

recency = Recency.T.describe().T
recency
count mean std min 25% 50% 75% max
recency 4338.0 93.059474 100.012264 1.0 18.0 51.0 142.75 374.0
fig,ax = plt.subplots(figsize=(8,5))
Recency.T.hist(bins=50,density=True,ax=ax)
ax.set_xlabel('Recency')
ax.set_ylabel('Frequency')
plt.show()

Frequency描述性统计

统计用户在分析期间的消费频次,最少1次,最大209次,平均消费次数为4.27次。

Frequency = DataFrame(columns=ids,index=["frequency"])
for ii in ids:invo = redatas[redatas.CustomerID==ii].InvoiceNoFrequency[ii] =  invo.value_counts().shape[0]
Frequency
16384 16385 16386 16387 16389 16392 16393 16394 16395 16398 ... 16369 16370 16372 16374 16376 16377 16378 16379 16380 16383
frequency 2 3 2 1 4 1 13 5 5 2 ... 3 4 2 2 2 1 3 4 1 2

1 rows × 4338 columns

frequency = Frequency.T.describe().T
frequency
count mean std min 25% 50% 75% max
frequency 4338.0 4.272015 7.697998 1.0 1.0 2.0 5.0 209.0
fig,ax = plt.subplots(ncols=2,figsize=(16,5))
Frequency.T.hist(bins=50,density=True,ax=ax[0])
ax[0].set_xlabel('Frequency')
ax[0].set_ylabel('Frequency')
Frequency[Frequency<50].T.hist(bins=12,density=True,ax=ax[1])
ax[1].set_xlabel('Frequency')
ax[1].set_ylabel('Frequency')

Monetary描述性统计

redatas["amount"] = redatas.Quantity*redatas.UnitPrice
Monetary = DataFrame(columns=ids,index=["monetary"])
for ii in ids:Monetary[ii] =  redatas[redatas.CustomerID==ii].amount.sum()
Monetary
16384 16385 16386 16387 16389 16392 16393 16394 16395 16398 ... 16369 16370 16372 16374 16376 16377 16378 16379 16380 16383
monetary 584.5 555.89 317.2 94.36 1382.07 221.19 3046.21 1555.34 1486.9 1705.8 ... 1553.66 1320.56 367.93 473.03 987.01 676.2 362.95 2157.4 1780.59 668.36

1 rows × 4338 columns

monetary = Monetary.T.describe().T
monetary
count mean std min 25% 50% 75% max
monetary 4338.0 2054.26646 8989.230441 3.75 307.415 674.485 1661.74 280206.02
fig,ax = plt.subplots(ncols=2,figsize=(16,5))
Monetary.T.hist(bins=50,density=True,ax=ax[0])
ax[0].set_xlabel('Monetary')
ax[0].set_ylabel('Frequency')
Monetary[Monetary<50000].T.hist(bins=8,density=True,ax=ax[1])
ax[1].set_xlabel('Monetary')
ax[1].set_ylabel('Frequency')

确定R、F、M值并对用户分类

rfm = concat([Recency,Frequency,Monetary],axis=0)
rfm = rfm.T
rfm.insert(0,"CustomerID",rfm.index)
rfm = rfm.sort_values(by="CustomerID")
rfm = rfm.set_index(np.arange(rfm.shape[0]))
rfm.head()
CustomerID recency frequency monetary
0 12346 326.0 1.0 77183.60
1 12347 3.0 7.0 4310.00
2 12348 76.0 4.0 1797.24
3 12349 19.0 1.0 1757.55
4 12350 311.0 1.0 334.40

利用各指标的四分位数进行划分。
以Recency为例,其下四分位数为18,中位数为51,上四分位数为142。

  • 当Recency小于18时,记R值为1;
  • 当Recency在18到51之间时,R值记为2;
  • 当Recency在51-142之间时,R值记为3;
  • 当Recency大于142时,R值记为4。

具体如下表所示

<25% 25%-50% 50%-75% >75%
R 1 2 3 4
F 4 3 2 1
M 4 3 2 1
def quantile(datas):rq = []xx = datas.describe().values[4:7]for i,da in datas.iteritems():if da > xx[2]:ii = 1elif da > xx[1]:ii = 2elif da > xx[0]:ii = 3else:ii = 4rq.append(ii)return np.array(rq)
rfm["r_quantile"] = 5-quantile(rfm.recency)
rfm["f_quantile"] = quantile(rfm.frequency)
rfm["m_quantile"] = quantile(rfm.monetary)
rfm["RFMScore"] = rfm.r_quantile*100+rfm.f_quantile*10+rfm.m_quantile
rfm.head()
CustomerID recency frequency monetary r_quantile f_quantile m_quantile RFMScore
0 12346 326.0 1.0 77183.60 4 4 1 441
1 12347 3.0 7.0 4310.00 1 1 1 111
2 12348 76.0 4.0 1797.24 3 2 1 321
3 12349 19.0 1.0 1757.55 2 4 1 241
4 12350 311.0 1.0 334.40 4 4 3 443

每个用户根据其Recency、Frequency、Monetary的大小都有了自己的R值、F值、M值,将其组合起来即为每个客户的RFM得分,该分数越小表示客户价值越高。

R分段 得分 F分段 得分 M分段 得分
活跃用户 1 忠实客户 1 高贡献 1
沉默用户 2 成熟客户 2 中高贡献 2
睡眠用户 3 老客户 3 中贡献 3
流失用户 4 新客户 4 低贡献 4

据此打分,我们就可以对用户进行分类

RFM Level RFM Score R F M
1 111~121 1
1
1
2
1~ 4
1
2 122~222 1
1
2
2
2
3~ 4
1
2
2~ 4
1~ 4
1~ 4
1~ 2
3 223~332 2
2
3
3
2
3~ 4
1~ 2
3
3~ 4
1~ 4
1~ 4
1~ 2
4 333~444 3
3
4
3
4
1~ 4
3~ 4
1~ 4
1~ 4
  • 0 - 122, 最有价值客户,价格不会是很敏感,所以主要推广忠实项目和新品
  • 122 - 223,快要逐渐失去的客户,需要通过人工短信或电话联系,针对性召回
  • 223 - 333, 最近没怎么购买的有价值客户,需要进一步激活,给一下打折,做一波推广

可以根据业务需要进一步细分.

基于统计模型来分类RFM模型

K-means Clustering

def calc_sl(rfm):rfmC = deepcopy(rfm)SS = {110:1,121:2,222:3,332:4}sl = []for sc in rfmC.RFMScore:for sk,sv in SS.items():if sc > sk:ll = svsl.append(ll)rfmC["RFMScore_Level"] = slreturn rfmC
#经过分类处理后的用户数据如下
rfmC = calc_sl(rfm)
rfmC.head()
CustomerID recency frequency monetary r_quantile f_quantile m_quantile RFMScore RFMScore_Level
0 12346 326.0 1.0 77183.60 4 4 1 441 4
1 12347 3.0 7.0 4310.00 1 1 1 111 1
2 12348 76.0 4.0 1797.24 3 2 1 321 3
3 12349 19.0 1.0 1757.55 2 4 1 241 3
4 12350 311.0 1.0 334.40 4 4 3 443 4
## 各字段的描述性统计信息
rfmC.drop(columns=["CustomerID","RFMScore_Level"]).describe()
recency frequency monetary r_quantile f_quantile m_quantile RFMScore
count 4338.000000 4338.000000 4338.000000 4338.000000 4338.000000 4338.000000 4338.000000
mean 93.059474 4.272015 2054.266460 2.494237 2.679806 2.500000 278.721761
std 100.012264 7.697998 8989.230441 1.122059 1.143825 1.118369 119.256757
min 1.000000 1.000000 3.750000 1.000000 1.000000 1.000000 111.000000
25% 18.000000 1.000000 307.415000 1.000000 2.000000 1.250000 144.000000
50% 51.000000 2.000000 674.485000 2.000000 3.000000 2.500000 244.000000
75% 142.750000 5.000000 1661.740000 3.750000 4.000000 3.750000 394.250000
max 374.000000 209.000000 280206.020000 4.000000 4.000000 4.000000 444.000000
rfm_log = DataFrame()
rfm_log["recency_log"]   = rfm.recency.apply(np.log10)
rfm_log["frequency_log"] = rfm.frequency.apply(np.log10)
rfm_log["monetary_log"]  = rfm.monetary.apply(np.log10)
rfm_log.tail()
recency_log frequency_log monetary_log
4333 5.627621 0.000000 5.196285
4334 5.198497 0.000000 4.392224
4335 2.079442 0.693147 5.182064
4336 1.386294 2.772589 7.647252
4337 3.761200 1.098612 7.516041
fig,ax = plt.subplots(ncols=2,figsize=(16,5))
ax[0].scatter(rfm_log.recency_log,rfm_log.monetary_log)
ax[0].grid()
ax[0].set_xlabel("recency_log")
ax[0].set_ylabel("monetary_log")
ax[1].scatter(rfm_log.frequency_log,rfm_log.monetary_log)
ax[1].grid()
ax[1].set_xlabel("frequency_log")
ax[1].set_ylabel("monetary_log")

def standardized(data):ss = StandardScaler().fit(data)return ss.transform(data)
rfmlog = standardized(rfm_log)
rfmlog = DataFrame(rfmlog,columns=rfm_log.columns)
rfmlog.head()
recency_log frequency_log monetary_log
0 1.435416 -1.048610 3.698719
1 -1.953393 1.111836 1.410201
2 0.382865 0.490522 0.716419
3 -0.619183 -1.048610 0.698706
4 1.401368 -1.048610 -0.617446
rfmlog.describe().T
count mean std min 25% 50% 75% max
recency_log 4338.0 -2.147146e-16 1.000115 -2.747497 -0.658264 0.094524 0.838502 1.534703
frequency_log 4338.0 -2.355833e-16 1.000115 -1.048610 -1.048610 -0.279044 0.738267 4.882714
monetary_log 4338.0 -1.099986e-16 1.000115 -4.179280 -0.684183 -0.060942 0.654244 4.721395
fig,ax = plt.subplots(ncols=2,figsize=(16,5))
ax[0].scatter(rfmlog.recency_log,rfmlog.monetary_log)
ax[0].grid()
ax[0].set_xlabel("recency_log")
ax[0].set_ylabel("monetary_log")
ax[1].scatter(rfmlog.frequency_log,rfmlog.monetary_log)
ax[1].grid()
ax[1].set_xlabel("frequency_log")
ax[1].set_ylabel("monetary_log")

from sklearn.cluster import KMeans
from mpl_toolkits.mplot3d import Axes3D
kmeans = KMeans(n_clusters=4)
labels = kmeans.fit_predict(rfmlog)
C = kmeans.cluster_centers_
fig = plt.figure(figsize=(9,6))
ax = Axes3D(fig,auto_add_to_figure=False)
fig.add_axes(ax)
ax.scatter(rfmlog.recency_log, rfmlog.frequency_log, rfmlog.monetary_log,c=labels)
ax.scatter(C[:, 0], C[:, 1], C[:, 2], marker='*', c='r', s=1000)
ax.set_xlabel("recency_log")
ax.set_ylabel("frequency_log")
ax.set_zlabel("monetary_log")

RFM模型的局限

RFM模型并不是万能的,具有相当多的局限性。尤其是在结合行业、产品特征来深入分析的时候,并不一定会符合模型。例如:

  • R值:对于手机电脑等电子产品,甚至房屋,汽车等大消费品,间隔时间或1-2年,或5-10年,或更久,此时R值大并不能说明用户流失风险高。

  • F值:如果某用户是忠诚的活动用户,啥时候有活动就啥时候买东西;或者用户固定每个月购买理财产品,这些行为都会导致F值可能是随机产生的,或是人为操控的,不太具有代表性。

  • M值:用户过去消费高并不一定代表未来消费高,例如购买耐用品可能一单可以用几年;或者用户趁开业活动薅羊毛囤货,都可能带来较高的M值。

python 在线零售分析相关推荐

  1. 利用Python进行数据分析之超市零售分析

    Author Bryce230 e-mail iswangjt@163.com Software win10,Pycharm2019.3.3,Python3.7.7,jupyter notebook ...

  2. 电商客户消费预测模型-基于数千万真实在线零售数据__企业调研_论文科研_毕业设计

    之前发过 <谁主沉浮?银行,消金,互联网公司的精准营销_智慧营销完全解读>介绍了智慧营销/精准营销目的是降低运营成本.但精准营销可以带来很多额外收益,例如提高销售利润,提高客户忠诚度,降低 ...

  3. NLP实战:利用Python理解、分析和生成文本 | 赠书

    导读:本文内容参考自<自然语言处理实战:利用Python理解.分析和生成文本>一书,由Hobson Lane等人所著. 本书是介绍自然语言处理(NLP)和深度学习的实战书.NLP已成为深度 ...

  4. python在线-python+在线

    广告关闭 2017年12月,云+社区对外发布,从最开始的技术博客到现在拥有多个社区产品.未来,我们一起乘风破浪,创造无限可能. 百度语音提供了语音识别.语音合成和语音唤醒等产品的sdk免费资源,是面向 ...

  5. python在线投票系统 统计票数_分层分平台,让每个学生享受教育公平 ——冯敬益老师的Python编程教学探索...

    在2月24日学校线上教学之前,冯敬益老师已早早告别了假期模式,投入到网络课程的建设之中. 为了让自己的课堂教学更有针对性,冯老师就任教的班级就同学们的学习条件展开调查.经统计,18-4H总人数28人, ...

  6. python商业分析_科研进阶 | 纽约大学 | 商业分析、量化金融:基于Python的商业分析工具...

    科研进阶 | 纽约大学 | 商业分析.量化金融:基于Python的商业分析工具(8.22开课)​mp.weixin.qq.com 课题名称 = 基于Python的商业分析工具 = 项目背景 数据分析为 ...

  7. python模型预测_《Python机器学习——预测分析核心算法》——1.5 构建预测模型的流程...

    本节书摘来异步社区<Python机器学习--预测分析核心算法>一书中的第1章,第1.5节,作者:[美]Michael Bowles(鲍尔斯),更多章节内容可以访问云栖社区"异步社 ...

  8. Python在线办公系统毕业设计源码071116

    Python在线办公系统 摘 要 一个企业实现办公自动化的程度是衡量其实现现代化管理的标准.办公自动化就是采用Internet技术,基于工作流的概念,使企业内部人员方便快捷地共享信息,高效协同工作. ...

  9. 在线零售的未来看起来就是网红的带货直播

    直播购物活动已成为在线购物的最新前沿.沃尔玛.亚马逊.古驰和欧莱雅等各种零售商和品牌正在试验新的流媒体格式,以销售越来越多的美容产品.服装.电子产品和家居用品. 这些活动在 Facebook.Inst ...

最新文章

  1. 新工具一键安装Java环境!微软又双叒叕造福开发者
  2. 解决Outlook带有附件的邮件重复发送的问题
  3. eclipse中查看android源码
  4. idea+maven下jrebel的安装破解
  5. 解压版本的tomcat服务安装
  6. OPENCV-5 学习笔记
  7. 突然讨厌做前端,讨厌代码_有关互联网用户最讨厌的广告类型的新数据
  8. Flask werkzeug 源码解析
  9. 安卓手机备份_备份安卓手机中的APK安装文件?小编这儿有4种方法
  10. C语言判断点是否在矩阵内
  11. 微课|中学生可以这样学Python(8.4节):递归算法例题讲解2
  12. python数据分析要学多久_如何七周成为数据分析师18:Python的新手教程
  13. 解决使用elementUI框架el-upload上传组件时session丢失问题
  14. java架构-Spring MVC 与 Servlet
  15. wince下的地址映射知识点滴
  16. Mac vscode花屏问题解决
  17. 家(单位)电信宽带,50M上行带宽,不用浪费了,发布Web(网站)应用刚好
  18. 浅析Python文件操作
  19. java零项目经验,找工作前该如何准备项目?面试时又该怎么说?
  20. 新人职场要淡定 情商比智商更重要

热门文章

  1. QAD的“炫富挑战”Accepted
  2. 亚马逊AWS:一个字头的诞生
  3. 使用jasypt3.0默认加密,启动时报:Failed to bind properties under ‘xxx.xxx.xxx‘ to java.lang.String
  4. php 下载地址提取,PHP提取emule下载ed2k链接
  5. scrapy框架下设置代理ip
  6. 51的庞升东才是彩虹QQ幕后?
  7. 修改网站地址栏小图标
  8. win7 安装双系统centos7
  9. 互联网金融时代,必看的六种理财模式------------王艾老哥浅析
  10. 工程量计算稿_如何从工程图或线稿中删除背景