日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 知識(shí)百科

用 Pandas 做 ETL,不要太快

來源: 責(zé)編: 時(shí)間:2023-08-07 16:29:54 240觀看
導(dǎo)讀 久違了,朋友們,來篇干貨。ETL 的全稱是 extract, transform, load,意思就是:提取、轉(zhuǎn)換、 加載。ETL 是數(shù)據(jù)分析中的基礎(chǔ)工作,獲取非結(jié)構(gòu)化或難以使用的數(shù)據(jù),把它變?yōu)楦蓛簟⒔Y(jié)構(gòu)化

久違了,朋友們,來篇干貨。MC728資訊網(wǎng)——每日最新資訊28at.com

ETL 的全稱是 extract, transform, load,意思就是:提取、轉(zhuǎn)換、 加載。ETL 是數(shù)據(jù)分析中的基礎(chǔ)工作,獲取非結(jié)構(gòu)化或難以使用的數(shù)據(jù),把它變?yōu)楦蓛簟⒔Y(jié)構(gòu)化的數(shù)據(jù),比如導(dǎo)出 csv 文件,為后續(xù)的分析提供數(shù)據(jù)基礎(chǔ)。MC728資訊網(wǎng)——每日最新資訊28at.com

1、提取數(shù)據(jù)MC728資訊網(wǎng)——每日最新資訊28at.com

這里從電影數(shù)據(jù) API 請(qǐng)求數(shù)據(jù)。在開始之前,你需要獲得 API 密鑰來訪問 API可以在這里[1]找到獲取密鑰的說明。MC728資訊網(wǎng)——每日最新資訊28at.com

一旦你有了密鑰,需要確保你沒有把它直接放入你的源代碼中,因此你需要?jiǎng)?chuàng)建 ETL 腳本的同一目錄中創(chuàng)建一個(gè)名為 config.py 的文件,將此放入文件:MC728資訊網(wǎng)——每日最新資訊28at.com

#config.pyMC728資訊網(wǎng)——每日最新資訊28at.com
api_key =MC728資訊網(wǎng)——每日最新資訊28at.com

 MC728資訊網(wǎng)——每日最新資訊28at.com

如果要將代碼發(fā)布到任何地方,應(yīng)該將 config.py 放入 .gitignore 或類似文件中,以確保它不會(huì)被推送到任何遠(yuǎn)程存儲(chǔ)庫中。MC728資訊網(wǎng)——每日最新資訊28at.com

還可以將 API 密鑰存儲(chǔ)為環(huán)境變量,或使用其他方法隱藏它。目標(biāo)是保護(hù)它不暴露在 ETL 腳本中。MC728資訊網(wǎng)——每日最新資訊28at.com

現(xiàn)在創(chuàng)建一個(gè)名為 tmdb.py 的文件,并導(dǎo)入必要的依賴:MC728資訊網(wǎng)——每日最新資訊28at.com

import pandas as pdMC728資訊網(wǎng)——每日最新資訊28at.com
import requestsMC728資訊網(wǎng)——每日最新資訊28at.com
import configMC728資訊網(wǎng)——每日最新資訊28at.com

向 API 發(fā)送單個(gè) GET 請(qǐng)求的方法。在響應(yīng)中,我們收到一條 JSON 記錄,其中包含我們指定的 movie_id:MC728資訊網(wǎng)——每日最新資訊28at.com

API_KEY = config.api_keyMC728資訊網(wǎng)——每日最新資訊28at.com
url = 'https://api.themoviedb.org/3/movie/{}?api_key={}'.format(movie_id, API_KEY)MC728資訊網(wǎng)——每日最新資訊28at.com
MC728資訊網(wǎng)——每日最新資訊28at.com
r = requests.get(url)MC728資訊網(wǎng)——每日最新資訊28at.com

這里我們請(qǐng)求 6 部電影,電影 movie_id 從 550 到 555 不等。我們創(chuàng)建一個(gè)循環(huán),一次請(qǐng)求每部電影一部,并將響應(yīng)附加到列表中:MC728資訊網(wǎng)——每日最新資訊28at.com

response_list = []MC728資訊網(wǎng)——每日最新資訊28at.com
API_KEY = config.api_keyMC728資訊網(wǎng)——每日最新資訊28at.com
MC728資訊網(wǎng)——每日最新資訊28at.com
for movie_id in range(550,556):MC728資訊網(wǎng)——每日最新資訊28at.com
url = 'https://api.themoviedb.org/3/movie/{}?api_key={}'.format(movie_id, API_KEY)MC728資訊網(wǎng)——每日最新資訊28at.com
r = requests.get(url)MC728資訊網(wǎng)——每日最新資訊28at.com
response_list.append(r.json())MC728資訊網(wǎng)——每日最新資訊28at.com

現(xiàn)在我們拿到了 response_list 這樣復(fù)雜冗長的 JSON 數(shù)據(jù),這里使用 from_dict() 從記錄中創(chuàng)建 Pandas 的 DataFrame 對(duì)象:MC728資訊網(wǎng)——每日最新資訊28at.com

df = pd.DataFrame.from_dict(response_list)MC728資訊網(wǎng)——每日最新資訊28at.com

如果在 jupyter 上輸出一下 df,你會(huì)看到這樣一個(gè)數(shù)據(jù)幀:MC728資訊網(wǎng)——每日最新資訊28at.com

MC728資訊網(wǎng)——每日最新資訊28at.com

至此,數(shù)據(jù)提取完畢。MC728資訊網(wǎng)——每日最新資訊28at.com

2、轉(zhuǎn)換MC728資訊網(wǎng)——每日最新資訊28at.com

我們并不需要提取數(shù)據(jù)的所有這些列,所以接下來選擇我們需要使用的列。MC728資訊網(wǎng)——每日最新資訊28at.com

假如以下列是我們感興趣的:MC728資訊網(wǎng)——每日最新資訊28at.com

budgetMC728資訊網(wǎng)——每日最新資訊28at.com
idMC728資訊網(wǎng)——每日最新資訊28at.com
imdb_idMC728資訊網(wǎng)——每日最新資訊28at.com
genresMC728資訊網(wǎng)——每日最新資訊28at.com
original_titleMC728資訊網(wǎng)——每日最新資訊28at.com
release_dateMC728資訊網(wǎng)——每日最新資訊28at.com
revenueMC728資訊網(wǎng)——每日最新資訊28at.com
runtimeMC728資訊網(wǎng)——每日最新資訊28at.com

創(chuàng)建一個(gè)名為 df_columns 的列名稱列表,以便從主數(shù)據(jù)幀中選擇所需的列。MC728資訊網(wǎng)——每日最新資訊28at.com

df_columns = ['budget', 'genres', 'id', 'imdb_id', 'original_title', 'release_date', 'revenue', 'runtime']MC728資訊網(wǎng)——每日最新資訊28at.com

請(qǐng)注意,有一個(gè) genres 列(表示電影的體裁,類型)是長這樣的:MC728資訊網(wǎng)——每日最新資訊28at.com

MC728資訊網(wǎng)——每日最新資訊28at.com

這是一個(gè) JSON 格式的列,我們希望擴(kuò)展它。MC728資訊網(wǎng)——每日最新資訊28at.com

一種比較直觀的方法是將 genres 內(nèi)的分類分解為多個(gè)列,如果某個(gè)電影屬于這個(gè)分類,那么就在該列賦值 1,否則就置 0,就像這樣:MC728資訊網(wǎng)——每日最新資訊28at.com

MC728資訊網(wǎng)——每日最新資訊28at.com

現(xiàn)在我們用 pandas 來實(shí)現(xiàn)這個(gè)擴(kuò)展效果。MC728資訊網(wǎng)——每日最新資訊28at.com

首先扁平化這個(gè) JSON 列表:MC728資訊網(wǎng)——每日最新資訊28at.com

genres_list = df['genres'].tolist()MC728資訊網(wǎng)——每日最新資訊28at.com
flat_list = [item for sublist in genres_list for item in sublist]MC728資訊網(wǎng)——每日最新資訊28at.com

接下來,我們創(chuàng)建一個(gè) genres_all 的臨時(shí)列,作為電影類別的代表,我們只需要 genres 內(nèi)的 name 屬性,稍后把它擴(kuò)展為單獨(dú)的列:MC728資訊網(wǎng)——每日最新資訊28at.com

result = []MC728資訊網(wǎng)——每日最新資訊28at.com
for l in genres_list:MC728資訊網(wǎng)——每日最新資訊28at.com
r = []MC728資訊網(wǎng)——每日最新資訊28at.com
for d in l:MC728資訊網(wǎng)——每日最新資訊28at.com
r.append(d['name'])MC728資訊網(wǎng)——每日最新資訊28at.com
result.append(r)MC728資訊網(wǎng)——每日最新資訊28at.com
df = df.assign(genres_all=result)MC728資訊網(wǎng)——每日最新資訊28at.com

為了完整的保存 genres 類型表,我們把它單獨(dú)做為一個(gè)表:電影類型表:MC728資訊網(wǎng)——每日最新資訊28at.com

df_genres = pd.DataFrame.from_records(flat_list).drop_duplicates()MC728資訊網(wǎng)——每日最新資訊28at.com

它是這樣的:MC728資訊網(wǎng)——每日最新資訊28at.com

MC728資訊網(wǎng)——每日最新資訊28at.com

接下來,將類型名稱附加到 df_columns 中,然后刪除 genres 列:MC728資訊網(wǎng)——每日最新資訊28at.com

df_columns = ['budget', 'id', 'imdb_id', 'original_title', 'release_date', 'revenue', 'runtime']MC728資訊網(wǎng)——每日最新資訊28at.com
df_genre_columns = df_genres['name'].to_list()MC728資訊網(wǎng)——每日最新資訊28at.com
df_columns.extend(df_genre_columns)MC728資訊網(wǎng)——每日最新資訊28at.com
MC728資訊網(wǎng)——每日最新資訊28at.com
s = df['genres_all'].explode()MC728資訊網(wǎng)——每日最新資訊28at.com
df = df.join(pd.crosstab(s.index, s))MC728資訊網(wǎng)——每日最新資訊28at.com

代碼的最后兩行,使用了 explode、crosstab 函數(shù)來擴(kuò)展多個(gè)列,其效果就是如果電影屬于某個(gè)類型,該行的值就為 1,結(jié)果就是這樣: MC728資訊網(wǎng)——每日最新資訊28at.com

關(guān)于日期時(shí)間,我們希望將日期擴(kuò)展為年、月、日、周,像這樣:MC728資訊網(wǎng)——每日最新資訊28at.com

MC728資訊網(wǎng)——每日最新資訊28at.com

那么以下代碼就是干這個(gè)的:MC728資訊網(wǎng)——每日最新資訊28at.com

df['release_date'] = pd.to_datetime(df['release_date'])MC728資訊網(wǎng)——每日最新資訊28at.com
df['day'] = df['release_date'].dt.dayMC728資訊網(wǎng)——每日最新資訊28at.com
df['month'] = df['release_date'].dt.monthMC728資訊網(wǎng)——每日最新資訊28at.com
df['year'] = df['release_date'].dt.yearMC728資訊網(wǎng)——每日最新資訊28at.com
df['day_of_week'] = df['release_date'].dt.day_name()MC728資訊網(wǎng)——每日最新資訊28at.com
df_time_columns = ['id', 'release_date', 'day', 'month', 'year', 'day_of_week']3、加載MC728資訊網(wǎng)——每日最新資訊28at.com

加載就很簡單了,將 DataFrame 導(dǎo)出到 excel 或者 csv 即可。MC728資訊網(wǎng)——每日最新資訊28at.com

df[df_columns].to_csv('tmdb_movies.csv', index=False)MC728資訊網(wǎng)——每日最新資訊28at.com
df_genres.to_csv('tmdb_genres.csv', index=False)MC728資訊網(wǎng)——每日最新資訊28at.com
df[df_time_columns].to_csv('tmdb_datetimes.csv', index=False)MC728資訊網(wǎng)——每日最新資訊28at.com

如果要導(dǎo)出 excel,那么就用 to_excel 函數(shù)。MC728資訊網(wǎng)——每日最新資訊28at.com

最后的話MC728資訊網(wǎng)——每日最新資訊28at.com

Pandas 是處理 excel 或者數(shù)據(jù)分析的利器,ETL 必備工具,本文以電影數(shù)據(jù)為例,分享了 Pandas 的常見用法。MC728資訊網(wǎng)——每日最新資訊28at.com

 MC728資訊網(wǎng)——每日最新資訊28at.com

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

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 云安全日?qǐng)?bào)220218:Ubuntu Linux內(nèi)核發(fā)現(xiàn)重要漏洞,需要盡快升級(jí)

下一篇: 云計(jì)算開發(fā):Python3-isdecimal()方法詳解

標(biāo)簽:
  • 熱門焦點(diǎn)
Top 主站蜘蛛池模板: 芦山县| 保德县| 浮山县| 平远县| 慈利县| 米脂县| 保亭| 措勤县| 嵊泗县| 湖州市| 于田县| 松溪县| 金塔县| 凤城市| 屯昌县| 祁连县| 藁城市| 无棣县| 云南省| 楚雄市| 独山县| 石屏县| 玛曲县| 松潘县| 弥勒县| 湖北省| 宁南县| 商河县| 浦东新区| 日照市| 吴桥县| 通渭县| 万载县| 宣化县| 比如县| 温州市| 竹北市| 南丰县| 曲靖市| 沙雅县| 濉溪县|