zoukankan      html  css  js  c++  java
  • 房价预测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的信息,这样就会大大简化后面的处理。

  • 相关阅读:
    如何在Ubuntu 18.04上安装Memcached
    ubuntu安装mysql添加密码
    Django学习---快速搭建搜索引擎(haystack + whoosh + jieba)
    django3.x 使用haystack 报错:ImportError: cannot import name 'six' from 'django.utils'
    spring boot2之Jackson和ObjectMapper
    python之装饰器强制函数上的类型检查
    python之*args和**kwargs的区别
    Python之@property
    python基础语法之and,or,not
    小案例
  • 原文地址:https://www.cnblogs.com/rongyupan/p/12879667.html
Copyright © 2011-2022 走看看