--- title: 機器學習導論 - Data Frame tags: 2021 Fall - 機器學習導論 GA: G-77TT93X4N1 --- # Data Frame > 這裡簡單介紹 `pandas` 套件裡的 `data frame` > > 以 `房價分析.ipynb` 為例 --- 先介紹兩個 `python` 基本指令, `print` 以及 `type`. * `print(x)`: 顧名思義就是把 `x` 顯示出來在銀幕上 * `type(x)`: 顧名思義就是check `x` 的資料型態 所以我自己常常用這個指令 `print(type(x))` 把 `x` 的資料型態顯示出來在銀幕上. 這樣就很容易知道每個變數分別代表什麼東西, 或是他存了什麼東西. --- 接著我們解釋一下這塊 python code: 這裡就是先載入兩個 package ```= import os import pandas as pd ``` 這裡是把資料夾裡的資料全都存到 `dfs` 這個 list 裡. ```= # 歷年資料夾 dirs = [d for d in os.listdir() if d[:4] == 'real'] dfs = [] for d in dirs: df = pd.read_csv(os.path.join(d,locToLetter[location] + '_lvr_land_a.csv'), index_col=False) df['Q'] = d[-1] dfs.append(df.iloc[1:]) ``` 我們可以查一下 `dfs` 的 data type ``` print(type(dfs)) ``` > <class 'list'> 也可以查一下 `dfs` 這個 list 的長度 (8年 x 4季 = 32 個檔案) ``` len(dfs) ``` > 32 --- 接著將 `dfs` 這個 list 以合併成一個 data frame, 並把它叫做 `df` 也就是 (data frame 的 initials) ```= df = pd.concat(dfs, sort=True) ``` 查一下 `df` 的 data type ``` print(type(df)) ``` > <class 'pandas.core.frame.DataFrame'> --- 對於 data frame 還有一些更進一步的指令可以看他裡面的資料類型, 比如以下三個. ``` print(df.ndim) print("---") # 分隔線 print(df.shape) print("---") # 分隔線 print(df.dtypes) ``` 請自行執行看會顯示出什麼 --- 接著以下就是對 df 做的一些操作. 基本上他增加了 `year`, `單價元坪` 以及 `建物型態2` 三個欄位, 以及刪除一些有備註的交易: ```= # 新增交易年份 df['year'] = pd.to_numeric(df['交易年月日'].str[:-4], errors='coerce') + 1911 # 平方公尺換成坪 df['單價元平方公尺'] = df['單價元平方公尺'].astype(float) df['單價元坪'] = df['單價元平方公尺'] * 3.30579 # 建物型態 df['建物型態2'] = df['建物型態'].str.split('(').str[0] # 刪除有備註之交易(多為親友交易、價格不正常之交易) df = df[df['備註'].isnull()] ``` 最後, 則是改這資料欄的 index. 原本是 1, 2, 3, ... 這個索引, 它改成以交易年月日來當 index, 然後可以排序 ```= # 將index改成年月日 df.index = pd.to_datetime(df['year'].astype(str) + df['交易年月日'].str[-4:] ,errors='coerce') df.sort_index(inplace=True) df.head() ``` --- 接著我要說明一下如何取出 data frame 裡的資料來做事. 最基本的指令就是 `df['欄位名稱']`, 這樣就能拿到那欄的資料. 不過我們通常想要拿來做數值運算, 所以有時候需要改一下 data type, 比如說我要拿 `year` 這欄位的資料, 不過這欄位原始資料型態應該是 int64 (整數), 所以就需要利用 `astype()` 改一下, 括號裡面是我們要改成的數據類型 ```= x = df["year"].astype(float) ``` 接著我們使用 `numpy` 這個 package 裡的 `np.asarray()` 指令就可以將 `x` 改成 `numpy` 的 array 型態. 不過我通常習慣將 array 改寫成一個矩陣, ```= x = np.asarray(x) x = x.reshape((len(x), 1)) ``` 或是兩行合併一起 ```= x = np.asarray(x).reshape((len(x), 1)) ``` 一樣我們有以下三個指令可以看其資料類型: ``` print(x.ndim) print("---") # 分隔線 print(x.shape) print("---") # 分隔線 print(x.dtype) ``` 請自行執行看會顯示出什麼 那這個 `x` 就可以拿來丟進 LMS 的 code 來做事了. --- #### Remark 這樣拿到的 `x` 長度很大, 建議取出其中約 10000 筆以內來做就好. ---