洞悉客户心声:Pandas标签帮你透视客户,标签化营销如虎添翼

2024-04-18 10:02:19 浏览数 (2)

在构建高效的数据分析体系时,我们经常会遇到两个核心概念:指标(Metrics)标签(Tags)。指标是对业务性能的量化衡量,它们帮助我们追踪关键业务目标的达成情况。例如,我们可能会关注用户增长率、产品销售额或客户的增续投等指标。这些数字目标为我们提供了业务运行的直观快照,并允许我们对成功与否进行量化评估。

而标签,则是附加在指标上的文字描述,用于对数据进行分类和上下文化。它们像是数据的属性,使我们能够从不同的角度切入,对指标进行深入分析。例如,对于销售额这一指标,我们可以使用“地区”、“产品线”、“客户群体”等标签来细分市场表现。通过这种方式,我们不仅能够了解整体的销售情况,还能够洞察到哪些产品在特定区域或客户群体中最受欢迎,从而做出更加精细化的业务决策。

在实际应用中,指标和标签的关系可以类比于坐标系中的点和坐标轴。指标代表了我们要追踪的具体数值,而标签则定义了坐标系中的各个维度,帮助我们定位和解释这些数值。没有标签,我们只能得到一个孤立的数字;而有了标签,我们就能够将这个数字放置在一个多维度的空间中,理解其背后的含义和价值。

客户标签不仅是数据价值体现的关键途径,更是我们今天讨论的核心所在。那在数据仓库中,通过分层、归类、建模会计算出一系列的指标,而标签则可以利用pandas将指标转化为对应的标签。

上篇已经讲解了pandas的几个方法,很多朋友好奇学会了,适用的场景在哪呢,这就听我娓娓道来。

先打个底:以理解为主,不够严谨,如果看完还是不会,那一定是我讲的不够好。我会尽可能对相对复杂的代码加入注释,欢迎大家评论区相互交流啊。

一、对类别型指标进行值的替换

该函数用于对类别型指标进行值的替换,举个例子,假设用户的星座对应的字典如下: "cnstll": {"白羊座":"11","金牛座":"12","双子座":"13","巨蟹座":"14","狮子座":"15","处女座":"16", "天枰座":"17","天蝎座":"18","射手座":"19","摩羯座":"20","水瓶座":"21","双鱼座":"22","其他":"99","NULL":"99"},

代码语言:javascript复制
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("☆₊⁺


	

0 人点赞