房價預測Task1

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的資訊,這樣就會大大簡化後面的處理。