推广数据的案例分析

目录

一、读取数据

二、处理字段信息

三、更改敏感数据

四、更改列名

五、查看数据类型

六、删除NaN行

七、查找重复项

八、更改值

九、匹配列

十、分表

(一)信息表

1、查找重复项并删除

2、检查匹配列是否重复

3、导出表

(二)消费表

1、把NaN值行去掉

 2、导出表

(三)名片表

1、筛选名片vs更改数据类型

2、导出表

(四)订单表

1、筛选名片vs更改数据类型

十一、导入数据库

(一)读取文件vs写入数据库

 十二、打开excel

  (一)导入数据vs制作模型

​(二)数据透视表


涉及工具,python, mysql, excel(power query, power pivot),数据来源:

现在数据是消费表,名片表,订单表组成的大的表,里面有信息是共同的,需要把表分成4个维度,除消费表,名片表,订单表还要分成信息总表

一、读取数据

import numpy as np
import pandas as pd
import datetime
import random
import math
import re
data = pd.read_excel('推广数据.xlsx')
#显示所有列
pd.set_option('display.max_columns', None)
data.head()

二、处理字段信息

当时这原三个表在合并是,项目组别与组别应属于同一个字段的,但写了不同的字段名,使值不在同一列中,现更为组别的值移到项目组别,并删除“组别”列

for idx in data.index:
    data.loc[idx, '项目组别']
    if data.loc[idx, '项目组别'] == '(空白)':
        data['项目组别'][idx] = data['组别'][idx]
data = data.drop(['组别'], axis=1)
data.head()

三、更改敏感数据

 现在的数据有点涉及到隐私,把先把“账户”、“项目组别”、“负责人"的信息更改一下

#更换帐号
def generate_random_str():
  """
  生成一个指定长度的随机字符串
  """
  random_str = ''
  base_str = 'ABCDEFGHIGKLMNOPQRSTUVWXYZabcdefghigklmnopqrstuvwxyz0123456789@#.'
  length = len(base_str) - 1
  for i in range(10):
    random_str += base_str[np.random.randint(0, length)]
  return random_str

#制造名字:
def generate_random_name():
  name = ''
  first_name = '张李黄陈刘梁杨'
  list_name = '静慧勇枫金素灿生原 '
  for i in range(3):
        if i ==0:
            name = first_name[np.random.randint(0, len(first_name))]
        else:
            name += list_name[np.random.randint(0, len(list_name))]
  return name

#制造组别:
def generate_random_zname():
  first_name = '东南西北'
  zname = first_name[np.random.randint(0, len(first_name))] + '宫'      
  return zname

#更换值
def get_rename(columns1 = '账户', columns2 = '项目组别', columns3 = '负责人'):
    dict_p = {}
    for i in data.index:
        
        dict_p.setdeafault()
        if data[columns2][i] not in dict_p:
            dict_p[data[columns2][i]] = generate_random_zname()  
        if data[columns3][i]not in dict_p:
            dict_p[data[columns3][i]] = generate_random_name()
            
        data[columns2][i] = dict_p[data[columns2][i]]
        data[columns3][i] = dict_p[data[columns3][i]]
        
        if data[columns1][i]== '转介绍_技能':
                continue
        elif data[columns1][i] not in dict_p:
            dict_p[data[columns1][i]] = generate_random_str()
        data[columns1][i] = dict_p[data[columns1][i]]

 四、更改列名

data.columns

#更改列名
data = data.rename(columns = {'首次分配日期' : '分配日期','首次分配时间' : '分配时间', '以下项目的总和:支付金额' : '支付金额',
       '以下项目的总和:扣息后流水' : '扣息后流水', '以下项目的总和:订单数' : '订单数', '以下项目的总和:含转介流水' : '含转介流水', 
       '以下项目的总和:推广名片数': '推广名片数',
       '以下项目的总和:有效名片数':'有效名片数', '以下项目的总和:机会数':'机会数', '以下项目的总和:cpa':'cpa', 
       '以下项目的总和:时效性(HOUR)':'时效性(HOUR)',
       '以下项目的总和:时效性(DAY)':'时效性(DAY)', '以下项目的总和:f展示量':'f展示量', '以下项目的总和:f点击量':'f点击量',
       '以下项目的总和:f消费':'f消费',
       '以下项目的总和:现金':'现金'},)
data.columns

五、查看数据类型

#查看数据类型
data.info()

六、删除NaN行

制作成函数是因为,后面分别的时候,也需要用上,方便使用

#删除渠道NaN值行
def del_NaN(column,dataframe):
    tem_dict = {}
    for idx in dataframe.index:
        try:
            type_val = type(dataframe[column][idx].item())
        except AttributeError:
            type_val = type(dataframe[column][idx])
        if type_val is float :
            if math.isnan(dataframe[column][idx]):
                tem_dict[idx] = False
            else:
                tem_dict[idx] = True
        else:
            tem_dict[idx] = True
         
    select_arr = pd.Series(tem_dict)
    dataframe = dataframe[select_arr]
    return dataframe
data = del_NaN('渠道', data)
data

七、查找重复项

#查找重复项
data.duplicated().sum()

八、更改值

账户中,转介绍的订单统一写成“转介绍_技能”,现在将不同的sku进行划分

tem_dict = {}
for idx in data.index:
    if re.search('转介绍.*',data['账户'][idx]):
        if data['sku'][idx] == '3D建模':
            data['账户'][idx] = '转介绍_建模'
        elif data['sku'][idx] == '原画设计':
            data['账户'][idx] = '转介绍_原画'
        else:
            data['账户'][idx] = '转介绍_影视'

九、匹配列

同一个账号名会在不同的渠道投广告,同一个渠道同一个账户也会在不同的广告位投广告,因此渠道、账户以广告位,可当信息表的主键。以此新增一个为匹配列,在后续中建模型时其它分表进行连接。

#广告投放'渠道','账户','广告位'形成为一值,新增匹配列
data['匹配列'] = 'NaN'
dict_n = {}
for idx in data.index:
    val = str(data['渠道'][idx]) + str(data['账户'][idx]) + str(data['广告位'][idx])
    if val not in  dict_n:
        dict_n[val] = random.randint(10000, 99999)
    data['匹配列'][idx] = dict_n[val]
data

十、分表

整体的信息处理了,现在进行分表:

(一)信息表

#制作账户信息分表
person_data_columns = ['渠道', '账户', '项目组别', '负责人','省份', '设备', '站', '广告位', '推广类型','匹配列']  
person_data = data[person_data_columns]
person_data

1、查找重复项并删除

person_data.duplicated().sum()  
#删除重复项
person_data = person_data.drop_duplicates()

2、检查匹配列是否重复

person_data[['匹配列']].duplicated().sum()

3、导出表

#导出账户信息分表
person_data.to_csv('person_data.csv', index=0, encoding='utf-8-sig')

(二)消费表

#制作消费信息分表
cost_data_columns = ['日期', 'f展示量', 'f点击量', 'f消费', '现金', '匹配列']  
cost_data = data[cost_data_columns]
cost_data

1、把NaN值行去掉

NaN值的行是来自名片表与及订单表所产生的

#删除渠道NaN值行
cost_data = del_NaN('f消费', cost_data)  #前面写的函数
cost_data

 2、导出表

#导出消费表
cost_data.to_csv('cost_data.csv', index = 0, encoding='utf-8-sig')

(三)名片表

#制作名片信息分表
card_data_columns = ['日期', '创建时间', '分配时间','推广名片数', '有效名片数', '机会数',  '意向度',
       '学员身份',  '时效性_小时分段', '时效性(HOUR)', '时效性(DAY)','推广身份' , '匹配列' ]  
card_data = data[card_data_columns]
card_data

1、筛选名片vs更改数据类型

只有名片表是有时间,用此列筛选,

card_data = card_data[card_data['创建时间'] != '(空白)']
card_data['推广名片数'] = card_data['推广名片数'].astype(int)
card_data['有效名片数'] = card_data['有效名片数'].astype(int)
card_data['机会数'] = card_data['机会数'].astype(int)
card_data

2、导出表

#导出名片表
card_data.to_csv('card_data.csv', index = 0, encoding='utf-8-sig')

(四)订单表

#制作订单信息分表
order_data_columns = ['日期',  '支付时间', '分配日期' ,  '支付金额', '扣息后流水', '订单数', '含转介流水','匹配列']  
order_data = data[order_data_columns]
order_data

1、筛选名片vs更改数据类型

order_data = order_data[order_data['支付时间'] != '(空白)']
order_data['订单数'] = order_data['订单数'].astype(int)
order_data

2、导出表

#导出订单表
order_data.to_csv('order_data.csv', index = 0, encoding='utf-8-sig')

四个表已经导出了,按了csv文件导出,现在开始按导入数据库中

十一、导入数据库

import os
from sqlalchemy import create_engine
#配置数据库引擎
engine = create_engine('mysql+pymysql://root:lcx121@localhost/Shida_Date' , encoding='utf-8')

(一)读取文件vs写入数据库

def readFile():
    try:
        #获取当前路径
        cwd = os.getcwd()
        #遍历当前路径,路径,文件全部爬去出来
        file_nums = 0
        for dirpaths, dirnaames,filenames in os.walk(cwd):
            #判断csv文件是否存在
            for filename in filenames:
                if filename.endswith(".csv"):
                    #读取文件
                    file_nums += 1
                    df = pd.read_csv(filename,encoding="utf8",sep=',',dtype={'code':str})
                    table_name = filename.split('.')[0]
                #直接写入数据库,'table_name'为表名,会自动创建一个表,不需要自己动手创建
                #to_sql函数支持两类mysql引擎一个是sqlalchemy,另一个是sqlliet3,在写入库的时候,pymysql(python3),mysqldb(python2)是不能用的,只能使用sqlalchemy或者sqlliet3.
                    df.to_sql(table_name,con=engine,if_exists='replace',index=False)
    except:
        print('已导入')
    print('file_nums is {}'.format(file_nums))
    
#第一个参数't_pandasRead'是需要导入的表名
#第二个参数数据库引擎
#第三个参数if_exists="",引号里面可以跟三个参数,fail(如果表存在,啥也不做),replace(如果表存在,删了表,再建立一个新表,把数据插入),append(如果表存在,把数据插入,如果表不存在创建一个表)
#第四个参数是否需要配置索引

运行函数,返回写入几个表

#调用函数
readFile()

查看数据库存也存在这几表:

 十二、打开excel

(一)导入数据vs制作模型

时间线分两条,回溯按消费名片所生成的订单,非回溯是当天的消费名片与产生订单 

(二)数据透视表

按非回溯的时间,数据表中只取了几天的数据,11月28号缺了一天的名片数据,12月1号与2号还没有订单生成。

 可以拉透视图对学员的身份,意向度的转化呀等分析……

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值