使用Python分析Box Office Mojo的周末票房数据(第1部分)

我是电影迷,我通常每周都会拜访我当地的电影院。 最重要的是,我经常花时间看电影评论,然后每天晚上睡觉。 幸运的是,一个晚上我碰到了一个名为Box Office Mojo的网站,分析某些电影数据的想法立刻浮出水面。

首先,最重要的是,该项目的前提条件是您对网络抓取的工作原理有一些基本的了解,并且对Pandas和matplotlib有一定的了解。 在计算机上安装Jupyter Notebook也很重要。

因此,让我们首先导入一些软件包:

 导入熊猫作为PD #数据分析 
导入请求#获取网址
从bs4导入BeautifulSoup作为bs #数据抓取
导入matplotlib.pyplot作为plt #数据可视化
导入日期时间#检查星期数

要连接Box Office Mojo,我们可以使用request。 在这里,我为此任务编写了一个简单的函数,因为我们稍后将需要在该项目中重用此步骤。

  def get_site(星期,年份): 
html ='http://www.boxofficemojo.com/weekend/chart/?yr= {}&wknd = {}&p = .htm'.format(年,周)
r = request.get(html)
返回r.content

通过输入星期数和年份,get_site将返回网站的原始内容。 然后,我们需要解析从网站获得的内容。

  def parse_source(page_source): 
#使用bs4在请求的页面中搜索表。
page_soup = bs(page_source,“ lxml”)
table = page_soup.find_all('table',attrs = {'cellspacing':'1'})
表格=表格[0]
output_columns = ['TW','LW','Title','Studio',
'Weekend_Gross / $','%_ Change',
'Theater_Count','Theater_Change','Average / $',
'Total_Gross / $','预算','num_week']
输出= dict((x,[]]对于output_columns中的x)
#获取表中所有行的内容。
all_rows = table.find_all('tr')[1:106]
#让我们来获得排名前50位的电影。
用于all_rows [:50]中的行:
row_cols = row.find_all('td')
对于dict_key,zip中的col(output_columns,row_cols):
输出[dict_key] .append(col.text)
#输出将是一个数据框
output_pd = pd.DataFrame(output)[output_columns]
返回output_pd

在此处的parse_source函数中,使用bs4来获取表中的所有数据,并且可以解析出所有不相关的数据。 然后,使用一个列表为我们要保留的数据创建列名。 接下来,找到所有行中的数据并将其作为值存储在字典中,并以output_columns作为键。 最后,字典(输出)被转换为数据框。

在开始整个过程​​之前,仍然需要进行一些清洁工作。

  def df_format(main_df): 
change_columns1 = ['Weekend_Gross / $','Average / $',
'Total_Gross / $','%_Change']
change_columns2 = ['Theater_Change','Theater_Count']
change_columns3 = ['num_week','TW']
main_df.drop('Budget',axis = 1,inplace = True)for change_columns1中的i:
如果我!='%_Change':
main_df.loc [:, str(i)] = main_df.loc [:, str(i)]。\
str.replace(',','')
main_df.loc [:, str(i)] = main_df.loc [:, str(i)]。\
str.replace('$','')
main_df.loc [:, str(i)] = main_df.loc [:, str(i)]。\
astype(int)
其他:
main_df.loc [:, str(i)] = main_df.loc [:, str(i)]。\
str.replace('%','')
main_df.loc [:, str(i)] = main_df.loc [:, str(i)]。\
str.replace(',','')
main_df.loc [:, str(i)] = main_df.loc [:, str(i)]。\
replace('-',0)
main_df.loc [:, str(i)] = main_df.loc [:, str(i)]。\
在change_columns2中b的astype(float):
如果b =='Theater_Count':
main_df.loc [:, str(b)] = main_df.loc [:, str(b)]。\
str.replace(',','')
main_df.loc [:, str(b)] = main_df.loc [:, str(b)]。\
astype(int)
elif b =='Theater_Change':
main_df.loc [:, str(b)] = main_df.loc [:, str(b)]。\
str.replace(',','')
main_df.loc [:, str(b)] = main_df.loc [:, str(b)]。\
replace('-',0)
main_df.loc [:, str(b)] = main_df.loc [:, str(b)]。\
change_columns3中c的astype(int):
main_df.loc [:, str(c)] = main_df.loc [:, str(c)]。astype(int)
main_df.set_index('TW',inplace = True)
返回main_df

该功能看起来有些混乱,而且我知道还有更优雅的解决方案可以清理和格式化数据,但是它可以工作。 尽管如此,我们准备去这里。

  #找出最近一个周末的星期数,它是40 datetime.date(2018,10,6).isocalendar()[1] #使用先前编写的函数获取数据 new = get_site(40,2018) 
main_df = parse_source(新)
main_df = df_format(main_df)
main_df

这将为我们返回一个已清理的数据框,它看起来应该像这样。

这些数据中大多数的含义是不言而喻的,但这里需要注意:TW表示本周的票房排名,LW表示上周的票房排名,LW列中的N表示这对本周末来说是新的。 现在,让我们调查每个工作室在第40周的表现。

  #Groupby Studio并计算票房总和。 
#然后按升序对值进行排序。week40= pd.DataFrame(main_df.groupby('Studio')['Weekend_Gross / $']。\
和())。\
sort_values('Weekend_Gross / $',ascending = False)
周40.head(10)

从上表中可以看出,索尼的表现确实不错,但这主要是由于其新的“毒液”电影。

在下一部分中,我们将从其他周末获得更多票房数据,并进行更深入的研究,以了解迄今为止各大电影制片厂在2018年的表现。 完整的教程可以在下面的链接中找到:

situkun123 / Moive_mojo_project

从Moive Mojo网站获得票房数据的项目– situkun123 / Moive_mojo_project

github.com

Box Office Mojo项目第二部分的链接:

https://medium.com/@kunsitu/analysing-weekend-box-office-data-from-box-office-mojo-by-using-python-part-2-a1687e8553f1

同时,如果您喜欢本文,请与您的朋友分享。