2020东京奥运会奖牌排行--数据可视化

2023-11-10

爬取数据1

1、数据来源:https://2020.cctv.com/medal_list/index.shtml
数据为下面图片的表格数据
国家金牌排行
2、具体代码
2.1需要提前下载好的pip install 库名

from selenium import webdriver
import lxml.html
import csv

2.2获取网页完整代码

#自动打开chrome,获取代码
driver = webdriver.Chrome('D:\\数据分析\\chromedriver_win32\\chromedriver.exe')
driver.get('https://2020.cctv.com/medal_list/index.shtml')
content=driver.page_source
driver.quit() #关闭chrome

2.3本地创建 .csv,存储爬下来的数据

f = open('nation_data.csv', 'w' , encoding='utf-8')
csv_writer = csv.writer(f)
#表头
csv_writer.writerow((["排名", "国家", "金牌", "银牌", "铜牌", "总数"]))

2.4定位xpath,写入文件

metree = lxml.html.etree
parser = metree.HTML(content)
td_list = parser.xpath("/html/body/div[3]/div/div/div/div[1]/div[3]/div[2]/div/div[3]/table/tbody[@id='medal_list1']//tr")
for td_item in td_list:
    num_item= td_item.xpath('.//text()')
    csv_writer.writerow(num_item)
f.close()  #关闭文件

2.5.csv无乱码转换,请看我的另一篇文章https://blog.csdn.net/weixin_44394124/article/details/120097063?spm=1001.2014.3001.5501
在这里插入图片描述
爬取出来的部分数据如图所示

数据爬取2

1、爬取每个国家的金、银、铜牌奖牌榜,如下图(中国和美国)
在这里插入图片描述

在这里插入图片描述
页面来源:
https://2020.cctv.com/medal_list/details/index.shtml?countryid=USA
https://2020.cctv.com/medal_list/details/index.shtml?countryidCHN
https://2020.cctv.com/medal_list/details/index.shtml?countryid
JPN
可以看出除了countryid={}不同,其他都相同

2、三字母国家代码
(http://api.cntv.cn/olympic/getOlyMedals?serviceId=pcocean&itemcode=GEN-------------------------------&t=jsonp&cb=banomedals)来源,如下图
在这里插入图片描述
复制到nation.txt文件
然后通过

import pandas as pd
file = open('D:\\Olympic_Games\\nation.txt', 'r', encoding='utf-8')
strfile = file.read()
s1=strfile.split('},{')
nat_list=[]
for i in s1:
    nat_list.append(i[-4:-1])
file.close()

#nation_data最加一列
csv_data = pd.read_csv('nation_data.csv', low_memory = False)#example.csv是需要被追加的CSV文件,low_memory防止弹出警告
csv_df = pd.DataFrame(csv_data)
csv_df['nationid'] = nat_list
csv_df.to_csv('nations_data.csv', index = None) #追加后生成的文件为out_csv

nat_list复制到nat.txt,文本内容为
‘USA’, ‘CHN’, ‘JPN’, ‘GBR’, ‘ROC’, ‘AUS’, ‘NED’, ‘FRA’, ‘GER’, ‘ITA’, ‘CAN’, ‘BRA’, ‘NZL’, ‘CUB’, ‘HUN’, ‘KOR’, ‘POL’, ‘CZE’, ‘KEN’, ‘NOR’, ‘JAM’, ‘ESP’, ‘SWE’, ‘SUI’, ‘DEN’, ‘CRO’, ‘IRI’, ‘SRB’, ‘BEL’, ‘BUL’, ‘SLO’, ‘UZB’, ‘GEO’, ‘TPE’, ‘TUR’, ‘GRE’, ‘UGA’, ‘ECU’, ‘ISR’, ‘IRL’, ‘QAT’, ‘KOS’, ‘BAH’, ‘UKR’, ‘BLR’, ‘ROU’, ‘VEN’, ‘IND’, ‘HKG’, ‘PHI’, ‘SVK’, ‘RSA’, ‘AUT’, ‘EGY’, ‘INA’, ‘POR’, ‘ETH’, ‘TUN’, ‘EST’, ‘THA’, ‘FIJ’, ‘LAT’, ‘BER’, ‘PUR’, ‘MAR’, ‘COL’, ‘AZE’, ‘DOM’, ‘ARM’, ‘KGZ’, ‘MGL’, ‘ARG’, ‘SMR’, ‘JOR’, ‘MAS’, ‘NGR’, ‘TKM’, ‘MKD’, ‘NAM’, ‘LTU’, ‘BRN’, ‘KSA’, ‘KAZ’, ‘MEX’, ‘FIN’, ‘KUW’, ‘CIV’, ‘GHA’, ‘SYR’, ‘BUR’, ‘GRN’, ‘MDA’, ‘BOT’

并把这些数据插入到nations_data.csv,如图
在这里插入图片描述

3、`把每个国家的金银铜名单汇总成三个表
from selenium import webdriver
import lxml.html
import csv

#先创建好gold.csv、silver.csv、bronze.csv
for str in [‘gold.csv’,‘silver.csv’,‘bronze.csv’]:
g = open(str, ‘w’, encoding=‘utf-8’)
csv_writer = csv.writer(g)
csv_writer.writerow(([“日期”, “项目”, “获得者”, ‘名次’, ‘countryid’]))
g.close()

file1 = open(‘D:\Olympic_Games\nat.txt’, ‘r’, encoding=‘utf-8’)
file1_list=file1.read()
file1.close()
p = file1_list.replace(’’’, ‘’)
c = p.replace(’ ‘, ‘’)
ls = c.split(’,’)

for i in ls:
print(i)
driver = webdriver.Chrome(‘D:\数据分析\chromedriver_win32\chromedriver.exe’)
#获奖金银铜名单
driver.get(‘https://2020.cctv.com/medal_list/details/index.shtml?countryid={}’.format(i))
content = driver.page_source
driver.quit()

metree = lxml.html.etree
parser = metree.HTML(content)

#金牌
gold_list = parser.xpath("/html/body/div[3]/div/div/div/div[1]/div[3]/div[2]/div/div[2]/div[1]/table/tbody[@id='gold']//tr")
f1 = open('gold.csv', 'a+', encoding='utf-8')
csv_writer = csv.writer(f1)
for td_item in gold_list:
    num_item = td_item.xpath('.//text()')
    csv_writer.writerow([num_item[0], num_item[1], num_item[2], 1, i])
f1.close()

#银牌
silver_list = parser.xpath("/html/body/div[3]/div/div/div/div[1]/div[3]/div[2]/div/div[2]/div[2]/table/tbody[@id='silver']//tr")
f2 = open('silver.csv', 'a+', encoding='utf-8')
csv_writer = csv.writer(f2)
for td_item in silver_list:
    num_item = td_item.xpath('.//text()')
    csv_writer.writerow([num_item[0], num_item[1], num_item[2], 2, i])
f2.close()

#铜牌
bronze_list = parser.xpath("/html/body/div[3]/div/div/div/div[1]/div[3]/div[2]/div/div[2]/div[3]/table/tbody[@id='bronze']//tr")
f3 = open('bronze.csv', 'a+', encoding='utf-8')
csv_writer = csv.writer(f3)
for td_item in bronze_list:
    num_item = td_item.xpath('.//text()')
    csv_writer.writerow([num_item[0], num_item[1], num_item[2], 3, i])
f3.close()

表1金牌gold.csv
在这里插入图片描述
表2银牌silver .csv
在这里插入图片描述
表3铜牌bronze.csv

数据处理

1、三个金银铜表,通过表拼接,形成一个大表
(csv转化xlsx,方便之间excel表处理数据)
2、大表和nations.xlsx左链接(nation_data.csv转化为nations.xlsx)

import pandas as pd

gold=pd.read_excel('golds.xlsx')
silver=pd.read_excel('silvers.xlsx')
bronze=pd.read_excel('bronzes.xlsx')

#清洗空行
gold=gold.dropna(axis=0,how='any')
silver=silver.dropna(axis=0,how='any')
bronze=bronze.dropna(axis=0,how='any')

#写进表里面
gold.to_excel('gold.xlsx')
silver.to_excel('silver.xlsx')
bronze.to_excel('bronze.xlsx')

#三个表行拼接为
su=gold.append(silver).append(bronze) #三个表行拼接

#存进表里面
su.to_excel('./su.xlsx')

#国家金牌表
nations=pd.read_excel('D:\\Olympic_Games\\nations.xlsx')

#左外连接
itemsum=pd.merge(nations,su,left_on="countryid",right_on="countryid",how="left")#左表,右表,左表标识列,右表标识列,左/右

#存进一个大数据表
itemsum.to_excel('./itemtoge.xlsx')


如图

在这里插入图片描述
3、
由于世界地图需要知道国家的英文名称,所以通过查询百度百科以及excel一系统操作,得到表china_eng.xlsx
在这里插入图片描述
2、
china_eng.xlsx和itemtoge.xlsx链接

#世界各国和地区名称代码、百度百科
left_table = pd.read_excel('D:\\Olympic_Games\\datas\\china-eng.xlsx')
right_table = pd.read_excel('D:\\Olympic_Games\\nations.xlsx')

#清洗空行
left_table=left_table.dropna(axis=0, how='any')

#链接
left_right = pd.merge(
        left_table,
        right_table,
        left_on='三字母代码',
        right_on='countryid',
        )
print(left_right)
left_right.to_excel('nation-eng.xlsx')

生成nation-eng.xlsx
在这里插入图片描述

数据可视化

1、世界地图

准备

from pyecharts import options as opts
from pyecharts.charts import Map
import pandas as pd
import os
datas=pd.read_excel('nation-eng.xlsx')
datas['总数'] = datas['总数'].astype('float')
# 基础数据
value = datas['总数']
attr = datas['英文简称']

data = []
for index in range(len(attr)):
    city_ionfo = [attr[index], value[index]]
    data.append(city_ionfo)
# 打开html
c = (
    Map()
        .add("世界地图", data, "world")
        .set_series_opts(label_opts=opts.LabelOpts(is_show=False))
        .set_global_opts(
        title_opts=opts.TitleOpts(title="奖牌总数"),
        visualmap_opts=opts.VisualMapOpts(max_=200),

    )
        .render()
)

# 打开html
os.system("render.html")

地图展示
在这里插入图片描述
2、多系列柱状图
排行前五的国家,金牌数量、银牌数量、铜牌数量拼接展示

import matplotlib.pyplot as plt
import  pandas as pd

datas =pd.read_excel('D:\\Olympic_Games\\nations.xlsx')
x = datas['国家'][0:5]
y1 = datas['金牌'][0:5]
y2 = datas['银牌'][0:5]
y3 = datas['铜牌'][0:5]

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

bar_width=0.2
plt.bar(y3.index,y3,color='orange',width=bar_width)
plt.bar(y2.index+bar_width,y2,color='yellow',width=bar_width)
plt.bar(y1.index+bar_width+bar_width,y1,color='red',width=bar_width)
plt.legend(('银牌','铜牌','金牌'))
plt.xticks(x.index+ 3 * bar_width / 3,x)
plt.show()

在这里插入图片描述
3、美国获取金牌数量、银牌数量、铜牌数量按时间累计

import pandas as pd
import matplotlib.pyplot as plt

data = pd.read_excel('D:\\Olympic_Games\\datas\\itemtoge.xlsx')

usa_gold=data[(data['名次']==1)&(data['国家']=='美国')]
usa_silver=data[(data['名次']==2)&(data['国家']=='美国')]
usa_bronze=data[(data['名次']==3)&(data['国家']=='美国')]

plt.rcParams['font.sans-serif']=['SimHei']#用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False#用来正常显示负号

#x
x=usa_gold.sort_values(by='日期')['日期'].drop_duplicates(keep="first")
x2=usa_bronze.sort_values(by='日期')['日期'].drop_duplicates(keep="first")
x3=usa_silver.sort_values(by='日期')['日期'].drop_duplicates(keep="first")

#日期所对应的累加的银牌
def count_num(usa_three):
    group = usa_three.groupby('日期')
    s = group.size()
    sum = 0
    y = []
    for n in range(len(s)):
        sum = s[n] + sum
        y.append(sum)
    return y
#日期所对应的累加的金牌、银牌、铜牌
data_gold=count_num(usa_gold)
data_silver=count_num(usa_silver)
data_bronze=count_num(usa_bronze)

plt.figure(figsize=(15,10))
#折线图
plt.title('美国')
plt.xlabel('时间')
plt.ylabel('数量')
plt.plot(x, data_gold, marker='o', markersize=3)  # 绘制折线图,添加数据点,设置点的大小
plt.plot(x2, data_bronze, marker='o', markersize=3)
plt.plot(x3, data_silver, marker='o', markersize=3)
plt.legend(['金牌', '银牌', '铜牌'])  # 设置折线名称
plt.show()  # 显示折线图

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

2020东京奥运会奖牌排行--数据可视化 的相关文章

随机推荐

  • 循环神经网络-LSTM

    参考 长期以来 隐变量模型存在着长期信息保存和短期输入缺失的问题 解决这一问题的最早方法之一是长短期存储器 long short term memory LSTM Hochreiter and Schmidhuber 1997 它有许多与门
  • 教你如何更改windows10系统默认字体

    以管理员身份运行命令提示符 打开注册表 定位到HKEY LOCAL MACHINE SOFTWARE Microsoft WindowsNT CurrentVersion Fonts 在右边找的Microsoft YaHei Microso
  • 常用继电器模块的PCB设计与实物分享

    今天分享一下自己做的一块继电器模块 因为之前有用到继电器模块的原理图 索性自己画了一下 原理图如图所示 一 原理图 继电器模块还是比较简单的 就是通过三极管的开关作用来使电路导通 从而来控制继电器的磁铁通电吸合内部的衔铁 其高低电平的触发其
  • Day6 - Python第三方模块xpinyin、faker、pymysql、Redis、rediscluster、xlrd、xlutils、openpyxl、request

    一 第三方模块 安装第三方模块 第一种方式 1 将pip命令加入到环境变量 且将python的安装目录下scripts目录加入到环境变量里面 2 pip install 数据库名称 pip install xpinyin python2 e
  • 用超级厉害的VS Code工具来嗨皮编程吧!

    用超级厉害的VS Code工具来嗨皮编程吧 目录 用超级厉害的VS Code工具来嗨皮编程吧 第一步 安装VS Code 第二步 插件宝藏等你来挖 1 装插件如虎添翼 3 快捷键 让编码更轻松 嗨皮 各位同行的学习小伙伴们 今天我来为你们介
  • 关于git cherry-pick

    项目开发过程中 经常遇到多分支的代码库管理 将提交的代码修改从一个分支转移到另一个分支是常见需求 这时分两种情况 一种情况 需要另一个分支的所有代码变动 那么就采用合并 git merge 另一种情况 只需要部分代码变动 某几个提交 这时可
  • Spring Cloud Alibaba,中国 Javaer 的福音,为微服务续上 18 年

    h2 Spring Cloud Alibaba 中国 Javaer 的福音 为微服务续上 18 年 nbsp h2 p 热 p p a href https my oschina net u 3820517 h4cd a nbsp 发布于
  • Vue指令 关于---v-html_指令 和 v-test_指令 详解

    要学会大大方方的表达爱意 爱不是冷冰冰 爱是炙热的 永远都是 笨蛋才会说反话 笨蛋才会把喜欢的人越推越远 一 在讲解 v test 指令 和v html 指令 前我么先回顾一些基本指令 v bind 单项绑定解析表达式 可简写为 xxx v
  • day6-列表的遍历,增删查改,比较运算,列表推导式,列表的相关函数

    列表基础学习 一 遍历列表 1 遍历列表 二 列表的增删查改操作 1 增 1 列表 append 元素 2 列表 insert 下标 元素 2 删 删除元素 1 del 列表 下标 2 列表 remove 元素 3 列表 pop 下标 列表
  • Win7、Win10系统封装后GHO文件太大?是因为虚拟内存没关、休眠文件没删!

    很多镜像文件封装好都是3 5g的 而最近我自己封装系统 封装完是8g 百度才知道是C盘有休眠文件大概5 4g 下图是我正在用的电脑删除休眠文件后的大小对比 删除休眠文件方法 1 在开始栏的 附件 里面找到 命令提示符 右击 以管理员身份运行
  • 文举论金:3.17黄金原油全面走势分析策略指导。

    市场没有绝对 涨跌没有定势 所以 对市场行情的涨跌平衡判断就是你的制胜法宝 欲望 有句意大利谚语 让金钱成为我们忠心耿耿的仆人 否则 它就会成为一个专横跋扈的主人 空头 多头都能赚钱 唯有贪心不能赚 是你掌控欲望还是欲望掌控你 古人云 不积
  • 使用eclipse创建一个图书管理系统(1)-----搭建架构

    目录 思维导图 图书管理系统的创建 第一步 搭建框架 使用者 第二步 搭建框架 被使用者 第三步 操作方法 第四步 main函数 思维导图 前言 昨天学了一下使用Java语言来写一个图书管理系统 于是今天写一篇博客作为一个小笔记巩固一下自己
  • git 打包两个版本差异

    git archive o update zip 当前版本号 git diff name only 上一版本号
  • QMainWindow和QWidget

    一 QMainWindow QmainWindow主窗口为用户提供一个应用程序框架 它有自己的布局 可以在布局中添加控件 在主窗口中可以添加控件 比如将工具栏 菜单栏 状态栏等添加到布局管理器中 窗口类型介绍 QMainWindow QWi
  • 人工智能技术发展历史

    人工智能 Artificial Intelligence 简称 AI 的历史可以追溯到上世纪50年代 以下是其中的关键点 1956年 达特茅斯会议 1956年 美国达特茅斯学院举办了一次会议 邀请了一些研究者共同探讨人工智能的概念 目标和方
  • 【NLP入门教程】三、词性标注

    词性标注 Part of Speech Tagging POS Tagging 是自然语言处理中的另一个基本任务 它涉及将文本中的每个词元 Token 标注为其对应的词性 如名词 动词 形容词等 词性标注有助于我们理解文本的语法结构 进而支
  • win10 家庭版系统安装docker desktop遇到那些坑

    最近开发中需要用到docker来打包镜像 由于我的电脑系统是win10 家庭版 而docker desktop针对win10系统只支持64 位的 Windows 10 专业版 企业版和教育版 我又不想重装系统 因为要重装一堆工具 太麻烦了
  • FILCO Majestouch Convertible 2 键盘连接电脑说明

    键盘连接新电脑频次比较低 每次都忘记了怎么操作 要去翻说明书 上网找方法 在此记录下圣手2代键盘连接新电脑或者切换电脑的连接方式
  • Python数据可视化matplotlib.pyplot的使用

    1 生成数据 安装matplotlib windows cmd中 pip install matplotlib 在Python环境下 使用import matplotlib检测是否安装成功 不报错就是安装成功 重启写py的工具就可以进行使用
  • 2020东京奥运会奖牌排行--数据可视化

    爬取数据1 1 数据来源 https 2020 cctv com medal list index shtml 数据为下面图片的表格数据 2 具体代码 2 1需要提前下载好的pip install 库名 from selenium impo