咱們使用pandas等工具,對於給出的.csv
文件進行處理,完成要求的幾個Task。python
利用sklearn的線性迴歸,對於房價進行簡單的預測。git
全部的要求,數據集等文件,請到個人GitHub倉庫自行下載:github.com/rongyupan/HousePricePredgithub
若是你是pandas這類數據分析工具的新手,那這個項目很適合你。由於這個項目只須要用到最基本,最簡單的操做。函數
transactions.csv
數據集是咱們的主要數據集;agents.csv
和agency.csv
保存了agents和agency之間的關係,也就是每一個agency下具體是哪幾個agents。工具
下面咱們針對每一個task,對於使用到的函數,以及解決的思路進行一下簡單的總結。excel
1.儘可能使用pandas自帶的函數進行處理code
好比統計數量、平均、求和這種操做,使用自帶的函數比本身寫循環要靠譜。get
能夠這樣理解:pandas更像python版的excel。在使用excel要對行/列求和之類的操做時,你會本身重寫一個函數嗎?數據分析
基本上在excel裏能夠用鼠標點擊完成的,大部分在pandas中有內置函數對應。pandas
2. 先對數據表進行增刪改
若是想要遵守經驗1,你會發現有時候直接對原始的數據表操做不可行,這時候就要對數據表進行篩選。
在完成下面每一個task以前,幾乎都須要對於數據表進行增刪改,增長/刪除/改動某幾列。
咱們改動數據表的目的就是爲了更好地完成經驗1。
import pandas as pd df = df.read_csv('./transactions.csv')
求出每一個agency的交易總量,並降序排列。
思路:先獲取每一個agent的交易總量,再計算每一個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
咱們可使用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儘管簡單,可是思路不少。上面是間接法:先使用value_counts()
函數獲得了每一個agent的數量,間接求得了agency的數量。
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相關,那麼這裏的工做就是值得了。
爲了獲取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的信息,這樣就會大大簡化後面的處理。