科技颠覆者 发表于 2022-9-16 17:14:37

我分析30w条数据后发现,西安新房公摊最低的竟是这里?

前两天一个邻居发出了灵魂质问:“为什么我买的180平和你的169平看上去一样大?”
“因为咱俩的套内面积都是138平......”
https://img2022.cnblogs.com/blog/1267939/202208/1267939-20220808134544767-1012775042.png
我们去看房子,比较不同楼盘的价格,看的都是单价,可这个单价,却是用(总价 ÷ 建筑面积)计算的。而我们实际买到手里的,是套内面积。
套内面积 = 使用面积+墙体厚度+阳台建筑面积
建筑面积 = 套内面积+分摊面积
(这里要吐槽一下不合理公摊制度,由霍英东发明,大陆1993年从香港引入,但香港2012年就取消了)
https://img2022.cnblogs.com/blog/1267939/202208/1267939-20220808135239216-1976371865.png
https://img2022.cnblogs.com/blog/1267939/202208/1267939-20220808135253645-1820677335.png
所以我们买房子,自然是希望公摊越小越好的,花同样的钱,公摊越小,买到的套内面积越大嘛。
可你知道西安哪个区域的预售新房平均公摊最小吗?于是我又花了三天时间,写了700多行代码做了一个统计,得到下面的结论:
(数据来源:西安住建局官网   数据范围:2021-01-01 ~ 至今)
碑林区公摊最低,周至县公摊最高,高新区第二高
https://img2022.cnblogs.com/blog/1267939/202208/1267939-20220808144833890-1501184524.png
曲江新区,124.5㎡最大套内榜夺冠
https://img2022.cnblogs.com/blog/1267939/202208/1267939-20220808145123558-830363760.png
建筑面积分布,主力段为100㎡-150㎡
https://img2022.cnblogs.com/blog/1267939/202208/1267939-20220808145328646-313949866.png
公摊分布 主力段为20%-24%
https://img2022.cnblogs.com/blog/1267939/202208/1267939-20220808145509944-334617200.png
面积越小,公摊越大,150-160平性价比较高
https://img2022.cnblogs.com/blog/1267939/202208/1267939-20220808145602284-508359782.png
总体放量平稳
https://img2022.cnblogs.com/blog/1267939/202208/1267939-20220808145816375-1480408815.png
祖传手艺

这个手艺我之前已经在《用1000行代码统计西安新房价格后,我有一个惊人的发现》这篇文章中展示过了,那里我们简单介绍了如何统计最准确的西安新房平均价格。
今天我们用类似的方法,从西安市房建局获取公摊数据,统计西安新房的平均公摊。
https://img2022.cnblogs.com/blog/1267939/202208/1267939-20220808134603497-1779881705.png
幸好当时的代码还在,主要逻辑差不多,但获取难度比上次要大,所以我们还需要将代码稍作改善。
https://img2022.cnblogs.com/blog/1267939/202208/1267939-20220808135428550-1966951134.png
对了,之前有粉丝留言,问我能不能把代码开源?我觉得很刑啊,这是让我的小日子过得越来越有判头了嘛。
https://img2022.cnblogs.com/blog/1267939/202208/1267939-20220808134621097-1159429444.png
我这里只讲技术和思路,作为学习使用,代码的话可以自己实现,一共也就几百行,只要你请求的不是那么的频繁就好。
言归正传,今天我们的页面流程是这样的,和上次的稍有不同:
https://img2022.cnblogs.com/blog/1267939/202208/1267939-20220808134629404-2099053279.png
具体的页面分析我今天就不讲了,和上次差不多,主要讲一下和上次不同的点。
1

我们请求的时候,多了一个区域选择:
https://img2022.cnblogs.com/blog/1267939/202208/1267939-20220808134640582-908970678.png
可以看到下面的这些区域也是西安的区县,所以我们在请求预售证信息页面的时候,需要加上区域编号,然后去根据区域遍历:
https://img2022.cnblogs.com/blog/1267939/202208/1267939-20220808134650560-769474005.png
2

由于我们希望统计每个区域的公摊嘛,但是上面“城六区”说的太宽泛,页面上也没有更详细的区域信息。所以我们需要提取“项目坐落”里的区域信息,对地址开头字符和区域做一个映射:
https://img2022.cnblogs.com/blog/1267939/202208/1267939-20220808134657767-831341466.png
然后就可以根据映射关系获取区域信息了。
3

由于我们的房屋公摊信息,没有直接展示在页面上,需要我们一个一个去点击获取:
https://img2022.cnblogs.com/blog/1267939/202208/1267939-20220808134708248-1640897914.png
所以这次我们要请求的接口量比上次获取价格要大几百倍,我们不能再用单线程请求了,需要上多线程。
我的电脑cpu是20核的,网络请求是典型的IO密集型操作,线程池大小参考值应该设置成2N,N是cpu核数,本场景IO占时间比重更高,所以线程池大小最佳值可能是3N、4N、5N。。。
但是因为我们是学习使用,不能给人家网站增加太大的负担,所以我们只启10个线程就好,等待队列大小10万,而且每请求一栋楼的数据,就让程序休眠10秒:
https://img2022.cnblogs.com/blog/1267939/202208/1267939-20220808134720447-1048394800.png
https://img2022.cnblogs.com/blog/1267939/202208/1267939-20220808134726695-722318825.png
这样可以让请求时间缩短10倍左右,也不会给网站增加太大压力。
4

因为这次请求的接口过多,网络可能会发生抖动,接口就会调用失败。如果不处理异常,程序就直接停止了,如果忽略异常,数据又会缺失,造成统计不准确。
https://img2022.cnblogs.com/blog/1267939/202208/1267939-20220808134736028-274174215.png
所以我们还需要调用接口失败时的重试机制。
我选择引入 spring-retry 来做重试机制,同时还需要aop的包:
https://img2022.cnblogs.com/blog/1267939/202208/1267939-20220808134743732-168576477.png
这样我们就可以在需要进行失败重试的方法上加上 @Retryable 注解了:
https://img2022.cnblogs.com/blog/1267939/202208/1267939-20220808134749466-1800716545.png
这里的意思是,如果发生异常,重试9次,每次间隔1秒、2秒、4秒、8秒。。。如果9次重试都失败了,会调用 @Recover 注释的恢复方法,记录日志,人工处理。
5

这次我们直接计算总页数,不再用上次那种页面返回是空就停止循环的偷懒办法。
直接在首页就可以获取总数量 totalCount:
https://img2022.cnblogs.com/blog/1267939/202208/1267939-20220808134802062-12797082.png
然后我们利用公式:
totalPageNum = (totalCount + pageSize - 1) / pageSize已知 pageSize = 10,可以计算出总页数,作为循环的停止条件。
这样也就绕过了上一次说的第一个坑。
6

这个网站的请求参数,不需要我们再单独获取了,而是直接再href参数里,所以我们可以直接获取href参数里的值,去请求下一级接口:
https://img2022.cnblogs.com/blog/1267939/202208/1267939-20220808134808544-2140847517.png
这样也就绕过了上一次说的第二个坑。
7

这个网站的数据一直要追溯到2005年。
https://img2022.cnblogs.com/blog/1267939/202208/1267939-20220808134814207-481991700.png
而我们并不想统计这么久远的数据,参考价值不大,只想统计2021-2022这两年的数据。
所以我们给循环停止条件上,额外加上时间判断,早于某个时间 after ,就不获取了。这里我设置的是 2021-01-01 。
https://img2022.cnblogs.com/blog/1267939/202208/1267939-20220808134820594-368018439.png
这里有个小细节,我用了已经不推荐使用的java标签写法,break two;因为我这里嵌套了三层for循环,我只希望跳出其中两层。不推荐这么写,我这里这么写只是因为想提一下这个知识点。
写sql

好了,主要不同就是上面这些,其他的逻辑和上次差别不大,就不赘述了。
最后跑一下程序:
https://img2022.cnblogs.com/blog/1267939/202208/1267939-20220808134826953-412881839.png
数据库里的数据:
https://img2022.cnblogs.com/blog/1267939/202208/1267939-20220808134834184-230549274.png
数据库有数据了,大概30w条
https://img2022.cnblogs.com/blog/1267939/202208/1267939-20220808141611652-340786849.png
接下来就是写sql查询的事了,我们只统计住宅,公寓和商业过滤掉。
西安各区新房平均公摊率:
https://img2022.cnblogs.com/blog/1267939/202208/1267939-20220808143852192-820447965.png
西安公摊最高的20个新房楼幢:
https://img2022.cnblogs.com/blog/1267939/202208/1267939-20220808144100143-1242602894.png
西安公摊最高的20个新房楼幢:
https://img2022.cnblogs.com/blog/1267939/202208/1267939-20220808144126800-79791011.png
西安新房各个建筑面积段房源数:
https://img2022.cnblogs.com/blog/1267939/202208/1267939-20220808144152785-156967145.png
西安新房各个公摊率段房源数:
https://img2022.cnblogs.com/blog/1267939/202208/1267939-20220808144210804-928338126.png
西安新房各个建筑面积段平均公摊:
https://img2022.cnblogs.com/blog/1267939/202208/1267939-20220808144257189-369736572.png
西安每个月预售证发证房源数:
https://img2022.cnblogs.com/blog/1267939/202208/1267939-20220808144309838-979808697.png
ok,到这里就统计完了,如果有想知道其他维度统计结果的,欢迎留言。
最后,愿公摊制度早日取消。
文章版权归作者所有,欢迎转载,但必须给出原文链接,否则保留追究法律责任的权利THE END
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: 我分析30w条数据后发现,西安新房公摊最低的竟是这里?