AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

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

用 Pandas 做 ETL,不要太快

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

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

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

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

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

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

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

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

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

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

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

import pandas as pdJ0Q28資訊網(wǎng)——每日最新資訊28at.com
import requestsJ0Q28資訊網(wǎng)——每日最新資訊28at.com
import configJ0Q28資訊網(wǎng)——每日最新資訊28at.com

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

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

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

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

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

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

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

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

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

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

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

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

budgetJ0Q28資訊網(wǎng)——每日最新資訊28at.com
idJ0Q28資訊網(wǎng)——每日最新資訊28at.com
imdb_idJ0Q28資訊網(wǎng)——每日最新資訊28at.com
genresJ0Q28資訊網(wǎng)——每日最新資訊28at.com
original_titleJ0Q28資訊網(wǎng)——每日最新資訊28at.com
release_dateJ0Q28資訊網(wǎng)——每日最新資訊28at.com
revenueJ0Q28資訊網(wǎng)——每日最新資訊28at.com
runtimeJ0Q28資訊網(wǎng)——每日最新資訊28at.com

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

聲明:本網(wǎng)頁(yè)內(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