直播数据分析

针对douyu_60937 直播间 (2018/11/19 19:04:18 - 2018/11/20 7:56:42) 这个时间段的数据分析

基础数据展示


以上数据是从直播间的弹幕中提取的相关数据,每个字段解释为

 {'id': '唯一标识','user': '用户名','cont': '发送的信息','level': '用户等级','sign': '牌子','sign_leve': '牌子等级','rid': '发言房间号',
}

依赖

pandas==0.23.4
matplotlib==3.0.2
numpy==1.15.4
datetime

数据处理

基础准备

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import datetimepath = "douyu_60937.xlsx"
data = pd.read_excel(path)

根据牌子名称统计最大值、最小值、平均值

  • 计算牌子的最大值、最小值、平均值的时候需要根据user 将数据删除重复项 ,避免多次计算
  • 需要做成图我们返回值设置成dict()
t = data[['user', 'sign', 'sign_leve']].drop_duplicates(subset=['user'])  # 删除重复用户
t = data.groupby('sign').sign_leve.agg(['mean', 'min', 'max'])
t.sort_values(['max'], ascending=False, inplace=True)
print(t)
print(t[:20].to_dict())

{'mean': {'小人参': 11.848837209302326, '196': 16.475254730713246, '女流': 11.418693982074263, 'Amss': 10.0, '水煮肉': 26.0, '小僵尸': 9.93750495049505, '339': 18.941176470588236, '金发雅': 24.0, '猛男': 7.768361581920904, '小豆包': 12.676724137931034, '阿冷': 10.416666666666666, '寅子': 7.059241706161138, '小痒虫': 10.718562874251496, 'S1un': 22.0, '小緑帽': 9.938271604938272, '集团军': 7.909323116219668, '小乌贼': 8.377464788732395, '点子王': 5.686131386861314, '小肚皮': 7.034911587538053, '林Q': 21.0}, 'min': {'小人参': 2, '196': 4, '女流': 3, 'Amss': 4, '水煮肉': 26, '小僵尸': 1, '339': 12, '金发雅': 24, '猛男': 1, '小豆包': 3, '阿冷': 6, '寅子': 1, '小痒虫': 2, 'S1un': 22, '小緑帽': 1, '集团军': 1, '小乌贼': 1, '点子王': 3, '小肚皮': 1, '林Q': 21}, 'max': {'小人参': 30, '196': 30, '女流': 30, 'Amss': 27, '水煮肉': 26, '小僵尸': 25, '339': 25, '金发雅': 24, '猛男': 23, '小豆包': 23, '阿冷': 22, '寅子': 22, '小痒虫': 22, 'S1un': 22, '小緑帽': 22, '集团军': 22, '小乌贼': 22, '点子王': 22, '小肚皮': 21, '林Q': 21}}

根据牌子名称统计数量

  • 分类统计的时候我们要修改列名用rename(column={'老列名':'新列名'})
sign_max_count = data[['user', 'sign', 'sign_leve']].drop_duplicates(subset=['user'])  # 删除重复用户
sign_max_count = data[['sign']].groupby(['sign']).agg({'sign': 'count'}).rename(columns={'sign': 'sign_count'})
sign_max_count.sort_values(['sign_count'], ascending=False, inplace=True)
print(sign_max_count)
print(sign_max_count[:20].to_dict())

{'sign_count': {'小肚皮': 15439, '小僵尸': 12625, '集团军': 1566, '196': 1374, '女流': 781, '影魔王': 640, '大马猴': 429, '寅子': 422, '小緑帽': 405, '小8路': 397, '小烈驴': 370, '小乌贼': 355, '小赢僧': 355, '保安团': 343, '猪芳芳': 243, '小豆包': 232, '王菠萝': 187, '二帆': 184, '猛男': 177, '汽车人': 173}}

统计各个等级的用户数量

now_data = data[['user', 'level']].drop_duplicates(subset=['user'])  # 删除重复用户
now_data = data[['level']].groupby(['level']).agg({'level': 'count'}).rename(columns={'level': 'level_count'})
now_data.sort_values(['level_count'], ascending=False, inplace=True)

{'level_count': {16: 3159, 19: 3122, 17: 3086, 21: 2984, 18: 2882, 15: 2832, 22: 2624, 23: 2564, 20: 2545, 13: 2379, 14: 2308, 24: 2274, 11: 2066, 12: 1894, 7: 1781, 9: 1753, 10: 1690, 8: 1678, 5: 1645, 25: 1554}}

每小时发言数量

  • 根据时间统计需要构造一个datetime 数据类型的列 , 利用 resample("时间标识符") + count() 进行统计
  • 为了后续制图方便我在这里直接把 <class 'pandas._libs.tslibs.timestamps.Timestamp'> 转换成python 内置的 datetime 类 方法是 to_pydatetime
df = data
df = df.loc[:, ('cont', 'uptime')]
df = df.set_index('uptime')
result = df.resample('H').count().rename(columns={'cont': 'user_count'})
print(result)
result = result.to_dict()s = {}
for k, v in result['user_count'].items():s[k.to_pydatetime()] = v
result['user_count'] = sprint(result)
return result

{'user_count': {datetime.datetime(2018, 11, 19, 19, 0): 12707, datetime.datetime(2018, 11, 19, 20, 0): 12374, datetime.datetime(2018, 11, 19, 21, 0): 19340, datetime.datetime(2018, 11, 19, 22, 0): 13530, datetime.datetime(2018, 11, 19, 23, 0): 8, datetime.datetime(2018, 11, 20, 0, 0): 2, datetime.datetime(2018, 11, 20, 1, 0): 1, datetime.datetime(2018, 11, 20, 2, 0): 0, datetime.datetime(2018, 11, 20, 3, 0): 0, datetime.datetime(2018, 11, 20, 4, 0): 5, datetime.datetime(2018, 11, 20, 5, 0): 1, datetime.datetime(2018, 11, 20, 6, 0): 11, datetime.datetime(2018, 11, 20, 7, 0): 23}}

每小时在线人数(发言人)

df = data.drop_duplicates(subset=['user'])
df = df.loc[:, ('user', 'uptime')]
df = df.set_index('uptime')
result = df.resample('H').count().rename(columns={'user': 'user_count'})
print(result)
result = result.to_dict()
s = {}
for k, v in result['user_count'].items():s[k.to_pydatetime()] = v
result['user_count'] = s
print(result)

{'user_count': {datetime.datetime(2018, 11, 19, 19, 0): 4223, datetime.datetime(2018, 11, 19, 20, 0): 2207, datetime.datetime(2018, 11, 19, 21, 0): 3843, datetime.datetime(2018, 11, 19, 22, 0): 1875, datetime.datetime(2018, 11, 19, 23, 0): 6, datetime.datetime(2018, 11, 20, 0, 0): 0, datetime.datetime(2018, 11, 20, 1, 0): 1, datetime.datetime(2018, 11, 20, 2, 0): 0, datetime.datetime(2018, 11, 20, 3, 0): 0, datetime.datetime(2018, 11, 20, 4, 0): 1, datetime.datetime(2018, 11, 20, 5, 0): 1, datetime.datetime(2018, 11, 20, 6, 0): 1, datetime.datetime(2018, 11, 20, 7, 0): 4}}

制作图表

粉丝牌等级情况 柱状图

def autolabel(ax, rects, xpos='center'):xpos = xpos.lower()ha = {'center': 'center', 'right': 'left', 'left': 'right'}offset = {'center': 0.5, 'right': 0.57, 'left': 0.43}for rect in rects:height = rect.get_height()ax.text(rect.get_x() + rect.get_width() * offset[xpos], 1.01 * height,'{}'.format(height), ha=ha[xpos], va='bottom')def sign_bar_wiht_leve(t1):"""粉丝牌等级情况柱状图:return:"""mean = [round(x, 1) for x in t1['mean'].values()]min = t1['min'].values()max = t1['max'].values()ind = np.arange(len(mean))width = 0.35fig, ax = plt.subplots()rects_2 = ax.bar(ind, min, width / 2, color='IndianRed', label='最低等级')rects_1 = ax.bar(ind + width / 2, mean, width / 2, color='SkyBlue', label='平均等级')rects_3 = ax.bar(ind + width, max, width / 2, color='Black', label='最高等级')ax.set_ylabel('等级')ax.set_title('粉丝牌等级 (2018/11/19  19:04:18 - 2018/11/20  7:56:42)')ax.set_xticks(ind)ax.set_xticklabels(t1['mean'].keys())ax.legend()fig = plt.gcf()fig.set_size_inches(30, 10.5)autolabel(ax=ax, rects=rects_1, xpos="center")autolabel(ax=ax, rects=rects_2, xpos="center")autolabel(ax=ax, rects=rects_3, xpos="center")fig.savefig("粉丝牌等级.jpg")fig.show()

粉丝牌占比 饼图

def sign_pie_with_count(t2):"""粉丝牌占比:param t2::return:"""sizes = list(t2['sign_count'].values())[:5]labels = list(t2['sign_count'].keys())[:5]plt.figure(figsize=(8, 4))  # 调节图形大小explode = (0, 0, 0, 0)  # 将某一块分割出来,值越大分割出的间隙越大patches, text1, text2 = plt.pie(sizes,labels=labels,autopct='%3.2f%%',  # 数值保留固定小数位shadow=False,  # 无阴影设置startangle=90,  # 逆时针起始角度设置pctdistance=0.8)  # 数值距圆心半径倍数距离plt.axis('equal')plt.legend()plt.title('粉丝牌占比 \n(2018/11/19  19:04:18 - 2018/11/20  7:56:42)')plt.savefig("粉丝牌占比.jpg")plt.show()

用户等级分布 折线图


def user_line_with_count(t4):"""用户等级分布折线图:param t4::return:"""t4 = sorted(t4['level_count'].items(), key=lambda d: d[0])x = [i[0] for i in t4]y = [i[1] for i in t4]plt.figure(figsize=(8, 4))plt.plot(x, y, "b--", linewidth=1)# 设置数字标签for a, b in zip(x, y):plt.text(a, b, b, ha='center', va='bottom', fontsize=10)plt.xlabel("用户等级")plt.ylabel("数量")plt.title("用户等级情况\n(2018/11/19  19:04:18 - 2018/11/20  7:56:42)")plt.savefig("用户等级情况.jpg")plt.show()

每个时间段用户以及弹幕量 折线图


def show_label(x, y, plt):# 设置数字标签for a, b in zip(x, y):plt.text(a, b, b, ha='center', va='bottom', fontsize=10)def user_time(t5, t6):"""每个时间段用户以及弹幕量:param t5::param t6::return:"""t_5 = {k.strftime("%Y-%m-%d %H"): v for k, v in t5['user_count'].items()}t_6 = {k.strftime("%Y-%m-%d %H"): v for k, v in t6['user_count'].items()}x_1 = t_5.keys()y_1 = t_5.values()x_2 = t_6.keys()y_2 = t_6.values()plt.figure(figsize=(9, 5))plt.plot(x_1, y_1, "o-", linewidth=1, label='弹幕数量')plt.plot(x_2, y_2, "g--", linewidth=1, label='在线人数')show_label(x_1, y_1, plt)show_label(x_2, y_2, plt)plt.xticks(rotation=30)plt.legend()plt.xlabel("小时")plt.ylabel("人数")plt.title("每个时间段用户以及弹幕量\n(2018/11/19  19:04:18 - 2018/11/20  7:56:42)")plt.savefig("每个时间段用户以及弹幕量.jpg")plt.show()

pandas matplotlib 直播数据分析相关推荐

  1. pandas matplotlib 用于数据分析和可视化

    上一个任务通过requests.BeautifulSoup4两个功能强大.用法简洁的函数库已经获取到了楼盘名.地址和价格这些新房信息,并且保存为csv格式文件,csv文件可以用excel打开并进行编辑 ...

  2. python 数据分析工具之 numpy pandas matplotlib

    作为一个网络技术人员,机器学习是一种很有必要学习的技术,在这个数据爆炸的时代更是如此. python做数据分析,最常用以下几个库 numpy pandas matplotlib 一.Numpy库 为了 ...

  3. Numpy,Pandas,Matplotlib

    一 . numpy -- 数据分析:就是把一些看似杂乱无章的数据信息提炼出来,总结出所研究的内在规律 -- 数据分析三剑客:Numpy,Pandas,Matplotlib -- Numpy(Numer ...

  4. python科学计算之numpy+pandas+matplotlib+mysql

    简介 本文主要介绍了读取mysql中的数据,将其保存至numpy和pandas中,通过matplotlib进行可视化数据分析. 一.环境搭建 使用anaconda搭建科学计算环境,并安装相关软件包. ...

  5. Numpy+Pandas+Matplotlib学习

    参考的教程是哔哩哔哩孙兴华UP主的视频,边学边做 BV1ji4y157uB 代码及所用的数据已上传至Github learn_numpy_pandas_matplotlib 文章目录 Numpy Pa ...

  6. Python numpy+pandas+matplotlib学习笔记

    Python numpy+pandas+matplotlib 本文是根据b站路飞学城Python数据分析全套教程的学习视频整理归纳的学习文档,主要目的是方便自己进行查阅,详细的还得去b站看原视频.另外 ...

  7. ML之FE:pandas库中数据分析利器之groupby分组函数、agg聚合函数、同时使用groupby与agg函数组合案例之详细攻略

    ML之FE:pandas库中数据分析利器之groupby分组函数.agg聚合函数.同时使用groupby与agg函数组合案例之详细攻略 目录 pandas库中数据分析利器之groupby分组函数.ag ...

  8. python显示图像某列的颜色值_Python Pandas Matplotlib图由单列中定义的类型值着色

    我有以下格式的数据: import pandas as ps table={'time':[1,2,3,4,5,1,2,3,4,5,1,2,3,4,5],\ 'data':[1,1,2,2,2,1,2 ...

  9. python画熊猫代码_Python 绘制散点图(Pandas + Matplotlib)

    简单绘制一个散点图. 数据使用小朋友的身高和体重,简单看看. 数据结构:下面看一下其中几条的部分内容,我们只需要其中身高(Height)和体重(Weight)列的数据: 共七万五千多条,下面看看通过p ...

最新文章

  1. var_export
  2. 如何获取真实的执行计划
  3. 欢迎报名参加第四届亚洲信息获取暑期学校(ASSIA2019)
  4. VS2010 MFC中控件、对话框等背景颜色动态修改的方法
  5. hibernate注解实体类(Emp.java)
  6. 登录注册实现(服务器数据)
  7. 浅谈ASP.NET的内部机制(二)
  8. 网页编辑PHP变量,编辑文件中的php代码和变量
  9. Java多线程 5 多线程其他知识简要介绍
  10. input输入框只允许输入数字/ 数字+小数点/ 文字+字母/ 等解决方法
  11. Android_View,ViewGroup,Window之间的关系
  12. 解只含加减的一元一次方程
  13. facebook注册工具_如何打开Facebook的数据保护工具
  14. Python邮件收发(SMTP POP3)
  15. 计算机系统如何禁止文件删除功能,Win7如何禁止在C盘上安装软件?|win7系统c盘哪些文件是可以删除的...
  16. 铸造工艺问题6——砂型涂料多厚,刷几次?芯头斜度?新旧砂的作用树脂、固化剂的作用
  17. Centos系统上安装并配置mysql的教程?
  18. 使用windows钩子捕获进程的启动和关闭消息
  19. jQuery 是一个 JavaScript 库。
  20. [Mugeda HTML5技术教程之11]Mugeda API简介

热门文章

  1. 简单的函数(也叫方法)
  2. 一起学ASP.NET Core 2.0学习笔记(一): CentOS下 .net core2 sdk nginx、supervisor、mysql环境搭建...
  3. Android Tcp操作
  4. 阿里云API网关(14)流控策略
  5. 【读书笔记】程序员的自我修养总结(七)
  6. 第二篇:白话tornado源码之待请求阶段
  7. HBase性能优化方法总结(2):表的设计
  8. windows核心编程-第二章 Unicode
  9. POJ3692 最大点权独立集元素个数
  10. 【Linux 内核】调度器 ④ ( sched_class 调度类结构体分析 | yield_task 函数 | heck_preempt_curr 函数 | task_struct 函数 )