---
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 筆以內來做就好.
---