版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
湖南商务职业技术学院毕业设计
目录
1引言1
1.1项目背景1
1.2开发环境与工具1
1.2.1Python简介1
1.2.2Pandas简介1
1.2.3Pyecharts简介2
2需求分析2
2.1可行性需求分析2
2.2采集目标功能分析3
2.3关键技术分析3
2.3.1网络爬虫技术3
2.3.2文件存取技术3
2.3.3可视化技术3
3数据采集4
3.1采集页面分析4
3.2获取分类列表5
3.3多线程爬虫6
3.4翻页处理7
3.5获取电影字段并保存8
4数据清洗与处理11
4.1数据清洗需求11
4.2数据清洗11
4.3读取文件并处理数据12
4.4保存到MySQL数据库12
5数据统计与分析15
5.1数据读取15
5.2数据展示15
I
湖南商务职业技术学院毕业设计
5.2.1统计每个电影分类的数量和平均评分15
5.2.2统计每年上映的电影数量和平均评分17
5.2.3统计每个国家上映电影的数量18
5.2.4统计出演电影最多的10个演员20
5.3数据分析21
6小结22
参考资料23
II
湖南商务职业技术学院毕业设计
豆瓣电影数据采集与分析
1引言
豆瓣电影作为国内知名的电影评价和推荐平台,包含了大量的电影信息和
用户评价,具有很高的价值和应用前景。对于电影爱好者和业内人士而言,了
解豆瓣电影网站上电影的评分、评论、票房等信息,可以为电影的制作、推广
和上映提供重要的参考依据。
因此,通过对豆瓣电影网站数据的采集和分析,可以帮助电影从业者和电
影爱好者深入了解电影市场的发展趋势、用户偏好、口碑评价等方面的信息,
进而为电影制作、发行和推广提供科学的数据支持。
1.1项目背景
豆瓣是中国知名的影视、图书、音乐等文化类产品评分、评论和分享平台
之一,其中豆瓣电影是其最具代表性的产品之一。豆瓣电影提供了大量的电影
信息,包括电影名称、导演、演员、上映时间、评分等,这些数据为研究电影
市场、电影观众等提供了宝贵的资源。因此,对豆瓣电影网站进行数据采集和
分析有着广泛的应用价值。
通过对豆瓣电影网站数据的采集、清洗和分析,探索豆瓣电影网站的电影
评分分布情况、热门电影的特征、不同国家和地区电影的产出情况等,为电影
从业者、影评人、电影爱好者等提供有益的信息和参考。同时,本项目的实现
也涉及了多种数据处理和分析技术,有助于提升数据分析技能和应用能力。
1.2开发环境与工具
1.2.1Python简介
Python是一种高级编程语言,广泛用于数据科学、机器学习、Web开发等
领域。Python的易用性、可读性和丰富的第三方库使其成为数据科学和数据分
析的热门语言之一。
1.2.2Pandas简介
Pandas是一个开源的Python数据分析库,它提供了快速、灵活、简单的数
据结构,用于处理和分析结构化数据。Pandas主要提供了两种数据结构:Series
1
湖南商务职业技术学院毕业设计
和DataFrame。在数据分析中,Pandas可以帮助我们进行数据预处理、数据清
洗和数据探索性分析。在数据可视化中,我们可以使用Pandas与Matplotlib
或Seaborn等库进行数据可视化。总之,Pandas是Python数据分析领域的重要
工具之一,广泛应用于数据清洗、处理、分析和可视化。
1.2.3Pyecharts简介
Pyecharts是一个基于Python的数据可视化库,它的目标是成为Python数
据可视化领域的工具之一。Pyecharts具有开箱即用、易于使用、高度定制和美
观的图表等特点。该库包含了各种图表类型,例如折线图、散点图、饼图、词
云图等。它的另一个重要功能是可以与Pandas等常见的数据分析库配合使用,
使得数据处理和可视化更加方便快捷。Pyecharts采用了Echarts的JavaScrip
t库作为其底层图表库,这使得它可以生成高质量的交互式图表。
2需求分析
2.1可行性需求分析
数据获取可行性:豆瓣电影网站提供了公开的API接口,但是限制了请求
频率和返回数据的数量,因此需要采用爬虫技术来获取更为详细的数据。通过
分析豆瓣电影网站的网页结构,可以确定采用Python的爬虫框架来实现数据的
获取。
数据存储可行性:获取到的数据需要进行存储和管理,常见的数据存储方
式包括文本文件、CSV文件、Excel文件、MySQL等。针对本项目,可以使用MySQL
数据库来存储和管理采集到的数据。
数据清洗可行性:从豆瓣电影网站获取到的数据往往存在缺失、重复、格
式不统一等问题,因此需要进行数据清洗和预处理。Pandas提供了大量的数据
处理和清洗函数,可以有效地解决这些问题。
数据分析可行性:获取和清洗完数据后,需要进行数据分析来发现数据之
间的关联性和规律性。Pandas提供了各种数据分析函数,可以帮助用户进行数
据分析和挖掘。
数据可视化可行性:通过数据可视化,可以更直观地展现数据分析结果,
Pandas结合Matplotlib、Seaborn、Plotly等可视化工具可以提供丰富的数据
可视化效果。
2
湖南商务职业技术学院毕业设计
2.2采集目标功能分析
豆瓣电影网站数据采集与分析的采集目标功能分析如下。
获取电影基本信息:电影名称、导演、演员、上映时间、评分等。
获取电影详细信息:剧情简介、演职人员、电影标签、制片国家等。
爬取电影评论:用户评论、评分等信息。
爬取演员详细信息:演员个人信息、出演电影列表等。
以上功能可以通过豆瓣电影网站的API或者页面爬取实现,可以为后续的
数据分析提供基础数据。
2.3关键技术分析
2.3.1网络爬虫技术
网络爬虫技术是一种自动化获取互联网数据的技术,通常用于从网页中提
取所需信息。通过访问网站并解析网页内容,网络爬虫可以自动抓取和提取所
需的数据,如文本、图片、视频等。网络爬虫技术已经成为许多领域的重要工
具,如商业数据分析、学术研究、新闻聚合、社交媒体分析等。但是,网络爬
虫技术的使用需要遵守相关法律法规和道德规范,同时应尊重网站的隐私和版
权,不进行恶意访问和数据滥用。
2.3.2文件存取技术
MySQL是一种流行的关系型数据库管理系统,常用于Web应用程序的开发
和管理。MySQL数据库使用文件存储数据,每个数据库都是一个目录,其中包
含多个文件,包括表结构和数据。MySQL还支持多种存储引擎,包括InnoDB
和MyISAM等,这些引擎对文件的组织和管理方式不同,可以根据需要选择适
合的引擎。MySQL还支持事务处理和索引优化等功能,使得它成为处理大型数
据集的理想选择。
2.3.3可视化技术
可视化技术是指通过图形化方式将数据呈现出来,帮助人们更好地理解和
分析数据。可视化技术通常包括图表、图像、地图等形式。它的优点在于能够
让人们更直观地了解数据,并快速发现数据中的模式和趋势。在数据分析领域,
可视化技术可以帮助人们更好地理解数据,从而做出更准确的决策。在现代数
3
湖南商务职业技术学院毕业设计
据处理技术的发展中,可视化技术成为数据处理技术不可或缺的一环,它可以
使复杂数据变得易于理解和应用。
3数据采集
3.1采集页面分析
本次数据采集的网站是豆瓣电影网,该网站中有各个分类的电影排行榜数
据,如下图3-1所示:
图3-1电影排行榜分类
点击其中的分类可以跳转到对应的排行榜中,电影按照评分升序排序,每
一页显示20条记录。如点击“剧情”排行榜,如下图3-2所示。
图3-2剧情类别排行榜
在向下浏览页面的过程中,页面会自动刷新,并请求下一页数据,根据这
个规则后续可以指定相应的翻页策略。
4
湖南商务职业技术学院毕业设计
需要采集的字段有:电影ID、电影名、电影类别、评分、类别列表、上映
时间、国家、排名、演员列表。了解网站结构之后,需要弄清数据使用哪个接
口返回的,打开浏览器开发者工具进行抓包分析,发现数据是从top_list接口
返回的,如下图3-3所示。
图3-3抓包分析
在请求该接口时,通过改变传入的参数请求到对应页面,其中type表示分
类编号、start表示从多少条记录开始,limit表示返回多少条数据。
3.2获取分类列表
通过初步的网页结构分析,已经基本明确的爬虫的策略,所有请求排行榜
首页,使用xpath获取到所有的分类url和分类名称,如下图3-4所示。
图3-4各分类所在的html标签
获取分类列表的代码如下所示:
defget_type_and_name(self):
response=requests.get(self.start_url,headers=self.headers)
html=etree.HTML(response.text)
category_url_list=html.xpath('//div[@class="types"]/span/a/@href')
category_name_list=html.xpath('//div[@class="types"]/span/a/text()')
type_and_name=list(
zip(map(lambdax:re.search(r"type=(\d+)",x).group(1),category_url_list),
category_name_list))
5
湖南商务职业技术学院毕业设计
returntype_and_name
这段代码是一个DoubleSpider类的中的方法,用于从指定的网页中获取电
影分类的名称和对应的URL。以下是对代码的详细解释。
使用requests库发送GET请求,获取指定URL的网页内容,
self.start_url为类的实例变量,存储了起始URL,self.headers为类的实例
变量,存储了HTTP请求头部信息,包括User-Agent等。
etree.HTML(response.text):使用lxml库中的etree模块将网页内容解析成
HTML文档。
使用XPath表达式提取HTML文档中所有分类URL所对应的属性href的值。
具体来说,该XPath表达式选取了所有具有class属性为types的div标签的
子元素span标签下的a标签,然后获取这些a标签的href属性的值。
使用XPath表达式提取HTML文档中所有分类名称所对应的文本值。与获取
a标签的步骤类似,该XPath表达式选取了所有具有class属性为types的div
标签的子元素span标签下的a标签,然后获取这些a标签的文本值。
最后将type的值和分类名称以元组的形式保存到列表中返回,以便于后续
方法使用。
3.3多线程爬虫
由于每个分类的电影数据量较大,并且涉及到的分类数据较多,如果使用
传统的单线程爬虫效率会极低,为了能够高效率采集数据,这里使用多线程爬
虫。多线程爬虫代码如下所示。
defrequest_category(self):
Thread=[]
type_and_name=self.get_type_and_name()
foritemintype_and_name:
type=item[0]
name=item[1]
print("采集类别{name}".format(name=name))
t1=threading.Thread(target=self.turn_page,args=(type,name,1))
Thread.append(t1)
fortinThread:
t.start()
6
湖南商务职业技术学院毕业设计
fortinThread:
t.join()
这段代码实现了对豆瓣电影网站的所有分类进行多线程采集数据。以下是
对代码的详细解释。
Thread=[]:创建一个空列表Thread,用于存储线程对象。
调用类的get_type_and_name()方法,获取所有电影分类的名称和URL,存
储在type_and_name变量中。
foritemintype_and_name::对type_and_name中的每个元素执行循环,
其中item表示当前元素,其值为一个包含分类ID和分类名称的元组。
type=item[0]和name=item[1]:从当前元组中分别获取分类ID和分类
名称,存储在变量type和name中。
t1=threading.Thread(target=self.turn_page,args=(type,name,1)):
创建一个新的线程对象t1,并将其赋值给变量t1。target参数指定线程要执行
的目标函数,即turn_page()方法;args参数为一个元组,其中包含turn_page()
方法需要的参数,分别为分类ID、分类名称和起始页码。
Thread.append(t1):将线程对象t1添加到Thread列表中。fortin
Thread::对Thread列表中的每个线程对象执行循环,其中t表示当前线程对
象。t.start():启动当前线程对象。fortinThread::对Thread列表中的每
个线程对象执行循环,其中t表示当前线程对象。t.join():等待当前线程对
象执行完毕。
这段代码实现了多线程采集豆瓣电影网站的所有分类数据,通过对每个分
类开启一个线程来提高采集效率。采集过程中,会打印正在采集的分类名称,
方便用户了解当前采集进度。
3.4翻页处理
通过改变top_list接口的start参数和limit参数控制翻页。如下图3-5
所示:
7
湖南商务职业技术学院毕业设计
图3-5top_list接口参数
通过编写turn_page方法实现翻页,代码如下所示。
defturn_page(self,type,name,page):
self.param.update(type=type,name=name)
print("采集第{page}页".format(page=page))
try:
self.get_data(name)
start=self.param['start']
self.param.update(start=start+20)
self.turn_page(type,name,page+1)
exceptExceptionase:
print("err===>",e)
这段代码实现了采集豆瓣电影网站某个分类下的所有电影数据,包括电影
名称、评分、导演、主演、制片国家、年份等信息。
self.param.update(type=type,name=name):将分类ID和分类名称添加到请求
参数self.param中。self.get_data(name):调用类的get_data()方法,采集
当前页的电影数据,其中name参数表示当前分类名称。
start=self.param['start']和self.param.update(start=start+20):
从请求参数self.param中获取当前页码,将页码加20后再次添加到请求参数
self.param中,以便获取下一页数据。
self.turn_page(type,name,page+1):递归调用turn_page()方法,传
入分类ID、分类名称和下一页码,以采集下一页数据。
这段代码实现了递归方式采集某个分类下的所有电影数据,每次采集一页
数据,然后自动跳转到下一页继续采集,直到采集完所有页面为止。递归的过
程中,会输出正在采集的页码,方便用户了解当前采集进度。
3.5获取电影字段并保存
电影的各个字段都保存在top_list的response对象中,response的返回
值是一个json对象,通过使用python的json解析库处理json对象,可以使
用python字典取值的方式将各个字段取出。如下图3-6所示。
8
湖南商务职业技术学院毕业设计
图3-6response返回值
通过编写get_data来解析各个字段,代码如下所示。
defget_data(self,name):
response=requests.get(self.data_url,params=self.param,headers=self.headers)
json_objs=json.loads(response.text)
forjson_objinjson_objs:
result={}
result["id"]=json_obj['id']
result["title"]=json_obj['title']
result["category"]=name
result["score"]=json_obj['score']
result["types"]="|".join(json_obj['types'])
result["release_date"]=json_obj['release_date']
result["regions"]="|".join(json_obj['regions'])
result["rank"]=json_obj['rank']
result["actors"]="|".join(json_obj['actors'])
result["actor_count"]=json_obj['actor_count']
print(result)
self.saveData(result)
iflen(json_objs)<20:
self.param.update(start=0)
raiseException("没有下一页了!")
这段代码实现了对某个分类下的一页电影数据进行解析和保存,其中包括
电影ID、电影名称、电影分类、电影评分、电影类型、上映日期、制片国家/地
区、排名、主演和主演人数等信息。以下是对代码的详细解释。
通过发送HTTPGET请求,获取当前页面的电影数据。将获取到的数据解析
9
湖南商务职业技术学院毕业设计
成JSON对象,以便后续操作。forjson_objinjson_objs::遍历JSON对象,
依次处理每个电影数据。result={}:创建一个字典,用于存储解析后的电影
数据。iflen(json_objs)<20::如果当前页面不足20条电影数据,则表示已
经到达最后一页。
编写saveData方法用于将数据保存到磁盘。代码如下所示。
defsaveData(self,result):
json_str=json.dumps(result,ensure_ascii=False)
withopen("doubanData2.json","a",encoding="utf-8")asf:
f.write(json_str+"\n")
这个方法实现了将采集到的电影信息写入到文件中的功能。具体的实现方
式是使用了Python内置的json模块将Python对象转换为JSON字符串,并将
其写入到文件中。这个方法的参数result是一个字典类型,包含了采集到的一
条电影信息,其中包括电影的id、标题、分类、评分、类型、上映日期、制片
国家/地区、排名、演员和演员人数等。在写入到文件时,首先将result转换
为JSON字符串,然后使用文件的追加模式a将其写入到文件中。由于在采集过
程中,可能会采集到相同的电影信息,为了避免重复写入,这里采用了追加换
行符\n的方式,以便于下一次写入时,能够写入到新的一行。如下图3-7所示。
图3-7doubanData.json文件
10
湖南商务职业技术学院毕业设计
4数据清洗与处理
4.1数据清洗需求
分析并总结出网站的数据清洗需求如下。
1)使用pandas读取json文件,并进行有效的数据清洗。
2)根据电影ID字段对数据进行去重处理。
3)将上映时间release_date字段切分成年月日三个字段。
4)将处理完成后的数据保存到MySQL中。
原始数据格式如下图4-1所示。
图4-1json格式
4.2数据清洗
数据清洗的过程从doubanData.json文件中读取数据,进行清洗,然后将
数据保存到MySQL中。具体的清洗过程可能包括去除重复行或列、删除无用的
列或行、处理缺失值、转换数据格式、合并、分组、排序等操作。清洗后的数
据可以更好地适应后续的数据分析和处理需求。
将数据保存到MySQL中可以更好地管理和分析数据,同时可以方便地与其
他数据进行关联分析。MySQL是一种流行的关系型数据库管理系统,它提供了许
多高级数据管理和分析工具,可以帮助我们更有效地处理和分析大量的数据。
通过将清洗过后的数据保存到MySQL中,我们可以更好地利用这些工具来分析
数据,揭示数据中的潜在模式和关系,以帮助我们做出更明智的商业决策。
11
湖南商务职业技术学院毕业设计
4.3读取文件并处理数据
Pandas是一个开源的Python数据分析库,提供了快速、灵活、易用的数据
结构和数据分析工具,被广泛应用于数据清洗、数据分析、数据可视化等领域。
使用pandas读取文件并进行处理,代码如下所示。
#读取json文件
df=pd.read_json('doubanData.json',lines=True,encoding="utf-8")
#数据清洗
df=df[['id','title','category','score','types','release_date','regions','rank','actors',
'actor_count']]
df.drop_duplicates(subset=['id'],keep='first',inplace=True)
df[['year','month','day']]=df['release_date'].str.split('-',expand=True)
df.drop('release_date',axis=1,inplace=True)
首先使用pandas的read_json函数读取名为doubanData.json的JSON文
件,并将其存储在名为df的pandasDataFrame中。lines=True表示每行数据
是一个JSON对象,而不是整个文件都是一个JSON对象。
将df中的列限制在指定的列名中,即id、title、category、score、
types、release_date、regions、rank、actors、actor_count。在dfDataFrame
中根据id列去除重复的行,保留第一行。inplace=True表示在原始DataFrame
中进行更改,而不是创建一个新的DataFrame。将df中的release_date列按照
-分割成year、month和day三列,并将它们分配给DataFrame中的新列。
最后在dfDataFrame中删除release_date列。axis=1表示列,而不是行。
inplace=True表示在原始DataFrame中进行更改,而不是创建一个新的
DataFrame。
4.4保存到MySQL数据库
数据清洗完成之后,为了便于后续的数据分析,需要将清洗之后的数据保
存到MySQL中,代码如下所示。
#连接MySQL数据库
conn=pymysql.connect(host='00',port=3306,user='root',password='mysql',
db='test',charset='utf8mb4')
12
湖南商务职业技术学院毕业设计
#UPDATEdouban_dataSETtitle=CONVERT(titleUSINGutf8mb4);
#建表语句
table_sql='''
CREATETABLEIFNOTEXISTS`douban_data`(
`id`varchar(50),
`title`varchar(255)CHARACTERSETutf8mb4,
`category`varchar(50)CHARACTERSETutf8mb4,
`score`float(2,1),
`types`textCHARACTERSETutf8mb4,
`regions`textCHARACTERSETutf8mb4,
`rank`int(11),
`actors`textCHARACTERSETutf8mb4,
`actor_count`int(11),
`year`varchar(4)DEFAULTNULL,
`month`varchar(2),
`day`varchar(2),
PRIMARYKEY(`id`)
)ENGINE=InnoDBDEFAULTCHARSET=utf8mb4COLLATEutf8mb4_unicode_ci;
'''
#执行建表语句
withconn.cursor()ascursor:
cursor.execute(table_sql)
#插入语句
insert_sql='''
INSERTINTO`douban_data`(`id`,`title`,`category`,`score`,`types`,`regions`,`rank`,
`actors`,`actor_count`,`year`,`month`,`day`)
VALUES(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)
'''
#执行插入语句
withconn.cursor()ascursor:
forrowindf.itertuples(index=False):
cursor.execute(insert_sql,row)
13
湖南商务职业技术学院毕业设计
#提交事务
mit()
#关闭数据库连接
conn.close()
这段代码是将清洗过的数据通过pymysql库连接MySQL数据库,并创建一
个名为"douban_data"的数据表。在创建表时,定义了表的字段名称、数据类型
和约束,并设置id字段为主键,保证数据的唯一性。接着,使用INSERTINTO
语句将清洗过的数据逐行插入到数据表中,完成数据的存储。在插入完成后,
通过mit()语句提交事务,保证数据的完整性。最后使用conn.close()
关闭数据库连接。
进入MySQL客户端,可以通过SQL查看数据是否正确导入,查看数据库表
语句如下图4-2所示。
图4-2查看douban_data表是否创建成功
查看数据是否正确导入,如下图4-3所示。
图4-3查看数据是否正确导入
14
湖南商务职业技术学院毕业设计
5数据统计与分析
5.1数据读取
MySQL是一种关系型数据库管理系统,是最流行的开源关系型数据库管理系
统之一。作为数据分析师,MySQL可以用来存储和管理各种数据,并对其进行各
种数据分析操作。在本项目中主要使用MySQL进行数据分析处理。
使用pyechart读取MySQL的分析结果,并进行可视化。Pyecharts是一个
基于Echarts.js的Python可视化库,它通过Python代码生成各种图表和地图,
还支持自定义主题、动态数据更新和大规模数据可视化等高级功能,可以满足
各种数据可视化需求。
5.2数据展示
5.2.1统计每个电影分类的数量和平均评分
编写SQL统计每个电影分类的数量和平均评分,如下所示:
SELECTcategory,COUNT(*)AScount,AVG(score)ASavg_score
FROMdouban_data
GROUPBYcategory
ORDERBYAVG(score)desc;
使用pyecharts绘制柱状图,通过pymysql库连接MySQL数据库,需要提
供数据库的IP地址、端口、用户名、密码、数据库名称和字符集等信息。构建
SQL查询语句,使用GROUPBY分组统计每个电影分类的数量和平均评分,再通
过ORDERBY对平均评分进行降序排序,以便在柱状图中展示。使用pandas库的
read_sql方法读取查询结果,将结果保存在DataFrame中。使用Pyecharts的
Bar方法创建一个柱状图实例bar。代码如下所示。
importpymysql
importpandasaspd
frompyecharts.chartsimportBar
frompyechartsimportoptionsasopts
conn=pymysql.connect(host='00',port=3306,user='root',password='mysql',
db='test',charset='utf8mb4')
sql='''
15
湖南商务职业技术学院毕业设计
SELECTcategory,COUNT(*)AScount,AVG(score)ASavg_score
FROMdouban_data
GROUPBYcategory
ORDERBYAVG(score)desc;'''
df=pd.read_sql(sql,conn)
bar=Bar()
bar.add_xaxis(df['category'].tolist())
bar.add_yaxis('数量',df['count'].tolist(),label_opts=opts.LabelOpts(is_show=False))
bar.add_yaxis('平均评分',df['avg_score'].tolist(),label_opts=opts.LabelOpts(is_show=False))
bar.set_global_opts(
title_opts=opts.TitleOpts(title='电影分类数量和平均评分'),
yaxis_opts=opts.AxisOpts(name='数量/平均评分'),
xaxis_opts=opts.AxisOpts(name='分类'),)
bar.render('movie_category.html')
conn.close()
柱状图如下图5-1所示。
图5-1统计每个电影分类的数量和平均评分
从数据中可以看出,纪录片是最受欢迎的电影类别之一,共有212部电影,
平均评分为8.98分。这表明观众对于真实事件的关注和认知程度较高。电影数
量排名前三的电影类型分别是剧情、喜剧和动作。这些电影类型都是传统意义
上的大众电影,是观众们最熟悉的电影类型。但是平均评分中,动画、冒险和
16
湖南商务职业技术学院毕业设计
纪录片等非传统电影类型也有较高的评分。
5.2.2统计每年上映的电影数量和平均评分
编写SQL统计每年上映的电影数量和平均评分,SQL如下所示。
SELECTyear,COUNT(*)AScount,AVG(score)ASavg_score
FROMdouban_data
WHEREyearISNOTNULL
GROUPBYyear
ORDERBYyear,AVG(score)DESC;
使用pycharts绘制折线图,按年份升序排序,详细代码如下所示:
importpymysql
importpandasaspd
frompyecharts.chartsimportLine
frompyechartsimportoptionsasopts
conn=pymysql.connect(host='00',port=3306,user='root',password='mysql',
db='test',charset='utf8mb4')
sql='''
SELECTyear,COUNT(*)AScount,AVG(score)ASavg_score
FROMdouban_data
WHEREyearISNOTNULL
GROUPBYyear
ORDERBYyear,AVG(score)DESC;'''
df=pd.read_sql(sql,conn)
line=Line()
line.add_xaxis(df['year'].tolist())
line.add_yaxis('数量',df['count'].tolist(),label_opts=opts.LabelOpts(is_show=False))
line.add_yaxis('平均评分',df['avg_score'].tolist(),label_opts=opts.LabelOpts(is_show=False))
line.set_global_opts(
title_opts=opts.TitleOpts(title='每年上映电影数量和平均评分'),
yaxis_opts=opts.AxisOpts(name='数量/平均评分'),
xaxis_opts=opts.AxisOpts(name='年份'),)
line.render('movie_year.html')
conn.close()
17
湖南商务职业技术学院毕业设计
首先连接到MySQL数据库,然后构建SQL查询语句,使用GROUPBY分组统
计每年上映的电影数量和平均评分,并按照平均评分降序排序,最后使用
Pyecharts绘制折线图。绘制的折线图包括两条折线,一条表示每年上映的电影
数量,另一条表示每年上映的电影的平均评分。折线图如下图5-2所示。
图5-2统计每年上映的电影数量和平均评分
电影产业是在19世纪末期开始发展的,但是在最初的几十年里,每年上映
的电影数量很少。直到20世纪初,每年才开始有两部或更多电影上映。到了1920
年代,电影产业开始进入黄金时期,每年上映的电影数量显著增加,同时平均
评分也保持较高水平。尽管电影产业在1920年代迎来了巨大的发展,但是在接
下来的几十年里,每年上映的电影数量并没有显著增长。这表明电影市场可能
已经开始饱和,而且竞争越来越激烈。在这个时期,电影评分也开始有所下降,
尽管总体上仍然保持较高的水平。到了1970年代和1980年代,每年上映的电
影数量再次显著增加。这一趋势在未来几十年中持续下去,直到今天。虽然电
影产业受到越来越多的竞争,但是在整个时期中,平均评分保持相对稳定的水
平,表明电影制作的质量得到了保证。
5.2.3统计每个国家上映电影的数量
编写SQL统计每个国家上映电影的数量,SQL如下所示。
SELECTSUBSTRING_INDEX(SUBSTRING_INDEX(regions,'|',n),'|',-1)AScountry,
COUNT(*)AScount
FROMdouban_data
18
湖南商务职业技术学院毕业设计
CROSSJOIN(SELECT1ASnUNIONALLSELECT2UNIONALLSELECT3UNION
ALLSELECT4UNIONALLSELECT5)ASnums
WHEREn<=LENGTH(regions)-LENGTH(REPLACE(regions,'|',''))+1
GROUPBYcountry
orderbyCOUNT(*)desc
limit10
SUBSTRING_INDEX(regions,'|',n):使用SUBSTRING_INDEX函数提取
regions字段中第n个国家或地区之前的所有字符(不包含第n个国家或地
区),这样得到的字符串就是第n个国家或地区的字符串及之前的所有国家或
地区字符串。
SUBSTRING_INDEX(SUBSTRING_INDEX(regions,'|',n),'|',-1):在上面
的字符串中,再次使用SUBSTRING_INDEX函数提取最后一个|符号之后的所有字
符,这样得到的就是第n个国家或地区的字符串。
CROSSJOIN(SELECT1ASnUNIONALLSELECT2UNIONALLSELECT3UNION
ALLSELECT4UNIONALLSELECT5)ASnums:使用CROSSJOIN语句生成一个
表,包含了数字1到5,这些数字用于提取regions字段中的每个国家或地区。
根据SQL的查询结果绘制饼图,饼图如下图5-3所示。
图5-3统计每个国家上映电影的数量
可以看到美国是上映电影数量最多的国家,共有1335部电影上映,其次是
中国大陆和英国,分别有468部和414部电影上映。中国香港和法国的电影数
19
湖南商务职业技术学院毕业设计
量也相当接近,分别是354部。日本、德国、韩国、加拿大和意大利则分别有
297、175、141、110和108部电影上映。
可以看出,美国在电影制作和上映方面仍然是世界领先者,中国大陆也在
快速发展。中国香港和法国的电影数量相当,这表明这两个地区在电影制作方
面的实力也相当。此外,日本、德国、韩国、加拿大和意大利也在电影制作方
面有所贡献,但与前面几个国家相比,数量相对较少。
然而,这些数字只代表了电影数量,而不能反映电影质量。要全面评估一
个国家的电影产业,还需要考虑其他因素,如票房、口碑和电影节获奖等。
5.2.4统计出演电影最多的10个演员
编写SQL统计每个演员出演电影的数量,SQL如下所示。
SELECTSUBSTRING_INDEX(SUBSTRING_INDEX(actors,'|',numbers.n),'|',-1)AS
actor_name,COUNT(*)AScount
FROMdouban_data
CROSSJOIN(
SELECT1nUNIONALLSELECT2UNIONALLSELECT3UNIONALLSELECT4
UNIONALLSELECT5UNIONALLSELECT6UNIONALLSELECT7UNIONALL
SELECT8UNIONALLSELECT9UNIONALLSELECT10
)ASnumbers
WHEREnumbers.n<=1+(LENGTH(actors)-LENGTH(REPLACE(actors,'|','')))
GROUPBYactor_name
havingactor_name
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 单位管理制度呈现大全【职工管理】
- 《会展项目管理复习》课件
- 《市场营销环境》课件
- 银行工作总结服务至上效率为王
- 家政服务行业销售工作总结
- 保育实习工作总结15篇
- 2023年项目部安全培训考试题加答案解析
- 2023年员工三级安全培训考试题及答案(考点梳理)
- 中考誓师口号(15篇)
- 2023年-2024年项目部治理人员安全培训考试题加答案解析
- 做账实操-科学研究和技术服务业的账务处理示例
- 2025年人教版历史八上期末复习-全册重难点知识
- 山东省滨州市2023-2024学年高一上学期1月期末考试 政治 含答案
- 仪控技术手册-自控专业工程设计用典型条件表
- 《庆澳门回归盼祖国统一》主题班会教案
- 洗衣房工作人员岗位职责培训
- 广东省深圳市光明区2022-2023学年五年级上学期数学期末试卷(含答案)
- XX小区春节灯光布置方案
- 《华为销售人员培训》课件
- 《广西壮族自治区房屋建筑和市政工程施工招标文件范本(2023年版)》
- 2024年化学螺栓锚固剂项目可行性研究报告
评论
0/150
提交评论