男篮世界杯已经落下帷幕,相信看球的朋友们都已经过足了篮球瘾。有些许遗憾,也有世界霸主的失落,还有老兵不死的坚持,当然还有西班牙军团的登顶。

自杀式输给波兰,溃败式负于尼日利亚,从前一直代表亚洲征战奥运会的中国,可能就要缺席下一届了。当阿联老去,中国即将不再有任何一名球员具备世界篮球运动员的水平,没有一个!期待中国男篮的再次崛起吧!

星光黯淡,小将领衔,教练席上的神奇老者也没能创造神奇,历史最差战绩,我们都不知道该不该赋予这只美国男篮以“梦之队”的称号。也许在不久后的东京,他们会球星云集,卷土重来吧。

什么是老兵,是接近40岁“高龄”的斗士,是场均准两双的无解,是令人啧啧称奇的坚持。钻石的最后,虽然没能如愿,但是谁又会在乎呢,你已经征服了整个世界!潘帕斯草原上的雄鹰,终将振翅高飞。

一如足球领域一样,西班牙军团的篮球同样强大。不能不佩服和感慨,当加索尔和卢比奥内外联合,双剑合璧时,他们就是篮球界的霸主。

下面我们就一起通过真实的数据,来细数本届男篮世界杯上的各项数据吧。

数据从哪里来

我不生产数据,只是数据的搬运工

下面分析的数据,都是抓取自新浪体育

▼数据抓取

在新浪体育网站上,有个世界杯专栏,在数据榜这个模块里,可以找个类似下面的链接

https://events.sports.sina.com.cn/bps/peony/mersh/beitai/fiba/stats/playerdata_order?leagueid=433&ordertype=FieldGoalsAverage&order=desc&dpc=1

该链接,只要修改 ordertype 字段,就可以获取到诸如球员得分,篮板球,助攻数等一些列数据,具体的过程就不说了,就是发请求,解析 json 的简单操作

import requests
import time

url_list = [
    'https://events.sports.sina.com.cn/bps/peony/mersh/beitai/fiba/stats/playerdata_order?leagueid=433&ordertype=PointsAverage',
    'https://events.sports.sina.com.cn/bps/peony/mersh/beitai/fiba/stats/playerdata_order?leagueid=433&ordertype=ReboundsAverage',
    'https://events.sports.sina.com.cn/bps/peony/mersh/beitai/fiba/stats/playerdata_order?leagueid=433&ordertype=PlusMinusAverage',
    'https://events.sports.sina.com.cn/bps/peony/mersh/beitai/fiba/stats/playerdata_order?leagueid=433&ordertype=StealsAverage',
    'https://events.sports.sina.com.cn/bps/peony/mersh/beitai/fiba/stats/playerdata_order?leagueid=433&ordertype=AssistsAverage',
    'https://events.sports.sina.com.cn/bps/peony/mersh/beitai/fiba/stats/playerdata_order?leagueid=433&ordertype=BlockedAverage',
    'https://events.sports.sina.com.cn/bps/peony/mersh/beitai/fiba/stats/playerdata_order?leagueid=433&ordertype=TurnoversAverage',
    'https://events.sports.sina.com.cn/bps/peony/mersh/beitai/fiba/stats/playerdata_order?leagueid=433&ordertype=PersonalFoulsAverage',
    'https://events.sports.sina.com.cn/bps/peony/mersh/beitai/fiba/stats/playerdata_order?leagueid=433&ordertype=FieldGoalsAverage'
]

def fire(url):
    file_name = url.split('=')[2]
    res = requests.get(url).json()
    data = res['playerdata_order']
    items = map(get_data, data)
    print('save data')
    save_to_csv(items, file_name)

def get_data(data):
    name = data['CNAlias']
    country = data['TeamCNName']
    points = data['PointsAverage']
    rebounds = data['ReboundsAverage']
    steals = data['StealsAverage']
    assists = data['AssistsAverage']
    fouls = data['PersonalFoulsAverage']
    plus_minus = data['PlusMinusAverage']
    blocked = data['BlockedAverage']
    goals_percentage = data['FieldGoalsPercentage_m']
    turnovers = data['TurnoversAverage']
    result = {
        'name': name,
        'country': country,
        'points': points,
        'rebounds': rebounds,
        'steals': steals,
        'assists': assists,
        'fouls': fouls,
        'plus_minus': plus_minus,
        'blocked': blocked,
        'goals_percentage': goals_percentage,
        'turnovers': turnovers
    }
    return result

def save_to_csv(data, file_name):
    with open(file_name + '_data.csv', 'w', encoding='utf-8') as f:
        f.write('name,country,points,rebounds,steals,assists,fouls,plus_minus,blocked,goals_percentage,turnovers\n')
        for d in data:
            try:
                row = '{},{},{},{},{},{},{},{},{},{},{}'.format(d['name'],
                                                                d['country'],
                                                                d['points'],
                                                                d['rebounds'],
                                                                d['steals'],
                                                                d['assists'],
                                                                d['fouls'],
                                                                d['plus_minus'],
                                                                d['blocked'],
                                                                d['goals_percentage'],
                                                                d['turnovers'])
                f.write(row)
                f.write('\n')
            except:
                continue

if __name__ == '__main__':
    for url in url_list:
        fire(url)
        time.sleep(2)

▼数据保存

我分别抓取了以得分、篮板,助攻等排名的数据,并分别保存在不同的 csv 文件当中,最后的文件内容大致如下

老兵不死|数据纪念男篮世界杯

全体球员可视化

球员得分排名

老兵不死|数据纪念男篮世界杯

几个亮点:

✔ 韩国的归化球员竟然场均得分最高
✔ 阿联成功入选
✔ 没有美国人

可能是韩国队打的比赛不多,对手不是很强,这个罗建儿作为迷你型中锋,也可以在内线翻云覆雨。

阿联确实宝刀不老,还记得最后的生死战,如果没有阿联,比赛可能早花了。

再次印证本届美国男篮无大牌,没有绝对的进攻核心,可能是他们兵败中国的最大原因了。

球员篮板排名

老兵不死|数据纪念男篮世界杯

有意思了,罗建儿竟然又是第一,要是按照国内排高校的标准,这妥妥的是双一流!

球员得分篮板排名

老兵不死|数据纪念男篮世界杯

罗建儿是本届世界杯唯一的一个能拿到得分篮板两双的球员,且是20+10,能力还是毋庸置疑的!

然后就要说说两位老将了,斯科拉和易建联。两位都是17+的场均得分加上7+的篮板,能够看得出,在***两端,两名球员都是各自球队不可或缺的一员。真的是家有一老,如有一宝啊。

不过人家阿根廷男篮已经完成了新老交替,未来依旧可期。而中国男篮呢,未来靠谁,是亚洲第一后卫-郭艾伦,还是大魔王-周琦,都还缺乏领袖气质和绝对能力啊!

最佳阵容可视化分析

最佳阵容球员

the_best_lineup = [
    '博格达诺维奇',
    '富尼耶',
    '卢比奥',
    '斯科拉',
    '加索尔'
]

球员能力分析

接下来就来看看本届世界杯,最佳阵容成员的各自数据。能力强不强,数据不说谎。

我分别选取了得分、篮板、助攻、抢断、封盖、犯规和失误为考察点,分别画出了各自的能力雷达图

老兵不死|数据纪念男篮世界杯

三个外线,两个内线,各自都以不同的能力,影响着比赛,帮助着团队。

塞尔维亚的博格达诺维奇,得分能力比较强,场均助攻也不错,关键是助攻失误比非常低,妥妥的进攻发动机。

法国队的富尼耶,得分助攻比较平均,从数据上来看,是五个人中较弱的一位。但是其强大的冲击力,是法国队得以击败美国的关键之一。

西班牙的卢比奥,是五个人中助攻最高的一位,但是同时失误次数也最多。他在外线的威胁,是西班牙能够轻松击败阿根廷的重要因素。当年的金童已经蓄起了胡须,岁月的沧桑给了他更多的坚忍。

阿根廷的斯科拉,作为攻守两端的绝对核心,如果不是两鬓的点点白发,不会有人知道他已经39岁了。此时的数据已经不再重要,篮球才是一切!

西班牙的小加索尔,成功的从哥哥手中接过了国家队的大旗,不是十分华丽的数据的背后,是他在球场上的经验,老道和威慑力,有他在,西班牙就不会轻易被击败。

球员投篮命中率对比

老兵不死|数据纪念男篮世界杯

没想到,投篮命中率最高的竟然是一名外线球员,也许这样和当今篮球的发展相关,大个往外跑,小个向里冲!

最佳五人组,每个人的命中率都在40%以上,怎一个稳字了得。

球员正负值对比

老兵不死|数据纪念男篮世界杯

富尼耶是五个人中正负值最低的,我说他在五个人里最弱,是不是也从侧面得到了印证呢。

而加索尔的正负值是最高的,他就是球队的定海神针。犹记得当阿根廷反攻凶猛时,就是加索尔临危上场,稳定军心,遏制对手的进攻,成功帮助球队拿下比赛。

老兵不死

只是逐渐凋零

来看看阿联的数据,竟然是莫名的心酸

老兵不死|数据纪念男篮世界杯

我不想再去分析为啥他的正负值这么低,因为我们都看到了他在球场上的努力和汗水,还有他因为丢失到手的篮板而懊恼的双手砸地的场景。

还有斯科拉,12.9的正负值,43.4%的命中率,场均17.9分,8.1篮板,没有人能够要求他再多做些什么了,尽情释放,努力燃烧,不悔!

最后以天下足球的文案来结尾,再合适不过了。

岁月你别催,该来的我不推;岁月你别催,走远的仍要追。当不得不说再见的时候,挥别的那一刻就如同流水的光阴,谁能抵得过,谁能叹息、奈何。

老兵不死|数据纪念男篮世界杯

老兵不死|数据纪念男篮世界杯

后台回复“老兵不死”,获取完整代码。