pandas:簡單的房價預測例項
我們使用pandas等工具,對於給出的.csv
檔案進行處理,完成要求的幾個Task。
利用sklearn的線性迴歸,對於房價進行簡單的預測。
所有的要求,資料集等檔案,請到我的GitHub倉庫自行下載:github.com/rongyupan/HousePricePred
如果你是pandas這類資料分析工具的新手,那這個專案很適合你。因為這個專案只需要用到最基本,最簡單的操作。
資料集描述
transactions.csv
資料集是我們的主要資料集;agents.csv
和agency.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的資訊,這樣就會大大簡化後面的處理。