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

當前位置:首頁 > 科技  > 知識百科

用 Pandas 做 ETL,不要太快

來源: 責編: 時間:2023-08-07 16:29:54 213觀看
導讀 久違了,朋友們,來篇干貨。ETL 的全稱是 extract, transform, load,意思就是:提取、轉換、 加載。ETL 是數據分析中的基礎工作,獲取非結構化或難以使用的數據,把它變為干凈、結構化

久違了,朋友們,來篇干貨。Knn28資訊網——每日最新資訊28at.com

ETL 的全稱是 extract, transform, load,意思就是:提取、轉換、 加載。ETL 是數據分析中的基礎工作,獲取非結構化或難以使用的數據,把它變為干凈、結構化的數據,比如導出 csv 文件,為后續的分析提供數據基礎。Knn28資訊網——每日最新資訊28at.com

1、提取數據Knn28資訊網——每日最新資訊28at.com

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

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

#config.pyKnn28資訊網——每日最新資訊28at.com
api_key =Knn28資訊網——每日最新資訊28at.com

 Knn28資訊網——每日最新資訊28at.com

如果要將代碼發布到任何地方,應該將 config.py 放入 .gitignore 或類似文件中,以確保它不會被推送到任何遠程存儲庫中。Knn28資訊網——每日最新資訊28at.com

還可以將 API 密鑰存儲為環境變量,或使用其他方法隱藏它。目標是保護它不暴露在 ETL 腳本中。Knn28資訊網——每日最新資訊28at.com

現在創建一個名為 tmdb.py 的文件,并導入必要的依賴:Knn28資訊網——每日最新資訊28at.com

import pandas as pdKnn28資訊網——每日最新資訊28at.com
import requestsKnn28資訊網——每日最新資訊28at.com
import configKnn28資訊網——每日最新資訊28at.com

向 API 發送單個 GET 請求的方法。在響應中,我們收到一條 JSON 記錄,其中包含我們指定的 movie_id:Knn28資訊網——每日最新資訊28at.com

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

這里我們請求 6 部電影,電影 movie_id 從 550 到 555 不等。我們創建一個循環,一次請求每部電影一部,并將響應附加到列表中:Knn28資訊網——每日最新資訊28at.com

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

現在我們拿到了 response_list 這樣復雜冗長的 JSON 數據,這里使用 from_dict() 從記錄中創建 Pandas 的 DataFrame 對象:Knn28資訊網——每日最新資訊28at.com

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

如果在 jupyter 上輸出一下 df,你會看到這樣一個數據幀:Knn28資訊網——每日最新資訊28at.com

Knn28資訊網——每日最新資訊28at.com

至此,數據提取完畢。Knn28資訊網——每日最新資訊28at.com

2、轉換Knn28資訊網——每日最新資訊28at.com

我們并不需要提取數據的所有這些列,所以接下來選擇我們需要使用的列。Knn28資訊網——每日最新資訊28at.com

假如以下列是我們感興趣的:Knn28資訊網——每日最新資訊28at.com

budgetKnn28資訊網——每日最新資訊28at.com
idKnn28資訊網——每日最新資訊28at.com
imdb_idKnn28資訊網——每日最新資訊28at.com
genresKnn28資訊網——每日最新資訊28at.com
original_titleKnn28資訊網——每日最新資訊28at.com
release_dateKnn28資訊網——每日最新資訊28at.com
revenueKnn28資訊網——每日最新資訊28at.com
runtimeKnn28資訊網——每日最新資訊28at.com

創建一個名為 df_columns 的列名稱列表,以便從主數據幀中選擇所需的列。Knn28資訊網——每日最新資訊28at.com

df_columns = ['budget', 'genres', 'id', 'imdb_id', 'original_title', 'release_date', 'revenue', 'runtime']Knn28資訊網——每日最新資訊28at.com

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

Knn28資訊網——每日最新資訊28at.com

這是一個 JSON 格式的列,我們希望擴展它。Knn28資訊網——每日最新資訊28at.com

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

Knn28資訊網——每日最新資訊28at.com

現在我們用 pandas 來實現這個擴展效果。Knn28資訊網——每日最新資訊28at.com

首先扁平化這個 JSON 列表:Knn28資訊網——每日最新資訊28at.com

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

接下來,我們創建一個 genres_all 的臨時列,作為電影類別的代表,我們只需要 genres 內的 name 屬性,稍后把它擴展為單獨的列:Knn28資訊網——每日最新資訊28at.com

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

為了完整的保存 genres 類型表,我們把它單獨做為一個表:電影類型表:Knn28資訊網——每日最新資訊28at.com

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

它是這樣的:Knn28資訊網——每日最新資訊28at.com

Knn28資訊網——每日最新資訊28at.com

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

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

代碼的最后兩行,使用了 explode、crosstab 函數來擴展多個列,其效果就是如果電影屬于某個類型,該行的值就為 1,結果就是這樣: Knn28資訊網——每日最新資訊28at.com

關于日期時間,我們希望將日期擴展為年、月、日、周,像這樣:Knn28資訊網——每日最新資訊28at.com

Knn28資訊網——每日最新資訊28at.com

那么以下代碼就是干這個的:Knn28資訊網——每日最新資訊28at.com

df['release_date'] = pd.to_datetime(df['release_date'])Knn28資訊網——每日最新資訊28at.com
df['day'] = df['release_date'].dt.dayKnn28資訊網——每日最新資訊28at.com
df['month'] = df['release_date'].dt.monthKnn28資訊網——每日最新資訊28at.com
df['year'] = df['release_date'].dt.yearKnn28資訊網——每日最新資訊28at.com
df['day_of_week'] = df['release_date'].dt.day_name()Knn28資訊網——每日最新資訊28at.com
df_time_columns = ['id', 'release_date', 'day', 'month', 'year', 'day_of_week']3、加載Knn28資訊網——每日最新資訊28at.com

加載就很簡單了,將 DataFrame 導出到 excel 或者 csv 即可。Knn28資訊網——每日最新資訊28at.com

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

如果要導出 excel,那么就用 to_excel 函數。Knn28資訊網——每日最新資訊28at.com

最后的話Knn28資訊網——每日最新資訊28at.com

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

 Knn28資訊網——每日最新資訊28at.com

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

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 云安全日報220218:Ubuntu Linux內核發現重要漏洞,需要盡快升級

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

標簽:
  • 熱門焦點
Top 主站蜘蛛池模板: 中牟县| 汉寿县| 那曲县| 阆中市| 平塘县| 城市| 威信县| 天祝| 三亚市| 长兴县| 中西区| 武威市| 衡南县| 财经| 大丰市| 普定县| 金沙县| 轮台县| 友谊县| 桃源县| 萍乡市| 新乡市| 田林县| 广宁县| 理塘县| 平遥县| SHOW| 拜城县| 临夏县| 芷江| 南雄市| 衡东县| 沧源| 荥经县| 铜陵市| 安平县| 策勒县| 绥中县| 安西县| 沙河市| 永善县|