python房地产数据分析统计服_Python数据分析之路(一)查询和统计_Melo的健身课堂的博客-程序员宅基地

技术标签: python房地产数据分析统计服  

0. 如何入门数据分析

关注沙漠之鹰的同窗必定看过沙漠君写得不少篇数据分析文章,好比分析房价,车价,预测机动车摇号这些话题。其实文章中全部的分析都使用了Python和它很是强大的数据分析库Pandas。一些机器学习和预测的功能则用到了sklearn库。掌握了这些工具,就能应对绝大多数的分析需求。html

纸上得来终觉浅,即便你看了不少书和代码,也未必比得上多接触例子多敲一些代码,三四个中等规模(约一两百行代码的)的案例就能让你有总体的把握。至于数据采集,沙漠之鹰有开源的数据抓取工具Hawk,网上也有众多如何获取数据的教程,所以本文再也不详述。python

系列文章分为三个部分:数组

1) 查询与统计

2) 可视化和高级用法

3) 分类和预测(估计会分为几篇文章)

好了,废话很少说,进入正题。markdown

1. 找到好的问题

好的问题其实比答案更重要。人认识问题,分为四种级别:网络

咱们知道本身知道的(房价在涨)

知道本身不知道的(可度量的信息,如房价平均涨幅)

不知道本身知道的(如证实摇号系统漏洞)

不知道本身不知道的(最有价值,蕴含着最大的机会)

沙漠君期待于寻找3-4层级的问题,但是多数状况只能在第1和第2档上徘徊。当你发现一个问题以后,还须要思考3个问题:数据结构

我是否找到了一个值得解决的问题?

我是否提出了一个足够好的解决方案

我真的想去解决这个问题吗?

最后的动机每每反映了你能解决该问题的最大极限,不少人也许仅仅是完成任务,所以有了一点成果便停滞不前,错过了最大的金矿。数据的质量比数量更重要,若是不知道什么样的数据更重要,即便拥有更多的数据也只会形成呕吐。数据分析须要专一,须要从纷繁的图表和信息中找到问题核心。app

一般来讲,人们对变化的指标更感兴趣,所以比率和增加幅度比静态的数据更有说服力。而变化又分长短时间,不一样维度得出的结论每每全然不一样。相关性很好,因果性更佳。有了因果性,便有了改变将来的能力。框架

下图展现了数据分析的通常流程(图片来自网络):机器学习

0151d2d37670427eb392deef.html

统计的三大核心:分组(map),聚合(reduce),排序(sort)。它们用的是如此广泛,所以MapReduce管道框架成了数据分析的标准,也很是适合作多机并行化。分组和排序很好理解,聚合指的是对各组内容作求和,分组等。函数

绝大部分数据分析操做,均可以经过查询,分组,聚合,排序四个元素进行级联组合进行。所以掌握这四大天王,应付通常的场景就都无问题了。 (这应该是这篇文章最重要的一句话了)

2. 查询和过滤

DataFrame是pandas的核心数据结构,能够理解为Excel里的二维矩阵,它更高级,能表达3维或更高维的数据,支持多索引。在内存中存取,效率极高,绝大多数操做都和DataFrame相关。维度为2的DataFrame,行(column)和列(row)的axis分别为0和1。能够针对某些列作索引(index),高维DataFrame是至关少见的。

2.1 查询

下面的表展现了Pandas对索引的介绍:

符号

说明

例子

[]

列值索引

df['房价'] ,df[['房价','车价']]

loc

行值索引

df.loc[0], df['2013':'2015']

iloc

行号索引

df.iloc[0], df.iloc[2:10]

ix

行索引

df.ix[0], df.ix[2:10]

时间也是比较重要的index,比较好用的是Timestamp,接受2016-12-24这种字符串,字符串到时间转换代码以下:

weather.index= weather[u'日期'].map(lambda x:Timestamp(x))

Pandas的索引功能很是强大,补充以下:

1) loc也能支持先行后列的查询:df.loc['20130101':'20130103' , ['A','B']],相似的如iloc

2) 我的感受ix的有些冗余,和ix和iloc相似

全部索引都支持字符串和数组,以及切片(slice)用于指定范围,索引还能传递一个bool类型的lambda表达式,或返回和其shape一致的bool数组

这种用法能够用在过滤上,这很是重要,咱们再给几个例子:

2.2 过滤

过滤有两方面需求:找出特定数据进行针对性分析,或

针对特定数据作分析,

过滤异常值。

异常值很是重要,应该细致分析致使它们产生的缘由,若是真是异常值,应该提前过滤,不然作聚合时会严重影响结果,如天价的房价。

先讨论按行过滤:非空过滤,过滤掉col列为空的内容:

df=df[!data.col.isnull()]

字符串过滤:

db[db.city.str.contains(u'市')]

若须要对df对某个键去重:

qq['id'].unique()

isin能判断单元格中的值是否在给定的数组内,若但愿对多个列作过滤,Pandas提供了现成的方法df.filter,还支持正则。还能进行逻辑操做,实现更复杂的需求。

2.3 遍历

有了索引和列操做,为什么还要有遍历?由于遍历更加灵活,固然性能相对会差一些:

函数

遍历目标

lambda参数

说明

map

一列的cell

cell

最为常见

apply

列/行

列或行的Series

axis:不填写cell,1:行,2:列

applymap

cell

cell

element-wise最为灵活

iterrows

行遍历

提供行号

见备注

iteritems

列遍历

提供列名

见备注

itertuples

行遍历

提供index

见备注

map, apply,applymap是只返回单元格或行列自己的,参数都是lambda,本节假设读者对python的lambda表达式有足够的了解。

但这样不能实现如“奇数偶数行作分别做不一样处理的需求,则这三个函数就无能为力。所以就有后面iterrows等三个函数。如iterrows,它会将行号和行迭代出来,从而方便自定义逻辑,示例以下:

for i,row in data.iterrows():

pass

2.4 求值和合并

一张表可能很难包含全部的信息,所以须要计算新值(求值)或join其余表(合并),但Pandas自己的Join并很差用,常常出错。

若是某个属性能够经过计算得到,可对各个列当作变量来处理,因为内部使用了C++和numpy加速,效率远比for循环更高,下面是处理房价的一个例子:总价/单价,并作小数点截取:

table['面积']= np.round(table['总价']*10000/table['单价'])

numpy提供了绝大多数常见的函数算子,能知足大部分需求。下面是合并:

横向合并(需保证行数一致)- 横向合并 df = pd.concat([data_train, dummies_Cabin])

删除列 df.drop(['Pclass', 'Name', 'Sex')]

纵向合并(join操做) data.merge(right=prop_rates, how='inner',left_on='Property_Area',right_index=True, sort=False)

若是不加参数,则能够自动经过列名合并。join的参数比较复杂,建议直接参考Pandas官方文档。

3. 分组,排序,聚合

排序,分组和聚合的组合都有无数种,这在技术层面不难。但若是要写报告,避免大而全,由于客户的注意力很容易浪费在没有意义的图表上。将客户真正关心的搞出来,行业背景分析,用户画像,竞品监测,销售行为分析...若是是写通俗文章,多问几我的,你想要知道什么。

因为分组是基础,咱们先介绍分组:

3.1 分组

分组就是按照一个或多个键,将数据分为几个组的过程。你能够直接传列名作分组,df.groupby('column_name')

也能够传递相同行数的Series甚至DataFrame。下面的例子是按日期里的年作分组:

df2.groupby(df2.日期.map(lambda x:x.year))

Pandas也能支持传递多个列的数组,除了切片之外,能在索引上使用的基本都能在group,sort上使用,一致性的API上手很是容易。

值得注意的是,因为时间索引分组比较困难,例如每五个月一组,能够用针对TimeStamp特定优化的方案,如resample:

下面计算了北京按年平均的AQI:

db[db.city==u'北京'][u'平均值'].resample('12M').aqi.mean()

3.2 排序

Pandas的排序很是之快,大部分操做都能在瞬间完成。排序分为两类:

对通常数据排序

通常排序,直接用sort便可,传递lambda,列名或多个列,或长度一致的Series,这与groupby等其余API一致,此处从略。

可指定ascending=True|False来指定升序,降序。

对分组后数据排序

groupby以后的数据,和通常的DataFrame不一样,而像个字典(dict)。对键排序,需使用sort_index,值排序,需使用sort_values。

3.3 聚合

聚合可将分组后的数据按需求从新打平。如求每一个分组的最大值(max),最小值(min),或数量等,例如:

df2.groupby(df2.日期.map(lambda x:x.year)).size()

咱们来写几个例子你们说说是什么意思:

car.groupby(car.年月.map(lambda x:x.month)).销量.sum().plot(kind='bar',title='汽车市场月度销量汇总')

将汽车数据按照月份分组,按销量求和。而后绘制直方图:

13b770c0ced46938595fa4fc5efe5232.png

Pandas支持直接将聚合结果绘图输出(虽然丑可是方便啊),下一节咱们将详细介绍它的使用细节。

这条语句统计了广西省东风MPV的各车型整体销量状况,并按数量降序:

df[(df.省=='广西') & (df.车型分类=='MPV') & (df.品牌=='东风')].groupby('车型').size().sort_values(ascending=False)

3.4 数据透视表

若是我想一次性地针对多种分组方式实行多种聚合策略,有没有更方便的API? 答案是数据透视表(pivot_table)。Excel也有该功能,异常强大,有了它,通常需求几乎都能实现。

有篇文章讲的很是详细,此处就不班门弄斧了,参考:

下面是同时按Name rep manager分组,按价格分别以总价和数量聚合,并将空值填为0.

pd.pivot_table(df,index=["Name","Rep","Manager"],values=["Price"],aggfunc=[np.sum,len],fill_value=0)

18e6cfb98bd162c38e567c9cdbac4eb2.png

pivot以后,生成的DataFrame是multiindex的,处理起来稍显繁琐,用xs可将某个子index的数据“提高”出来,例如:

df_pivot.xs(('12AM新坐标',2011))

至于更复杂的访问和采样,可配合loc和PD.IndexSlice, 可自行查看官方文档。

4. 总结

Pandas自己异常强大,功能很是繁杂,笔者仅仅掌握了其中很是小的一部分。可是对于通常的需求都能经过简单的操做组合出来。API的一致性很是重要,Pandas(包括numpy等)都继承了Python的优良特性,所以只要能触类旁通,就能进步神速。

文章不能太长,不然就没人看得完了。不过相信我,掌握文中说的用法,基本上就足够混口饭吃了。由于写SQL的速度和灵活性是远远不及Pandas语法的。下一篇是数据可视化,咱们来讨论如何作可视化,还有对应的Python库。

有任何问题,欢迎交流。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_32259717/article/details/113670020

智能推荐

Java——模拟实现ArrayList和LinkedList类(一)_monologuezjp的博客-程序员宅基地

由于数组一旦定义,其长度就无法改变,某些情况下给我们的编程带来了不便。Java提供了两个集合——ArrayList类和LinkedList类,用来代替数组,有效解决了数组长度不能动态改变的问题。为了加深对数组和这两个集合类的理解,于是模拟这两个类实现了两个Box类,用来代替Array。为了方便,这里只实现了存储int类。模拟实现ArrayListArrayList 的好处是:可以动态增...

用Eclipse调试Node.js代码_赶路人儿的博客-程序员宅基地_eclipse调试js代码

1、在eclipse上安装v8插件: 1)Help>Install New Software ,在弹出的界面上点击Add,然后输入name和location两个信息,如下图:Name:随便取一个;location:http://chromedevtools.googlecode.com/svn/update/dev/注:安装的时候需要使用vpn,因为这里的地址是请求到了go

【考研高数-线性代数-强化】第四章 线性方程组(重点,别马虎大意)_刘鑫磊up的博客-程序员宅基地

【考研高数-线性代数-基础】第四章 线性方程组【重点】课本讲义:P82~P111一:网络结构网络图二:基本内容与重要结论1.基础知识2.主要定理三:典型例题1.基础解系2.解方程组Ax=b通用方程组求解: 1.已知方程组 同解变形(行变换)讨论参数 2.抽象方程组 秩、解的结构、推理分析一:齐次方程组Ax=0 n-r(A)线性无关的解向量、基础解系二:非齐次方程组Ax=b 有解判...

73.ORM聚合函数详解:Count_长大的小蚂蚁的博客-程序员宅基地

Count:用来求某个数据的个数。在以下所有的示例中所采用的模型为:from django.db import models# 定义作者模型class Author(models.Model): name = models.CharField(max_length=100, unique=True) age = models.IntegerField() ema...

ZUPT的相关初步理解_slam让我头疼的博客-程序员宅基地_zupt算法

参考至https://zhuanlan.zhihu.com/p/115529319零速修正(Zero Velocity Update, ZUPT)即,当载体处于静止状态时,载体此时的速度为零,利用载体中的惯性系统的解算速度作为系统速度误差的观测量,对其他误差量进行修正,改善静止状态下的组合导航结果,不需要增加外部传感器,因而是一种有效且廉价易实现的技术。零速修正一般方法利用卡尔曼滤波进行。当检测到载体处于静止状态时,利用SINS子系统解算的速度作为系统速度误差的观测量,进行卡尔曼滤波估计,利用更新后的

html5 css3d,HTML5/CSS3雀跃的3D字符串_weixin_39841572的博客-程序员宅基地

CSS语言:CSSSCSS确定html,body {width: 100%;height: 100%;background: #76b852;background: -webkit-linear-gradient(to left, #76b852, #8DC26F);background: -webkit-linear-gradient(right, #76b852, #8DC26F);backg...

随便推点

mysql zimbra_Zimbra 相关设置_爱家小厨酱的博客-程序员宅基地

zimbra 相关的一些设置,不定期更新。更换 Logo 图标和链接mkdir /opt/zimbra/jetty/webapps/zimbra/logos/zmprov mcf zimbraSkinLogoURL https://mail.exsvc.cnzmprov md exsvc.cn zimbraSkinLogoURL https://mail.exsvc.cnzmprov md exs...

提升 iOS 开发效率! Xcode 9 内置模拟器的9个技巧_weixin_34324081的博客-程序员宅基地

iOS模拟器是在开发任意iOS应用程序过程中不可或缺、无法被忽视的一个部分。值得一提的是,Xcode 9的新模拟器带来了很多有用的功能,能够提升你的开发效率。对比历代模拟器的更新,这次有了很重大的改变。所以让我们开始这篇教程的重点吧,本文会列出我在新iOS模拟器中发现的新功能(一些技巧也可以在旧的模拟器中使用)。1. 在全屏模式下使用Xcode模拟器当你使用13寸的 Mac 时,Xcode ...

MySQL 基础 ———— 视图的应用与总结_圣斗士Morty的博客-程序员宅基地

引言视图是一种虚拟表,和普通表的使用是一样的,视图的一大特点就是“临时性”,是通过表动态生成的数据,只保存SQL逻辑,不保存查询结果。视图在实际生产中主要有两种应用场景:1、多个地方用到同样的查询结果;2、该查询使用的SQL比较复杂。下面,我们来总结一下这个在开发中经常会用到的知识点。一、视图的优势首先,视图并不能提高SQL的性能,它的作用在于更好的组织数据。优势有以下...

Mirai实现QQ机器人_只是六号z的博客-程序员宅基地_mirai机器人

Mirai实现机器人Java实现QQ机器人教程1.拉取项目demo2.修改配置文件3.滑动窗口验证(1)配置JVM参数(2)启动项目(3)获取ticket①让手机和电脑连接②开启调试模式③进行滑动验证4.简单测试Java实现QQ机器人教程要想实现Java版的QQ机器人,其实并不难,今天就给大家分享一下使用Mirai框架制作简单的QQ机器人。1.拉取项目demo首先,Miari是一个开源的框架,我们可以从GitHub上拉取项目进行查看,但是GitHub需要使用加速插件才能很好的访问,所以在这里我们可以

在centOs 上搭建nginx来部署静态页面网站_weixin_34392435的博客-程序员宅基地

2019独角兽企业重金招聘Python工程师标准>>> ...

LibreOJ #2036. 「SHOI2015」自动刷题机_weixin_30302609的博客-程序员宅基地

#2036. 「SHOI2015」自动刷题机内存限制:256 MiB时间限制:1000 ms标准输入输出题目类型:传统评测方式:文本比较题目描述曾经发明了信号增幅仪的发明家 SHTSC 又公开了他的新发明:自动刷题机——一种可以自动 AC 题目的神秘装置。自动刷题机刷题的方式非常简单:首先会瞬间得出题目的正确做法,然后开始写程序。每秒,自动刷...