当前位置:首页 > 科技  > 知识百科

用 Pandas 做 ETL,不要太快

来源: 责编: 时间:2023-08-07 16:29:54 283观看
导读 久违了,朋友们,来篇干货。ETL 的全称是 extract, transform, load,意思就是:提取、转换、 加载。ETL 是数据分析中的基础工作,获取非结构化或难以使用的数据,把它变为干净、结构化

久违了,朋友们,来篇干货。aOj28资讯网——每日最新资讯28at.com

ETL 的全称是 extract, transform, load,意思就是:提取、转换、 加载。ETL 是数据分析中的基础工作,获取非结构化或难以使用的数据,把它变为干净、结构化的数据,比如导出 csv 文件,为后续的分析提供数据基础。aOj28资讯网——每日最新资讯28at.com

1、提取数据aOj28资讯网——每日最新资讯28at.com

这里从电影数据 API 请求数据。在开始之前,你需要获得 API 密钥来访问 API可以在这里[1]找到获取密钥的说明。aOj28资讯网——每日最新资讯28at.com

一旦你有了密钥,需要确保你没有把它直接放入你的源代码中,因此你需要创建 ETL 脚本的同一目录中创建一个名为 config.py 的文件,将此放入文件:aOj28资讯网——每日最新资讯28at.com

#config.pyaOj28资讯网——每日最新资讯28at.com
api_key =aOj28资讯网——每日最新资讯28at.com

 aOj28资讯网——每日最新资讯28at.com

如果要将代码发布到任何地方,应该将 config.py 放入 .gitignore 或类似文件中,以确保它不会被推送到任何远程存储库中。aOj28资讯网——每日最新资讯28at.com

还可以将 API 密钥存储为环境变量,或使用其他方法隐藏它。目标是保护它不暴露在 ETL 脚本中。aOj28资讯网——每日最新资讯28at.com

现在创建一个名为 tmdb.py 的文件,并导入必要的依赖:aOj28资讯网——每日最新资讯28at.com

import pandas as pdaOj28资讯网——每日最新资讯28at.com
import requestsaOj28资讯网——每日最新资讯28at.com
import configaOj28资讯网——每日最新资讯28at.com

向 API 发送单个 GET 请求的方法。在响应中,我们收到一条 JSON 记录,其中包含我们指定的 movie_id:aOj28资讯网——每日最新资讯28at.com

API_KEY = config.api_keyaOj28资讯网——每日最新资讯28at.com
url = 'https://api.themoviedb.org/3/movie/{}?api_key={}'.format(movie_id, API_KEY)aOj28资讯网——每日最新资讯28at.com
aOj28资讯网——每日最新资讯28at.com
r = requests.get(url)aOj28资讯网——每日最新资讯28at.com

这里我们请求 6 部电影,电影 movie_id 从 550 到 555 不等。我们创建一个循环,一次请求每部电影一部,并将响应附加到列表中:aOj28资讯网——每日最新资讯28at.com

response_list = []aOj28资讯网——每日最新资讯28at.com
API_KEY = config.api_keyaOj28资讯网——每日最新资讯28at.com
aOj28资讯网——每日最新资讯28at.com
for movie_id in range(550,556):aOj28资讯网——每日最新资讯28at.com
url = 'https://api.themoviedb.org/3/movie/{}?api_key={}'.format(movie_id, API_KEY)aOj28资讯网——每日最新资讯28at.com
r = requests.get(url)aOj28资讯网——每日最新资讯28at.com
response_list.append(r.json())aOj28资讯网——每日最新资讯28at.com

现在我们拿到了 response_list 这样复杂冗长的 JSON 数据,这里使用 from_dict() 从记录中创建 Pandas 的 DataFrame 对象:aOj28资讯网——每日最新资讯28at.com

df = pd.DataFrame.from_dict(response_list)aOj28资讯网——每日最新资讯28at.com

如果在 jupyter 上输出一下 df,你会看到这样一个数据帧:aOj28资讯网——每日最新资讯28at.com

aOj28资讯网——每日最新资讯28at.com

至此,数据提取完毕。aOj28资讯网——每日最新资讯28at.com

2、转换aOj28资讯网——每日最新资讯28at.com

我们并不需要提取数据的所有这些列,所以接下来选择我们需要使用的列。aOj28资讯网——每日最新资讯28at.com

假如以下列是我们感兴趣的:aOj28资讯网——每日最新资讯28at.com

budgetaOj28资讯网——每日最新资讯28at.com
idaOj28资讯网——每日最新资讯28at.com
imdb_idaOj28资讯网——每日最新资讯28at.com
genresaOj28资讯网——每日最新资讯28at.com
original_titleaOj28资讯网——每日最新资讯28at.com
release_dateaOj28资讯网——每日最新资讯28at.com
revenueaOj28资讯网——每日最新资讯28at.com
runtimeaOj28资讯网——每日最新资讯28at.com

创建一个名为 df_columns 的列名称列表,以便从主数据帧中选择所需的列。aOj28资讯网——每日最新资讯28at.com

df_columns = ['budget', 'genres', 'id', 'imdb_id', 'original_title', 'release_date', 'revenue', 'runtime']aOj28资讯网——每日最新资讯28at.com

请注意,有一个 genres 列(表示电影的体裁,类型)是长这样的:aOj28资讯网——每日最新资讯28at.com

aOj28资讯网——每日最新资讯28at.com

这是一个 JSON 格式的列,我们希望扩展它。aOj28资讯网——每日最新资讯28at.com

一种比较直观的方法是将 genres 内的分类分解为多个列,如果某个电影属于这个分类,那么就在该列赋值 1,否则就置 0,就像这样:aOj28资讯网——每日最新资讯28at.com

aOj28资讯网——每日最新资讯28at.com

现在我们用 pandas 来实现这个扩展效果。aOj28资讯网——每日最新资讯28at.com

首先扁平化这个 JSON 列表:aOj28资讯网——每日最新资讯28at.com

genres_list = df['genres'].tolist()aOj28资讯网——每日最新资讯28at.com
flat_list = [item for sublist in genres_list for item in sublist]aOj28资讯网——每日最新资讯28at.com

接下来,我们创建一个 genres_all 的临时列,作为电影类别的代表,我们只需要 genres 内的 name 属性,稍后把它扩展为单独的列:aOj28资讯网——每日最新资讯28at.com

result = []aOj28资讯网——每日最新资讯28at.com
for l in genres_list:aOj28资讯网——每日最新资讯28at.com
r = []aOj28资讯网——每日最新资讯28at.com
for d in l:aOj28资讯网——每日最新资讯28at.com
r.append(d['name'])aOj28资讯网——每日最新资讯28at.com
result.append(r)aOj28资讯网——每日最新资讯28at.com
df = df.assign(genres_all=result)aOj28资讯网——每日最新资讯28at.com

为了完整的保存 genres 类型表,我们把它单独做为一个表:电影类型表:aOj28资讯网——每日最新资讯28at.com

df_genres = pd.DataFrame.from_records(flat_list).drop_duplicates()aOj28资讯网——每日最新资讯28at.com

它是这样的:aOj28资讯网——每日最新资讯28at.com

aOj28资讯网——每日最新资讯28at.com

接下来,将类型名称附加到 df_columns 中,然后删除 genres 列:aOj28资讯网——每日最新资讯28at.com

df_columns = ['budget', 'id', 'imdb_id', 'original_title', 'release_date', 'revenue', 'runtime']aOj28资讯网——每日最新资讯28at.com
df_genre_columns = df_genres['name'].to_list()aOj28资讯网——每日最新资讯28at.com
df_columns.extend(df_genre_columns)aOj28资讯网——每日最新资讯28at.com
aOj28资讯网——每日最新资讯28at.com
s = df['genres_all'].explode()aOj28资讯网——每日最新资讯28at.com
df = df.join(pd.crosstab(s.index, s))aOj28资讯网——每日最新资讯28at.com

代码的最后两行,使用了 explode、crosstab 函数来扩展多个列,其效果就是如果电影属于某个类型,该行的值就为 1,结果就是这样: aOj28资讯网——每日最新资讯28at.com

关于日期时间,我们希望将日期扩展为年、月、日、周,像这样:aOj28资讯网——每日最新资讯28at.com

aOj28资讯网——每日最新资讯28at.com

那么以下代码就是干这个的:aOj28资讯网——每日最新资讯28at.com

df['release_date'] = pd.to_datetime(df['release_date'])aOj28资讯网——每日最新资讯28at.com
df['day'] = df['release_date'].dt.dayaOj28资讯网——每日最新资讯28at.com
df['month'] = df['release_date'].dt.monthaOj28资讯网——每日最新资讯28at.com
df['year'] = df['release_date'].dt.yearaOj28资讯网——每日最新资讯28at.com
df['day_of_week'] = df['release_date'].dt.day_name()aOj28资讯网——每日最新资讯28at.com
df_time_columns = ['id', 'release_date', 'day', 'month', 'year', 'day_of_week']3、加载aOj28资讯网——每日最新资讯28at.com

加载就很简单了,将 DataFrame 导出到 excel 或者 csv 即可。aOj28资讯网——每日最新资讯28at.com

df[df_columns].to_csv('tmdb_movies.csv', index=False)aOj28资讯网——每日最新资讯28at.com
df_genres.to_csv('tmdb_genres.csv', index=False)aOj28资讯网——每日最新资讯28at.com
df[df_time_columns].to_csv('tmdb_datetimes.csv', index=False)aOj28资讯网——每日最新资讯28at.com

如果要导出 excel,那么就用 to_excel 函数。aOj28资讯网——每日最新资讯28at.com

最后的话aOj28资讯网——每日最新资讯28at.com

Pandas 是处理 excel 或者数据分析的利器,ETL 必备工具,本文以电影数据为例,分享了 Pandas 的常见用法。aOj28资讯网——每日最新资讯28at.com

 aOj28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-119-2165-0.html用 Pandas 做 ETL,不要太快

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 云安全日报220218:Ubuntu Linux内核发现重要漏洞,需要尽快升级

下一篇: 云计算开发:Python3-isdecimal()方法详解

标签:
  • 热门焦点
  • 小米官宣:2023年上半年出货量中国第一!

    今日早间,小米电视官方微博带来消息,称2023年小米电视上半年出货量达到了中国第一,同时还表示小米电视的巨屏风暴即将开始。“公布一个好消息2023年#小米电视上半年出货量中国
  • CSS单标签实现转转logo

    转转品牌升级后更新了全新的Logo,今天我们用纯CSS来实现转转的新Logo,为了有一定的挑战性,这里我们只使用一个标签实现,将最大化的使用CSS能力完成Logo的绘制与动画效果。新logo
  • 十个简单但很有用的Python装饰器

    装饰器(Decorators)是Python中一种强大而灵活的功能,用于修改或增强函数或类的行为。装饰器本质上是一个函数,它接受另一个函数或类作为参数,并返回一个新的函数或类。它们通常用
  • 如何通过Python线程池实现异步编程?

    线程池的概念和基本原理线程池是一种并发处理机制,它可以在程序启动时创建一组线程,并将它们置于等待任务的状态。当任务到达时,线程池中的某个线程会被唤醒并执行任务,执行完任
  • JavaScript学习 -AES加密算法

    引言在当今数字化时代,前端应用程序扮演着重要角色,用户的敏感数据经常在前端进行加密和解密操作。然而,这样的操作在网络传输和存储中可能会受到恶意攻击的威胁。为了确保数据
  • 消费结构调整丨巨头低价博弈,拼多多还卷得动吗?

    来源:征探财经作者:陈香羽随着流量红利的退潮,电商的存量博弈越来越明显。曾经主攻中高端与品质的淘宝天猫、京东重拾“低价”口号。而过去与他们错位竞争的拼多多,靠
  • 微博大门常打开,迎接海外画师漂洋东渡

    作者:互联网那些事“起猛了,我能看得懂日语了”。“为什么日本人说话我能听懂?”“中文不像中文,日语不像日语,但是我竟然看懂了”…&hell
  • 质感不错!OPPO K11渲染图曝光:旗舰IMX890传感器首次下放

    一直以来,OPPO K系列机型都保持着较为均衡的产品体验,历来都是2K价位的明星机型,去年推出的OPPO K10和OPPO K10 Pro两款机型凭借各自的出色配置,堪称有
  • 2021中国国际消费电子博览会与青岛国际软件融合创新博览会新闻发布会隆重举行

    9月18日,2021中国国际消费电子博览会与青岛国际软件融合创新博览会新闻发布会在青岛国际新闻中心隆重举行。发布会上青岛市政府领导联袂出席,对本次双展会情
Top