房价预测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的信息,这样就会大大简化后面的处理。

相关文章
相关标签/搜索