数据可视化是数据科学项目中一个至关重要的阶段。它允许研究者快速浏览数据集,并制定出所有可能的数据操作策略。目前市场上有许多可视化库。在数据科学项目的初期阶段,可能已经熟悉了matplotlib或seaborn。每个初学者都是从这些库开始的,它们确实是理解绘图本质和发现不同类型图表的好起点。随着在探索之旅中不断进步,总是希望在新技能方面提升自己,这就是本文将为当前知识库增加新技能的地方!
Bokeh是一个为Python用户设计的交互式可视化库。它提供了一个Python API,用于在D3.js中创建视觉数据应用程序,而无需编写任何JavaScript代码。Bokeh可以帮助任何希望快速轻松地制作交互式图表、仪表板和数据应用程序的人。这个库的安装非常简单,可以通过pip完成:
pip install bokeh
打开一个新的Jupyter笔记本,并按照以下方式配置图表的输出:
from bokeh.io import output_notebook, show
output_notebook()
将探索的数据集是“Trending YouTube Video Statistics”。可以通过提供的超链接直接从Kaggle下载数据集。需要注意的是,数据集包含多个国家的CSV文件。本文将探索印度的趋势视频。相应的CSV文件是“INvideos.csv”。让查看df.info()以获取所有关于列的信息。
数据集中的当前日期格式是这样的:17.14.11,它是年-月-日的格式,pandas可能无法识别。因此,将在转换时指定格式:
df["trending_date"] = pd.to_datetime(df.trending_date, format='%y.%d.%m')
类别映射:category_id列有1到44之间的数字。顾名思义,这些是视频类别的ID。这些包括娱乐、新闻、电影或预告片。在Kaggle数据集中,有一个名为IN_category_id.json的JSON文件,其中包含这些ID与印度相关类别的映射。在下面的代码中,加载JSON文件,提取所需信息,然后进行更改:
with open("IN_category_id.json", 'r') as f:
categories = json.load(f)
mappedCategories = {}
for i in categories['items']:
mappedCategories[i['id']] = i['snippet']['title']
df['category_id'] = df.category_id.astype(str).map(mappedCategories)
有足够的特征可以为各种类型的图表绘制。让看看如何使用Bokeh库实现每种类型的图表。
使用以下代码行将图表的主题设置为暗模式:
from bokeh.io import curdoc
curdoc().theme = 'dark_minimal'
在这个条形图中,将绘制频道名称以及它们在趋势部分出现的次数。许多独特的频道出现在趋势部分,因此,为此设置了两个标准。第一,它们的计数应该大于150,并且缩小到前10个条目。
from bokeh.io import show
from bokeh.plotting import figure
temp = df.channel_title.value_counts()[df.channel_title.value_counts() > 150][:10]
fig = figure(x_range=temp.index.tolist(), title="进入趋势列表的主要频道", plot_width=950)
fig.vbar(x=temp.index.tolist(), top=temp.values.tolist(), width=0.9)
fig.ygrid.visible = False
fig.xgrid.visible = False
fig.xaxis.major_label_orientation = pi/4
fig.xaxis.axis_label = '频道'
fig.yaxis.axis_label = '在趋势中的次数'
show(fig)
2. 饼图
饼图有助于查看类别在特征中的贡献。每个类别所覆盖的区域有助于确定该类别对其他类别的整体影响。它可以被称为百分比的可视化呈现。在下面的图表中,正在查看进入趋势部分的不同视频类别。
from bokeh.io import show
from bokeh.palettes import Category20c
from bokeh.plotting import figure
from bokeh.transform import cumsum
temp = df.category_id.value_counts()
data = pd.Series(temp).reset_index(name='value').rename(columns={'index':'categories'})
data['angle'] = data['value']/data['value'].sum() * 2*pi
data['color'] = Category20c[len(temp)]
p = figure(title="类别对趋势部分的贡献", toolbar_location=None, tools="hover", tooltips="@categories: @value")
p.wedge(x=0, y=1, radius=0.6, start_angle=cumsum('angle', include_zero=True), end_angle=cumsum('angle'), line_color="white", fill_color='color', legend_field='categories', source=data)
p.axis.axis_label=None
p.axis.visible=False
p.grid.grid_line_color = None
show(p)
可以清楚地看到,娱乐视频在趋势部分中最为常见。
散点图非常有用,可以分析一系列值上的趋势。在下面的图表中,查看特定一天趋势的视频数量。需要注意的是,日期列不支持作为字符串类型的悬停工具,因此不得不创建一个单独的列,其中包含日期的字符串类型。看下面的实现:
from bokeh.plotting import figure, show
from bokeh.models import DatetimeTickFormatter
temp = df.trending_date.value_counts()
data = pd.Series(temp).reset_index(name='value').rename(columns={'index':'dates'})
data['hoverX'] = data.dates.astype(str)
p = figure(title="每天的趋势视频", x_axis_type="datetime", tools="hover", tooltips="@hoverX: @value")
p.scatter(x='dates', y='value', line_width=2, source=data)
p.xaxis.major_label_orientation = pi/4
p.xaxis.axis_label = '时间线'
p.yaxis.axis_label = '趋势视频数量'
show(p)
看了这些代码,可能会认为这不是一个简单的任务,需要为图表的每个元素输入很多内容。这就是为什么大多数用户使用pandas-bokeh,它提供了Bokeh绘图后端到pandas。它非常容易使用,不需要这么多代码!
Pandas-Bokeh是一个很棒的模块,允许直接从数据帧中绘制Bokeh图表,包括所有的悬停工具、标记轴等!首先,需要安装这个模块:
import pandas_bokeh
接下来,还需要在笔记本中设置这些图表的输出:
pandas_bokeh.output_notebook()
看一个示例图表(使用pandas-bokeh):
df['comments_disabled'].value_counts().plot_bokeh(kind='pie', title='评论是否被禁用?')