学习视频:【课程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分钟的弹幕内容
其余几张表类似操作即可