在上一部分《【python数据分析实战】电影票房数据分析(一)数据采集》 已经获取到了2011年至今的票房数据,并保存在了mysql中。
本文将在实操中讲解如何将mysql中的数据抽取出来并做成动态可视化。
图1 每年的月票房走势图
第一张图,我们要看一下每月的票房走势,毫无疑问要做成折线图,将近10年的票房数据放在一张图上展示。
数据抽取:
采集到的票房数据是按天统计的,并且我们只看正常上映的和点映的,其他如重映等场次均不在本次统计内。
因此我们先对mysql中的数据releaseInfo字段进行筛选,然后根据上映年份和月份进行分组聚合,得到10年内每月的票房数据。
用sql取到数据后,再将不同年份的数据分别放入list中,原始数据是以"万"为单位的str,这里我们折算为以"亿"为单位的float。
构造图像:
x轴数据为年份,
再分别将不同年份的票房数据添加到y轴中,
最后配置下图像的属性即可。
config = {...} # db配置省略
conn = pymysql.connect(**config)
cursor = conn.cursor()
sql = '''
select substr(`date`,1,4) year,
substr(`date`,5,2) month,
round(sum(`boxInfo`),2) monthbox
from movies_data
where (substr(`releaseInfo`,1,2) = '上映' or `releaseInfo`='点映' )
group by year,month order by year,month
'''
cursor.execute(sql)
data = cursor.fetchall()
x_data = list(set([int(i[1]) for i in data]))
x_data.sort()
x_data = list(map(str, x_data))
y_data1 = [round(int(i[2]) / 10000, 2) for i in data if i[0] == '2011']
y_data2 = [round(int(i[2]) / 10000, 2) for i in data if i[0] == '2012']
y_data3 = [round(int(i[2]) / 10000, 2) for i in data if i[0] == '2013']
y_data4 = [round(int(i[2]) / 10000, 2) for i in data if i[0] == '2014']
y_data5 = [round(int(i[2]) / 10000, 2) for i in data if i[0] == '2015']
y_data6 = [round(int(i[2]) / 10000, 2) for i in data if i[0] == '2016']
y_data7 = [round(int(i[2]) / 10000, 2) for i in data if i[0] == '2017']
y_data8 = [round(int(i[2]) / 10000, 2) for i in data if i[0] == '2018']
y_data9 = [round(int(i[2]) / 10000, 2) for i in data if i[0] == '2019']
cursor.close()
conn.close()
def line_base() -> Line:
c = (
Line(init_opts=opts.InitOpts(height="600px", width="1300px"))
.add_xaxis(x_data)
.add_yaxis("2011", y_data1)
.add_yaxis("2012", y_data2)
.add_yaxis("2013", y_data3)
.add_yaxis("2014", y_data4)
.add_yaxis("2015", y_data5)
.add_yaxis("2016", y_data6)
.add_yaxis("