python分析英雄联盟
基于ECharts的英雄联盟(LPL)数据可视化分析

创建Flask 连接前端 模板页面
爬取需要 用到的特 定数据
接收服务 器返回的 JSON数据
ECharts 构建数据 可视化
将数据存 入MySQL 数据库
JSON数据 存入定义 好的路由
将图标放 入前端盒
子中
图 1 系统框架图 Fig.1 System framework diagram
收稿日期 :2022-05-26 作者简介 :郑涛(2001—),男,福建福州人,本科,研究方向 :数据挖掘。 通讯作者 :陈婷婷(1995—),女,福建厦门人,硕士研究生,助教,研究方向 :数据挖掘、大数据分析。
3.1 系统总体框架 本项目运用 Request 网络爬虫框架,从英雄联盟(LPL) 官网爬取各战队比赛数据,利用 Flask 框架及 Python、 ECharts、HTML5、CSSJavaScript 等多种语言,构建针 对赛事观众设计的一套智能分析系统,并进行可视化展 示,其系统结构框架图如图 1 所示。 由图 1 可以看出,该系统由三个模块组成 :数据采 集模块,数据传输模块,数据可视化模块。其中数据可 视化包括个人战绩堆叠图、英雄数据轮播图、战队胜负 数据、个人比赛数据、战队排行榜、个人排行榜及 MVP 种子选手,还有英雄比赛数据查询模块。 3.2 软件体系架构设计 在软件体系架构设计中,采用分层模块化设计。在用 户层上,安装常见的浏览器软件,用户本机可连接英特网 前提下,用户即可操作功能模块 ;在应用层上,设计英雄 比赛数据查询模块、英雄数据轮播图等子模块 ;在交互层 上,使用 Flask 连接前端页面,通过 Ajax 向服务器发送 请求,接收服务器返回的 JSON 数据然后使用 JavaScript 修改网页,进而实现页面局部数据更新。 3.3 系统设计技术路线 在设计本系统时,前端模块可使用 VScode 来进行代 码的编辑、开发和优化,使用 Django 基础架构,利用原 生前端开发工具和 Bootstrap 前端框架来进行前端页面的 搭建,并使用 ECharts 可视化开发工具构建可视化图表, 构建可视化系统,针对部分系统的数据,可使用数据库 作为存储和交换的中间载体,系统设计技术路线直观表 述如图 2 所示。
lol脚本的原理

lol脚本的原理
LOL脚本的原理指的是在LOL游戏中使用脚本编写的程序来
实现自动化操作的功能。
脚本是一种通过代码来控制游戏角色或者自动执行游戏操作的技术。
LOL脚本通常使用脚本编程语言来编写,比如Python、Lua等。
这些编程语言提供了丰富的函数和类库,可以用来模拟玩家的操作。
通过编写脚本,玩家可以实现自动释放技能、自动走位、自动购买装备等一系列操作,从而提高游戏战斗的效率和便捷性。
脚本的原理是将游戏的相关信息和操作以代码的形式进行封装,并通过调用游戏的API(Application Programming Interface,
应用程序编程接口)来实现与游戏的交互。
脚本可以获取游戏内的各种状态信息,比如英雄血量、敌人位置等,然后根据这些信息来做出相应的操作。
这些操作可能是自动释放技能、自动选择目标、自动使用物品等。
脚本的原理还包括了一些游戏机制的研究和分析。
通过分析游戏的内存数据和网络数据包,可以获取到更多的游戏信息,比如敌人的位置、技能的冷却时间等。
这些信息可以用于制定更加精确和高效的操作策略。
需要注意的是,LOL脚本的使用往往违反了游戏的规则和服
务条款,可能会导致账号被封禁。
此外,脚本的使用也会削减游戏的挑战性和娱乐性,对其他玩家造成不公平的竞争。
因此,
玩家在使用脚本前应该权衡利弊,并自觉遵守游戏规则和道德准则。
python数据分析方法论述(配备代码和数据)

python数据分析方法论述(配备代码和数据)Python数据分析方法论述引言Python是一种功能强大且灵活的编程语言,被广泛应用于数据分析领域。
本文将论述一些常用的Python数据分析方法,并配备相应的代码和数据。
1. 数据获取在数据分析过程中,首先需要获取数据。
Python提供了多种方法来获取数据,包括从文件读取数据、通过API获取数据、从数据库中提取数据等。
以下是一个从CSV文件中读取数据的示例代码:import pandas as pddata = pd.read_csv('data.csv')2. 数据清洗在进行数据分析之前,通常需要对数据进行清洗,以去除缺失值、异常值或重复值等。
Python提供了丰富的工具和库来进行数据清洗。
以下是一个简单的数据清洗示例,用于去除缺失值:data.dropna(inplace=True)3. 数据探索数据探索是数据分析的重要环节,可以通过统计分析、可视化等方式来了解数据的特征和分布情况。
Python提供了许多库和工具来进行数据探索。
以下是一个使用Matplotlib库进行数据可视化的示例代码:import matplotlib.pyplot as pltplt.hist(data['column_name'])plt.show()4. 数据分析在数据分析阶段,可以应用各种统计方法和机器学习算法来挖掘数据中的信息和模式。
Python提供了众多用于数据分析的库和算法。
以下是一个使用Scikit-learn库进行回归分析的示例代码:from sklearn.linear_model import LinearRegressionX = data[['feature1', 'feature2']]y = data['target']model = LinearRegression()model.fit(X, y)5. 结果展示数据分析的最后一步是将结果进行展示和分享。
python爬取电竞《绝地求生》比赛数据集分析

python爬取电竞《绝地求⽣》⽐赛数据集分析 python爬取电竞《绝地求⽣》⽐赛数据集分析⼀,选题背景 电⼦竞技(Electronic Sports)是电⼦游戏⽐赛达到“竞技”层⾯的体育项⽬。
电⼦竞技就是利⽤电⼦设备作为运动器械进⾏的、⼈与⼈之间的智⼒和体⼒结合的⽐拼。
通过电⼦竞技,可以锻炼和提⾼参与者的思维能⼒、反应能⼒、四肢协调能⼒和意志⼒,培养团队精神,并且职业电竞对体⼒也有较⾼要求。
电⼦竞技也是⼀种职业,和棋艺等⾮电⼦游戏⽐赛类似,2003年11⽉18⽇,国家体育局正式批准,将电⼦竞技列为第99个正式体育竞赛项⽬。
2008年,国家体育总局将电⼦竞技改批为第78号正式体育竞赛项⽬。
2018年雅加达亚运会将电⼦竞技纳为表演项⽬。
数据来源:20G绝地求⽣⽐赛数据集。
⼆,设计⽅案1,爬⾍名称:python爬取电竞《绝地求⽣》⽐赛数据集分析2,爬⾍爬取的内容与数据特征分析 主要分成两部分,⼀部分是玩家⽐赛的统计数据,以agg_match_stats开头,⼀部分是玩家被击杀的数据,以kill_match_stats开头本次分析选取其中的两个数据集进⾏分析3,设计⽅案:1. 飞机嗡嗡地,我到底跳哪⾥⽐较安全?2. 我是该苟着不动,还是应该出去猛⼲?3. 是该单打独⽃还是跟队友⼀起配合?4. 毒来了我跑不过毒怎么办啊?5. 什么武器最有⽤?6. 近战适合使⽤什么武器,狙击适合使⽤什么武器呢?7. 最后的毒圈⼀般会在哪⾥呢?三,结果特征分析1,页⾯的结构与特征分析四,程序设计1,# 使⽤pandas读取数据1import pandas as pd2import numpy as np3import matplotlib.pyplot as plt4import seaborn as sns5 %matplotlib inline6 plt.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体7 plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显⽰为⽅块的问题89# 使⽤pandas读取数据10 agg1 = pd.read_csv('/Users/apple/Desktop/pubg/aggregate/agg_match_stats_1.csv')2,# 探索数据结构并数据清洗1 agg1.head()# 总共有13844275⾏玩家数据,15列1 agg1.shape1 agg1.columns1 ()3,数据分析与可视化# 丢弃重复数据1 agg1.drop_duplicates(inplace=True)23 agg1.loc[1]# 添加是否成功吃鸡列1 agg1['won'] = agg1['team_placement'] == 1# 添加是否搭乘过车辆列1 agg1['drove'] = agg1['player_dist_ride'] != 0我是该苟着不动,还是应该出去猛⼲1 agg1.loc[agg1['player_kills'] < 40, ['player_kills', 'won']].groupby('player_kills').won.mean().plot.bar(figsize=(15,6), rot=0)2 plt.xlabel('击杀⼈数', fontsize=14)3 plt.ylabel("吃鸡概率", fontsize=14)4 plt.title('击杀⼈数与吃鸡概率的关系', fontsize=14)不同模式下的平均击杀⼈数:1 agg1.groupby('party_size').player_kills.mean()1 g = sns.FacetGrid(agg1.loc[agg1['player_kills']<=10, ['party_size', 'player_kills']], row="party_size", size=4, aspect=2)2 g = g.map(sns.countplot, "player_kills")3456 party_size=11 party_size=21 party_size=4是该单打独⽃还是跟队友⼀起配合?1 agg1.loc[agg1['party_size']!=1, ['player_assists', 'won']].groupby('player_assists').won.mean().plot.bar(figsize=(15,6), rot=0)2 plt.xlabel('助攻次数', fontsize=14)3 plt.ylabel("吃鸡概率", fontsize=14)4 plt.title('助攻次数与吃鸡概率的关系', fontsize=14)“毒来了我跑不过毒怎么办啊”之车辆到底有多重要?1 agg1.groupby('drove').won.mean().plot.barh(figsize=(6,3))2 plt.xlabel("吃鸡概率", fontsize=14)3 plt.ylabel("是否搭乘过车辆", fontsize=14)4 plt.title('搭乘车辆与吃鸡概率的关系', fontsize=14)5 plt.yticks([1,0],['是','否'])1 dist_ride = agg1.loc[agg1['player_dist_ride']<12000, ['player_dist_ride', 'won']]23 labels=["0-1k", "1-2k", "2-3k", "3-4k","4-5k", "5-6k", "6-7k", "7-8k", "8-9k", "9-10k", "10-11k", "11-12k"]4 dist_ride['drove_cut'] = pd.cut(dist_ride['player_dist_ride'], 12, labels=labels)56 dist_ride.groupby('drove_cut').won.mean().plot.bar(rot=60, figsize=(8,4))7 plt.xlabel("搭乘车辆⾥程", fontsize=14)8 plt.ylabel("吃鸡概率", fontsize=14)9 plt.title('搭乘车辆⾥程与吃鸡概率的关系', fontsize=14)match_unique = agg1.loc[agg1['party_size'] == 1, 'match_id'].unique()match_unique = agg1.loc[agg1['party_size'] == 1, 'match_id'].unique()把玩家被击杀的数据导⼊进来1# 先把玩家被击杀的数据导⼊进来并探索数据2 death1 = pd.read_csv('/Users/apple/Desktop/pubg/deaths/kill_match_stats_final_1.csv')34 death1.head()1 ()23 death1.shape45 death1_solo = death1[death1['match_id'].isin(match_unique)]67 death1_()飞机嗡嗡地,我到底跳哪⾥⽐较安全1# 只统计单⼈模式,筛选存活不超过180秒的玩家数据2 death_180_seconds_erg = death1_solo.loc[(death1_solo['map'] == 'ERANGEL')&(death1_solo['time'] < 180)&(death1_solo['victim_position_x']>0), :].dropna()3 death_180_seconds_mrm = death1_solo.loc[(death1_solo['map'] == 'MIRAMAR')&(death1_solo['time'] < 180)&(death1_solo['victim_position_x']>0), :].dropna() 45 death_180_seconds_erg.shape67 death_180_seconds_mrm.shape1# 选择存活不过180秒的玩家死亡位置2 data_erg = death_180_seconds_erg[['victim_position_x', 'victim_position_y']].values3 data_mrm = death_180_seconds_mrm[['victim_position_x', 'victim_position_y']].values45# 重新scale玩家位置6 data_erg = data_erg*4096/8000007 data_mrm = data_mrm*1000/80000089from scipy.ndimage.filters import gaussian_filter10import matplotlib.cm as cm11from matplotlib.colors import Normalize12from scipy.misc.pilutil import imread1314from scipy.ndimage.filters import gaussian_filter15import matplotlib.cm as cm16from matplotlib.colors import Normalize1718def heatmap(x, y, s, bins=100):19 heatmap, xedges, yedges = np.histogram2d(x, y, bins=bins)20 heatmap = gaussian_filter(heatmap, sigma=s)2122 extent = [xedges[0], xedges[-1], yedges[0], yedges[-1]]23return heatmap.T, extent2425 bg = imread('/Users/apple/Desktop/pubg/erangel.jpg')26 hmap, extent = heatmap(data_erg[:,0], data_erg[:,1], 4.5)27 alphas = np.clip(Normalize(0, hmap.max(), clip=True)(hmap)*4.5, 0.0, 1.)28 colors = Normalize(0, hmap.max(), clip=True)(hmap)29 colors = cm.Reds(colors)30 colors[..., -1] = alphas3132 fig, ax = plt.subplots(figsize=(24,24))33 ax.set_xlim(0, 4096); ax.set_ylim(0, 4096)34 ax.imshow(bg)35 ax.imshow(colors, extent=extent, origin='lower', cmap=cm.Reds, alpha=0.9)36 plt.gca().invert_yaxis()1 bg = imread('/Users/apple/Desktop/pubg/miramar.jpg')2 hmap, extent = heatmap(data_mrm[:,0], data_mrm[:,1], 4)3 alphas = np.clip(Normalize(0, hmap.max(), clip=True)(hmap)*4, 0.0, 1.)4 colors = Normalize(0, hmap.max(), clip=True)(hmap)5 colors = cm.Reds(colors)6 colors[..., -1] = alphas78 fig, ax = plt.subplots(figsize=(24,24))9 ax.set_xlim(0, 1000); ax.set_ylim(0, 1000)10 ax.imshow(bg)11 ax.imshow(colors, extent=extent, origin='lower', cmap=cm.Reds, alpha=0.9)12#plt.scatter(plot_data_mr[:,0], plot_data_mr[:,1])13 plt.gca().invert_yaxis()最后的毒圈⼀般会在哪⾥呢?这⾥选取每场⽐赛第⼀名和第⼆名的位置数据,因为第⼀名和第⼆名所在的位置基本上就是最后的毒圈所在的位置1 death_final_circle_erg = death1_solo.loc[(death1_solo['map'] == 'ERANGEL')&(death1_solo['victim_placement'] == 2)&(death1_solo['victim_position_x']>0)&(death1_solo['killer_position_x']>0), :].dropna()2 death_final_circle_mrm = death1_solo.loc[(death1_solo['map'] == 'MIRAMAR')&(death1_solo['victim_placement'] == 2)&(death1_solo['victim_position_x']>0)&(death1_solo['killer_position_x']>0), :].dropna() 34print(death_final_circle_erg.shape)5print(death_final_circle_mrm.shape)67 final_circle_erg = np.vstack([death_final_circle_erg[['victim_position_x', 'victim_position_y']].values,8 death_final_circle_erg[['killer_position_x', 'killer_position_y']].values])*4096/8000009 final_circle_mrm = np.vstack([death_final_circle_mrm[['victim_position_x', 'victim_position_y']].values,10 death_final_circle_mrm[['killer_position_x', 'killer_position_y']].values])*1000/8000001 bg = imread('/Users/apple/Desktop/pubg/erangel.jpg')2 hmap, extent = heatmap(final_circle_erg[:,0], final_circle_erg[:,1], 1.5)3 alphas = np.clip(Normalize(0, hmap.max(), clip=True)(hmap)*1.5, 0.0, 1.)4 colors = Normalize(0, hmap.max(), clip=True)(hmap)5 colors = cm.Reds(colors)6 colors[..., -1] = alphas78 fig, ax = plt.subplots(figsize=(24,24))9 ax.set_xlim(0, 4096); ax.set_ylim(0, 4096)10 ax.imshow(bg)11 ax.imshow(colors, extent=extent, origin='lower', cmap=cm.Reds, alpha=0.9)12#plt.scatter(plot_data_er[:,0], plot_data_er[:,1])1314 plt.gca().invert_yaxis()1 bg = imread('/Users/apple/Desktop/pubg/miramar.jpg')2 hmap, extent = heatmap(final_circle_mrm[:,0], final_circle_mrm[:,1], 1.5)3 alphas = np.clip(Normalize(0, hmap.max(), clip=True)(hmap)*1.5, 0.0, 1.)4 colors = Normalize(0, hmap.max(), clip=True)(hmap)5 colors = cm.Reds(colors)6 colors[..., -1] = alphas78 fig, ax = plt.subplots(figsize=(24,24))9 ax.set_xlim(0, 1000); ax.set_ylim(0, 1000)10 ax.imshow(bg)11 ax.imshow(colors, extent=extent, origin='lower', cmap=cm.Reds, alpha=0.9)12#plt.scatter(plot_data_mr[:,0], plot_data_mr[:,1])13 plt.gca().invert_yaxis()什么武器最有⽤?1 erg_died_of = death1.loc[(death1['map']=='ERANGEL')&(death1['killer_position_x']>0)&(death1['victim_position_x']>0)&(death1['killed_by']!='Down and Out'),:]2 mrm_died_of = death1.loc[(death1['map']=='MIRAMAR')&(death1['killer_position_x']>0)&(death1['victim_position_x']>0)&(death1['killed_by']!='Down and Out'),:]34print(erg_died_of.shape)5print(mrm_died_of.shape)1 erg_died_of['killed_by'].value_counts()[:10].plot.barh(figsize=(10,5))2 plt.xlabel("被击杀⼈数", fontsize=14)3 plt.ylabel("击杀的武器", fontsize=14)4 plt.title('武器跟击杀⼈数的统计(绝地海岛艾伦格)', fontsize=14)5 plt.yticks(fontsize=12)狙击适合使⽤什么武器?1# 把位置信息转换成距离,以“⽶”为单位2 erg_distance = np.sqrt(((erg_died_of['killer_position_x']-erg_died_of['victim_position_x'])/100)**2 + ((erg_died_of['killer_position_y']-erg_died_of['victim_position_y'])/100)**2)3456 mrm_distance = np.sqrt(((mrm_died_of['killer_position_x']-mrm_died_of['victim_position_x'])/100)**2 + ((mrm_died_of['killer_position_y']-mrm_died_of['victim_position_y'])/100)**2) 78910 sns.distplot(erg_distance.loc[erg_distance<400])1 erg_died_of.loc[(erg_distance > 800)&(erg_distance < 1500), 'killed_by'].value_counts()[:10].plot.bar(rot=30)2 plt.xlabel("狙击的武器", fontsize=14)3 plt.ylabel("被狙击的⼈数", fontsize=14)4 plt.title('狙击武器跟击杀⼈数的统计(绝地海岛艾伦格)', fontsize=14)5 plt.yticks(fontsize=12)1 mrm_died_of.loc[(mrm_distance > 800)&(mrm_distance < 1000), 'killed_by'].value_counts()[:10].plot.bar(rot=30)2 plt.xlabel("狙击的武器", fontsize=14)3 plt.ylabel("被狙击的⼈数", fontsize=14)4 plt.title('狙击武器跟击杀⼈数的统计(热情沙漠⽶拉玛)', fontsize=14)5 plt.yticks(fontsize=12)近战适合使⽤什么武器?1 erg_died_of.loc[erg_distance<10, 'killed_by'].value_counts()[:10].plot.bar(rot=30)2 plt.xlabel("近战武器", fontsize=14)3 plt.ylabel("被击杀的⼈数", fontsize=14)4 plt.title('近战武器跟击杀⼈数的统计(绝地海岛艾伦格)', fontsize=14)5 plt.yticks(fontsize=12)1 mrm_died_of.loc[mrm_distance<10, 'killed_by'].value_counts()[:10].plot.bar(rot=30)2 plt.xlabel("近战武器", fontsize=14)3 plt.ylabel("被击杀的⼈数", fontsize=14)4 plt.title('近战武器武器跟击杀⼈数的统计(热情沙漠⽶拉玛)', fontsize=14)5 plt.yticks(fontsize=12)Top10武器在各距离下的击杀百分⽐1 erg_died_of['erg_dist'] = erg_distance2 erg_died_of = erg_died_of.loc[erg_died_of['erg_dist']<800, :]3 top_weapons_erg = list(erg_died_of['killed_by'].value_counts()[:10].index)4 top_weapon_kills = erg_died_of[np.in1d(erg_died_of['killed_by'], top_weapons_erg)].copy()5 top_weapon_kills['bin'] = pd.cut(top_weapon_kills['erg_dist'], np.arange(0, 800, 10), include_lowest=True, labels=False)6 top_weapon_kills_wide = top_weapon_kills.groupby(['killed_by', 'bin']).size().unstack(fill_value=0).transpose()7810 top_weapon_kills_wide = top_weapon_kills_wide.div(top_weapon_kills_wide.sum(axis=1), axis=0)11121314from bokeh.models.tools import HoverTool15from bokeh.palettes import brewer16from bokeh.plotting import figure, show, output_notebook17from bokeh.models.sources import ColumnDataSource1819def stacked(df):20 df_top = df.cumsum(axis=1)21 df_bottom = df_top.shift(axis=1).fillna(0)[::-1]22 df_stack = pd.concat([df_bottom, df_top], ignore_index=True)23return df_stack2425 hover = HoverTool(26 tooltips=[27 ("index", "$index"),28 ("weapon", "@weapon"),29 ("(x,y)", "($x, $y)")30 ],31 point_policy='follow_mouse'32 )3334 areas = stacked(top_weapon_kills_wide)3536 colors = brewer['Spectral'][areas.shape[1]]37 x2 = np.hstack((top_weapon_kills_wide.index[::-1],38 top_weapon_kills_wide.index)) /0.0953940 TOOLS="pan,wheel_zoom,box_zoom,reset,previewsave"41 output_notebook()42 p = figure(x_range=(1, 800), y_range=(0, 1), tools=[TOOLS, hover], plot_width=800)43 p.grid.minor_grid_line_color = '#eeeeee'4445 source = ColumnDataSource(data={46'x': [x2] * areas.shape[1],47'y': [areas[c].values for c in areas],48'weapon': list(top_weapon_kills_wide.columns),49'color': colors50 })5152 p.patches('x', 'y', source=source, legend="weapon",53 color='color', alpha=0.8, line_color=None)54 p.title.text = "Top10武器在各距离下的击杀百分⽐(绝地海岛艾伦格)"55 p.xaxis.axis_label = "击杀距离(0-800⽶)"56 p.yaxis.axis_label = "百分⽐"5758 show(p)59606162 mrm_died_of['erg_dist'] = mrm_distance63 mrm_died_of = mrm_died_of.loc[mrm_died_of['erg_dist']<800, :]64 top_weapons_erg = list(mrm_died_of['killed_by'].value_counts()[:10].index)65 top_weapon_kills = mrm_died_of[np.in1d(mrm_died_of['killed_by'], top_weapons_erg)].copy()66 top_weapon_kills['bin'] = pd.cut(top_weapon_kills['erg_dist'], np.arange(0, 800, 10), include_lowest=True, labels=False)67 top_weapon_kills_wide = top_weapon_kills.groupby(['killed_by', 'bin']).size().unstack(fill_value=0).transpose()6869 top_weapon_kills_wide = top_weapon_kills_wide.div(top_weapon_kills_wide.sum(axis=1), axis=0)70717273def stacked(df):74 df_top = df.cumsum(axis=1)75 df_bottom = df_top.shift(axis=1).fillna(0)[::-1]76 df_stack = pd.concat([df_bottom, df_top], ignore_index=True)77return df_stack7879 hover = HoverTool(80 tooltips=[81 ("index", "$index"),82 ("weapon", "@weapon"),83 ("(x,y)", "($x, $y)")84 ],85 point_policy='follow_mouse'86 )8788 areas = stacked(top_weapon_kills_wide)8990 colors = brewer['Spectral'][areas.shape[1]]91 x2 = np.hstack((top_weapon_kills_wide.index[::-1],92 top_weapon_kills_wide.index)) /0.0959394 TOOLS="pan,wheel_zoom,box_zoom,reset,previewsave"95 output_notebook()96 p = figure(x_range=(1, 800), y_range=(0, 1), tools=[TOOLS, hover], plot_width=800)97 p.grid.minor_grid_line_color = '#eeeeee'9899 source = ColumnDataSource(data={100'x': [x2] * areas.shape[1],101'y': [areas[c].values for c in areas],102'weapon': list(top_weapon_kills_wide.columns),103'color': colors104 })105106 p.patches('x', 'y', source=source, legend="weapon",107 color='color', alpha=0.8, line_color=None)108 p.title.text = "Top10武器在各距离下的击杀百分⽐(热情沙漠⽶拉玛)"109 p.xaxis.axis_label = "击杀距离(0-800⽶)"110 p.yaxis.axis_label = "击杀百分⽐"112 show(p)⾃⼰把⾃⼰⼲倒的⽅式与⼈数1 death1.head()1 kill_by_self = death1.loc[death1['killer_name']==death1['victim_name'], "killed_by"]23 kill_by_self.value_counts()[:10].plot.barh()4 plt.xlabel("⾃毙的⼈数", fontsize=14)5 plt.ylabel("⾃毙的⽅式", fontsize=14)6 plt.title('⾃⼰把⾃⼰⼲倒的⽅式与⼈数', fontsize=14)7 plt.yticks(fontsize=12)1# ⾃⼰把⾃⼰⼲倒的⼈数场均百分⽐2 kill_by_self.shape[0]/death1.shape[0]*100完整代码:1import pandas as pd2import numpy as np3import matplotlib.pyplot as plt4import seaborn as sns5 %matplotlib inline6 plt.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体7 plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显⽰为⽅块的问题89# 使⽤pandas读取数据10 agg1 = pd.read_csv('/Users/apple/Desktop/pubg/aggregate/agg_match_stats_1.csv')1112# 探索数据结构13 agg1.head()1415# 总共有13844275⾏玩家数据,15列16 agg1.shape1718 agg1.columns1920 ()2122# 丢弃重复数据23 agg1.drop_duplicates(inplace=True)2425 agg1.loc[1]2627# 添加是否成功吃鸡列28 agg1['won'] = agg1['team_placement'] == 12930# 添加是否搭乘过车辆列31 agg1['drove'] = agg1['player_dist_ride'] != 03233 agg1.loc[agg1['player_kills'] < 40, ['player_kills', 'won']].groupby('player_kills').won.mean().plot.bar(figsize=(15,6), rot=0)34 plt.xlabel('击杀⼈数', fontsize=14)35 plt.ylabel("吃鸡概率", fontsize=14)36 plt.title('击杀⼈数与吃鸡概率的关系', fontsize=14)3738 agg1.groupby('party_size').player_kills.mean()3940 g = sns.FacetGrid(agg1.loc[agg1['player_kills']<=10, ['party_size', 'player_kills']], row="party_size", size=4, aspect=2)41 g = g.map(sns.countplot, "player_kills")4243 agg1.loc[agg1['party_size']!=1, ['player_assists', 'won']].groupby('player_assists').won.mean().plot.bar(figsize=(15,6), rot=0)44 plt.xlabel('助攻次数', fontsize=14)45 plt.ylabel("吃鸡概率", fontsize=14)46 plt.title('助攻次数与吃鸡概率的关系', fontsize=14)4748 agg1.groupby('drove').won.mean().plot.barh(figsize=(6,3))49 plt.xlabel("吃鸡概率", fontsize=14)50 plt.ylabel("是否搭乘过车辆", fontsize=14)51 plt.title('搭乘车辆与吃鸡概率的关系', fontsize=14)52 plt.yticks([1,0],['是','否'])5354 dist_ride = agg1.loc[agg1['player_dist_ride']<12000, ['player_dist_ride', 'won']]5556 labels=["0-1k", "1-2k", "2-3k", "3-4k","4-5k", "5-6k", "6-7k", "7-8k", "8-9k", "9-10k", "10-11k", "11-12k"]57 dist_ride['drove_cut'] = pd.cut(dist_ride['player_dist_ride'], 12, labels=labels)5859 dist_ride.groupby('drove_cut').won.mean().plot.bar(rot=60, figsize=(8,4))60 plt.xlabel("搭乘车辆⾥程", fontsize=14)61 plt.ylabel("吃鸡概率", fontsize=14)62 plt.title('搭乘车辆⾥程与吃鸡概率的关系', fontsize=14)6364 match_unique = agg1.loc[agg1['party_size'] == 1, 'match_id'].unique()6566# 先把玩家被击杀的数据导⼊进来并探索数据67 death1 = pd.read_csv('/Users/apple/Desktop/pubg/deaths/kill_match_stats_final_1.csv')6869 death1.head()7071 ()7273 death1.shape7475 death1_solo = death1[death1['match_id'].isin(match_unique)]7677 death1_()7879# 只统计单⼈模式,筛选存活不超过180秒的玩家数据80 death_180_seconds_erg = death1_solo.loc[(death1_solo['map'] == 'ERANGEL')&(death1_solo['time'] < 180)&(death1_solo['victim_position_x']>0), :].dropna()81 death_180_seconds_mrm = death1_solo.loc[(death1_solo['map'] == 'MIRAMAR')&(death1_solo['time'] < 180)&(death1_solo['victim_position_x']>0), :].dropna()8283 death_180_seconds_erg.shape8485 death_180_seconds_mrm.shape8687# 选择存活不过180秒的玩家死亡位置88 data_erg = death_180_seconds_erg[['victim_position_x', 'victim_position_y']].values89 data_mrm = death_180_seconds_mrm[['victim_position_x', 'victim_position_y']].values9091# 重新scale玩家位置92 data_erg = data_erg*4096/80000093 data_mrm = data_mrm*1000/8000009495from scipy.ndimage.filters import gaussian_filter96import matplotlib.cm as cm97from matplotlib.colors import Normalize98from scipy.misc.pilutil import imread99100from scipy.ndimage.filters import gaussian_filter101import matplotlib.cm as cm102from matplotlib.colors import Normalize103104def heatmap(x, y, s, bins=100):105 heatmap, xedges, yedges = np.histogram2d(x, y, bins=bins)106 heatmap = gaussian_filter(heatmap, sigma=s)107108 extent = [xedges[0], xedges[-1], yedges[0], yedges[-1]]109return heatmap.T, extent110111 bg = imread('/Users/apple/Desktop/pubg/erangel.jpg')112 hmap, extent = heatmap(data_erg[:,0], data_erg[:,1], 4.5)113 alphas = np.clip(Normalize(0, hmap.max(), clip=True)(hmap)*4.5, 0.0, 1.)114 colors = Normalize(0, hmap.max(), clip=True)(hmap)115 colors = cm.Reds(colors)116 colors[..., -1] = alphas117118 fig, ax = plt.subplots(figsize=(24,24))119 ax.set_xlim(0, 4096); ax.set_ylim(0, 4096)120 ax.imshow(bg)121 ax.imshow(colors, extent=extent, origin='lower', cmap=cm.Reds, alpha=0.9)122 plt.gca().invert_yaxis()123124 bg = imread('/Users/apple/Desktop/pubg/miramar.jpg')125 hmap, extent = heatmap(data_mrm[:,0], data_mrm[:,1], 4)126 alphas = np.clip(Normalize(0, hmap.max(), clip=True)(hmap)*4, 0.0, 1.)127 colors = Normalize(0, hmap.max(), clip=True)(hmap)128 colors = cm.Reds(colors)129 colors[..., -1] = alphas130131 fig, ax = plt.subplots(figsize=(24,24))132 ax.set_xlim(0, 1000); ax.set_ylim(0, 1000)133 ax.imshow(bg)134 ax.imshow(colors, extent=extent, origin='lower', cmap=cm.Reds, alpha=0.9)135#plt.scatter(plot_data_mr[:,0], plot_data_mr[:,1])136 plt.gca().invert_yaxis()137138 death_final_circle_erg = death1_solo.loc[(death1_solo['map'] == 'ERANGEL')&(death1_solo['victim_placement'] == 2)&(death1_solo['victim_position_x']>0)&(death1_solo['killer_position_x']>0), :].dropna() 139 death_final_circle_mrm = death1_solo.loc[(death1_solo['map'] == 'MIRAMAR')&(death1_solo['victim_placement'] == 2)&(death1_solo['victim_position_x']>0)&(death1_solo['killer_position_x']>0), :].dropna() 140141print(death_final_circle_erg.shape)142print(death_final_circle_mrm.shape)143144 final_circle_erg = np.vstack([death_final_circle_erg[['victim_position_x', 'victim_position_y']].values,145 death_final_circle_erg[['killer_position_x', 'killer_position_y']].values])*4096/800000146 final_circle_mrm = np.vstack([death_final_circle_mrm[['victim_position_x', 'victim_position_y']].values,147 death_final_circle_mrm[['killer_position_x', 'killer_position_y']].values])*1000/800000148149 bg = imread('/Users/apple/Desktop/pubg/erangel.jpg')150 hmap, extent = heatmap(final_circle_erg[:,0], final_circle_erg[:,1], 1.5)151 alphas = np.clip(Normalize(0, hmap.max(), clip=True)(hmap)*1.5, 0.0, 1.)152 colors = Normalize(0, hmap.max(), clip=True)(hmap)153 colors = cm.Reds(colors)154 colors[..., -1] = alphas155156 fig, ax = plt.subplots(figsize=(24,24))157 ax.set_xlim(0, 4096); ax.set_ylim(0, 4096)158 ax.imshow(bg)159 ax.imshow(colors, extent=extent, origin='lower', cmap=cm.Reds, alpha=0.9)160#plt.scatter(plot_data_er[:,0], plot_data_er[:,1])161 plt.gca().invert_yaxis()162163 bg = imread('/Users/apple/Desktop/pubg/miramar.jpg')164 hmap, extent = heatmap(final_circle_mrm[:,0], final_circle_mrm[:,1], 1.5)165 alphas = np.clip(Normalize(0, hmap.max(), clip=True)(hmap)*1.5, 0.0, 1.)166 colors = Normalize(0, hmap.max(), clip=True)(hmap)167 colors = cm.Reds(colors)168 colors[..., -1] = alphas169170 fig, ax = plt.subplots(figsize=(24,24))171 ax.set_xlim(0, 1000); ax.set_ylim(0, 1000)172 ax.imshow(bg)173 ax.imshow(colors, extent=extent, origin='lower', cmap=cm.Reds, alpha=0.9)174#plt.scatter(plot_data_mr[:,0], plot_data_mr[:,1])175 plt.gca().invert_yaxis()176177 erg_died_of = death1.loc[(death1['map']=='ERANGEL')&(death1['killer_position_x']>0)&(death1['victim_position_x']>0)&(death1['killed_by']!='Down and Out'),:]178 mrm_died_of = death1.loc[(death1['map']=='MIRAMAR')&(death1['killer_position_x']>0)&(death1['victim_position_x']>0)&(death1['killed_by']!='Down and Out'),:]179180print(erg_died_of.shape)181print(mrm_died_of.shape)182183 erg_died_of['killed_by'].value_counts()[:10].plot.barh(figsize=(10,5))184 plt.xlabel("被击杀⼈数", fontsize=14)185 plt.ylabel("击杀的武器", fontsize=14)186 plt.title('武器跟击杀⼈数的统计(绝地海岛艾伦格)', fontsize=14)187 plt.yticks(fontsize=12)188189 mrm_died_of['killed_by'].value_counts()[:10].plot.barh(figsize=(10,5))190 plt.xlabel("被击杀⼈数", fontsize=14)191 plt.ylabel("击杀的武器", fontsize=14)192 plt.title('武器跟击杀⼈数的统计(热情沙漠⽶拉玛)', fontsize=14)193 plt.yticks(fontsize=12)194195# 把位置信息转换成距离,以“⽶”为单位196 erg_distance = np.sqrt(((erg_died_of['killer_position_x']-erg_died_of['victim_position_x'])/100)**2 + ((erg_died_of['killer_position_y']-erg_died_of['victim_position_y'])/100)**2)197198 mrm_distance = np.sqrt(((mrm_died_of['killer_position_x']-mrm_died_of['victim_position_x'])/100)**2 + ((mrm_died_of['killer_position_y']-mrm_died_of['victim_position_y'])/100)**2) 199200 sns.distplot(erg_distance.loc[erg_distance<400])201202 erg_died_of.loc[(erg_distance > 800)&(erg_distance < 1500), 'killed_by'].value_counts()[:10].plot.bar(rot=30)203 plt.xlabel("狙击的武器", fontsize=14)204 plt.ylabel("被狙击的⼈数", fontsize=14)205 plt.title('狙击武器跟击杀⼈数的统计(绝地海岛艾伦格)', fontsize=14)206 plt.yticks(fontsize=12)207208 mrm_died_of.loc[(mrm_distance > 800)&(mrm_distance < 1000), 'killed_by'].value_counts()[:10].plot.bar(rot=30)209 plt.xlabel("狙击的武器", fontsize=14)210 plt.ylabel("被狙击的⼈数", fontsize=14)211 plt.title('狙击武器跟击杀⼈数的统计(热情沙漠⽶拉玛)', fontsize=14)212 plt.yticks(fontsize=12)213214 erg_died_of.loc[erg_distance<10, 'killed_by'].value_counts()[:10].plot.bar(rot=30)215 plt.xlabel("近战武器", fontsize=14)216 plt.ylabel("被击杀的⼈数", fontsize=14)217 plt.title('近战武器跟击杀⼈数的统计(绝地海岛艾伦格)', fontsize=14)218 plt.yticks(fontsize=12)219220 mrm_died_of.loc[mrm_distance<10, 'killed_by'].value_counts()[:10].plot.bar(rot=30)221 plt.xlabel("近战武器", fontsize=14)222 plt.ylabel("被击杀的⼈数", fontsize=14)223 plt.title('近战武器武器跟击杀⼈数的统计(热情沙漠⽶拉玛)', fontsize=14)224 plt.yticks(fontsize=12)225226 erg_died_of['erg_dist'] = erg_distance227 erg_died_of = erg_died_of.loc[erg_died_of['erg_dist']<800, :]228 top_weapons_erg = list(erg_died_of['killed_by'].value_counts()[:10].index)229 top_weapon_kills = erg_died_of[np.in1d(erg_died_of['killed_by'], top_weapons_erg)].copy()230 top_weapon_kills['bin'] = pd.cut(top_weapon_kills['erg_dist'], np.arange(0, 800, 10), include_lowest=True, labels=False)231 top_weapon_kills_wide = top_weapon_kills.groupby(['killed_by', 'bin']).size().unstack(fill_value=0).transpose()232233 top_weapon_kills_wide = top_weapon_kills_wide.div(top_weapon_kills_wide.sum(axis=1), axis=0)234235from bokeh.models.tools import HoverTool236from bokeh.palettes import brewer237from bokeh.plotting import figure, show, output_notebook238from bokeh.models.sources import ColumnDataSource239240def stacked(df):241 df_top = df.cumsum(axis=1)242 df_bottom = df_top.shift(axis=1).fillna(0)[::-1]243 df_stack = pd.concat([df_bottom, df_top], ignore_index=True)244return df_stack245246 hover = HoverTool(247 tooltips=[248 ("index", "$index"),249 ("weapon", "@weapon"),250 ("(x,y)", "($x, $y)")251 ],252 point_policy='follow_mouse'253 )254255 areas = stacked(top_weapon_kills_wide)。
Python爬取OPGG上英雄联盟英雄胜率及选取率信息的操作

Python爬取OPGG上英雄联盟英雄胜率及选取率信息的操作由⽹站界⾯可以看出,右侧有英雄的详细信息,以Garen为例,胜率为53.84%,选取率为16.99%,常⽤位置为上单现对⽹页源代码进⾏分析(右键⿏标在菜单中即可找到查看⽹页源代码)。
通过查找“53.84%”快速定位Garen所在位置由代码可看出,英雄名、胜率及选取率都在td标签中,⽽每⼀个英雄信息在⼀个tr标签中,td⽗标签为tr标签,tr⽗标签为tbody标签。
对tbody标签进⾏查找代码中共有5个tbody标签(tbody标签开头结尾均有”tbody”,故共有10个”tbody”),对字段内容分析,分别为上单、打野、中单、ADC、辅助信息以上单这部分英雄为例,我们需要⾸先找到tbody标签,然后从中找到tr标签(每⼀条tr标签就是⼀个英雄的信息),再从⼦标签td标签中获取英雄的详细信息⼆、爬取步骤爬取⽹站内容->提取所需信息->输出英雄数据getHTMLText(url)->fillHeroInformation(hlist,html)->printHeroInformation(hlist)getHTMLText(url)函数是返回url链接中的html内容fillHeroInformation(hlist,html)函数是将html中所需信息提取出存⼊hlist列表中printHeroInformation(hlist)函数是输出hlist列表中的英雄信息三、代码实现1、getHTMLText(url)函数def getHTMLText(url): #返回html⽂档信息try:r = requests.get(url,timeout = 30)r.raise_for_status()r.encoding = r.apparent_encodingreturn r.text #返回html内容except:return ""2、fillHeroInformation(hlist,html)函数以⼀个tr标签为例,tr标签内有7个td标签,第4个td标签内属性值为"champion-index-table__name"的div标签内容为英雄名,第5个td标签内容为胜率,第6个td标签内容为选取率,将这些信息存⼊hlist列表中def fillHeroInformation(hlist,html): #将英雄信息存⼊hlist列表soup = BeautifulSoup(html,"html.parser")for tr in soup.find(name = "tbody",attrs = "tabItem champion-trend-tier-TOP").children: #遍历上单tbody标签的⼉⼦标签if isinstance(tr,bs4.element.Tag): #判断tr是否为标签类型,去除空⾏tds = tr('td') #查找tr标签下的td标签heroName = tds[3].find(attrs = "champion-index-table__name").string #英雄名winRate = tds[4].string #胜率pickRate = tds[5].string #选取率hlist.append([heroName,winRate,pickRate]) #将英雄信息添加到hlist列表中3、printHeroInformation(hlist)函数def printHeroInformation(hlist): #输出hlist列表信息print("{:^20}\t{:^20}\t{:^20}\t{:^20}".format("英雄名","胜率","选取率","位置"))for i in range(len(hlist)):i = hlist[i]print("{:^20}\t{:^20}\t{:^20}\t{:^20}".format(i[0],i[1],i[2],"上单"))4、main()函数⽹站地址赋值给url,新建⼀个hlist列表,调⽤getHTMLText(url)函数获得html⽂档信息,使⽤fillHeroInformation(hlist,html)函数将英雄信息存⼊hlist列表,再使⽤printHeroInformation(hlist)函数输出信息def main():url = "http://www.op.gg/champion/statistics"hlist = []html = getHTMLText(url) #获得html⽂档信息fillHeroInformation(hlist,html) #将英雄信息写⼊hlist列表printHeroInformation(hlist) #输出信息四、结果演⽰1、⽹站界⾯信息2、爬取结果五、完整代码import requests #导⼊requests库import bs4 #导⼊bs4库from bs4 import BeautifulSoup #导⼊BeautifulSoup库def getHTMLText(url): #返回html⽂档信息try:r = requests.get(url,timeout = 30)r.raise_for_status()r.encoding = r.apparent_encodingreturn r.text #返回html内容except:return ""def fillHeroInformation(hlist,html): #将英雄信息存⼊hlist列表soup = BeautifulSoup(html,"html.parser")for tr in soup.find(name = "tbody",attrs = "tabItem champion-trend-tier-TOP").children: #遍历上单tbody标签的⼉⼦标签 if isinstance(tr,bs4.element.Tag): #判断tr是否为标签类型,去除空⾏tds = tr('td') #查找tr标签下的td标签heroName = tds[3].find(attrs = "champion-index-table__name").string #英雄名winRate = tds[4].string #胜率pickRate = tds[5].string #选取率hlist.append([heroName,winRate,pickRate]) #将英雄信息添加到hlist列表中def printHeroInformation(hlist): #输出hlist列表信息print("{:^20}\t{:^20}\t{:^20}\t{:^20}".format("英雄名","胜率","选取率","位置"))for i in range(len(hlist)):i = hlist[i]print("{:^20}\t{:^20}\t{:^20}\t{:^20}".format(i[0],i[1],i[2],"上单"))def main():url = "http://www.op.gg/champion/statistics"hlist = []html = getHTMLText(url) #获得html⽂档信息fillHeroInformation(hlist,html) #将英雄信息写⼊hlist列表printHeroInformation(hlist) #输出信息main()如果需要爬取打野、中单、ADC或者辅助信息,只需要修改fillHeroInformation(hlist,html)函数中的for tr in soup.find(name = "tbody",attrs = "tabItem champion-trend-tier-TOP").children语句将attrs属性值修改为"tabItem champion-trend-tier-JUNGLE""tabItem champion-trend-tier-MID""tabItem champion-trend-tier-ADC""tabItem champion-trend-tier-SUPPORT"等即可!以上为个⼈经验,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。
Python实现的10个有趣的项目

Web应用开发
Python在Web开发中的应用广泛,如Django、Flask等框架
Python的Web开发框架具有易用性、灵活性和扩展性
Python的Web开发框架支持多种数据库,如MySQL、PostgreSQL 等
Python的Web开发框架支持多种模板引擎,如Jinja2、Django Te m p l a te 等
Part Six
Python在科学计 算中的应用
生物信息学分析
基因序列分析:通过Python进行 基因序列的比对、注释和预测
基因组数据分析:对基因组数据进 行统计分析、可视化和挖掘
添加标题
添加标题
添加标题
添加标题
蛋白质结构预测:利用Python进 行蛋白质结构预测和建模
药物设计:通过Python进行药物 设计和筛选,提高药物研发效率
数据处理:使用Python进行数据清 洗、转换和整合
数据可视化:使用Python绘制天气 数据图表,如温度、湿度、风速等
数据分析:对天气数据进行统计分析, 如温度变化趋势、湿度分布等
应用:将分析结果应用于天气预报、 旅游规划等领域
股票市场数据分析
利用Python进行股票市场数据分析 利用Python库如pandas、numpy等进行数据处理 利用Python进行股票价格预测 利用Python进行股票市场风险评估
Python的Web开发框架支持多种前端技术,如HTML、CSS、 JavaScript等
Python的Web开发框架支持多种部署方式,如Apache、Nginx等
Part Five
Python在游戏开 发中的应用
游戏AI设计
游戏AI的基本概 念:让游戏中的 角色具有智能行 为
faker库的用法

Faker是一个用于生成伪随机数据的Python 库,可以用于生成各种类型的虚拟数据,如姓名、地址、电子邮件、文本、图像等。
它通常用于测试、填充数据库、制作样本数据等场景。
下面是关于Faker库的基本用法示例:
1.安装:你可以使用pip命令来安装Faker库。
在终端中运行以下命令即可安
装:
2.生成随机数据:在使用之前,你需要导入Faker库并创建一个Faker实例。
然
后,你可以使用该实例来生成不同类型的虚拟数据。
以下是一个示例:
3.本地化设置:Faker支持多种语言和地区的数据生成。
你可以通过设置本地
化参数来生成特定语言和地区的虚拟数据。
例如:
这将生成英文语言环境下的虚拟数据。
Faker是一个方便易用的 Python 库,可以帮助你快速生成各种类型的虚拟数据。
无
论是在进行软件测试、数据库填充、数据分析还是制作样本数据时,Faker都可以
提供有效的解决方案。
如果你需要不同类型的虚拟数据来填充应用程序或测试数据集,Faker库将会是一个很有用的工具。
python中faker用法

python中faker用法摘要:1.介绍Python中的Faker库2.Faker库的作用和用途3.Faker库的主要功能4.Faker库在实际项目中的应用5.Faker库与其他库的比较和优势6.总结Faker库在Python中的重要性正文:Python是一种广泛使用的编程语言,其功能强大且易于学习。
在数据生成和模拟方面,Python中的Faker库是一个非常有用的库。
Faker库是一个用于生成各种数据的Python库,它可以模拟各种数据类型,如姓名、地址、电话号码、电子邮件地址等。
在许多实际项目中,Faker库可以帮助开发者快速生成大量测试数据,从而简化开发过程并提高效率。
Faker库的主要功能包括:- 生成各种类型的随机数据,如文本、数字、日期等- 支持多种语言和地区设置- 可自定义生成数据的样式和格式- 与其他Python库集成,如Factory Boy和Pytest等在实际项目应用中,Faker库可以帮助开发者生成大量测试数据,从而简化测试过程。
例如,在进行数据验证或数据处理任务时,可以使用Faker库生成模拟数据,以验证代码的正确性。
此外,Faker库还可以用于生成虚拟用户信息,从而在Web应用程序中模拟用户行为。
与其他库相比,Faker库具有以下优势:- 易于使用:Faker库提供了简单易用的API,开发者可以快速上手并开始使用- 高度灵活:Faker库支持多种语言和地区设置,可以根据需要自定义生成数据的样式和格式- 社区支持:Faker库拥有活跃的社区,可以获得丰富的文档和示例代码综上所述,Faker库在Python中具有重要的地位。
无论是在实际项目中还是日常开发中,Faker库都可以为开发者提供便利,帮助快速生成数据并提高开发效率。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
还不会选英雄阵容?python来帮你carry全场欢迎来到召唤术峡谷~”英雄联盟作为一款长青游戏,风靡了这么多年,2018全球总决赛的IG冠军一出更是引发了众多撸迷又将游戏重新拾起。
今天我们就来分析一下战队的阵容选择会对胜率带来什么样的影响。
1.载入必要的包import pandas as pdimport matplotlib.pyplot as pltimport seaborn as snsfrom pyecharts import Radar2.读取并观察数据情况dat_hero=pd.read_csv('TeamHero_index.csv')dat_hero.head()3.数据分析(1)红蓝方因素对胜负的影响众所周知,在英雄联盟中,由于蓝方会先手ban英雄及pick英雄,因此通常蓝方的胜率更高一些。
让我们来看看数据是否能够印证这一点。
取出红方获胜的数据:red_win1=dat_hero[dat_hero['是否红方'].isin(['1'])]red_win1=red_win1[red_win1['是否获胜'].isin(['1'])]red_win2=dat_hero[dat_hero['是否红方'].isin(['0'])]red_win2=red_win2[red_win2['是否获胜'].isin(['0'])]red_win=pd.concat([red_win1,red_win2])red_win.shape(208,8)取出蓝方获胜的数据blue_win1=dat_hero[dat_hero['是否红方'].isin(['1'])]blue_win1=blue_win1[blue_win1['是否获胜'].isin(['0'])]blue_win2=dat_hero[dat_hero['是否红方'].isin(['0'])]blue_win2=blue_win2[blue_win2['是否获胜'].isin(['1'])]blue_win=pd.concat([blue_win1,blue_win2])blue_win.shape(316,8)画出红蓝方胜场直方图由上面的数据和图可以看到,蓝方有316胜场,红方仅有208胜场。
可以印证蓝有相对而言更有优势。
下面我们再对红蓝方所选用的英雄属性进行分析。
计算红方获胜时英雄平均属性:value1=[[red_win['攻击'].mean(),red_win['法术'].mean(),red_win['防御'].mean(),red_win['团战'].mean(),red_win['机动'].mean()]]计算蓝方获胜时英雄平均属性:value2=[[blue_win['攻击'].mean(),blue_win['法术'].mean(),blue_win['防御'].mean(),blue_win['团战'].mean(),bluewin['机动'].mean()]]from pyecharts import Radarradar = Radar()#用于调整雷达各维度的范围大小c_schema= [{"name": "攻击", "max": 54.3, "min": 54.1},{"name": "法术", "max": 52, "min": 51},{"name": "防御", "max": 54, "min": 52},{"name": "团战", "max": 73.2, "min": 71},{"name": "机动", "max": 66, "min": 65}]radar.config(c_schema=c_schema)radar.add("红方获胜",value1,item_color="#f9713c",area_color='#ea3a2e',area_opacity=0.3) radar.add("蓝方获胜",value2,item_color='#2525f5',area_color='#2525f5',area_opacity=0.3)radar从图中可以看到,作为红方,想要胜利攻击力、法术强度、防御性能都要比在蓝方时强一些,团战能力更是达到顶峰,而作为蓝色方来说,均衡发展就可以赢得胜利,团战能力也不需要特别强。
(2) 各个战队战绩分析plt.figure(figsize=(15,7))plt.xlabel('战队',fontsize=30,fontproperties=myfont)plt.ylabel('次数',fontsize=30,fontproperties=myfont)sns.countplot(x='战队',hue='是否获胜',data=dat_hero,palette=sns.color_palette('hls',7))从图中可以看出,胜场比负场多的战队分别有EDG, IG, RNG, WE, NB,OMG这六支战队。
胜场最多的依次是IG, RNG, WE这三支战队。
我们对这三支战队所选用英雄属性进行分析。
#计算EDG战队所选用英雄的平均属性EDG=dat_hero[dat_hero['战队'].isin(['EDG'])]edg_value=[[EDG['攻击'].mean(),EDG['法术'].mean(),EDG['防御'].mean(),EDG['团战'].mean(),EDG['机动'].mean()]]#计算RNG战队所选用英雄的平均属性RNG=dat_hero[dat_hero['战队'].isin(['RNG'])]rng_value=[[RNG['攻击'].mean(),RNG['法术'].mean(),RNG['防御'].mean(),RNG['团战'].mean(),RNG['机动'].mean()]]#计算WE战队所选用英雄的平均属性WE=dat_hero[dat_hero['战队'].isin(['WE'])]we_value=[[WE['攻击'].mean(),WE['法术'].mean(),WE['防御'].mean(),WE['团战'].mean(),WE['机动'].mean()]]radar1 = Radar()#用于调整雷达各维度的范围大小c_schema= [{"name": "攻击", "max": 55, "min": 53},{"name": "法术", "max": 52.5, "min": 50},{"name": "防御", "max": 55, "min": 52},{"name": "团战", "max": 76, "min": 72},{"name": "机动", "max": 68, "min": 64}]radar1.config(c_schema=c_schema)radar1.add("EDG", edg_value,item_color="#f9713c",line_width=3)radar1.add("RNG", rng_value,item_color='#2525f5',line_width=3)radar1.add("WE", we_value,item_color='#000',line_width=3)radar1从上图可以看出,每支队伍在选用英雄时都有自己的特点。
EDG更爱攻击性的阵容,RNG法术、防御做的不错,WE则更偏向团战和机动性。
所以说,没有绝对的阵容,只要队友不坑、猥琐别浪,游戏还是能赢得。
看了分析,赶快去召唤师峡谷战斗吧!。