【Python】数据可视化--基于TMDB_5000_Movie数据集

一、数据准备

tmdb_5000_movie数据集下载

二、数据预处理

观察数据集合情况

import pandas as pd
import ast
import warnings
warnings.filterwarnings('ignore')
# 加载数据集
df = pd.read_csv('tmdb_5000_movies.csv')
# 查看数据集信息
print(df.info())

 由于原数据集包含的数据信息较多,因此我们可以在每次需要分析的时候提取部分字段进行分析,比如关键字、电影类型、上映时间、生产厂家、预算、收入等等

df = df[['keywords','genres','production_companies','release_date','budget','revenue','vote_average','vote_count']]

观察过滤完的数据集和我们不难发现存在部分字段缺失值,字段类型数据形式不是我们想要的结果,因此我们对数据集进行进一步处理

import ast# 将genres、production_companies中的字符串转换为列表
df['genres'] = df['genres'].apply(lambda x: ast.literal_eval(x))
df['production_companies'] = df['production_companies'].apply(lambda x: ast.literal_eval(x))# 处理缺值数据
filtered_df = df[~df['release_date'].isna()]
filtered_df.dropna(inplace=True)# 提取日期中的年份
filtered_df['year'] = pd.to_datetime(filtered_df['release_date']).dt.year
filtered_df['year'].apply(int)

三、数据可视化分析

注:下面代码需要上面的预处理结果。

一)2000-2016年期间Twentieth Century Fox Film Corporation、Universal Pictures和Paramount Pictures三家影视公司每年制作的电影数量

二)2012-2016年平均评分前十的电影类型

import matplotlib.pyplot as plt
import seaborn as sns# 提取待处理字段
filtered_df = filtered_df[['year', 'genres', 'vote_average']]def split_data(df, split_column):# 拆分指定的列df = df.explode(split_column)# 过滤掉指定列值为nan的数据df = df[~df[split_column].isna()]# 提取出指定列的名称df.loc[:, split_column] = df[split_column].apply(lambda x: x['name'])return df# 拆分genres
filtered_df = split_data(filtered_df, 'genres')
filtered_df.rename(columns={'genres':'genre'}, inplace=True)# 筛选2012-2016年的电影
filtered_df = filtered_df[(2012 <= filtered_df['year']) & (filtered_df['year'] <= 2016)]
# 计算各电影类型平均评分和
grouped_df = filtered_df.groupby('genre')['vote_average'].mean().reset_index(name='vote_average')
grouped_df = grouped_df.sort_values(by='vote_average', ascending=False)
grouped_df = grouped_df.head(10)# 生成可视化图表
plt.figure(figsize=(10, 8))
sns.barplot(x=list(grouped_df['genre']),y=list(round(grouped_df['vote_average'],2)),width=0.6)
plt.ylim(0,8)
plt.title('2012-2016年平均评分前十的电影类型')
plt.xlabel('类型')
plt.ylabel('平均评分')
plt.tight_layout()
plt.legend(['平均评分'])# 在柱子上方显示每个柱子的值
for index, value in enumerate(list(round(grouped_df['vote_average'],2))):plt.text(index, value + 0.08, str(value), ha='center')plt.show()

运行结果:

三)2016年的总利润中,各电影类型所占的比例

import random# 提取待处理字段
filtered_df = filtered_df[['year', 'genres','budget', 'revenue']]# 处理budget、revenue
filtered_df.reset_index(inplace=True)
total = filtered_df['genres'].str.len()
total = total.apply(lambda x: 1 if x == 0 else x)
filtered_df['budget'] = filtered_df['budget'] / total
filtered_df['revenue'] = filtered_df['revenue'] / totaldef split_data(df, split_column):# 拆分指定的列df = df.explode(split_column)# 过滤掉指定列值为nan的数据df = df[~df[split_column].isna()]# 提取出指定列的名称df.loc[:, split_column] = df[split_column].apply(lambda x: x['name'])return df# 拆分genres
filtered_df = split_data(filtered_df, 'genres')
filtered_df.rename(columns={'genres':'genre'}, inplace=True)# 筛选2016年的电影
filtered_df = filtered_df[filtered_df['year'] == 2016]
# 添加利润列
filtered_df['profit'] = filtered_df['revenue'] - filtered_df['budget']
# 过滤利润小于0的
filtered_df = filtered_df[0 <= filtered_df['profit']]
# 计算各电影类型平均利润和
grouped_df = filtered_df.groupby( 'genre')['profit'].sum().reset_index(name='profit')# 计算各电影类型所占比例
total_scale = grouped_df['profit'].sum()
# 将scale除以整列总和并乘以100,得到每行的比例
grouped_df['scale'] = (grouped_df['profit'] / total_scale) * 100
# 将scale小于1的行的genre设置为"Other"
grouped_df.loc[grouped_df['scale'] < 1, 'genre'] = "Other"
# 计算"Other"行的"profit"和"scale"的总和
other_profit_sum = grouped_df.loc[grouped_df['genre'] == "Other", 'profit'].sum()
other_scale_sum = grouped_df.loc[grouped_df['genre'] == "Other", 'scale'].sum()
grouped_df.loc[grouped_df['genre'] == "Other", ['profit', 'scale']] = [other_profit_sum, other_scale_sum]
grouped_df = grouped_df.sort_values(by='genre')
# print(grouped_df)
# 生成随机颜色
def generate_random_colors(num_colors):colors = []for _ in range(num_colors):# 生成随机的 RGB 值r = random.random()g = random.random()b = random.random()colors.append((r, g, b))return colors# 生成可视化图表
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['font.size'] = '13'x = list(grouped_df['genre'])
y = list(round(grouped_df['scale'],2))plt.figure(figsize=(14, 8))
plt.style.use('ggplot')
bars = plt.barh(x, y, height=0.6, color=generate_random_colors(len(x))[::-1])
plt.xlabel('收入占比', fontsize=14)
plt.ylabel('电影类型', fontsize=14)
plt.tight_layout()for i, bar in enumerate(bars):plt.text(bar.get_width() + 0.2, bar.get_y() + bar.get_height() / 2, f'{y[i]:.1f}%', ha='left',va='center', color='green')plt.title('2016年的总利润中,各电影类型所占的比例', fontsize=18, x=0.5, y=1.05)
plt.show()

运行结果:

四)比较2000-2017年期间Universal Pictures和Paramount Pictures两家影视公司制作各类型电影的数量。

# 提取待处理字段
filtered_df = filtered_df[['year', 'production_companies', 'genres']]
# 筛选2000-2017年的电影
filtered_df = filtered_df[(filtered_df['year'] >= 2000) & (filtered_df['year'] <= 2017)]def split_data(df, split_column):# 拆分指定的列df = df.explode(split_column)# 过滤掉指定列值为nan的数据df = df[~df[split_column].isna()]# 提取出指定列的名称df.loc[:, split_column] = df[split_column].apply(lambda x: x['name'])return df# 拆分production_companies
filtered_df = split_data(filtered_df, 'production_companies')
filtered_df.rename(columns={'production_companies':'company'}, inplace=True)
filtered_df = filtered_df[(filtered_df['company'] == 'Universal Pictures') | (filtered_df['company'] == 'Paramount Pictures') ]
# 拆分genres
filtered_df = split_data(filtered_df, 'genres')
filtered_df.rename(columns={'genres':'genre'}, inplace=True)# 根据公司和类型对数据进行分组,并计算每个组的数量
grouped_df = filtered_df.groupby(['company', 'genre']).size().reset_index(name='count')
# print(grouped_df)# 使用pivot_table函数处理数据
processed_df = pd.pivot_table(grouped_df, values='count', index='genre', columns='company', fill_value=0)
processed_df = processed_df.sort_values(by='genre', ascending=False)
# print(processed_df)# 生成可视化结果
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['font.size'] = '13'# 设置图形大小和风格
plt.figure(figsize=(12, 8))
plt.style.use('seaborn-muted')# 数据直接提取
genres = list(processed_df.index)
universal = list(processed_df['Universal Pictures'])
paramount = list(processed_df['Paramount Pictures'])# 绘制两家公司的数量对比图
plt.barh(np.arange(len(genres)), universal, height=0.3, label='Universal Pictures')
plt.barh(np.arange(len(genres)) + 0.3, paramount, height=0.3, label='Paramount Pictures')plt.yticks(np.arange(len(genres)) + 0.15, genres, fontsize=12)
plt.legend()
plt.grid(axis='y')# 添加数据标签
for i, value in enumerate(universal):plt.text(value + 0.15, i, str(value), ha='left', va='center', fontsize=10)
for i, value in enumerate(paramount):plt.text(value + 0.15, i + 0.3, str(value), ha='left', va='center', fontsize=10)# 设置标题和坐标轴标签
plt.title('2000-2017年期间Universal Pictures和Paramount Pictures两家影视公司制作各类型电影的数量', fontsize=16)
plt.xlabel('电影数量')
plt.ylabel('电影类型')
plt.tight_layout()
plt.show()

运行结果:

五)比较2010-2016年期间Universal Pictures和Paramount Pictures两家影视公司制作各类型电影的平均利润

# 提取待处理字段
filtered_df = filtered_df[['year', 'production_companies', 'genres', 'revenue', 'budget']]
# 筛选2010-2016年的电影
filtered_df = filtered_df[(filtered_df['year'] >= 2010) & (filtered_df['year'] <= 2016)]def split_data(df, split_column):# 拆分指定的列df = df.explode(split_column)# 过滤掉指定列值为nan的数据df = df[~df[split_column].isna()]# 提取出指定列的名称df.loc[:, split_column] = df[split_column].apply(lambda x: x['name'])return df# 拆分production_companies
filtered_df = split_data(filtered_df, 'production_companies')
filtered_df.rename(columns={'production_companies':'company'}, inplace=True)
filtered_df = filtered_df[(filtered_df['company'] == 'Universal Pictures') | (filtered_df['company'] == 'Paramount Pictures') ]# 处理budget、revenue
filtered_df.reset_index(inplace=True)
total = filtered_df['genres'].str.len()
total = total.apply(lambda x: 1 if x == 0 else x)
filtered_df['budget'] = filtered_df['budget'] / total
filtered_df['revenue'] = filtered_df['revenue'] / total# 拆分genres
filtered_df = split_data(filtered_df, 'genres')
filtered_df.rename(columns={'genres':'genre'}, inplace=True)# 添加利润列
filtered_df['profit'] = filtered_df['revenue'] - filtered_df['budget']
# 过滤利润小于0的
filtered_df = filtered_df[0 <= filtered_df['profit']]# 根据公司和类型对数据进行分组,并计算每个组的数量
grouped_df = filtered_df.groupby(['company', 'genre'])['profit'].mean().reset_index(name='average_profit')
# print(grouped_df)# 使用pivot_table函数处理数据
processed_df = pd.pivot_table(grouped_df, values='average_profit', index='genre', columns='company', fill_value=0)
processed_df = processed_df.sort_values(by='genre', ascending=False)
# print(processed_df)# 提取Universal Pictures和Paramount Pictures的数据
genres = list(processed_df.index)
universal = list(round(processed_df['Universal Pictures'],2))
paramount = list(round(processed_df['Paramount Pictures'],2))# 绘制平均利润图
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['font.size'] = '13'
plt.figure(figsize=(12, 8))
plt.plot(genres, universal, alpha=0.5, label='Universal Pictures', color='#fa51cf')
plt.bar(genres, paramount, alpha=0.5, label='Paramount Pictures', color='#acaaf1')plt.title('2010-2016年期间Universal Pictures和Paramount Pictures制作各类型电影的平均利润')
plt.xlabel('类型')
plt.ylabel('平均利润')
plt.legend()
plt.xticks(rotation=45)
plt.show()

运行结果:

六)比较2012-2016年期间Universal和Paramount每年制作各类型电影的数量

from pyecharts import options as opts
from pyecharts.charts import Bar, Timeline# 提取待处理字段
filtered_df = filtered_df[['year', 'production_companies', 'genres']]
# 筛选2012-2016年的电影
filtered_df = filtered_df[(filtered_df['year'] >= 2012) & (filtered_df['year'] <= 2016)]def split_data(df, split_column):# 拆分指定的列df = df.explode(split_column)# 过滤掉指定列值为nan的数据df = df[~df[split_column].isna()]# 提取出指定列的名称df.loc[:, split_column] = df[split_column].apply(lambda x: x['name'])return df# 拆分production_companies
filtered_df = split_data(filtered_df, 'production_companies')
filtered_df.rename(columns={'production_companies':'company'}, inplace=True)
filtered_df = filtered_df[(filtered_df['company'] == 'Universal Pictures') | (filtered_df['company'] == 'Paramount Pictures') ]# 拆分genres
filtered_df = split_data(filtered_df, 'genres')
filtered_df.rename(columns={'genres':'genre'}, inplace=True)# 根据公司和类型对数据进行分组,并计算每个组的数量
grouped_df = filtered_df.groupby(['year', 'company', 'genre']).size().reset_index(name='count')
# print(grouped_df)# 获取所有年份、公司和类型的组合
all_years = grouped_df['release_year'].unique()
all_companies = grouped_df['company'].unique()# 创建空的DataFrame用于存储合并后的数据
merged_df = pd.DataFrame(columns=['release_year', 'company', 'genre', 'count'])# 遍历所有年份、公司和类型的组合
for year in all_years:all_genres = grouped_df[grouped_df['release_year'] == year]['genre'].unique()all_genres.sort()for company in all_companies:for genre in all_genres:# 检查是否存在对应的记录condition = (grouped_df['release_year'] == year) & (grouped_df['company'] == company) & (grouped_df['genre'] == genre)if len(grouped_df[condition]) > 0:count = grouped_df[condition]['count'].values[0]else:count = 0# 添加记录到合并后的DataFramemerged_df = pd.concat([merged_df, pd.DataFrame({'release_year': [year], 'company': [company], 'genre': [genre], 'count': [count]})],ignore_index=True)# print(merged_df)# 创建时间轮番图
timeline = Timeline(init_opts=opts.InitOpts(width='1200px',height='600px',animation_opts=opts.AnimationOpts(animation_delay=1000, # 动画延时animation_easing='elasticOut'))
)# 遍历每个年份
for year in all_years:# 提取当前年份的数据universal_data = merged_df[(merged_df['release_year'] == year) & (merged_df['company'] == 'Universal Pictures')]paramount_data = merged_df[(merged_df['release_year'] == year) & (merged_df['company'] == 'Paramount Pictures')]# 创建柱状图bar = (Bar(init_opts=opts.InitOpts(height='500px')).add_xaxis(universal_data['genre'].tolist()).add_yaxis('Universal Pictures',universal_data['count'].tolist(),gap=0,itemstyle_opts=opts.ItemStyleOpts(color='#FF4D4F')).add_yaxis('Paramount Pictures',paramount_data['count'].tolist(),gap=0,itemstyle_opts=opts.ItemStyleOpts(color='#1890FF')).set_global_opts(title_opts=opts.TitleOpts(title=f'{int(year)}年 Universal和Paramount制作各类型电影的数量',pos_left='center',),xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=30,font_size=12,)),yaxis_opts=opts.AxisOpts(name='数量',max_=max(universal_data['count'].max(), paramount_data['count'].max())+1,axislabel_opts=opts.LabelOpts(font_size=12)),# visualmap_opts=opts.VisualMapOpts(#     min_=0,#     max_=8,#     is_show=False# ),# datazoom_opts=[#     opts.DataZoomOpts(#         range_start = 0,#         range_end = 100#     )# ],legend_opts=opts.LegendOpts(pos_right='10%',pos_top='12%',orient='vertical'),tooltip_opts=opts.TooltipOpts(trigger='item',axis_pointer_type='cross')))# 将柱状图添加到时间轮番图中timeline.add(bar, f'{int(year)}年')# 调整时间轴位置
timeline.add_schema(orient="vertical",  # 垂直展示is_auto_play=True,play_interval=2000,  # 播放时间间隔,毫秒pos_right="2%",pos_top="50",height="500",  # 组件高度width="70",label_opts=opts.LabelOpts(is_show=True,color="black",position='left'),
)# 渲染并保存时间轮番图
timeline.render('时间轮番图.html')

运行结果:(时间轮番图)

七)2000-2016年期间产量最高五家电影公司出产电影的平均评分

from pyecharts import options as opts
from pyecharts.charts import Line, Bar
from pyecharts.globals import ThemeType
from pyecharts.render import make_snapshot
from snapshot_selenium import snapshot# 提取待处理字段
filtered_df = filtered_df[['year', 'production_companies', 'vote_average']]
# 2000-2016年期间产量最高五家电影公司出产电影的平均评分
filtered_df = filtered_df[(2000 <= filtered_df['year']) & (filtered_df['year'] <= 2016)]def split_data(df, split_column):# 拆分指定的列df = df.explode(split_column)# 过滤掉指定列值为nan的数据df = df[~df[split_column].isna()]# 提取出指定列的名称df.loc[:, split_column] = df[split_column].apply(lambda x: x['name'])return df# 拆分production_companies
filtered_df = split_data(filtered_df, 'production_companies')
filtered_df.rename(columns={'production_companies':'company'}, inplace=True)grouped_df = filtered_df.groupby('company').agg(count=('company', 'size'),vote_average=('vote_average', 'mean')).reset_index()grouped_df = grouped_df.sort_values(by='count', ascending=False)
grouped_df = grouped_df.head(5)
grouped_df = grouped_df.sort_values(by='company')
print(grouped_df)x_index = grouped_df['company'].tolist()
y_value1 = round(grouped_df['vote_average'],2).tolist()
y_value2 = grouped_df['count'].tolist()bar = (Bar(init_opts=opts.InitOpts(width="800px",height="400px",theme=ThemeType.LIGHT)).add_xaxis(xaxis_data=x_index).add_yaxis(series_name="平均评分",y_axis=y_value1,category_gap="50%",label_opts=opts.LabelOpts(is_show=False)).extend_axis(  # 第二坐标轴yaxis=opts.AxisOpts(name="产出数量",type_="value",min_=100,max_=250,interval=20,axislabel_opts=opts.LabelOpts(formatter="{value}部")  # 设置坐标轴格式)).set_global_opts(title_opts=opts.TitleOpts(title="2000-2016年期间产量最高五家电影公司出产电影的平均评分",),tooltip_opts=opts.TooltipOpts(is_show=True, trigger="axis", axis_pointer_type="cross"),legend_opts=opts.LegendOpts(pos_right='15%',pos_top='5%',),xaxis_opts=opts.AxisOpts(type_="category",axispointer_opts=opts.AxisPointerOpts(is_show=True, type_="shadow"),axislabel_opts=opts.LabelOpts(rotate=25)),yaxis_opts=opts.AxisOpts(name="平均评分",type_="value",min_=5,max_=7,interval=0.2,axislabel_opts=opts.LabelOpts(formatter="{value} 分"),  # 设置坐标轴格式axistick_opts=opts.AxisTickOpts(is_show=True),splitline_opts=opts.SplitLineOpts(is_show=True),),)
)line = (Line().add_xaxis(xaxis_data=x_index).add_yaxis(series_name="产出数量",yaxis_index=1,y_axis=y_value2,itemstyle_opts=opts.ItemStyleOpts(color="red"),label_opts=opts.LabelOpts(is_show=False),z=2  # 使折线图显示在柱状图上面)
)
title = '2000-2016年期间产量最高五家电影公司出产电影的平均评分'
make_snapshot(snapshot, bar.overlap(line).render(title+'.html'), title+'.png')

八)2016年的总票房收入中,各电影公司所占的比例

from pyecharts import options as opts
from pyecharts.charts import Line, Bar
from pyecharts.globals import ThemeType
from pyecharts.render import make_snapshot
from snapshot_selenium import snapshot# 提取待处理字段
filtered_df = filtered_df[['year', 'production_companies', 'revenue']]
# 2016年的总票房收入中,各电影公司所占的比例
filtered_df = filtered_df[(filtered_df['year'] == 2016)]
# 处理收入列
total = filtered_df['production_companies'].str.len()
total = total.apply(lambda x: 1 if x == 0 else x)
# print(total)
filtered_df['revenue'] = filtered_df['revenue'] / totaldef split_data(df, split_column):# 拆分指定的列df = df.explode(split_column)# 过滤掉指定列值为nan的数据df = df[~df[split_column].isna()]# 提取出指定列的名称df.loc[:, split_column] = df[split_column].apply(lambda x: x['name'])return df# 拆分production_companies
filtered_df = split_data(filtered_df, 'production_companies')
filtered_df.rename(columns={'production_companies': 'company'}, inplace=True)
# print(filtered_df.head(10).to_string())# 按公司分组
grouped_df = filtered_df.groupby( 'company')['revenue'].sum().reset_index(name='revenue')
# 计算总票房收入
total_revenue = grouped_df['revenue'].sum()
# 添加比例列
grouped_df['scale'] = (grouped_df['revenue'] / total_revenue) * 100
grouped_df['revenue'] = round(grouped_df['revenue']/10000,2)# 将scale小于2的行的company设置为"Other"
grouped_df.loc[grouped_df['scale'] < 1, 'company'] = "Other"
# 计算"Other"行的"revenue"和"scale"的总和
other_revenue_sum = grouped_df.loc[grouped_df['company'] == "Other", 'revenue'].sum()
other_scale_sum = grouped_df.loc[grouped_df['company'] == "Other", 'scale'].sum()
grouped_df.loc[grouped_df['company'] == "Other", ['revenue', 'scale']] = [other_revenue_sum, other_scale_sum]
# 删除重复行
grouped_df = grouped_df.drop_duplicates()
# 按比例排序
grouped_df = grouped_df.sort_values(by='company')
# print(grouped_df.head(20).to_string())# 提取绘图数据集合
x_index = grouped_df['company'].tolist()
y_value1 = grouped_df['revenue'].tolist()
y_value2 = grouped_df['scale'].tolist()bar = (Bar(init_opts=opts.InitOpts(width="1200px",height="500px",theme=ThemeType.LIGHT)).add_xaxis(xaxis_data=x_index).add_yaxis(series_name="票房收入",y_axis=y_value1,category_gap="50%",label_opts=opts.LabelOpts(is_show=False)).extend_axis(  # 第二坐标轴yaxis=opts.AxisOpts(name="所占比例",type_="value",min_=1,max_=5,# interval=200,axislabel_opts=opts.LabelOpts(formatter="{value} %")  # 设置坐标轴格式)).set_global_opts(title_opts=opts.TitleOpts(title="2016年的总票房收入中,各电影公司所占的比例",),tooltip_opts=opts.TooltipOpts(is_show=True, trigger="axis", axis_pointer_type="cross"),legend_opts=opts.LegendOpts(pos_right='15%',pos_top='5%',),xaxis_opts=opts.AxisOpts(type_="category",axispointer_opts=opts.AxisPointerOpts(is_show=True, type_="shadow"),axislabel_opts=opts.LabelOpts(rotate=25)),yaxis_opts=opts.AxisOpts(name="票房收入",type_="value",# min_=5,# max_=7,# interval=0.2,# axislabel_opts=opts.LabelOpts(formatter="{value} $"),  # 设置坐标轴格式axistick_opts=opts.AxisTickOpts(is_show=True),splitline_opts=opts.SplitLineOpts(is_show=True),),)
)line = (Line().add_xaxis(xaxis_data=x_index).add_yaxis(series_name="所占比例",yaxis_index=1,y_axis=y_value2,itemstyle_opts=opts.ItemStyleOpts(color="red"),label_opts=opts.LabelOpts(is_show=False),z=2  # 使折线图显示在柱状图上面)
)
title = '2016年的总票房收入中,各电影公司所占的比例'
make_snapshot(snapshot, bar.overlap(line).render(title+'.html'), title+'.png')

运行结果:

九)对比2011-2016年期间改编电影和原创电影每年平均票房收入

import json
from pyecharts import options as opts
from pyecharts.charts import Line, Bar
from pyecharts.globals import ThemeType
from pyecharts.render import make_snapshot
from snapshot_selenium import snapshot# 提取待处理字段
filtered_df = filtered_df[['year', 'keywords', 'revenue']]
# 对比2011-2016年期间改编电影和原创电影每年平均票房收入,电影的其中一个keywords为“based on novel”,则它为改编电影,否则为原创电影
filtered_df = filtered_df[(2011 <= filtered_df['year']) & (filtered_df['year'] <= 2016)]# 定义函数来判断电影是否为改编电影
def is_adapted_movie(keywords_json):try:keywords = json.loads(keywords_json.replace("'", '"'))return any(keyword['name'] == 'based on novel' for keyword in keywords)except json.JSONDecodeError:return False# 为数据集添加一列以标记改编电影
filtered_df['is_adapted'] = filtered_df['keywords'].apply(is_adapted_movie)
# print(filtered_df['is_adapted'])# print(filtered_df.groupby(['year', 'is_adapted'])['revenue'].mean().head(10).to_string())
grouped_df = filtered_df.groupby(['year', 'is_adapted'])['revenue'].mean().unstack()
print(grouped_df.head(10).to_string())
# 准备数据用于绘图
x_index = grouped_df.index.tolist()
y_value1 = grouped_df[True].tolist()
y_value2 = grouped_df[False].tolist()bar = (Bar(init_opts=opts.InitOpts(width="800px",height="400px",theme=ThemeType.LIGHT)).add_xaxis(xaxis_data=x_index).add_yaxis('Adapted',y_axis=y_value1,gap=0,label_opts=opts.LabelOpts(is_show=False),itemstyle_opts=opts.ItemStyleOpts(color='#1890FF')).add_yaxis('Original',y_axis=y_value2,gap=0,label_opts=opts.LabelOpts(is_show=False),itemstyle_opts=opts.ItemStyleOpts(color='#FF4D4F')).set_global_opts(title_opts=opts.TitleOpts(title="对比2011-2016年期间改编电影和原创电影每年平均票房收入",),tooltip_opts=opts.TooltipOpts(is_show=True, trigger="axis", axis_pointer_type="cross"),legend_opts=opts.LegendOpts(pos_right='15%',pos_top='5%',),xaxis_opts=opts.AxisOpts(type_="category",axispointer_opts=opts.AxisPointerOpts(is_show=True, type_="shadow"),axislabel_opts=opts.LabelOpts(rotate=25)),yaxis_opts=opts.AxisOpts(name="平均收入",type_="value",axistick_opts=opts.AxisTickOpts(is_show=True),splitline_opts=opts.SplitLineOpts(is_show=True),),)
)
title = '对比2011-2016年期间改编电影和原创电影每年平均票房收入'
make_snapshot(snapshot, bar.render(title + '.html'), title + '.png')

运行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/620410.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jenkins集成Sonar Qube

下载插件 重启Jenkins 容器 sonarqube 使用令牌 Jenkins 配置 重新构建

小程序基础学习(多插槽)

先创建插槽 定义多插槽的每一个插槽的属性 在js文件中启用多插槽 在页面使用多插槽 组件代码 <!--components/my-slots/my-slots.wxml--><view class"container"><view class"left"> <slot name"left" ></slot>&…

YOLOv8改进 | 注意力篇 | 实现级联群体注意力机制CGAttention (全网首发)

一、本文介绍 本文给大家带来的改进机制是实现级联群体注意力机制CascadedGroupAttention,其主要思想为增强输入到注意力头的特征的多样性。与以前的自注意力不同,它为每个头提供不同的输入分割,并跨头级联输出特征。这种方法不仅减少了多头注意力中的计算冗余,而且通过增…

八爪鱼拉拉手

欢迎来到程序小院 八爪鱼拉拉手 玩法&#xff1a;点击鼠标左键拖动移动八爪鱼&#xff0c;当他的手很忙的时候他会很高兴&#xff0c; 不同关卡不同的八爪鱼的位置摆放&#xff0c;快去闯关吧^^。开始游戏https://www.ormcc.com/play/gameStart/248 html <div id"gam…

GCC工具源码编译

文章目录 背景一、下载源码二、编译前依赖准备2.1 相关工具依赖2.2 相关lib&#xff08;gmp/ mpfr /mpc&#xff09;依赖2.2.1 lib源码下载2.2.2 lib源码编译 三、编译GCC3.1 编译3.2 链接 四、报错处理 背景 日常可能涉及到系统里自带GCC版本与被编译源码存在不兼容&#xff…

大模型背景下计算机视觉年终思考小结(一)

1. 引言 在过去的十年里&#xff0c;出现了许多涉及计算机视觉的项目&#xff0c;举例如下&#xff1a; 使用射线图像和其他医学图像领域的医学诊断应用使用卫星图像分析建筑物和土地利用率相关应用各种环境下的目标检测和跟踪&#xff0c;如交通流统计、自然环境垃圾检测估计…

【SSM框架】初识Spring

初识Spring Spring家族 Spring发展到今天已经形成了一种开发的生态圈&#xff0c;Spring提供了若千个项目&#xff0c;每个项目用于完成特定的功能 ✅Spring Framework&#xff08;底层框架&#xff09;Spring Boot&#xff08;提高开发速度&#xff09;Spring Cloud&#xf…

第1课 ROS 系统介绍

1.ROS操作系统介绍 在学习ROS 系统前&#xff0c;我们需要先了解操作系统的定义。操作系统&#xff0c;顾名思义&#xff0c;即提供部分软件和硬件的接口&#xff0c;以供用户直接使用。因此&#xff0c;针对不同的平台、不同的功能&#xff0c;需要采用不同的操作系统来完成底…

智能导诊-医院信息化建设标准

智能导诊系统主要依赖于自然语言处理和机器学习等技术。患者可以通过语音、文字等方式描述病情&#xff0c;系统通过自然语言处理技术对病情进行语义分析和理解。随后&#xff0c;机器学习算法对患者的症状和病情进行推理&#xff0c;结合已有的疾病知识库&#xff0c;为患者提…

canvas设置图形图案、文字图案

查看专栏目录 canvas示例教程100专栏&#xff0c;提供canvas的基础知识&#xff0c;高级动画&#xff0c;相关应用扩展等信息。canvas作为html的一部分&#xff0c;是图像图标地图可视化的一个重要的基础&#xff0c;学好了canvas&#xff0c;在其他的一些应用上将会起到非常重…

强化学习应用(二):基于Q-learning的物流配送路径规划研究(提供Python代码)

一、Q-learning算法简介 Q-learning是一种强化学习算法&#xff0c;用于解决基于马尔可夫决策过程&#xff08;MDP&#xff09;的问题。它通过学习一个值函数来指导智能体在环境中做出决策&#xff0c;以最大化累积奖励。 Q-learning算法的核心思想是使用一个Q值函数来估计每…

AI大模型学习笔记一

一、商业观点&#xff1a;企业借助大模型获得业务增长可能 二、底层原理&#xff1a;transformer 1&#xff09;备注 ①下面每个步骤都是自回归的过程&#xff08;aotu-regressive&#xff09;&#xff1a;已输出内容的每个字作为输入&#xff0c;一起生成下一个字 ②合起来就…

【GNN2】PyG完成图分类任务,新手入门,保姆级教程

上次讲了如何给节点分类&#xff0c;这次我们来看如何用GNN完成图分类任务&#xff0c;也就是Graph-level的任务。 【GNN 1】PyG实现图神经网络&#xff0c;完成节点分类任务&#xff0c;人话、保姆级教程-CSDN博客 图分类就是以图为单位的分类&#xff0c;举个例子&#xff1…

Open3D 点云等比例缩放(20)

Open3D 点云等比例缩放(20) 一、算法介绍二、算法实现1.代码世人慌慌张张,不过图碎银几两, 偏偏这碎银几两,能解世间万种慌张。 一、算法介绍 实现这样一个功能,沿着中心,按照指定的比例,比如1/2,缩小或者放大点云,保存到新的文件中 二、算法实现 1.代码 import…

小程序基础学习(js混编)

在组件中使用外部js代码实现数据改变 先创建js文件 编写一些组件代码 编写外部js代码 在组件的js中引入外部js 在 app.json中添加路径规则 组件代码 <!--components/my-behavior/my-behavior.wxml--> <view><view>当前计数为{{count}}</view> <v…

Kibana:使用反向地理编码绘制自定义区域地图

Elastic 地图&#xff08;Maps&#xff09;附带预定义区域&#xff0c;可让你通过指标快速可视化区域。 地图还提供了绘制你自己的区域地图的功能。 你可以使用任何您想要的区域数据&#xff0c;只要你的源数据包含相应区域的标识符即可。 但是&#xff0c;当源数据不包含区域…

最新域名群站开源系统:打造强大网站矩阵,引领SEO优化新潮流!

搭建步骤 第一步&#xff1a;安装PHP和MYSQL服务器环境 对于想要深入了解网站建设的人来说&#xff0c;自己动手安装PHP和MYSQL服务器环境是必不可少的步骤。这将使你能够更好地理解网站的运行机制&#xff0c;同时为后续的网站开发和优化打下坚实基础。 第二步&#xff1a;…

QSpace:Mac上的简洁高效多窗格文件管理器

在Mac用户中&#xff0c;寻找一款能够提升文件管理效率的工具是常见的需求。QSpace&#xff0c;一款专为Mac设计的文件管理器&#xff0c;以其简洁的界面、高效的多窗格布局和丰富的功能&#xff0c;为用户提供了一个全新的文件管理体验。 QSpace&#xff1a;灵活与功能丰富的结…

ImportError: cannot import name ‘Doc‘ from ‘typing_extensions‘

在训练大模型时候出现&#xff1a;ImportError: cannot import name ‘Doc’ from ‘typing_extensions’ 。 问题 原因 安装的typing_extensions版本不正确 解决方法 pip install typing_extensions4.8.0

Python Flask教程

Flask Doc: https://rest-apis-flask.teclado.com/docs/course_intro/what_is_rest_api/Github: https://github.com/tecladocode/rest-apis-flask-python 1. 最简单的应用 最小应用 from flask import Flaskapp Flask(__name__)app.route("/") def hello_world()…