Advertisement

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

阅读量:

爬取数据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文件时遇到乱码问题?请参考我发布的相关内容:

在这里插入图片描述

爬取出来的部分数据如图所示

数据爬取2

1、爬取每个国家的金、银、铜牌奖牌榜,如下图(中国和美国)

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

查看美国奖牌榜的详细信息,请访问该网页:https://2020.cctv.com/medal_list/details/index.shtml?ID=United States of America
查看中国奖牌榜的详细信息,请访问该网页:https://2020.cctv.com/medal_list/details/index.shtml?ID=China
查看日本奖牌榜的详细信息,请访问该网页:https://2020.cctv.com/medal_list/details/index.shtml?ID=Japan
可以看出除了ID为空的不同外, 其他都相同

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
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读

该文本内容包括 USA、CHN、JPN 等等 英国联合王国(GBR)、台湾地区(ROC)、澳大利亚(AUS)、荷兰(NED)、比利时(BEL) 等多国的文字信息

并把这些数据插入到nations_data.csv,如图

在这里插入图片描述

3、将各国金银铜奖牌数据整合为三份表格
from selenium import webdriver
import lxml.html
import csv

#依次准备好gold.csv、silver.csv以及bronze(csv文件
遍历文件列表[ gold-.csv, silver-.csv, bronze-*.csv ]
逐个打开文件并以UTF-8编码方式写入内容
导入CSV模块并初始化文件写入对象
将列标题添加至表格中

file1 = file.open('D:\\Olympic\\Games\\nat.txt', 'r', encoding='utf-8')
file1_list = file.read()
file.close()
p = strng.replace('\'\'\'', '')
c = strng.replace(' ', '\n')
ls = strng.split(',')

for i in ls:
print(i)
driver = webdriver.Chrome(r'D:\数据分析\chromedriver_win32\chromedriver.exe')

获奖金银铜名单

driver.get(f'https://2020.cctv.com/medal_list/details/index.shtml?countryid={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. 三种材质精美的金属表格通过组合成一个综合表格实现功能整合(将Excel文件格式从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')
    
    
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读

如图

在这里插入图片描述

因为世界地图通常需要了解各国的英文名称, 所以首先通过访问百度百科网站获取相关国家名称信息, 接着利用Excel软件完成数据录入工作, 最终生成并导出为 excel 格式的 csv 文件

在这里插入图片描述

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()  # 显示折线图
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读
在这里插入图片描述

全部评论 (0)

还没有任何评论哟~