Try   HackMD

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