数据科学项目中的数据可视化

数据可视化数据科学项目中一个至关重要的阶段。它允许研究者快速浏览数据集,并制定出所有可能的数据操作策略。目前市场上有许多可视化库。在数据科学项目的初期阶段,可能已经熟悉了matplotlib或seaborn。每个初学者都是从这些库开始的,它们确实是理解绘图本质和发现不同类型图表的好起点。随着在探索之旅中不断进步,总是希望在新技能方面提升自己,这就是本文将为当前知识库增加新技能的地方!

Bokeh库简介

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='评论是否被禁用?')
  • LinkedIn –
  • Twitter –
  • GitHub –
  • Medium –
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485