您现在的位置是:热点 >>正文
用 Pandas 做 ETL,不要太快
热点0528人已围观
简介...
久违了,朋友们,来篇干货。
ETL 的全称是 extract, transform, load,意思就是:提取、转换、 加载。ETL 是数据分析中的基础工作,获取非结构化或难以使用的数据,把它变为干净、结构化的数据,比如导出 csv 文件,为后续的分析提供数据基础。
1、提取数据
这里从电影数据 API 请求数据。在开始之前,你需要获得 API 密钥来访问 API可以在这里[1]找到获取密钥的说明。
一旦你有了密钥,需要确保你用 没有把它直接放入你的源代码中,因此你需要创建 ETL 脚本的同一目录中创建一个名为 config.py 的文件,将此放入文件:
#config.py
api_key =
如果要将代码发布到任何地方,应该将 config.py 放入 .gitignore 或类似文件中,以确保它不会被推送到任何远程存储库中。
还可以将 API 密钥存储为环境变量,或使用其他方法隐藏它。目标是保护它不暴露在 ETL 脚本中。
现在创建一个名为Pa tmdb.py 的文件,并导入必要的依赖:
import pandas as pd
import requests
import config
向 API 发送单个 GET 请求的方法。在响应中,我们收到一条 JSON 记录,其中包含我们指定的 movie_id:
API_KEY = config.api_key
url = 'https://api.themoviedb.org/3/movie/{}?api_key={}'nd.format(movie_id, API_KEY)
r = requests.get(url)
这里我们请求 6 部电影,电影 movie_id 从 550 到 555 不等。我们创建一个循环,一次请求每部电影一部,并将响应附加到列表中:
response_list = []
API_KEY = config.api_key
for movie_id in range(550,556):
url = 'https://api.themoviedb.asorg/3/movie/{}?api_key={}'.format(movie_id, API_KEY)
r = requests.get(url)
response_list.append(r.json())
现在我们拿到了 response_list 这样复杂冗长的 JSON 数据,这里使用 from_dict() 从记录中创建 Pandas 的 DataFrame 对象:
df = pd.DataFram 做e.from_dict(response_list)
如果在 jupyter 上输出一下 df,你会看到这样一个数据帧:
至此,数据提取完毕。
2、转换
我们并不需要提取数据的所有这些列,所以接下来选择我们需要使用的列。
假如以下列是我们感兴趣的:
budget
id
imdb_id
genres
original_title
release_date
revenue
runtime
创建一个名为 df_columns 的列名称列表,以 E便从主数据帧中选择所需的列。
df_columns = ['budget', 'genres', 'id', 'imdb_id', 'original_title', 'release_date', 'revenue', 'runtime']
请注意,有一个 genres 列(表示电影的体裁,类型)是长这样的:
这是一个 JSON 格式的列,我们希望扩展它。
一种比较直观的方法是将 genres 内的分类分解为多个列,如果某个电影属TL于这个分类,那么就在该列赋值 1,否则就置 0,就像这样:
现在我们用 pandas 来实现这个扩展效果。
首先扁平化这个 JSON 列表:
genres_list = df['genres'].tolist()
flat_list = [item for sublist in genres_list for item in sublist]
接下来,我们创建一个 genres_all 的临时列,作为电影类别的代表,我们只需要 genres 内的 na,不me 属性,稍后把它扩展为单独的列:
result = []
for l in genres_list:
r = []
for d in l:
r.append(d['name'])
result.append(r)
df = df.assign(genres_all=result)
为了完整的保存 genres 类型表,我们把它单独做为一个表:电影类型表:
df_genres = pd.DataFrame.from_records(flat_lis要太t).drop_duplicates()
它是这样的:
接下来,将类型名称附加到 df_columns 中,然后删除 genres 列:
df_columns = ['budget', 'id', 'imdb_id', 'original_title', 'release_date', 'revenue', 'runtime']
df_genre_columns = df_genres['name'].to_list()
df_c用 olumns.extend(df_genre_columns)
s = df['genres_all'].explode()
df = df.join(pd.crosstab(s.index, s))
代码的最后两行,使用了 explode、crosstab 函数来扩展多个列,其效果就是如果电影属于某个类型,该行的值就为 1,结果就是这样:
关于日期时间,我们希望将日期扩展为年、月、日、周,像这样:
那么以下代码就是干这个Pa的:
df['release_date'] = pd.to_datetime(df['release_date'])
df['day'] = df['release_date'].dt.day
df['month'] = df['release_date'].dt.month
df['year'] = df['release_date'].dt.year
df['day_of_week'] = df['release_datnde'].dt.day_name()
df_time_columns = ['id', 'release_date', 'day', 'month', 'year', 'day_of_week']3、加载
加载就很简单了,将 DataFrame 导出到 excel 或者 csv 即可。
df[df_columns].to_csv('tmdb_movies.csv', index=False)
df_genres.to_csv('tmdb_gasenres.csv', index=False)
df[df_time_columns].to_csv('tmdb_datetimes.csv', index=False)
如果要导出 excel,那么就用 to_excel 函数。
最后的话
Pandas 是处理 excel 或者数据分析的利器,ETL 必备工具,本文以电影数据为例,分享了 Pandas 的常见用法。
Tags:
相关文章
标签: 好想来
热点撰文 | 曹双涛 编辑 | 杨博丞 题图 | IC Photo “外界看到零食折扣店疯狂的客流纷纷想要入局,但万臣集团对外公布的门店数量高达15000家,已实现稳定盈利的门店占比有多少?已从好想来出来...
【热点】
阅读更多标签: 薇美铺 WeMakePrice 趣天Qoo10 电商平台
热点云梦级11月12日云梦级消息,据韩联社报道,当地时间10日,韩国首尔的一家法院裁定,因欠款问题陷入困境的电商平台——薇美铺WeMakePrice正式破产。 据报道,去年7月底,薇美铺向法院申请启动重整...
【热点】
阅读更多孤独老人的新伴侣:韩国AI玩偶实现24小时陪伴与健康监测
热点在韩国,独居老人们的新朋友 —— 一款能够实时监测健康状况的 AI 玩偶,正在逐渐成为他们生活中不可或缺的一部分。这款名为 Hyodol 的智能娃娃,由韩国初创公司 Hyodol 开发,已经在政府的推...
【热点】
阅读更多
热门文章
最新文章
友情链接
- 标签: 康师傅
- https://www.ncetm.org.uk/search?action=CHECK&q=谷歌搜索留痕【tg:seogoogle987】,RWu
- https://www.xvideos.com/tags/谷歌搜索留痕【tg:seogoogle987】,tLH
- https://www.scq.ubc.ca/?page=2&s=谷歌搜索留痕【tg:seogoogle987】,y8y
- https://www.reallywildbirdfood.co.uk/store/search?q=谷歌搜索留痕【tg:seogoogle987】,qcR
- https://www.u-bourgogne.fr/?cat=117&s=谷歌搜索留痕【tg:seogoogle987】,Hcr
- https://www.polliwogs.com/search/谷歌搜索留痕【tg:seogoogle987】,3W5
- https://www.tombow.com/search/谷歌搜索留痕【tg:seogoogle987】,DnG
- https://www.wheels24.gr/?action=CHECK&s=谷歌搜索留痕【tg:seogoogle987】,Dqa
- https://www.laoairlines.com/?action=QUERY&s=谷歌搜索留痕【tg:seogoogle987】,8MG
- https://www.pinkpanda.ro/magazin/ingrijirea-tenului?page=87&q=谷歌搜索留痕【tg:seogoogle987】,ORC
- https://www.rookwinkel.nl/catalogsearch/result/index/?q=谷歌搜索留痕【tg:seogoogle987】,r0b
- https://www.tailoy.com.pe/catalogsearch/result/?q=谷歌搜索留痕【tg:seogoogle987】,Bcr
- https://www.jusoen.com/addreng.asp?p1=谷歌搜索留痕【tg:seogoogle987】x1b
- https://www.sebson.de/en/search?query=谷歌搜索留痕【tg:seogoogle987】,oji
- https://www.lauben.com/de/?s=谷歌搜索留痕【tg:seogoogle987】,KOv
- https://www.pacific-lifestyle.co.uk/search?sort=alphabetical&term=谷歌搜索留痕【tg:seogoogle987】,Ou8
- https://www.wikiart.org/pt/Search/谷歌搜索留痕【tg:seogoogle987】,o0h
- https://5gaa.org/?token=6e2l7hjt2i26gzgctgwdrv7v0j6nxorq&s=谷歌搜索留痕【tg:seogoogle987】fM4
- https://www.stonerealestate.com.au/?cat=100&s=谷歌搜索留痕【tg:seogoogle987】,MNj
- https://www.lenovo.com/gb/en/search?action=SEARCH&text=谷歌搜索留痕【tg:seogoogle987】,gJb
- https://www.teacherspayteachers.com/Browse/Price-Range/Free/Search:Western International University Physics degree=谷歌搜索留痕【tg:seogoogle987】,uqR
- https://www.losgatoschamber.com/list/search?action=SEARCH&q=谷歌搜索留痕【tg:seogoogle987】,w7d
- https://www.resopal.de/catalogsearch/result/?action=SEARCH&q=谷歌搜索留痕【tg:seogoogle987】,gUE
- https://www.universal-music.co.jp/?ID=1sIcckCTeBS8FjzCshAW9w53s8gr691o&s=谷歌搜索留痕【tg:seogoogle987】,WSN
- https://www.realsporting.com/buscador?buscar=谷歌搜索留痕【tg:seogoogle987】,kSs
- https://www.kingston.gov.uk/site-search/results/?q=谷歌搜索留痕【tg:seogoogle987】,A2q
- https://www.merchbar.com/search?q=谷歌搜索留痕【tg:seogoogle987】,rBz
- https://www.totolink.vn/search/谷歌搜索留痕【tg:seogoogle987】,RAZ
- https://www.tullygroup.us/?ID=hbkq8jFjrQlVRrwzEmvoUJJAY4e1Lfo5&s=谷歌搜索留痕【tg:seogoogle987】,mbo
- https://www.temu.com/search_result.html?search_key=谷歌搜索留痕【tg:seogoogle987】iHj
- https://www.tumblr.com/tagged/谷歌搜索留痕【tg:seogoogle987】,Nv5
- https://www.kuaikanmanhua.com/sou/谷歌搜索留痕【tg:seogoogle987】,55G
- https://www.therapeuticassociates.com/?cat=5&s=谷歌搜索留痕【tg:seogoogle987】,dO4
- https://www.rockngem.com/?action=CHECK&s=谷歌搜索留痕【tg:seogoogle987】,xSl
- https://www.youm7.com/Home/Search?allwords=谷歌搜索留痕【tg:seogoogle987】,uO4
- https://www.sensorshop24.de/catalogsearch/result/index/?type=132&q=谷歌搜索留痕【tg:seogoogle987】,xa5
- https://www.youthforum.org/search-results?cx=4f5236218ab5e8ef9&ie=UTF-8&q=谷歌搜索留痕【tg:seogoogle987】,hNK
- https://www.uckfieldtc.gov.uk/?s=谷歌搜索留痕【tg:seogoogle987】,Q6C
- https://www.kubb-tool.bfs.admin.ch/en/search?action=CHECK&q=谷歌搜索留痕【tg:seogoogle987】,yk5
- https://www.remit.co.jp/vi/?s=谷歌搜索留痕【tg:seogoogle987】,CAu
- https://www.lneg.pt/en/?s=谷歌搜索留痕【tg:seogoogle987】,ZDn
- https://www.kelsa.co.uk/catalogsearch/result/index/?T=1686132119291&q=谷歌搜索留痕【tg:seogoogle987】,Zot
- https://www.lifesciencesweden.se/search?q=谷歌搜索留痕【tg:seogoogle987】,QnL
- https://www.kissthekangaroo.com.au/index.php?route=product/search&tag=谷歌搜索留痕【tg:seogoogle987】,U77
- https://hsmoa.com/search?query=谷歌搜索留痕【tg:seogoogle987】7CF
- https://www.uctronics.com/catalogsearch/result/?q=谷歌搜索留痕【tg:seogoogle987】,n2W
- https://www.smarty.net/search?q=谷歌搜索留痕【tg:seogoogle987】,S2C
- https://www.world-architects.com/en/search?term=谷歌搜索留痕【tg:seogoogle987】,vAn
- https://www.lneg.pt/?cat=140&s=谷歌搜索留痕【tg:seogoogle987】,igx
- https://www.youtube.com/hashtag/谷歌搜索留痕【tg:seogoogle987】,phP