【大数据】—FIFA世界杯探索性分析(EDA)

引言

足球,作为全球最受欢迎的运动之一,拥有庞大的粉丝群体和深远的文化影响。自1930年首届FIFA世界杯举办以来,这项赛事已经成为全球体育盛事,吸引了数十亿观众的目光。世界杯不仅是各国足球技艺的较量,更是国家荣誉和民族自豪感的体现。随着大数据时代的到来,我们有机会从新的视角审视这项赛事,利用数据分析揭示比赛背后的趋势和模式。

背景

在数据科学领域,探索性数据分析(Exploratory Data Analysis,简称EDA)是一种用于理解数据集特征的重要方法。分析师可以识别数据中的模式、关联和异常,为进一步的统计建模和决策提供依据。FIFA世界杯作为一项历史悠久的国际足球赛事,其数据集包含了丰富的信息,如球队表现、球员统计、比赛结果等,为进行EDA提供了理想的素材。

数据集信息

本次研究的数据来源于Kaggle(点击本文标题下方可免费下载),数据集共有3个表格。
在这里插入图片描述

开始探索……

读入数据:

# 导入pandas库,这是一个强大的数据处理和分析工具,提供了易于使用的数据结构和数据分析工具。  
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)    
# 导入matplotlib.pyplot模块,这是Python的一个绘图库,提供了类似于MATLAB的绘图系统。  
import matplotlib.pyplot as plt    
# 导入seaborn库,这是基于matplotlib的一个高级绘图库,提供了更多的绘图功能和美化选项。  
import seaborn as sns    
# 启用Jupyter Notebook中的matplotlib内联显示模式,这样绘制的图形会直接嵌入到Notebook中。  
%matplotlib inline    
# 导入plotly库,这是一个基于Web的交互式图表库,允许创建丰富的、交互式的数据可视化图表。  
import plotly as py    
# 导入cufflinks库,这是一个用于Pandas DataFrame的Plotly绘图接口,可以让Pandas DataFrame直接通过cufflinks的API绘制Plotly图表。  
import plotly.express as px
# 导入Python的os模块,它提供了许多与操作系统交互的功能,比如文件路径操作、环境变量访问等。  
import os    
# 使用os模块中的walk函数遍历'/kaggle/input'目录及其所有子目录。  
# os.walk()生成一个三元组(dirpath, dirnames, filenames)。  
# dirpath是一个字符串,表示当前正在遍历的这个目录的路径。  
# dirnames是一个列表,内容是该目录下的所有子目录的名字(不包括路径,只是名字)。  
# filenames是一个列表,内容是该目录下的所有非目录文件的名字(同样只是名字,不包括路径)。  
# 注意:在您的代码中,dirnames参数被忽略(用_表示),因为这里只关心文件名和目录名。  
for dirname, _, filenames in os.walk('/Users/c/Downloads/archive/'):  
    # 对于os.walk()遍历到的每一个目录(包括'/kaggle/input'本身及其所有子目录),  
    # 执行以下循环,遍历该目录下的所有文件(不包括子目录)。  
    for filename in filenames:  
        # 使用os.path.join()函数将目录名(dirname)和文件名(filename)组合成完整的文件路径。  
        # 然后,打印这个完整的文件路径。  
        print(os.path.join(dirname, filename))

获取3个数据集文件路径:
在这里插入图片描述

players = pd.read_csv("/Users/c/Downloads/archive/WorldCupPlayers.csv")
matches = pd.read_csv("/Users/c/Downloads/archive/WorldCupMatches.csv")
world_cup = pd.read_csv("/Users/c/Downloads/archive/WorldCups.csv")
display(players.head(1), matches.head(1), world_cup.head(1))

分别展示数据集第一行数据信息:
在这里插入图片描述分展别示数据的整体信息:
在这里插入图片描述在这里插入图片描述
在这里插入图片描述查看数据缺失情况:
在这里插入图片描述matches数据集有3720个缺失值,我们将它删除并显示后5行:
在这里插入图片描述这里要对数据进行一下说明,自 1930 年首届世界杯以来,每四年进行一次,但 1942 年和 1946 年世界杯因第二次世界大战而没有举行,所以数据有缺失值,本文旨在给大家展示方法,得出的结论只是针对现有的数据进行的分析,并不代表真实结果。

三个数据集都需要清洗和处理,细节很多,我就不一一介绍,只介绍主要的地方,感兴趣的可以看代码上方#后面的注释:

在这里插入图片描述在这里插入图片描述

# 定义一个列表,包含了一些旧的(可能是错误的或需要更新的)名称  
old_name = ['Germany FR', 'Maracan� - Est�dio Jornalista M�rio Filho', 'Estadio do Maracana']  
# 注释:这里的列表包含了三个字符串,其中第二个和第三个字符串可能包含了编码问题(如特殊字符的显示错误),这可能是由于文件编码或数据传输时的问题导致的。    
# 定义一个列表,包含了与old_name中每个元素相对应的新的(正确的)名称  
new_name = ['Germany', 'Maracan Stadium', 'Maracan Stadium']  
# 注释:这个列表与old_name列表一一对应,每个元素都是对应旧名称的更正或标准化版本。    
# 将old_name列表中的所有元素添加到变量wrong中  
wrong = wrong + old_name  
# 注释:这行代码的目的是将old_name列表中的所有元素追加到wrong列表中,以收集所有需要被更正或更新的旧名称。    
# 将new_name列表中的所有元素添加到变量correct中   
correct = correct + new_name  
wrong,correct

在这里插入图片描述

# 遍历wrong列表,对每个旧名称进行替换  
for index, wr in enumerate(wrong):  
    # 使用replace方法将world_cup中的旧名称wr替换为correct列表中对应位置的正确名称  
    # 注意:这里假设world_cup是一个字符串或支持.replace()方法的数据类型  
    # enumerate(wrong)会生成一个包含索引和值的元组,index是索引,wr是当前迭代的旧名称  
    world_cup = world_cup.replace(wrong[index], correct[index])  
    # 注释:这行代码会更新world_cup变量的值,使其包含所有已替换的名称。  
  
# 再次遍历wrong列表,这次是对matches变量进行替换  
for index, wr in enumerate(wrong):  
    # 使用replace方法将matches中的旧名称wr替换为correct列表中对应位置的正确名称  
    # 注意:这里假设matches也是一个字符串或支持.replace()方法的数据类型  
    matches = matches.replace(wrong[index], correct[index])  
    # 注释:这行代码会更新matches变量的值,使其包含所有已替换的名称。  
  
# 第三次遍历wrong列表,这次是对players变量进行替换  
for index, wr in enumerate(wrong):  
    # 使用replace方法将players中的旧名称wr替换为correct列表中对应位置的正确名称  
    # 注意:这里假设players也是一个字符串或支持.replace()方法的数据类型  
    players = players.replace(wrong[index], correct[index])  
    # 注释:这行代码会更新players变量的值,使其包含所有已替换的名称。 
    names = matches[matches['Home Team Name'].str.contains('rn">')]['Home Team Name'].value_counts()
names

在这里插入图片描述在这里插入图片描述在这里插入图片描述

# 合并冠军、亚军、季军的得奖频数,缺失值填充0,转为整数。
teams = pd.concat([winner, runnerup, third], axis=1)
teams.fillna(0, inplace=True)
teams = teams.astype(int)
teams.columns = ['winner', 'runnerup', 'third']
teams

以上代码,分别计算每个国家得冠军、亚军、季军的次数,合并成一张表格,缺失的部分填充0,详见下表:

在这里插入图片描述老爱看足球的朋友们应该认识上面的英文代表哪个国家,我能看懂1/3!

探索性分析(EDA):

import plotly.graph_objects as go  
  
# 假设teams DataFrame已经正确构建,并且包含'winner'、'runnerup'、'third'三列  
  
# 设置柱状图的x轴(即球队名称,这里假设每行代表一个球队)  
x = teams.index  # 如果teams的索引就是球队名称  
  
# 设置柱状图的y轴数据,这里有三组数据,每组对应一个奖项  
y_winner = teams['winner']  
y_runnerup = teams['runnerup']  
y_third = teams['third']  
  
# 创建柱状图  
fig = go.Figure(data=[  
    go.Bar(name='Winner', x=x, y=y_winner),  
    go.Bar(name='Runner-up', x=x, y=y_runnerup),  
    go.Bar(name='Third Place', x=x, y=y_third)  
])  
  
# 设置图表标题和x、y轴标签  
fig.update_layout(  
    title='FIFA 世界杯胜率统计',  
    xaxis_title='国家队名称',  
    yaxis_title='获奖数量',  
    barmode='group'  # 将柱状图设置为分组模式,以便在同一x轴位置上堆叠显示不同的奖项  
)  
  
# 显示图表  
fig.show()

在这里插入图片描述
根据表格数据绘制柱状图,今天数据可视化都是可以交互的,巴西最多,拿了5个冠军,还分别拿了2个亚军和2个季军。

# 从matches DataFrame中选择主队相关信息并移除缺失值  
home = matches[['Home Team Name', 'Home Team Goals']].dropna()  
# 从matches DataFrame中选择客队相关信息并移除缺失值  
away = matches[['Away Team Name', 'Away Team Goals']].dropna()    
# 重命名列名  
home.columns = ['Countries', 'Goals']  
# 注意:这里直接使用home的列名来设置away的列名,而不是再次调用home.columns(虽然这样也可以,但直接赋值更清晰)  
away.columns = ['Countries', 'Goals']    
# 使用concat来合并home和away DataFrame,ignore_index=True用于重置索引  
goals = pd.concat([home, away], ignore_index=True)
# 按国家进行分组计算进球总数,并降序排列。
goals = goals.groupby('Countries').sum().sort_values(by = 'Goals', ascending=False).reset_index()
goals

计算每个国家的进球总数,见下表:
在这里插入图片描述提取进球最多的前20个国家数据可视化:
在这里插入图片描述最多的哪个英文应该是德国战车吧,没具体查过全凭印象。

在这里插入图片描述

# 绘制 Attendance Per Year  
fig1 = go.Figure(data=go.Bar(  
    x=world_cup['Year'],  
    y=world_cup['Attendance'],  
    text=world_cup['Attendance'],  # 显示在条形图上的文本  
    textposition='auto'  # 自动调整文本位置  
))  
fig1.update_layout(  
    title='每年观赛人数',  
    xaxis_title='年度',  
    yaxis_title='观赛人数',  
    barmode='group',  # 对于这个单一条形图,barmode 设置为 'group' 是默认且不需要的,但保持一致性  
    xaxis=dict(  
        tickangle=80  # 旋转 x 轴标签  
    )  
)  
fig1.show()  
  
# 绘制 Qualified Teams Per Year  
fig2 = go.Figure(data=go.Bar(  
    x=world_cup['Year'],  
    y=world_cup['QualifiedTeams'],  
    text=world_cup['QualifiedTeams'],  
    textposition='auto'  
))  
fig2.update_layout(  
    title='每年获奖球队',  
    xaxis_title='年度',  
    yaxis_title='获奖球队',  
    xaxis=dict(  
        tickangle=80  
    )  
)  
fig2.show()  
  
# 绘制 Goals Scored by Teams Per Year  
fig3 = go.Figure(data=go.Bar(  
    x=world_cup['Year'],  
    y=world_cup['GoalsScored'],  
    text=world_cup['GoalsScored'],  
    textposition='auto'  
))  
fig3.update_layout(  
    title='每年球队进球数',  
    xaxis_title='年度',  
    yaxis_title='进球数',  
    xaxis=dict(  
        tickangle=80  
    )  
)  
fig3.show()  
  
# 注意:最后一个图表的标题可能有误,应该是 'Matches Played Per Year'  
# 绘制 Matches Played Per Year  
fig4 = go.Figure(data=go.Bar(  
    x=world_cup['Year'],  
    y=world_cup['MatchesPlayed'],  
    text=world_cup['MatchesPlayed'],  
    textposition='auto'  
))  
fig4.update_layout(  
    title='每年比赛场次',  
    xaxis_title='年度',  
    yaxis_title='比赛场次',  
    xaxis=dict(  
        tickangle=80  
    )  
)  
fig4.show()

在这里插入图片描述

在这里插入图片描述在这里插入图片描述
在这里插入图片描述从上面几个图可以看到,1940至1950年有缺口,是因为二战有2届世界杯没有举行,数据缺失。

在这里插入图片描述

# 使用pandas的concat函数将两个DataFrame(home和away)沿着列(axis=1)方向合并。
goals = pd.concat([home, away], axis=1)    
# 使用fillna函数将合并后的DataFrame中的NaN值替换为0。  
# 这通常用于处理缺失数据,确保后续计算不会因为NaN值而出错。  
goals.fillna(0, inplace=True)    
# 创建一个新列'Goals',其值为'Home Team Goals'列和'Away Team Goals'列的和。  
# 这将计算出每场比赛的总进球数。  
goals['Goals'] = goals['Home Team Goals'] + goals['Away Team Goals']    
# 使用drop函数删除'Home Team Goals'和'Away Team Goals'这两列。  
# 这样做是为了减少DataFrame的冗余列,只保留我们需要的'Goals'列。  
# axis=1表示操作是在列上进行的。  
goals = goals.drop(labels = ['Home Team Goals', 'Away Team Goals'], axis = 1).reset_index()
goals.columns = ['Year', 'Country', 'Goals']
goals = goals.sort_values(by = ['Year', 'Goals'], ascending = [True, False])
goals

上面代码分别计算了每支球队主队和客队进球总数,并合并至一张表格,详见下表:

在这里插入图片描述

top5 = goals.groupby('Year').head()
top5.head(10)

按年份进行分组计算,每组只显示前5行数据,显示表格前10行数据,详见下图:

在这里插入图片描述

# 从goals DataFrame中提取年份和进球数的值,分别赋值给x和y变量。     
x, y = goals['Year'].values, goals['Goals'].values  
  
# 初始化一个空列表data,用于存储每个国家进球数的Bar对象。  
data = []  
  
# 遍历top5 DataFrame中不重复的国家名(或队伍名)。  
for team in top5['Country'].drop_duplicates().values:  
    # 对于每个国家,从top5 DataFrame中筛选出该国家的数据,并分别获取年份和进球数。  
    year = top5[top5['Country'] == team]['Year']  
    goal = top5[top5['Country'] == team]['Goals']  
      
    # 使用Plotly的go.Bar对象创建一个新的条形图,其中x轴为年份,y轴为进球数,name为国家的名字。  
    # 注意:这里实际上并没有直接使用之前从goals DataFrame中提取的x和y值,而是为每个国家重新提取了数据。  
    data.append(go.Bar(x = year, y = goal, name = team))  
  
# 设置图形的布局。barmode设置为'stack',表示条形图将堆叠显示。  
# 标题设置为'Top 5 Teams with most Goals',并且不显示图例(因为每个国家的颜色已经足够区分)。  
layout = go.Layout(barmode = 'stack', title = '进球最多的前5支球队—堆叠柱状图', showlegend = False)  
  
# 使用Plotly的go.Figure对象创建一个图形,其中data为之前构建的包含所有国家条形图的列表,layout为设置的布局。  
fig = go.Figure(data = data, layout = layout)  
  
# 显示图形。这将打开一个浏览器窗口(或标签页)来展示堆叠条形图。  
fig.show()

下图每个柱子的5种颜色分别代表进球最多的前5支球队,我鼠标指向的橙色位置显示的是法国队在1958年进了23个球。
在这里插入图片描述

matches['Year'] = matches['Year'].astype(int)
# 使用 'groupby' 方法对 'matches' DataFrame 进行分组,根据 'Stadium'(体育场)和 'City'(城市)列的值来分组。  
# 然后,对于每个分组,计算 'Attendance'(观众人数)列的平均值。  
# reset_index() 方法用于将分组后的结果转换回 DataFrame,其中原来的分组键('Stadium' 和 'City')成为新的列。  
# 最后,使用 sort_values 方法按 'Attendance' 列的值降序排序结果,以便最高的平均观众人数排在最前面。  
std = matches.groupby(['Stadium', 'City'])['Attendance'].mean().reset_index().sort_values(by='Attendance', ascending=False)
top10 = std[:10]

# 使用 Plotly 创建条形图  
fig = go.Figure(data=[go.Bar(  
    y=top10['Stadium'],  
    x=top10['Attendance'],  
    orientation='h',  # 水平条形图  
    text=top10['City'],  # 显示在条形图上的文本(城市名)  
    textposition='outside',  # 文本位置在条形图外部  
    marker_color='blue'  # 条形图颜色  
)])  
  
# 设置图表布局  
fig.update_layout(  
    title='平均上座率最高的体育场',  
    xaxis_title='平均上座人数',  
    yaxis_title='体育馆名称',  
    height=600,  
    width=800,  
    barmode='stack'  # 如果你想要堆叠条形图(这里其实不需要,因为只有一个系列),否则可以去掉  
)  
  
# 自定义文本显示(这里我们已经在 go.Bar 中设置了 text 和 textposition)  
# 如果你需要更复杂的文本格式化,可以在这里添加额外的 text 或 annotation  
  
# 显示图表  
fig.show()  

下图展示了平均观看比赛的人数最多的球场:
在这里插入图片描述

# 计算 City 列中前 20 个最常见城市的出现次数  
city_counts = matches['City'].value_counts()[:20]  
city_counts_df = city_counts.reset_index()  
city_counts_df.columns = ['City', 'Frequency']  # 重命名列以更清晰地表示它们的内容  
# 自定义颜色列表  
custom_colors = ['#FF6384', '#36A2EB', '#FFCE56', '#FF7F50', '#90EE90']   
fig = px.bar(city_counts_df, 
             x='City',
             y='Frequency',
             title='比赛最多的城市 Top 20',
             orientation='v',
             color_discrete_sequence=custom_colors)  
fig.update_layout(xaxis_title='城市名称', yaxis_title='赛事次数')  
fig.update_layout(  
    xaxis_showgrid=True,  
    yaxis_showgrid=True,  
    xaxis_gridcolor='lightgrey',  # 设置x轴网格线的颜色  
    xaxis_gridwidth=0.2,            # 设置x轴网格线的宽度  
    xaxis_griddash='dash',        # 设置x轴网格线的样式为虚线  
    yaxis_gridcolor='lightgrey',  
    yaxis_gridwidth=0.2,  
    yaxis_griddash='dash'  
)
  
# 显示图表  
fig.show()

下图提取了比赛最多城市 Top 20:
在这里插入图片描述

gold = world_cup["Winner"]  
silver = world_cup["Runners-Up"]  
bronze = world_cup["Third"]  
  
# 计算奖牌数  
gold_count = gold.value_counts().reset_index()  
gold_count.columns = ['Country', 'WINNER']  
  
silver_count = silver.value_counts().reset_index()  
silver_count.columns = ['Country', 'SECOND']  
  
bronze_count = bronze.value_counts().reset_index()  
bronze_count.columns = ['Country', 'THIRD']  
  
# 合并数据  
podium_count = gold_count.merge(silver_count, on='Country', how='outer').merge(bronze_count, on='Country', how='outer').fillna(0)   
  
# 确保所有国家都有数据(如果需要的话)  
# 注意:这里可能不需要再次重新索引,因为合并操作已经处理了这个问题  
# 但如果你想要确保包含特定的国家列表,你可以再次使用reindex  
  
# 绘制堆叠柱状图  
fig = go.Figure(data=[  
    go.Bar(name='Gold', x=podium_count['Country'], y=podium_count['WINNER'], marker_color='gold'),  
    go.Bar(name='Silver', x=podium_count['Country'], y=podium_count['SECOND'], marker_color='silver', base=podium_count['WINNER']),  
    go.Bar(name='Bronze', x=podium_count['Country'], y=podium_count['THIRD'], marker_color='brown', base=podium_count['WINNER'] + podium_count['SECOND'])  
])  
  
# 更新布局  
fig.update_layout(barmode='stack',  
                  xaxis_title='国家',  
                  yaxis_title='奖牌数量',  
                  title='各国奖牌数量—堆叠柱状图',  
                  xaxis=dict(tickangle=45, tickfont=dict(size=14)),  
                  yaxis=dict(titlefont=dict(size=14)),  
                  legend=dict(font=dict(size=14)),  
                  width=800,  
                  height=600)  
  
# 显示图表  
fig.show()

下图3分颜色分别代表金牌、银牌、铜牌的数量:
在这里插入图片描述

# 提取主客场队伍和进球数,并删除缺失值  
home = matches[['Home Team Name', 'Home Team Goals']].dropna()  
away = matches[['Away Team Name', 'Away Team Goals']].dropna()  
  
# 将主客场数据合并,并调整列名  
home_goals = home.rename(columns={'Home Team Name': 'countries', 'Home Team Goals': 'goals'})  
away_goals = away.rename(columns={'Away Team Name': 'countries', 'Away Team Goals': 'goals'})  
goal_per_country = pd.concat([home_goals, away_goals], ignore_index=True)  
  
# 确保 'goals' 列是整数类型  
goal_per_country['goals'] = goal_per_country['goals'].astype('int64')  
  
# 按国家分组并计算总进球数  
goal_per_country_grouped = goal_per_country.groupby('countries')['goals'].sum().sort_values(ascending=False)  
  
# 绘制条形图  
fig = go.Figure(data=[go.Bar(  
    x=goal_per_country_grouped.index,  # 国家名作为 x 轴  
    y=goal_per_country_grouped.values,  # 进球数作为 y 轴  
    marker_color='blue'  # 条形颜色  
)])  
  
# 设置图形布局  
fig.update_layout(  
    title='国家历史进球总数—柱状图',  
    xaxis_title='国家名',  
    yaxis_title='历史进球总数',  
    xaxis=dict(tickangle=45, tickfont=dict(size=14)),  # 旋转 x 轴标签并设置字体大小  
    yaxis=dict(titlefont=dict(size=14)),  # 设置 y 轴标题字体大小  
    font=dict(size=14),  # 设置全局字体大小  
    width=800,  
    height=600  
)  
  
# 只显示前10名  
fig.update_xaxes(range=[goal_per_country_grouped.index[0], goal_per_country_grouped.index[9]])  
  
# 显示图形  
fig.show()

还是德国队排第一:
在这里插入图片描述

# 定义一个函数get_labels,它接受一个包含比赛数据的字典(或DataFrame的行)作为参数  
def get_labels(matches):  
    # 如果主队的进球数大于客队的进球数,则返回'主场胜'  
    if matches['Home Team Goals'] > matches['Away Team Goals']:  
        return '主场胜'  
    # 如果主队的进球数小于客队的进球数,则返回'客场胜'  
    if matches['Home Team Goals'] < matches['Away Team Goals']:  
        return '客场胜'  
    # 如果主队和客队的进球数相等,则返回'平局'  
    return '平局'  
  
# 使用apply函数和lambda表达式,将get_labels函数应用于matches DataFrame的每一行  
# axis=1指定函数应用于DataFrame的横向(即每一行),因为get_labels函数是按行处理数据的  
# 这会创建一个新的Series,其中包含了每场比赛的结果  
matches['outcome'] = matches.apply(lambda x: get_labels(x), axis=1)  
  
# 使用head(2)函数显示修改后的DataFrame的前两行  
# 这有助于验证'outcome'列是否已正确添加到DataFrame中,并包含预期的比赛结果  
matches.head(2)

封装一个函数,新增一列用于存放计算主场胜、客场胜、平局的次数:
在这里插入图片描述

# 转换为适合 plotly 的格式  
labels = list(mt.index)  
values = list(mt.values)  
  
# 生成颜色列表,确保颜色数量与标签数量相匹配  
# 如果调色板中的颜色不够,可以循环使用  
n_colors = len(labels)  
color_palette = sns.color_palette('winter_r', n_colors=n_colors)  # 移除 as_cmap=True  
marker_colors = color_palette  # 直接使用生成的颜色列表  
  
# 如果需要循环使用颜色(虽然在这个例子中可能不需要)  
# marker_colors = color_palette * (n_colors // len(color_palette) + 1)[:n_colors]  
  
# 创建饼图  
fig = go.Figure(data=[go.Pie(labels=labels, values=values, hole=.3,  
                             marker=dict(colors=marker_colors),  # 使用 marker 字典来设置颜色  
                             textinfo='label+percent',  
                             insidetextorientation='radial'  
                            )])  
  
# 设置饼图的标题  
fig.update_layout(title_text='主客场球队胜负占比图—饼图',  
                  font_size=14,  # 全局字体大小  
                  title_font_size=16)  # 标题字体大小  
  
# 显示图形  
fig.show()

在这里插入图片描述

小结

欧洲杯目前正如火如荼进行中,决定来一篇足球题材的博文,本文探索性分析了1930年至2014年的世界杯部分数据。

创作不易,关注、点赞、评论!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

02STM32环境搭建新建工程

STM32环境搭建&新建工程 软件安装&#xff1a;开发方式&新建工程步骤&架构 个人心得 软件安装&#xff1a; 安装Keil5 MDK 安装器件支持包 软件注册 安装STLINK驱动 安装USB转串口驱动 开发方式&新建工程步骤&架构 STM32开发方式&#xff1a; 1.寄存器 …

笔记14:程序中的循环结构

生活中的循环现象&#xff1a; -日复一日&#xff0c;年复一年 -春夏秋冬&#xff0c;四季交替 -周日&#xff0c;周一&#xff0c;周二&#xff0c;周三&#xff0c;周四&#xff0c;周五&#xff0c;周六 -人生是一个轮回&#xff0c;多年后&#xff0c;又会回到最初的原点 …

APP渗透-android12夜神模拟器+Burpsuite实现

一、夜神模拟器下载地址&#xff1a;https://www.yeshen.com/ 二、使用openssl转换证书格式 1、首先导出bp证书 2、将cacert.der证书在kali中转换 使用openssl生成pem格式证书,并授予最高权限 openssl x509 -inform der -in cacert.der -out cacert.pem chmod 777 cacert…

容器:queue(队列)

以下是关于queue容器的总结 1、构造函数&#xff1a;queue [queueName] 2、添加、删除元素: push() 、pop() 3、获取队头/队尾元素&#xff1a;front()、back() 4、获取栈的大小&#xff1a;size() 5、判断栈是否为空&#xff1a;empty() #include <iostream> #include …

解决 MEX 文件 ‘xxx.mexw64‘ 无效: 找不到指定的模块。的问题

1.问题描述 在matlab R2021b中运行编译好后的gptoolbox工具箱中的函数[SVtemp,SFtemp,IF] selfintersect(V,F);报错如下 MEX 文件 E:\MATLAB_File\gptoolbox\mex\selfintersect.mexw64 无效: 找不到指定的模块。出错 offset_bunny (第 15 行) [SVtemp,SFtemp,IF] selfinter…

MATLAB-分类CPO-RF-Adaboost冠豪猪优化器(CPO)优化RF随机森林结合Adaboost分类预测(二分类及多分类)

MATLAB-分类CPO-RF-Adaboost冠豪猪优化器&#xff08;CPO&#xff09;优化RF随机森林结合Adaboost分类预测&#xff08;二分类及多分类&#xff09; 分类CPO-RF-Adaboost冠豪猪优化器&#xff08;CPO&#xff09;优化RF随机森林结合Adaboost分类预测&#xff08;二分类及多分类…

MySQL基础篇(三)数据库的修改 删除 备份恢复 查看连接情况

对数据库的修改主要指的是修改数据库的字符集&#xff0c;校验规则。 将test1数据库字符集改为gbk。 数据库的删除&#xff1a; 执行完该数据库就不存在了&#xff0c;对应数据库文件夹被删除&#xff0c;级联删除&#xff0c;里面的数据表全部被删除。 注意&#xff1a;不要随…

线程同步66666

1. 概述 当有多个线程访问同一个共享资源&#xff08;临界资源&#xff09;时&#xff0c;且不允许同时访问&#xff0c;那么就需要线程同步。常见的线程同步方式&#xff1a;互斥锁、读写锁、条件变量、信号量。 2. 互斥锁 互斥锁的方式可以简单概括为&#xff1a;锁定操作…

ros1仿真导航机器人 navigation

仅为学习记录和一些自己的思考&#xff0c;不具有参考意义。 1navigation导航框架 2导航设置过程 &#xff08;1&#xff09;启动仿真环境 roslaunch why_simulation why_robocup.launch &#xff08;2&#xff09;启动move_base导航、amcl定位 roslaunch why_simulation nav…

【OnlyOffice】桌面应用编辑器,插件开发大赛,等你来挑战

OnlyOffice&#xff0c;桌面应用编辑器&#xff0c;最近版本已从8.0升级到了8.1 从PDF、Word、Excel、PPT等全面进行了升级。随着AI应用持续的火热&#xff0c;OnlyOffice也在不断推出AI相关插件。 因此&#xff0c;在此给大家推荐一下OnlyOffice本次的插件开发大赛。 详细信息…

磁盘就是一个超大的Byte数组,操作系统是如何管理的?

磁盘在操作系统的维度看&#xff0c;就是一个“超大的Byte数组”。 那么操作系统是如何对这块“超大的Byte数组”做管理的呢&#xff1f; 我们知道在逻辑上&#xff0c;上帝说是用“文件”的概念来进行管理的。于是&#xff0c;便有了“文件系统”。那么&#xff0c;文件系统…

深圳晶彩智能ESP32-2432S028R实时观察LVGL9效果

深圳晶彩智能ESP32-2432S028R概述&#xff1a; 深圳晶彩智能出品ESP32-32432S028R为2.8寸彩色屏采用分辨率320x240彩色液晶屏&#xff0c;驱动芯片是ILI9431。板载乐鑫公司出品ESP-WROOM-32&#xff0c;Flash 4M。型号尾部“R”标识电阻膜的感压式触摸屏&#xff0c;驱动芯片是…

以腾讯为例,手把手教你搭建产品帮助中心

一个精心设计的产品帮助中心对于提高用户满意度和体验至关重要。腾讯&#xff0c;作为全球领先的互联网企业&#xff0c;通过其多样化的产品线&#xff08;包括微信、QQ、腾讯游戏、腾讯视频等&#xff09;吸引了亿万用户。下面将以腾讯为例&#xff0c;向您展示如何搭建一个高…

数据库系统原理 | 查询作业1

整理自博主本科《数据库系统原理》专业课自己完成的实验课查询作业&#xff0c;以便各位学习数据库系统概论的小伙伴们参考、学习。 *文中若存在书写不合理的地方&#xff0c;欢迎各位斧正。 专业课本&#xff1a; ​ ———— 本次实验使用到的图形化工具&#xff1a;Heidisql…

进程的控制-ps和kill命令

ps 查看进程信息 部分参数&#xff1a; a : 显示现行终端机下的所有程序&#xff0c;包括其他用户的程序 u: 以用户为主的格式来显示程序状况 x: 显示所有程序&#xff0c;不以 终端机来区分 kill 向指定的进程发送信号 kill 可将指定的信息送至程序。预设的信息为 SIG…

linux下高级IO模型

高级IO 1.高级IO模型基本概念1.1 阻塞IO1.2 非阻塞IO1.3 信号驱动IO1.4 IO多路转接1.5 异步IO 2. 模型代码实现2.1 非阻塞IO2.2 多路转接-selectselect函数介绍什么才叫就绪呢&#xff1f;demoselect特点 2.3 多路转接-pollpoll函数介绍poll优缺点demo 2.4 多路转接-epoll&…

24西安电子科技大学马克思主义学院—考研录取情况

01、马克思主义学院各个方向 02、24马克思主义学院近三年复试分数线对比 PS&#xff1a;马院24年院线相对于23年院线增加15分&#xff0c;反映了大家对于马克思主义理论学习与研究的热情高涨&#xff0c;也彰显了学院在人才培养、学科建设及学术研究等方面的不断进步与成就。 6…

集成学习(一)Bagging

前边学习了&#xff1a;十大集成学习模型&#xff08;简单版&#xff09;-CSDN博客 Bagging又称为“装袋法”&#xff0c;它是所有集成学习方法当中最为著名、最为简单、也最为有效的操作之一。 在Bagging集成当中&#xff0c;我们并行建立多个弱评估器&#xff08;通常是决策…

限时免费!国产Sora快手可灵Web网页端及全新功能上线!国货之光!

大家好&#xff0c;我是程序员X小鹿&#xff0c;前互联网大厂程序员&#xff0c;自由职业2年&#xff0c;也一名 AIGC 爱好者&#xff0c;持续分享更多前沿的「AI 工具」和「AI副业玩法」&#xff0c;欢迎一起交流~ 快手可灵&#xff08;Kling&#xff09;这回是真的出息了&…

DP:二维费用背包问题

文章目录 &#x1f3b5;二维费用背包问题&#x1f3b6;引言&#x1f3b6;问题定义&#x1f3b6;动态规划思想&#x1f3b6;状态定义和状态转移方程&#x1f3b6;初始条件和边界情况 &#x1f3b5;例题&#x1f3b6;1.一和零&#x1f3b6;2.盈利计划 &#x1f3b5;总结 &#x1…