房價預測Task1

pandas:簡單的房價預測實例

咱們使用pandas等工具,對於給出的.csv文件進行處理,完成要求的幾個Task。python

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

全部的要求,數據集等文件,請到個人GitHub倉庫自行下載:github.com/rongyupan/HousePricePredgithub

若是你是pandas這類數據分析工具的新手,那這個項目很適合你。由於這個項目只須要用到最基本,最簡單的操做。函數

數據集描述

transactions.csv數據集是咱們的主要數據集;agents.csvagency.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')

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

相關文章
相關標籤/搜索