但愿歷盡千帆,終能得償所愿,
文章目錄
- 一、資料獲取
- 三、資料查看
- 三、分析土地交易資料
- 1. 土地出讓形式&土地成交狀態
- 2. 土地交易面積
- 3. 交易土地的規劃用途
- 4. 土地成交區域
- 四、其他說明
一、資料獲取
土地市場資料一般會公示在當地的公共資源交易中心,但經常會出現只公示當周或當月資料的情況,因此,我們得去找專業的土地網站獲取交易資料,比如土流網:https://www.tudinet.com/market-0-0-0-0/

網站結構簡單,簡單的url翻頁構造,然后用xpath決議提取資料即可,
爬蟲代碼如下:
import requests
from lxml import etree
import random
import time
import logging
import openpyxl
from datetime import datetime
wb = openpyxl.Workbook()
sheet = wb.active
sheet.append(['土地位置', '出讓形式', '推出時間', '土地面積', '規劃建筑面積', '土地地址', '成交狀態', '土地代號', '規劃用途'])
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s: %(message)s')
user_agent = [
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6",
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6",
"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1",
"Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
"Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24"
]
start = datetime.now()
def get_info(page):
headers = {
"User-Agent": random.choice(user_agent)
}
url = f'https://www.tudinet.com/market-254-0-0-0/list-pg{page}.html'
resp = requests.get(url, headers=headers).text
time.sleep(1)
html = etree.HTML(resp)
lis = html.xpath('//div[@class="land-l-cont"]/dl')
# print(len(lis)) # 一頁35條資訊
for li in lis:
try:
location = li.xpath('.//dd/p[7]/text()')[0] # 土地位置
transfer_form = li.xpath('.//dt/i/text()')[0] # 出讓形式
launch_time = li.xpath('.//dd/p[1]/text()')[0] # 推出時間
land_area = li.xpath('.//dd/p[3]/text()')[0] # 土地面積
planning_area = li.xpath('.//dd/p[5]/text()')[0] # 規劃建筑面積
address = li.xpath('.//dd/p[4]/text()')[0] # 土地地址
state = li.xpath('.//dd/p[2]/text()')[0] # 成交狀態
area_code = li.xpath('.//dt/span/text()')[0] # 土地代號
planned_use = li.xpath('.//dd/p[6]/text()')[0] # 規劃用途
data = [location, transfer_form, launch_time, land_area, planning_area, address, state, area_code, planned_use]
sheet.append(data)
logging.info(data)
except Exception as e:
logging.info(e.args[0])
continue
def main():
for i in range(1, 101):
get_info(i)
logging.info(f'抓取第{i}頁資料完畢')
# 休眠 防止爬得過快 給服務器減少壓力
time.sleep(random.uniform(1, 2))
wb.save(filename="real_estate_info.xlsx")
if __name__ == '__main__':
main()
delta = (datetime.now() - start).total_seconds()
print(f'資料抓取完畢,用時:{delta}')
運行爬蟲代碼,提取到成都地區3158塊土地資料,結果如下:

三、資料查看


資料比較干凈和完整,可以直接用于資料分析,
三、分析土地交易資料
1. 土地出讓形式&土地成交狀態
import pandas as pd
from pyecharts import options as opts
from pyecharts.charts import Pie
from pyecharts.globals import CurrentConfig, ThemeType
# 參考本地資源
CurrentConfig.ONLINE_HOST = 'D:/python/pyecharts-assets-master/assets/'
# 讀取資料
df = pd.read_excel('real_estate_info.xlsx').loc[:, ['出讓形式', '成交狀態']]
# 統計
df1 = df['出讓形式'].value_counts()
df2 = df['成交狀態'].value_counts()
# 構造data_pair
data_pair_1 = [(i, int(j)) for i, j in zip(df1.index, df1.values)]
data_pair_2 = [(i, int(j)) for i, j in zip(df2.index, df2.values)]
# 繪制餅圖
c = (
Pie(init_opts=opts.InitOpts(theme=ThemeType.DARK, width="1100px", height="500px")) # 初始配置項
.add(
"土地出讓形式",
data_pair_1,
center=["25%", "50%"],
label_opts=opts.LabelOpts(is_show=True),
)
.set_colors(['red', 'blue', 'purple'])
.add(
"土地成交狀態",
data_pair_2,
center=["70%", "50%"],
label_opts=opts.LabelOpts(is_show=True),
)
.set_global_opts(title_opts=opts.TitleOpts(title="土地出讓形式&土地成交狀態占比"), # 全域配置項
legend_opts=opts.LegendOpts(is_show=False)
)
.set_series_opts( # 系列配置項
tooltip_opts=opts.TooltipOpts(
trigger="item", formatter="{a} <br/>{b}: {c} ({d}%)"
)
)
.render("pie_.html")
)

統計分析,并用pyecharts餅圖可視化,已有的資料中,從 2015年9月 到 2020年2月,成都土地出讓形式:掛牌出讓占比67.73%、拍賣出讓占比31.45%,只有很少一部分是招標出讓,僅占比0.82%,成都土地招拍掛未成交和流拍土地占比不到一半,而已成交土地占比高達65.77%,整體成交率較高,原因可能為有意向競拍人數量多、出價比較合適,
2. 土地交易面積
import pandas as pd
import pyecharts.options as opts
from pyecharts.charts import Bar
from pyecharts.globals import CurrentConfig, ThemeType
CurrentConfig.ONLINE_HOST = 'D:/python/pyecharts-assets-master/assets/'
df = pd.read_excel('real_estate_info.xlsx').loc[:, ['推出時間', '土地面積', '規劃建筑面積']]
date = df['推出時間'].str.split('年', expand=True)[0] # 這列的字串 按年切割
df['年份'] = date # 添加新的一列 年份
# 取掉 '平' 資料型別轉為float
df['土地面積'] = df['土地面積'].str[:-1].map(float)
df['規劃建筑面積'] = df['規劃建筑面積'].str[:-1].map(float)
# 分組 求和 單位轉換為 萬m2
land_area = df.groupby('年份').agg({'土地面積': 'sum'}) / 10000
planned_area = df.groupby('年份').agg({'規劃建筑面積': 'sum'}) / 10000
# <class 'pandas.core.frame.DataFrame'>
print(land_area, type(land_area))
print(planned_area, type(planned_area))
# 2016年-2019年 爬取的資料 2020年的只有兩個月資料 2015年的資料是9月之后的
years = [int(y) for y in land_area.index[1:-1]]
# 面積保留兩位小數
ydata_1 = [float('{:.2f}'.format(i)) for i in land_area['土地面積'][1:-1]]
ydata_2 = [float('{:.2f}'.format(j)) for j in planned_area['規劃建筑面積'][1:-1]]
# 繪制柱形圖
bar = (
Bar(init_opts=opts.InitOpts(theme=ThemeType.DARK))
.add_xaxis(xaxis_data=years)
.add_yaxis(
series_name='土地面積(萬m2)',
yaxis_data=ydata_1,
label_opts=opts.LabelOpts(is_show=False)
)
.add_yaxis(
series_name='規劃建筑面積(萬m2)',
yaxis_data=ydata_2,
label_opts=opts.LabelOpts(is_show=False)
)
.set_global_opts(
xaxis_opts=opts.AxisOpts(name='年份'),
yaxis_opts=opts.AxisOpts(name='萬m2')
)
.set_series_opts(markpoint_opts=opts.MarkPointOpts(
data=[
opts.MarkPointItem(type_="max", name="最大值"),
opts.MarkPointItem(type_="min", name="最小值"),
]),
)
.render('bar_.html')
)

從2016年到2019年,土地交易面積逐年增加,2018土地交易面積開始達到高潮,該年總的規劃建筑面積為4156.15萬m2,之后2019年土地交易面積較2018年有所下降,
import pandas as pd
from pyecharts import options as opts
from pyecharts.charts import Bar
from pyecharts.globals import CurrentConfig, ThemeType
CurrentConfig.ONLINE_HOST = 'D:/python/pyecharts-assets-master/assets/'
df = pd.read_excel('real_estate_info.xlsx').loc[:, ['推出時間', '土地面積', '規劃建筑面積']]
df['土地面積'] = df['土地面積'].str[:-1].map(float)
df['規劃建筑面積'] = df['規劃建筑面積'].str[:-1].map(float)
date = df['推出時間'].str.split('月', expand=True)[0] # 這列的字串 按月切割
date = date.apply(lambda x: x + '月') # 都加上月
# print(date)
df['月份'] = date
# 取2019年之后的
df1 = df[(df['推出時間'].str[:4] == '2020') | (df['推出時間'].str[:4] == '2019')]
df2 = df1.groupby('月份').agg({'土地面積': 'sum'}) / 10000
df3 = df1.groupby('月份').agg({'規劃建筑面積': 'sum'}) / 10000
# print(df2)
# print(df3)
month = df2.index.tolist()
ydata_1 = [float('{:.2f}'.format(i)) for i in df2['土地面積']]
ydata_2 = [float('{:.2f}'.format(j)) for j in df3['規劃建筑面積']]
bar = (
Bar(init_opts=opts.InitOpts(theme=ThemeType.DARK))
.add_xaxis(xaxis_data=month)
.add_yaxis(
series_name='土地面積(萬m2)',
yaxis_data=ydata_1,
stack='stack1', # 堆疊
label_opts=opts.LabelOpts(is_show=False)
)
.add_yaxis(
series_name='規劃建筑面積(萬m2)',
yaxis_data=ydata_2,
stack='stack1',
label_opts=opts.LabelOpts(is_show=False)
)
.reversal_axis() # 反轉 水平條形圖
.set_global_opts(
xaxis_opts=opts.AxisOpts(name='萬m2'),
yaxis_opts=opts.AxisOpts(name='月份')
)
.render('reverse_bar.html')
)

從2019年1月到2020年2月各月份上土地交易面積來看,2019年成都土地交易市場比較活躍,土地交易面積起伏較大,2019年12月規劃建筑面積為817.47萬m2,達到峰值,之后2020年開始,1、2月土地交易面積下降較多,部分原因可能是受年初國內新冠疫情爆發的影響,
3. 交易土地的規劃用途
import pandas as pd
from pyecharts.charts import Radar
from pyecharts import options as opts
from pyecharts.globals import CurrentConfig, ThemeType
CurrentConfig.ONLINE_HOST = 'D:/python/pyecharts-assets-master/assets/'
df = pd.read_excel('real_estate_info.xlsx')['規劃用途']
datas = df.value_counts()
items = datas.index.tolist()
colors = ['#FF0000', '#FF4500', '#00FA9A', '#FFFFF0', '#FFD700']
# RadarItem:雷達圖資料項配置
labels = [opts.RadarIndicatorItem(name=items[i], max_=50, color=colors[i]) for i in range(len(items))]
value = [int(j) for j in datas.values]
radar = (
Radar(init_opts=opts.InitOpts(theme=ThemeType.DARK))
.add_schema(
schema=labels
)
.add(
series_name='土地規劃用途占比(%)',
data = [[round((x / sum(value)) * 100, 3) for x in value]],
areastyle_opts=opts.AreaStyleOpts(opacity=0.5, color='blue') # 區域填充顏色
)
.set_global_opts(
)
.render('radar.html')
)

交易土地的用途主要以工業用地為主,工業用地占比高達43.667%,還有相當一部分比例用作商業/辦公用地、綜合用地、其他用地,住宅用地僅占比5.098%,也從側面反應出成都注重工業的發展,搜索一些資料了解到,“十二五”期間,成都工業年均增速約14.4%,在15個副省級城市中排名首位,有力支撐了成都地區生產總值邁上“萬億”臺階,
4. 土地成交區域
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
import pandas as pd
import matplotlib as mpl
df = pd.read_excel('real_estate_info.xlsx')
area = df['土地位置']
# 成都主要 區 縣 市 9區6縣4市
with open('test.txt', encoding='utf-8') as f:
areas = f.read().split('、')
for item in areas:
# 每個行政區 對每行資料都進行判斷
# 土地位置里包含行政區名 值為規劃建筑面積 不包含 值為0
# 得到19列 以行政區為列名 其下面為規劃建筑面積
df[item] = [eval(df.loc[x, '規劃建筑面積'][:-1]) if item in df.loc[x, '土地位置'] else 0 for x in range(len(df['土地位置']))]
date = df['推出時間'].str.split('年', expand=True)[0] # 這列的字串 按年切割
df['年份'] = date # 添加新的一列 年份
df1 = df[areas]
df1.index = df['年份']
df2 = df1.groupby('年份').sum()
# print(df2.iloc[:5, ::]) # 2020年資料只有到2月的 舍去
# print(type(df2.iloc[:5, ::].T)) # 轉置
datas = np.array(df2.iloc[:5, ::].T) # 19行 5列 二維陣列
print(datas, type(datas))
x_label = [year for year in range(2015, 2020)]
y_label = areas
mpl.rcParams['font.family'] = 'Kaiti'
fig, ax = plt.subplots(figsize=(15, 9))
# 繪制熱力圖 cmap:從數字到色彩空間的映射
sns.heatmap(data=df2.iloc[:5, ::].T, linewidths=0.25,
linecolor='black', ax=ax, annot=True,
fmt='.1f', cmap='OrRd', robust=True,
)
# 添加描述資訊 x y軸 title
ax.set_xlabel('年份', fontdict={'size': 18, 'weight': 'bold'})
ax.set_ylabel('行政區', fontdict={'size': 18, 'weight': 'bold'})
ax.set_title(r'各行政區2015-2019年的總規劃建筑面積(平方米)', fontsize=25, x=0.5, y=1.02)
# 隱藏邊框
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
ax.spines['left'].set_visible(False)
ax.spines['bottom'].set_visible(False)
# 保存 展示圖片
plt.savefig('heat_map.png')
plt.show()

從交易區域來看,除雙流縣和郫縣,各行政區每年都有一定土地成交,龍泉驛區和青白江區2018年到2019年交易土地面積最大,土地交易市場火熱,
四、其他說明
- 本文資料分析只做學習研究之用,提供的結論僅供參考
- 不足之處,請多多指正
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/38082.html
標籤:其他
