前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >分析你的个人Netflix数据

分析你的个人Netflix数据

作者头像
磐创AI
发布2021-04-21 10:24:46
1.7K0
发布2021-04-21 10:24:46
举报

磐创AI分享

作者 | Pooja Rane

编译 | VK 来源 | Towards Data Science

我花了多少时间看老友记?

这是一个在过去几年里反复出现在我脑海中的问题。很长一段时间以来,情景喜剧一直是我的首选。

这曾经是一个我无法回答的问题,因为Netflix允许用户下载的与活动相关的数据非常有限。

时代变了,现在,Netflix允许你下载一个名副其实的关于你账户的数据宝库。通过使用Python和Pandas编程,我们现在可以得到这个问题的具体答案:我花了多少时间看《老友记》?我们来看看吧。

第1步:下载Netflix数据

请确保你已通过浏览器登录到Netflix,然后访问此页面。在Netflix主屏幕上,你还可以通过单击右上角的帐户图标,单击“帐户”,然后单击加载页面上的“下载你的个人信息”来找到此页面。

在下一页,你将看到:

单击“提交请求”。Netflix会给你发一封确认邮件,你需要点击。那么,不幸的是,你必须等待。Netflix说,准备一份数据报告可能需要30天。我在24小时内拿到了报告。报告准备好后,你将收到一封电子邮件。当它是,行动迅速,因为再过几个星期,下载将“过期”,

下载数据将以.zip文件的形式到达,该文件包含大约十几个文件夹,其中大部分包含.csv格式的表。

第2步:熟悉数据

这是数据分析过程中的关键步骤。我们对数据理解得越好,就越有可能进行有意义的分析。

让我们看看我们有什么。下面是我们解压时将看到的内容。

我们的主要目标是弄清楚我花了多少时间看Netflix。内容交互似乎是最有可能包含数据的文件夹。如果我们打开它我们会找到一个叫做ViewingActivity.csv“这看起来和我们想要的一模一样——一份我们在账户历史上查看过的所有内容的日志。

第3步:把你的数据加载到一个Jupyter笔记本中

我们将导入pandas库并将Netflix数据CSV读入pandas数据框:

代码语言:javascript
复制
import pandas as pd
df = pd.read_csv('ViewingActivity.csv')

现在,让我们快速预览一下数据,以确保一切看起来都是正确的。我们先使用shape,它将告诉我们行和列的数量。

代码语言:javascript
复制
df.shape

(12098, 10)

这个结果意味着我们有12098行和10列。现在,让我们通过使用head().

代码语言:javascript
复制
df.head(2)

看起来棒极了!

第4步:准备数据分析

在我们进行数字运算之前,让我们先清理一下这些数据,使其更易于处理。

删除不必要的列(可选)

首先,我们将从删除不打算使用的列开始。这是完全可选的,对于大型或正在进行的项目来说,这可能不是一个好主意。但是对于这样一个小规模的个人项目,使用一个只包含我们实际使用的列的数据框是很好的。

在本例中,我们计划分析我观看了多少以及何时观看了Office,因此需要保留“Start Time”、“持续时间”、“标题”和“国家”列。其他的都可以。

为此,我们将使用df.drop()并传递两个参数:

  1. 我们要删除的列的列表
  2. axis=1,指示pandas删除列

下面是它的样子:

代码语言:javascript
复制
df = df.drop(['Profile Name', 'Attributes','Supplemental Video Type','Device Type','Bookmark','Latest Bookmark'],axis=1)

df.head(1)

将字符串转换为Pandas中的Datetime和Timedelta

我们两个时间相关列中的数据看起来确实正确,但是这些数据实际存储的格式是什么?我们可以用df.dtypes快速获取数据框中每列的数据类型列表,执行:

代码语言:javascript
复制
df.dtypes

正如我们在这里看到的,这三列都存储为object,这意味着它们是字符串。对于Title列来说这很好,但是我们需要将两个与时间相关的列更改为正确的数据类型,然后才能使用它们。

具体来说,我们需要做到以下几点:

  • 将Start Time转换为datetime(pandas可以理解和执行计算的数据和时间格式)
  • 将Start Time从UTC转换为本地时区
  • 将持续时间转换为timedelta(pandas可以理解并执行计算的持续时间格式)

所以,让我们按照这个顺序来处理这些任务,首先使用pandas将Start Time通过pd.to_datetime()转换为DateTime

我们还将添加可选参数utc=True,以便DateTime数据附带utc时区。这很重要,因为我们需要在下一步将其转换为不同的时区。

然后我们就再一次运行df.dtypes,确认这一切都如预期的那样有效。

代码语言:javascript
复制
df['Start Time']= pd.to_datetime(df['Start Time'], utc =True)
df.dtypes

现在我们得到了正确格式的列,是时候改变时区。

我们可以使用.tz_convert()将DateTime转换为任何时区,并将参数与要转换为的时区的字符串一起传递给它。在这种情况下,这是'US/Eastern'。为了找到你的特定时区,这里有一个方便的参考TZ时区选项:https://en.wikipedia.org/wiki/List_of_tz_database_time_zones

这里比较棘手的一点是,我们只能对DatetimeIndex使用.tz_convert(),因此在执行转换之前,我们需要使用set_index()将Start Time列设置为索引。

在本教程中,我们随后将使用reset_index()将其转换回常规列。根据你的偏好和目标,这可能不是必需的,但是为了简单起见,我们将尝试使用列中的所有数据进行分析,而不是将其中的一些数据作为索引。

代码:

代码语言:javascript
复制
# 将“Start Time”列更改为数据帧的索引
df = df.set_index('Start Time')

# 从UTC时区转换为东部时间
df.index = df.index.tz_convert('US/Eastern')

# 重置索引,使“Start Time”再次成为一列
df = df.reset_index()

# 仔细检查它是否有效
df.head(1)

我们可以看到这是正确的,因为数据集中的前一行的Start Time是2020-10-29 03:27:48。美国东部时区比UTC晚5个小时,所以我们可以看到我们的转换是正确的!

现在,让我们来处理我们的Duration列。这与我们在转换Start Time列时所做的非常相似。我们只需要pd.to_timedelta()并将要转换的列传递给参数。再一次,我们将使用df.dtypes快速检查我们的工作。

代码语言:javascript
复制
df['Duration']= pd.to_timedelta(df['Duration'])
df.dtypes

完美!但我们还有一个数据准备任务要处理:过滤标题列

我们有很多方法可以进行过滤,但是出于我们的目的,我们将创建一个名为friends的新数据框,并仅用标题列包含“friends”的行填充它。

我们使用str.contains(),给出两个参数:

  • “Friends”,这是我们用来挑选Friends片段的子字符串。
  • regex=False,它告诉函数前一个参数是字符串而不是正则表达式。

以下是实际操作中的情况:

代码语言:javascript
复制
friends = df[df['Title'].str.contains('Friends',regex=False)]
friends.shape

(1801, 4)

在我们真正深入分析之前,我们应该做最后一步。在我们的数据探索中,我们注意到当某些内容(如章节预览)在主页上自动播放时,它将被视为我们数据中的视图。

然而,只看两秒钟的预告片和真正看一部电视剧是不一样的!因此,让我们进一步过滤friends数据帧,将Duration限制大于1分钟。这将有效地计算观看部分剧集的时间,同时过滤掉那些短的、不可避免的“预览”视图。

再一次,friends.head()或friends.sample()是检查我们工作的好方法,但为了保持隐私,我将再次使用df.shape以确认某些行已从数据框中删除。

代码语言:javascript
复制
friends = friends[(friends['Duration']> '0 days 00:01:00')]
friends.shape

(1542, 4)

看起来不错,让我们继续有趣的事情吧!

第5步:分析数据

当你意识到你花了多少时间看同一个节目。

我花了多少时间看老友记?

因为我们已经得到了pandas可以计算的持续时间列格式,所以回答这个问题非常简单。我们可以使用.sum将总持续时间相加:

代码语言:javascript
复制
friends['Duration'].sum()

Timedelta('17 days 05:26:30')

所以,我花了17天05小时26分30秒在Netflix上看老友记。很多。

在我看来,在10年的时间里,而且其中很大一部分时间并没有积极地观看!尤其是当我在做不需要脑力的工作,吃东西的时候。

我什么时候看《老友记》?

让我们用两种不同的方式来回答这个问题:

  • 一周中哪几天我看的电视剧最多?
  • 我最常在一天中的哪几个小时开始?

我们将从一个小的准备工作开始,这将使这些任务更加简单:为“weekday”和“hour”创建新的列。.dt.weekday和.dt.hour在Start Time列上执行此操作,并将结果分配给名为weekday和hour的新列:

代码语言:javascript
复制
friends['weekday'] = friends['Start Time'].dt.weekday
friends['hour'] = friends['Start Time'].dt.hour
friends.tail(1)

现在,让我们做一点分析!这些结果将更容易直观地理解,因此我们将首先使用%matplotlib使图表显示在我们的Jupyter笔记本中。然后,我们将导入matplotlib。

代码语言:javascript
复制
%matplotlib inline
import matplotlib

现在,让我们绘制一张我的观看习惯图表。为此,我们需要完成以下几个步骤:

  • 告诉pandas我们要用哪一天的顺序pd.Categorical-默认情况下,它会根据每天观看的剧集数量按降序绘制,但在查看图表时,按周一到周日的顺序查看数据会更直观。
  • 数一数我每天看的剧集总数
  • 对数据进行排序和绘图

(当然,我们还有许多其他方法可以用来分析和可视化这些数据。)

让我们一步一步来看看它的样子:

代码语言:javascript
复制
# 设置我们的分类并定义顺序,以便将日期绘制为星期一到星期日
friends['weekday']=pd.Categorical(friends['weekday'],categories=[0,1,2,3,4,5,6],ordered=True)

# 按天创建老友记并计算每个工作日的行数,将结果分配给该变量
friends_by_day = friends['weekday'].value_counts()

# 使用我们的分类法对索引进行排序,以便星期一(0)是第一个,星期二(1)是第二个,等等。
friends_by_day = friends_by_day.sort_index()

# 可选:更新字体大小,使它更大一点,更容易阅读
matplotlib.rcParams.update({'font.size':15})

# 以条形图的形式按天打印老友记,并列出大小、标题和标签
g= friends_by_day.plot(kind='bar', figsize=(10,5), title = 'Friends watched by day');
g.set_xlabel('Mon - Sun');

正如我们所看到的,我实际上倾向于在周末看比平日更多的节目。在这一周里,也有大量的时间主要花在吃东西或只是作为背景噪音。

现在,让我们按小时看一看相同的数据。这里的过程与我们刚才所做的非常相似:

代码语言:javascript
复制
# 设置我们的分类并定义顺序,这样时间就被标为0-23
office['hour'] = pd.Categorical(office['hour'], categories=
friends['hour']=pd.Categorical(friends['hour'],categories=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23],ordered=True)

# 按小时创建老友记,并计算每小时的行数,将结果分配给该变量
friends_by_hour = friends['hour'].value_counts()

# 使用我们的分类法对索引进行排序,以便午夜(0)是第一个,凌晨1点(1)是第二个,等等。
friends_by_hour = friends_by_hour.sort_index()

# 以条形图的形式按小时绘制办公室图,并列出大小、标题和标签
h=friends_by_hour.plot(kind='bar', figsize=(12,8), title = 'Friends episodes watched by hour');
h.set_xlabel('Views By Hour - AM to PM')

从数据上看,晚上9点到早上12点是我最常开始剧集的时间。这是由于我(不健康的)习惯,在睡觉的时候把节目当作噪音来播放——其中很多片段可能是在我睡觉的时候自动播放的!

关键要点

在这篇文章中,我们快速浏览了Netflix的一些个人数据。但是从这里你可以利用本文分析的方法做很多事!以下是一些为自己扩展这个项目的想法:

  • 为另一个节目做同样或类似的分析。
  • 找出你看得最多和最少的特定剧集
  • 创建更漂亮的图表

你也可以尝试一些其他有趣的项目使用你自己的个人资料。例如:

  • 使用Python了解你在Amazon上花了多少钱
  • 使用Python分析你的Facebook发帖习惯

把你学到的东西用于实际应用总是一个好主意。还有什么比从你每天遇到的事情开始更好呢。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-04-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 磐创AI 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 磐创AI分享
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档