在构建高效的数据分析体系时,我们经常会遇到两个核心概念:指标(Metrics)和 标签(Tags)。指标是对业务性能的量化衡量,它们帮助我们追踪关键业务目标的达成情况。例如,我们可能会关注用户增长率、产品销售额或客户的增续投等指标。这些数字目标为我们提供了业务运行的直观快照,并允许我们对成功与否进行量化评估。
而标签,则是附加在指标上的文字描述,用于对数据进行分类和上下文化。它们像是数据的属性,使我们能够从不同的角度切入,对指标进行深入分析。例如,对于销售额这一指标,我们可以使用“地区”、“产品线”、“客户群体”等标签来细分市场表现。通过这种方式,我们不仅能够了解整体的销售情况,还能够洞察到哪些产品在特定区域或客户群体中最受欢迎,从而做出更加精细化的业务决策。
在实际应用中,指标和标签的关系可以类比于坐标系中的点和坐标轴。指标代表了我们要追踪的具体数值,而标签则定义了坐标系中的各个维度,帮助我们定位和解释这些数值。没有标签,我们只能得到一个孤立的数字;而有了标签,我们就能够将这个数字放置在一个多维度的空间中,理解其背后的含义和价值。
客户标签不仅是数据价值体现的关键途径,更是我们今天讨论的核心所在。那在数据仓库中,通过分层、归类、建模会计算出一系列的指标,而标签则可以利用pandas将指标转化为对应的标签。
上篇已经讲解了pandas的几个方法,很多朋友好奇学会了,适用的场景在哪呢,这就听我娓娓道来。
先打个底:以理解为主,不够严谨,如果看完还是不会,那一定是我讲的不够好。我会尽可能对相对复杂的代码加入注释,欢迎大家评论区相互交流啊。
一、对类别型指标进行值的替换
该函数用于对类别型指标进行值的替换,举个例子,假设用户的星座对应的字典如下:
"cnstll": {"白羊座":"11","金牛座":"12","双子座":"13","巨蟹座":"14","狮子座":"15","处女座":"16", "天枰座":"17","天蝎座":"18","射手座":"19","摩羯座":"20","水瓶座":"21","双鱼座":"22","其他":"99","NULL":"99"},
import pandas as pd
def cat_process(df, cat_dict):
'''
该函数用于对类别型指标进行值的替换,其中:
df : dataframe,传入待处理的dateframe,必须包括待替换的指标列
cat_dict: dict类型,key代表待替换的指标名称,value代表用于替换的一一对应的值的关系词典
关系词典中必须包含“其他”和"NULL"两个key。
原数据中没有“其他”的在“其他”中填入和“NULL”key对应的相同的value
return df:传入的df中在cat_dict中存在的指标的值已被替换成为对应标签的值
'''
for key,cat_val in cat_dict.items():
# df[key] 取某一列的值 df[key].map(cat_val) 根据这个字典或函数对 Series(索引 值) 中的每个元素进行映射或转换
df[key] = df[key].map(cat_val)
# 将空值替换成其他,inplace = True: 表示对 DataFrame 进行原地修改,即不创建新的副本
df[key].fillna(cat_val['其他'], inplace=True)
# 将数据类型转换为int64
df[key] = df[key].astype('int64')
return df
# 创建测试数据
data = {
'姓名': ['张三', '李四', '王五', '赵六', '钱七'],
'星座': ['狮子座', '天蝎座', '双子座', '摩羯座', '水瓶座']
}
df = pd.DataFrame(data)
# 星座的字典
cat_dict = {
"星座": {
"白羊座": "11",
"金牛座": "12",
"双子座": "13",
"巨蟹座": "14",
"狮子座": "15",
"处女座": "16",
"天枰座": "17",
"天蝎座": "18",
"射手座": "19",
"摩羯座": "20",
"水瓶座": "21",
"双鱼座": "22",
"其他": "99",
"NULL": "99"
}
}
# 调用 cat_process 函数
processed_df = cat_process(df, cat_dict)
# 打印处理后的 DataFrame
print(processed_df)
运行结果
代码语言:javascript复制 姓名 星座
0 张三 15
1 李四 18
2 王五 13
3 赵六 20
4 钱七 21
可能会有人提出疑问:为什么要经历这样的转换过程?将中文值转换为数字岂非增加了复杂性?然而事实并非如此。采用数字存储具有以下几点好处:
- 存储效率:数字通常比文本占用更少的存储空间。使用数字代码可以减少数据库的存储需求,提高存储效率。
- 查询性能:数字类型的数据在数据库中进行查询和排序时比文本类型更快。这对于需要频繁进行数据分析和报告的大型数据集尤其重要。
- 数据一致性:使用数字代码可以避免由于文本标签的不同写法(如大小写、空格、特殊字符等)引起的数据不一致问题。
- 安全性:在某些情况下,将敏感信息(如客户信息)以数字代码的形式存储可以提高数据的安全性。
- 数据处理:在进行数据分析和挖掘时,数字类型的数据更容易进行计算和统计,如使用聚合函数、执行数学运算等。
- 扩展性:数字代码可以更容易地扩展以适应新的标签或分类,而不需要修改数据库结构。
- 兼容性:数字代码可以与不同的数据库系统和数据分析工具兼容,便于数据的迁移和交换。 总的来说,将客户标签存储为数字可以提高数据库的效率、节省存储空间,同时有助于保护客户隐私和简化数据处理过程。
这一种方法适用于多种场景,比如客户来源、公司类型、居住省份、性别、生肖等等。
二、对数值型指标进行缺失值的填充和分箱处理
该函数用于对数值型指标进行缺失值的填充和分箱处理,举个例子,我们对客户的最后一笔交易距今时长做一个分箱处理: 区间对应的字典值如下:
标签编码 | 标签值 |
---|---|
11 | 1年以下 |
12 | [1年,3年) |
13 | [3年以上) |
99 | 未投资 |
那我们的执行代码如下:
代码语言:javascript复制import pandas as pd
import numpy as np
def num_process(df, num_dict, num_null):
'''
该函数用于对数值型指标进行缺失值的填充和分箱处理,其中:
df : dataframe,传入待处理的dateframe,必须包括待分箱的指标列
num_dict: dict类型,key代表待分箱的指标名称,value代表分箱的切分点
tag_null:dict类型,key代表待分箱的指标名称,value代表该指标下需单独分组的缺失值
return df:传入的df中在num_dict中存在的指标的值已被替换成为对应标签的值
'''
# num_dict:{'last_trans_mon_dur': [0, 12, 36, inf]}
for key, cat_val in num_dict.items():
null_ind = []
if num_null.get(key) is not None:
# 找到数据框中列为 key 且数值等于 num_null[key] 的行的索引,并转换为列表形式。 例如 [0, 1, 2] 此处代表找出和json文件中缺失值一样的数据对应的索引
null_ind2 = list(df[df[key] == num_null[key]].index) # 主要是找出 不正常的数据 脏数据, 如果数据质量不错,这里就不会执行
# 将数据框中列为 key 且数值等于 num_null[key] 的值替换为 98。 其中 num_null里键key对应的值 inplace = True 代表在原数据上修改,默认为False
df[key].replace(num_null[key], 98, inplace=True)
null_ind.extend(null_ind2) # 将列表往后扩展
print("①.null_ind:%s" % null_ind)
df[key] = df[key].astype('str') # 将数据框类型转换为str
df[key].replace('NULL', '99', inplace=True) # 数据框中指标为 key 且数值等于 'NULL' 的值替换为 99。
null_ind1 = list(
df[df[key] == '99'].index) # 找到数据框中列为 key 且数值等于 99 的行的索引,并转换为列表形式。 例如 [0, 1, 2] 目的也是为了找出null的数据
null_ind.extend(null_ind1)
this_col = df[key].astype('float') # 将数据框类型转换为浮点型 例如 99 - 99.0
print("②.this_col:%s" % this_col)
print("☆₊⁺