Python数分实战

学习视频:【课程3.0】Python基础与分析实战_哔哩哔哩_bilibili

        由于学习过python进行数据分析,所以就简单记录一下,最主要学习的还是视频最后的两个项目,进行实战

        之前想不明白明明有很智能的软件做数据分析,为什么还要学python,现在发现它处理txt文本格式的数据很方便,如图所示

列表和字典复习

[xx,xx,xx] 可以看作一行/一列数据

{k:v,k:v,k:v} 可以看作一行数据(含表头)

{k:v} 若v是列表,可以看作一列数据(含表头)

{k:v,k:v,k:v} 若v是列表,可以看作多行多列的数据(含表头)

[{k1:v,k2:v,k3:v},

{k1:v,k2:v,k3:v},

{k1:v,k2:v,k3:v}] 可以看作多行多列的数据(含表头)

数据预处理

        查看数据,发现每条广告数据表头字段都是一样的,那就代表我们只需要对一个处理,后面用循环就可以

        观察部分数据发现,比较明显的错误:GMV和成交金额都太大了且相同

取出数据,赋值

        取出第一条广告数据

去除重复值

        这里GMV和成交金额相同,那么为了更明显的观察,删除成交金额,保留GMV

处理异常值

        得知这里GMV单位出错了,这里的单位是分,那就除以100即可

增添必要字段

        作为一张广告数据表,必要的字段是roi,即投入产出比,成交额/成本,可以直观看到是负收入

分隔字段(广告策略)

        这里的广告计划名称特别长,得知代表的意义分别是:商品名称、人群标签、用户年龄、用户等级,按照下划线分割开来

        

循环处理

        上文都是对ad_1进行处理,我们需要第二条、第三条也被处理,可以手动把ad_list[0]中0改为1、2再运行一遍,但是比较麻烦

        这里用for循环很简单,先回顾一下for循环两种形式:

        item可以随意改名,menu是一个列表

        for item in menu:

                print(item)

        for i in range(len(menu)):【len(menu)更符合工作需求】

                print(menu[i])

这里增加了历史数据,需要同样处理然后整合

导入数据

        第二份数据太长了,直接粘贴过来可能会卡住,所以放在txt文件中导入进来,这里用的是with open,我记得我之前用的是read。这里还给了个名字history

        注意:数据现在是字符串类型的,需要修改

数据预处理

更改数据类型

        用到eval函数:自动计算括号内的表达式

循环处理

整合数据

        history数据没有1月1号的,用extend函数可以将ad_list增加到history尾部

条件筛选

        对每一条数据判断roi是否>=1,挑选出符合条件的数据取出

自定义函数

有参数输入,有返回值

        这里学习到一个新知识:f''

        f‘’可以将变量嵌入到内容当中

        注意:有返回值那我们需要用一个变量接住返回值

无参数输入,有返回值

有参数输入,无返回值

既没有输入参数,也没有返回值

处理单条数据

        这里我们只需要进行这个操作即可,无需返回什么

批量处理数据

        由于我们写好了处理单条数据的代码,那么可以直接放在for循环中遍历,也不需要输出

筛选数据

Pandas学习

        引入pandas,然后转为dataframe对象查看

series和dataframe

series

        一维数据结构,代表一列数据,name相当于这一列数据的表头字段,index则可以对索引命名

        这里再创建一个s2,将s1、s2用concat连接起来,会按照索引对应起来而不是按照顺序

dataframe

        可以看作由多个series组成

Pandas实战练习

数据读取

        1.这里可以直接读取数据,但是演示了一下如果跟原数据不在同一文件夹下的情况,就将上方搜索框内的内容复制 + \ + 原数据名称,注意前面要加个r

        2.converters参数,是在数据读取阶段将uid改为字符串形式,否则会自动给我们改为数字

        3.id列同样也希望是字符串形式,这里展示另一种改法,用astype函数

数据导出

        一般导出数据是excel格式,后缀是xlsx,这里的index=False代表去除导出表格里面第一列的索引

        如果有需求导出为csv格式,那么建议先导出为txt格式,按照制表符分隔,然后再用excel打开这个txt文件

数据访问

        访问列数据

        访问行数据

        访问行列

数据筛选

        data['progress']>=100000判断出每条数据满足条件为True,否则为False,外面再套一个data[]就能将为True的取出来

数据去重

        drop_duplicates()默认对完全重复的行去重,可以在内部添加参数

        subset:对某一列去重,例如每个uid对应一个人,那么肯定有用户发了多条弹幕,对uid去重可以看到有多少人发了弹幕

        keep:first保留最先一条数据,last保留最后一条数据

        inplace:一个赋值操作

        理解轴的概念,按照方向更好理解

合并

        导入第二张表,用pandas自带的concat函数将data和data2连接在一起

连接

        user_level是一张用户等级表,想给每个用户分等级,用pandas的merge函数连接两张表,第一个参数是左表,第二个参数是右表,how代表连接方式,默认为inner内连接,on代表连接的字段

        这里我们用rename修改uid这个列名,这时再用merge连接两表就需要增加左表连接字段和右表连接字段

排序

        sort_values按照某字段排序,ascending默认为升序,False代表降序

匿名函数

        可以写简单的函数

分组

        用group by进行分组,一般是为了使用聚合函数而分组,这里想对每个商品名称的消耗求和,如果直接写['消耗']结果是一个series对象,为了更直观地观察可以写成[['消耗']],会变成dataframe对象

        agg函数,希望对聚合字段看到不一样的聚合结果时使用

        这是另一种写法

        自定义函数写法,求最大值与最小值的差

转换

        相当于窗口函数,对每个商品名称的GMV求和,放入新的一列中

        注意:这里product_gp是history按照’商品名称‘分组过后的表,未聚合过是不可以用transform的

        

排名

        要求每个投放日期内GMV排名,那先要对’投放日期‘分组,然后对其中的GMV排序,排序用到rank函数

        method = ’dense‘代表密集排名方法,会为每个不同的值分配一个唯一的排名,并且相同的值将获得相同的排名。

        但是我们希望排名是整数,用astype修改类型

字符串方法

split

        对这一列用'_'分隔,expand代表拆分成列,这样用[0]、[1]可以直接取列

        像这样就添加到原表了

contains

        一个筛选功能,用contains可以对’商品名称‘列匹配’玩转‘这个字符串,有的会显示True,否则为False,那么外面套一层history[]就能将True的数据挑选出来

        reset_index是重置索引,drop是丢掉原来的索引

replace

        用注释内的代码写起来较简单,但是不美观

        可以使用正则表达式来做

extract

        我们只想提取此列中第一个_前的内容,就用extract来提取

绘图

折线图

        按照日期分组,对GMV求和,然后绘制折线图

柱形图

条形图

直方图

散点图

饼图

map、apply、applymap

map

        map对series或字典中每个数据进行操作,单列数据

apply

        apply对 Series 中的每个元素或 DataFrame 的每列/每行应用一个函数

        这里要注意,默认axis是为0的,但是这样传入的是一列一列的数据,相当一是按照索引值传入的,那么会找不到‘客单价’等字段,所以这里我们修改为axis=1

applymap

        applymap对 DataFrame 中的每个元素应用一个函数

apply使用补充

        当工作中有需求要自己填入参数,比如算出来的结果要乘以系数

        参数添加args=自行定义的参数

项目一:办公自动化

        项目背景:老板需要你提供抖音平台上,男士护肤品的带货视频

        简而言之,就是将这两张表的内容按一定顺序呈现到word里面,而我们熟知操作excel,但是并不会操作word,所以接下来我们要自主学习如何用python操作word

        自主学习思路:

        1.百度搜索python操作word,寻找各个帖子内提及最多的方法,我们会发现,最多的词是python-docx

        2.搜索打开python-docx官方文档,学习新知识可以先将示例运行一下,运行前要先下载一下python-docx,cmd运行(这里我一开始报错,因为没关代理,记得用pip下载时要关闭代理)

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple python-docx

        3.运行过后发现多出一个word,将代码和word对比观察可以看到每部分代码做了什么事

        4.大致明白各代码作用后,可以删除下面增加分页和制作表格的代码,只保留上半部分便于学习

第一版

        我们希望将video_list表中品牌作为一级标题,AwemeDesc作为二级标题,speech_text表中的视频文案作为正文显示出来

        仿照示例写的代码如下

        结果如图

第二版

        我们希望可以循环处理这些数据,首先要读取这两张表进来,然后查看数据类型有没有问题,并将两张表连接起来

        用一个for循环将每一行中的所需字段提取出来

        结果如下

第三版

        在第二版的基础上,我们还需要优化

        1.标题一:我们希望标题一不会重复,相同的大标题只会出现一次。这里通过if判断语句来实现,当本条数据跟上一条数据的’品牌‘不一样或者是第一条数据时,才会将这条数据的’品牌‘变成大标题

        2.我们希望在标题二的后面可以加上’达人昵称‘和’视频地址‘,这里我们使用f语句,之前也使用过,可以读取字符串内的表达式,使其应用出来

        注意:在f''内部我们所提取的字段,类似:BloggerName需要改成双引号,跟f''区别开,否则报错

项目二:弹幕内容分析

数据处理

        首先导入用户等级表

        剩余的五张表由于表头都一样,所以我们不用一张一张导入,希望可以用循环导入并拼接起来

        这里用到新知识os.listdir,'./'代表在本文件夹中读取

        这里也是用for循环将五张表拼接起来,先将每张表读取出来,然后用concat拼接

        在进行合并操作前我们新增一列将数据来源于哪张表标注清楚

时间处理

        处理时间列要引入新函数,由于时间列是时间戳形式,用datetime.fromtimestamp转换,然后就可以用year等自动处理年月日,但是星期是标准日期没有的,要查询出来还得用datetime.isoweekday

时间分析

月份

        我们对2022年的数据分析

        发现:2022年3月份弹幕很活跃,但是并不能说明发弹幕的人多,所以我们再继续分析发弹幕的人数

        这里我们对uid进行不重复计数,用的是nuique函数

        结论:2022年3月份发送弹幕的人也是最多的

        假设:季节?视频进入推流池?这些猜想都无法被验证

星期

        惊人的发现:工作日1-4、周天,弹幕是最活跃的,周五、六活跃度下降

        这里使用pygwalker导入数据,省了很多代码

用户画像

数据处理

        分组计数,用transform扩展至每一组中数据

        两张表uid的类型不同,连接报错,修改一下user_level的uid类型

弹幕内容

        这里有个细节就是[['id']],变成dataframe对象,否则无法对id降序排列

        查看弹幕数最多的人都发了些什么

        第一行代码是限制最多展示300行

等级分布
 

        大部分分弹幕主要来自于4、5级用户,自学课程大部分发弹幕的观众是b站的粘性用户

        可以证实上述结论

视频内容

数据处理

        progress显示的是视频进度条,是毫秒,需要除以1000转换单位

        只要取时分秒即可转化为进度条

        我们要绘图不需要精确到秒,取时分即可

视频内容分析

        去掉开头结尾,11分钟有100条弹幕,但似乎并没什么特殊的;9分钟是因为有互动

        观察11分钟的弹幕内容

        其余几张表类似操作即可

  • 6
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值