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

用 Pandas 做 ETL,不要太快

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

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

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

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

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

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

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

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

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

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

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

import pandas as pdEkW28资讯网——每日最新资讯28at.com
import requestsEkW28资讯网——每日最新资讯28at.com
import configEkW28资讯网——每日最新资讯28at.com

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

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

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

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

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

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

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

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

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

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

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

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

budgetEkW28资讯网——每日最新资讯28at.com
idEkW28资讯网——每日最新资讯28at.com
imdb_idEkW28资讯网——每日最新资讯28at.com
genresEkW28资讯网——每日最新资讯28at.com
original_titleEkW28资讯网——每日最新资讯28at.com
release_dateEkW28资讯网——每日最新资讯28at.com
revenueEkW28资讯网——每日最新资讯28at.com
runtimeEkW28资讯网——每日最新资讯28at.com

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

标签:
  • 热门焦点
  • 石头自清洁扫拖机器人G10S评测:多年黑科技集大成之作 懒人终极福音

    科技圈经常能看到一个词叫“缝合怪”,用来形容那些把好多功能或者外观结合在一起的产品,通常这样的词是贬义词,但如果真的是产品缝合的好、缝合的实用的话,那它就成了中性词,今
  • 7月安卓手机性能榜:红魔8S Pro再夺榜首

    7月份的手机市场风平浪静,除了红魔和努比亚带来了两款搭载骁龙8Gen2领先版处理器的新机之外,别的也想不到有什么新品了,这也正常,通常6月7月都是手机厂商修整的时间,进入8月份之
  • CSS单标签实现转转logo

    转转品牌升级后更新了全新的Logo,今天我们用纯CSS来实现转转的新Logo,为了有一定的挑战性,这里我们只使用一个标签实现,将最大化的使用CSS能力完成Logo的绘制与动画效果。新logo
  • 把LangChain跑起来的三个方法

    使用LangChain开发LLM应用时,需要机器进行GLM部署,好多同学第一步就被劝退了,那么如何绕过这个步骤先学习LLM模型的应用,对Langchain进行快速上手?本片讲解3个把LangChain跑起来
  • Flowable工作流引擎的科普与实践

    一.引言当我们在日常工作和业务中需要进行各种审批流程时,可能会面临一系列技术和业务上的挑战。手动处理这些审批流程可能会导致开发成本的增加以及业务复杂度的上升。在这
  • 中国家电海外掘金正当时|出海专题

    作者|吴南南编辑|胡展嘉运营|陈佳慧出品|零态LT(ID:LingTai_LT)2023年,出海市场战况空前,中国创业者在海外纷纷摩拳擦掌,以期能够把中国的商业模式、创业理念、战略打法输出海外,他们依
  • 大厂卷向扁平化

    来源:新熵作者丨南枝 编辑丨月见大厂职级不香了。俗话说,兵无常势,水无常形,互联网企业调整职级体系并不稀奇。7月13日,淘宝天猫集团启动了近年来最大的人力制度改革,目前已形成一
  • onebot M24巧系列一体机采用轻薄机身设计,现已在各平台开售

    onebot M24 巧系列一体机目前已在线上线下各平台同步开售。onebot M24 巧系列采用一体化轻薄机身设计,最薄处为 10.15mm,拥有宝石红、午夜蓝、石墨绿、雅致
  • 亲历马斯克血洗Twitter,硅谷的苦日子在后头

    文/刘哲铭  编辑/李薇  马斯克再次挥下裁员大刀。  美国时间11月14日,Twitter约4400名外包员工遭解雇,此次被解雇的员工的主要工作为内容审核等。此前,T
Top