目录
涉及工具,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号还没有订单生成。
可以拉透视图对学员的身份,意向度的转化呀等分析……