产品
解决方案
客户案例
资源中心
活动中心
关于我们
在云器Lakehouse上玩Kaggle数据之Paris Olympics 2024 Games Dataset
数据见闻
2024年10月8日
2024年巴黎奥运会作为第33届夏季奥林匹克运动会,不仅在体育竞技层面吸引了全球的目光,而且在数据分析方面也呈现出许多有趣和值得关注的话题。

2024年巴黎奥运会作为第33届夏季奥林匹克运动会,不仅在体育竞技层面吸引了全球的目光,而且在数据分析方面也呈现出许多有趣和值得关注的话题。在Kaggle上,也找到了本届奥运会的完整数据集。

Kaggle数据集地址:https://www.kaggle.com/datasets/sajkazmi/paris-olympics-2024-games-dataset-updated-daily 。 记得给SYED SAJEEL HAIDER在kaggle点个upvote,据说这样Kaggle就可以给他发个金牌!

该数据集包含的有关 2024 年巴黎夏季奥运会的所有内容,在11个csv文件里包括了场地、团队、赛程、奖牌、奖牌获得者、赛事、团队、运动员、教练等方面的数据。

image.png

其中results目录里包含了45个项目的结果数据。

image.png

❓问题引入:如何以懒人的方式把这些数据加载进云器Lakehouse进行分析呢?去看看这里会有哪些有趣的数据发现?

懒人的方式:不想写建表的DDL语句,何况是要写12个表的DDL语句。那么能想到的最简单的办法是什么?

不想动手,那就要动动脑了。回顾一下,在玩US Funds dataset from Yahoo Finance数据的时候,用过的两种方式都是要写好建表DDL语句的。必须要想到新的办法,那就是用云器Zettapark来完成这个懒人任务。

✅Zettapark 是用于处理云器Lakehouse 数据的 Python 库。它提供了一个高级的 Python API,用于在云器Lakehouse 中执行 SQL 查询、操作数据和处理结果。Zettapark 使得在 Python 中使用云器Lakehouse 变得更加简单和高效。你可以使用 Zettapark 执行 SQL 查询、操作数据和处理结果,就像在 Python 中使用 pandas 一样。

下载数据到本地

从Kaggle数据集地址:https://www.kaggle.com/datasets/sajkazmi/paris-olympics-2024-games-dataset-updated-daily下载数据到本地,放在data目录下。

安装云器Zettapark

!pip install -q ../whl/clickzetta_zettapark_python-1.13.0-py3-none-any.whl -i https://pypi.tuna.tsinghua.edu.cn/simple

创建Zettapark会话

使用Zettapark的第一步是与ClickZetta Lakehouse建立会话。

from clickzetta.zettapark.session import Session
hints = dict()
hints['sdk.job.timeout'] = 3
hints['query_tag'] = 'qiliang_paris_olympics_hints_zettapark'
connection_parameters = {
  "username": "qiliang",
  "password": "",
  "service": "",
  "instance": "",
  "workspace": "",
  "schema": "paris_olympics_2024_games",
  "vcluster": "default",
  "sdk_job_timeout": 10,
  "hints": hints,
}
session = Session.builder.configs(connection_parameters).create()

懒人捷径:通过Zettapark的save_as_table方法一步实现目标表结构创建和数据导入

检查csv文件,进行分类处理,其中需要将results目录下的各类比赛项目的数据进行并表,增加一列sport用来代表比赛项目,就用文件名前缀即可。

image.png

代码如下:

import os
import pandas as pd
import warnings

def is_hidden(filepath):
    return filepath.startswith('.')

# 忽略 FutureWarning
warnings.filterwarnings("ignore", category=FutureWarning)
# List to hold DataFrames for "results" directory
results_dfs = []

for dirname, dirs, filenames in os.walk('./data/paria olympics 2024 dataset updated'):
    dirs[:] = [d for d in dirs if not is_hidden(d)]
    for filename in filenames:
        if is_hidden(filename):
            continue
        filepath = os.path.join(dirname, filename)
        
        # Get the parent directory
        parent_dir = os.path.basename(os.path.dirname(filepath))
        
        # Remove the file extension from the filename
        filename_without_ext, _ = os.path.splitext(filename)
        
        if parent_dir == "results":
            try:
                data = pd.read_csv(filepath)
                # Replace spaces in column names with underscores and convert to lowercase,以符合列名命名规范要求
                data.columns = [col.replace(" ", "_").lower() for col in data.columns]
                # Convert columns to appropriate types
                data = data.astype(str)
                # Add game_type column
                data['sport'] = filename_without_ext
                # Reorder to make it the first column
                cols = ['sport'] + [col for col in data if col != 'sport']
                data = data[cols]
                results_dfs.append(data)

            except Exception as e:
                print(f"Error processing filepath={filepath}: {e}")
        else:
            table_name = filename_without_ext.replace(" ", "_")
            try:
                data = pd.read_csv(filepath)
                # Replace spaces in column names with underscores and convert to lowercase,以符合数据库列名命名规范要求
                data.columns = [col.replace(" ", "_").lower() for col in data.columns]
                df = session.create_dataframe(data)
                df.write.save_as_table(table_name, mode="overwrite", table_type="transient")
                print(f"Data from {filepath} written to table {table_name}")
            except Exception as e:
                print(f"Error processing filepath={filepath}, table_name={table_name}: {e}")
# Combine all DataFrames for "results" into one
if results_dfs:
    combined_results_df = pd.concat(results_dfs, ignore_index=True)
    # 将 NaN 或 NULL 值替换为空字符串
    combined_results_df = combined_results_df.fillna('')
    # 使用 applymap 方法替换所有 NaN 值为空字符串
    combined_results_df = combined_results_df.applymap(lambda x: '' if x == 'nan' else x)
    zettapark_results_df = session.create_dataframe(combined_results_df)
    zettapark_results_df.write.save_as_table("results", mode="overwrite", table_type="transient")
    print("Combined data written to table 'results'")

在云器Lakehouse里查看zettapark save_as_table的结果

可以看到,刚才下载下来的csv文件里的数据,通过云器zettapark的save_as_table已经全部写进云器Lakehouse的表里了。这避免了要手写12张目标表的的DDL语句,大幅成就了懒人,并且效率极高,特别适合在大数据平台上玩小数据,省去了文件(比如csv文件)很多的情况下,文件数据进入云器Lakehouse的麻烦。

image.png

通过DataGPT分析数据

基于2024巴黎奥运会的数据集,我们可以进行多种有趣的分析,比如:

  1. 奖牌统计: 分析各国获得的金牌、银牌和铜牌数量,以及总奖牌数,从而了解各国在奥运会上的表现。

  2. 运动员表现: 研究不同运动员的成绩,包括他们的个人最好成绩、在本届奥运会上的表现以及与其他运动员的比较。

  3. 项目分析: 分析哪些项目最受欢迎或产生了最多的奖牌,以及哪些项目的竞争最为激烈。

  4. 时间趋势: 如果数据集包含历届奥运会的数据,可以分析奖牌分布随时间的变化趋势。

  5. 年龄和性别分布: 分析参赛运动员的年龄和性别分布,了解不同年龄段和性别在不同项目中的表现。

接下来我们就用云器Lakehouse的DataGPT来分析刚才通过zettapark save_as_table加载进来的数据。

参赛运动员的年龄和性别分布

只需要向DataGPT提问“运动员的年龄和性别分布”,DataGPT就会生成如下的回答。从最幼者12岁到最长者70岁,生命不息,运动不止,满屏的奥运精神,此致敬礼!

在美好的青春岁月里做人生值得骄傲的事情,向青春的光彩致敬!

image.png

哪些项目最受欢迎或产生了最多的奖牌

只需要向DataGPT提问“哪些项目最受欢迎或产生了最多的奖牌”,DataGPT就会生成如下的回答。你喜欢的项目是哪一个?

image.png

每个国家的教练数

东道主就是东道主,教练数上是杠杠的Top1!

image.png

每天奖牌数

原来接近尾声的8月10日是产生奖牌数最多的一天,看来刚开始少点也不用着急哦!

image.png

总结

在云器Lakehouse上玩数据,总觉得数据是非大不可,否则就是杀鸡焉用宰牛刀了。本文尝试了Kagge上2024巴黎奥运会小数据集的场景,本方案省去了小数据集里对多个文件创建目标表建表的繁琐任务,从而大幅扫清了数据工程方面的麻烦事。通过DataGPT直接以问答的方式分析数据,从而可以使得更多非技术人员玩转数据,喜欢上数据分析,帮助企业数据文化走向大众化。

你还有哪些感兴趣的数据问题?快来用云器Lakehouse耍起来吧!

云器Lakehouse现已开放注册
欢迎申请体验,每个账号开通会获赠一定金额的代金券,助您快速试用体验。如需更多代金券额度,请您联系商务获取。
预约咨询
微信咨询
电话咨询