数据分析实战

数据分析学习之旅

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

本文旨在记录本人学习数据分析的一些思路和一些坑,以供复习和总结。

数据分析,在我的理解里有点像概率论里面的大数定律,所有人都在有意识的基于自己的效用最大化做出决策,但这些决策往往呈现出规律性,特别的例子就是正态分布的存在,数据分析就是从复杂的数据中发现这种规律,站在更高的视角来看待问题。


`提示:分析工具使用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进行数据分析的基本流程,最为关键的其实不是工具,而是数据思维。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值