数据分析学习之旅
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
本文旨在记录本人学习数据分析的一些思路和一些坑,以供复习和总结。
数据分析,在我的理解里有点像概率论里面的大数定律,所有人都在有意识的基于自己的效用最大化做出决策,但这些决策往往呈现出规律性,特别的例子就是正态分布的存在,数据分析就是从复杂的数据中发现这种规律,站在更高的视角来看待问题。
`提示:分析工具使用python
一、基本业务场景
1.根据提供的广告数据进行分析,第一步是要降低广告点击产生的费用,筛选出高点击高转化的词组,然后根据数据表现分配权重
2.进一步根据不同时间段广告词的表现,进行时间序列分析,做出整体表现和预测。
二、具体步骤
1.EXCEL分析
业务会从运营网站上拿到第一手数据,导出是xlsx格式的Excel文档,所以我的第一个想法是直接在excel表格里面构建一个自动化的结构
将单表数据导入“待赋值表”,可在分析表进行操作
为了方便导入,制作了一个简易窗口程序
代码如下(示例):
from fileinput import filename
import tkinter as tk # 图形界面库
from tkinter import filedialog # 图形界面库的文件对话框模块
from tkinter import messagebox # 图形界面库的弹窗模块
import pandas as pd
from win32com.client import Dispatch
from threading import Thread
import pythoncom
from time import time
def main():
class DownloadTaskHandler(Thread):
def run(self): # 必须是run() 函数 sb design
start_time = time()
df = pd.read_excel(file)
file2 = file_path+'广告筛选1.0- 轻量级.xlsm' # 待处理文件
if df.shape[0]<5001:
print('处理中,请稍后!')
writer = pd.ExcelWriter(file2,engine='openpyxl',mode='a',if_sheet_exists='replace')
df.to_excel(writer,sheet_name='待赋值表',index=False)
writer.save()
writer.close()
end_time = time()
print(f'program consum {end_time-start_time} seconds!')
pythoncom.CoInitialize()
# 弹出窗口,窗口标题为“成功”,窗口含有信息“成功生成文件。”
messagebox.showinfo(title='成功', message='成功生成文件。')
xlApp = Dispatch('Excel.Application')
xlApp.Visible=1 # 显示excel界面
xlBook = xlApp.Workbooks.Open(file2, ReadOnly = False) #打开对应的excel文件
pythoncom.CoUninitialize()
else:
messagebox.showinfo(title='失败',message='请选择小于5000行的数据!')
bo_deal.config(state=tk.NORMAL)
class DownloadTaskHandler_large(Thread):
def run(self):
file2 = self.file_path+'广告筛选1.0- 重量级.xlsm' # 待处理文件
df = pd.read_excel(self.file)
writer = pd.ExcelWriter(file2,engine='openpyxl',mode='a',if_sheet_exists='replace')
df.to_excel(writer,sheet_name='待赋值表',index=False)
writer.save()
writer.close()
if df.shape[0]<15000:
# 弹出窗口,窗口标题为“成功”,窗口含有信息“成功生成文件。”
messagebox.showinfo(title='成功', message='成功生成文件。')
xlApp = Dispatch('Excel.Application')
xlApp.Visible=1 # 显示excel界面
xlBook = xlApp.Workbooks.Open(file2, ReadOnly = False) #打开对应的excel文件
else:
messagebox.showinfo(title='失败',message='暂时无法处理超过15000行的数据!')
bo_deal_l.config(state=tk.NORMAL)
def cho_file():
# 路径问题
global file
file = filedialog.askopenfilename()
global file_name
file_name = file.split('/')[-1]
global file_path
file_path = file.replace(file_name,"")
a = file_name.split('.')[-1]
if a!=('xlsx'or'xlsm'):
messagebox.showinfo(title='失败',message='请选择正确的excel文件!')
else:
messagebox.showinfo(title='文件已就绪!', message='单击处理文件。')
print(file)
def deal_file():
bo_deal.config(state=tk.DISABLED)
a=DownloadTaskHandler(daemon=True)
a.start()
def deal_file_l():
bo_deal_l.config(state=tk.DISABLED)
a=DownloadTaskHandler_large(daemon=True)
a.start()
# tkinter part
window = tk.Tk()
width = 300
hight = 200
screen_width = window.winfo_screenwidth()
screen_hight = window.winfo_screenheight()
info = "%dx%d+%d+%d" % (width,hight,(screen_width-width)/2,(screen_hight-hight)/2)
window.geometry(info)
window.title('Excel文件处理')
#self.path = os.path.split(os.path.realpath(__file__))[0]
# 创建一个按钮,按钮放在window窗口上
# 按钮上的字是“选择文件”,按下后触发功能“cho_files”函数
bo_cho = tk.Button(window, text='选择文件',bg='#7CCD7C', command=cho_file)
bo_deal = tk.Button(window, text='处理小文件', command=deal_file)
bo_deal_l = tk.Button(window, text='处理大文件', command=deal_file_l)
# 创建一个标签
lable1 = tk.Label(window, text='选择要处理的文件,再点击处理')
# 创建一个多行文本框,放在window窗口上
Text_word = tk.Text(window)
Text_word.insert('insert', '数据<=5000 请选择处理小文件\n数据解释\n A:高点击,高CR\n B:高点击,低CR\n C:低点击,高CR\n D:低点击,低CR')
# pack
bo_cho.pack()
bo_deal.pack()
bo_deal_l.pack()
#bo_deal_l.pack()
lable1.pack()
Text_word.pack()
tk.mainloop()
if __name__ == '__main__':
main()
tkinter是个简单又实用的窗口函数库,搭建的窗口极大提升了程序的装X指数,建议学一下。使用tkinter搭建框架,其中的button函数可以触发自定义的函数,基本上就是利用pandas读取再写入的作用,期间对比了openpyxl库,pandas速度更胜一筹,但是整体速度还是很慢五千行的数据要等待20多秒,然后恶补了一番多线程多进程的知识,得知PYTHON存在所谓的GIL锁,最多只能发挥CPU单核的性能,异步携程是最好的解决方法,单这种纯IO写入的问题怎么写,暂时还没有思路。
2.搭建本地数据库
想要进行时间序列分析,需要大量的数据,又因为每个业务只能提供自己一段时间内有限的数据,所以一个自然的想法就是搭建一个数据库来存放数据,数据库语句简单看了下,不管那些除了增删改查之外的东西应该没什么复杂的,特别是有navicat可视化工具之后。下一步就是用python把excel数据写入数据库里面,后面应该会设计删改,查应该也是一个重点。
写入代码如下(示例):
import pandas as pd
import pymysql
import numpy as np
from pymysql.converters import escape_string #转义问题!!!
nan = float('nan')
file = r'C:\Users\Administrator\Desktop\商品推广 搜索词 报告4.27.xlsx'
df = pd.read_excel(file)
data_array = np.array(df)
data_list = data_array.tolist()
# a = data_list[532][8]
# print(a)
# print(type(a))
conn = pymysql.connect(host='127.0.0.1',port=3306,user='root',password='123456',database='ad_data',charset='utf8mb4') #连接数据库
try:
i = 0
for i in range(len(data_list)):
#数据清洗
if pd.isna(data_list[i][19]):
data_list[i][19]= 0
print(data_list[i])
if pd.isna(data_list[i][16]):
data_list[i][16]= 0
print(data_list[i])
if pd.isna(data_list[i][15]):
data_list[i][15]= 0
print(data_list[i])
if pd.isna(data_list[i][11]):
data_list[i][11]= 0
print(data_list[i])
if pd.isna(data_list[i][12]):
data_list[i][12]= 0
print(data_list[i])
with conn.cursor() as cursor:
sql='''insert into `data` (`start_date`,`end_date`,`ad_group_name`,`currency`,`ad_campaign`,`ad_group`,`launch`,`matching_type`,`customer_search_terms`,`quantity_display`,`hits`,`ctr`,`cr`,`cost`,`total_sells`,`acos`,`roas`,`total_orders`,`total_sell_amount`,`conversion_rate`,`sku_sell_amount`,`un_sku_sell_amount`,`sku_sell`,`un_sku_sell`) \
value('%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s')''' \
%(data_list[i][0],data_list[i][1],data_list[i][2],data_list[i][3],data_list[i][4],data_list[i][5],escape_string(data_list[i][6]),data_list[i][7],escape_string(data_list[i][8]),data_list[i][9],data_list[i][10],data_list[i][11],data_list[i][12],data_list[i][13],data_list[i][14],data_list[i][15],data_list[i][16],data_list[i][17],data_list[i][18],data_list[i][19],data_list[i][20],data_list[i][21],data_list[i][22],data_list[i][23])
affected_rows = cursor.execute(sql)
if affected_rows == 1:
print(f'写入第{i+1}行!')
conn.commit()
print('写入完成!')
except pymysql.MySQLError as err:
print(err)
conn.rollback()
finally:
conn.close()
简单说一下遇到的坑
1.第一个就是数据标签多达24个,要把pandas读出来的文件一一对应的传进去,免不了会出错,应该还存在简易的办法。
2.写入sql的格式控制符同一用%s ,而不用%d,%f,问就是规定。
3.python空值是nan,而sql只认识None,首先要数据清洗,把none转化为nan,我用的方法其实过于冗杂,可以直接使用df.isnull()和df.fillna()进行批量操作,但是对于一些数据。如成本销售比,用来度量产品长期的表现,这个指标是越小越好,成本销售比=成本/销售额,但是很多产品没有销售额,如果一味的使用fillna(0),就会使数据失去意义,还是要具体问题具体分析。
4.遇到字符里面还有’的,例如:a = ‘children’s toy’ 会报错,多个引号的字符转义谨记escape_string()方法。
3.远程链接数据库
数据库选用了mysql,管理工具是Navicat,如果你使用的是华为云,或者阿里云服务器,记得在服务器管理打开3306端口权限。
4.时间序列分析
这点会在后续网页分析中提到。
总结
这里对文章进行总结:
以上就是今天要讲的内容,本文仅仅简单介绍了利用pandas进行数据分析的基本流程,最为关键的其实不是工具,而是数据思维。