房價預測Task1

rongyupan發表於2020-05-12

pandas:簡單的房價預測例項

我們使用pandas等工具,對於給出的.csv檔案進行處理,完成要求的幾個Task。

利用sklearn的線性迴歸,對於房價進行簡單的預測。

所有的要求,資料集等檔案,請到我的GitHub倉庫自行下載:github.com/rongyupan/HousePricePred

如果你是pandas這類資料分析工具的新手,那這個專案很適合你。因為這個專案只需要用到最基本,最簡單的操作。

資料集描述

transactions.csv資料集是我們的主要資料集;agents.csvagency.csv儲存了agents和agency之間的關係,也就是每個agency下具體是哪幾個agents。

下面我們針對每個task,對於使用到的函式,以及解決的思路進行一下簡單的總結。

自己的經驗

1.儘量使用pandas自帶的函式進行處理

比如統計數量、平均、求和這種操作,使用自帶的函式比自己寫迴圈要靠譜。

可以這樣理解:pandas更像python版的excel。在使用excel要對行/列求和之類的操作時,你會自己重寫一個函式嗎?

基本上在excel裡可以用滑鼠點選完成的,大部分在pandas中有內建函式對應。

2. 先對資料表進行增刪改

如果想要遵照經驗1,你會發現有時候直接對原始的資料表操作不可行,這時候就要對資料表進行篩選。

在完成下面每個task之前,幾乎都需要對於資料表進行增刪改,增加/刪除/改動某幾列。

我們改動資料表的目的就是為了更好地完成經驗1。

資料集匯入

import pandas as pd 

df = df.read_csv('./transactions.csv')

Task 1

求出每個agency的交易總量,並降序排列。

思路:先獲取每個agent的交易總量,再計算每個agency的數量。

計算每個agency的交易總量

解決方案:(1)遍歷表中每行,根據agent來判斷加到具體哪個agency;最直接,但是最麻煩。

(2)使用df['xxx'].value_counts(),自動統計每列中,出現的元素的對應數量。

agt = df['AgentId'].value_counts()
print(agt)

# 獲取每個元素的數量
agt[0]

# return
3    93
2    88
4    76
1    74
5    44
0    39
Name: AgentId, dtype: int64

39

table顯示

我們可以使用pd.DataFrame()來以表格的形式顯示。

建立資料幀可以使用字典匯入的方式,但一定要注意:字典的值的型別需要為list

Agency = {'Agency Name':["Other","Your Estate","Lovely Housing"],\
        'Numbers':[sum_agc[0],sum_agc[1],sum_agc[2]]}
res_1 = pd.DataFrame(Agency)

降序排列

使用res_1.sort_values("Numbers", ascending=False),也就是對於'Numbers'這一列進行降序排列。

如果沒有ascending=False這個引數,預設為升序排列。

Task1其他方法

task1儘管簡單,但是思路很多。上面是間接法:先使用value_counts()函式得到了每個agent的數量,間接求得了agency的數量。

方法1:新增一列AgencyId

我們只有agent的資訊,那我們就先增加一列,整理出agency的資訊。這裡就是用到了上面說的經驗2。

得到了agency的資訊後,就能用value_counts()這個函式直接得到結果。

df_1 = df[['AgentId']]  # (1)
df_1['AgencyId'] = 1    # (2)

for i in range(len(df_1)):  # (3)
    agtId = df_1.loc[i, 'AgentId']  # (4)
    if agtId == 0:
        df_1.loc[i, 'AgencyId'] = 0 # (5)
    if agtId == 2 or agtId == 3 or agtId == 5:
        df_1.loc[i, 'AgencyId'] = 1
    if agtId == 1 or agtId == 4:
        df_1.loc[i, 'AgencyId'] = 2

df_1['AgencyId'].value_counts()

# return
1    225
2    150
0     39
Name: AgencyId, dtype: int64

(1)擷取第一列df_1 = df['AgentId']df_1 = df[['AgentId']]有何不同?

是維度的不同。第一種為一維,可以理解成一個array或list;第二種是二維的表格,表頭為AgentId,每一列都有序號。

建議使用第二種寫法。

(2)如何新增一列?

直接用df_1['Col_name']=1就能新建一列名為Col_name,值全為1的列。

(3)len(df_1)是什麼意思?

獲取df_1的長度,也就是多少行,當然,不包括表頭的那一行。

等價的寫法是df_1.shape[0]df_1.shape會返回(414, 2)這樣一個list,也就是取其第一個數。

(4)df_1.loc[i, 'AgentId']定位

第一個引數是第i行,從0開始;第二個位置是列位置。

(5)這裡為什麼不能先在前面設定一個引數,比如agcId,然後使用這個更短的引數不是寫起來更方便?

為了修改值,只能這麼寫。如果使用了第三個引數,實質上是把這個位置的值複製了一遍,修改的是這個複製的值,而不是真實值。

這種方法程式碼這麼多,沒有剛開始的方法簡潔,但是,如果後面有agency相關,那麼這裡的工作就是值得了。

方法2:資料表擷取

為了獲取agency的資訊,有沒有更簡單的方法?

df_1 = df[['AgentId']]

df_1_0 = df_1[df_1['AgentId'] == 0]
df_1_0['AgencyId'] = 0
df_1_0

我們就得到了Agency0的所有資料。df_1['AgentId'] == 0會得到一列全是 True/False 的序列;

然後在加上df_1[df_1['AgentId'] == 0]就得到所有'AgentId'=0的內容;

最後在以上的基礎上新增一列AgencyId即可。使用for等迴圈語句即可自動化這個過程

同樣的,如果後面需要agency的資訊,這樣就會大大簡化後面的處理。

相關文章