聚类尝试-kmeans-step1数据预处理
在已爬取的上海二手房數據基礎上,調用高德接口,獲取房屋經緯度及人民廣場經緯度。在原有數據上添加一列“房子到人民廣場的距離”,然后利用k-means進行聚類分析。本文只記錄數據預處理部分。
REF:
Python:爬了下鏈家的小區數據,為數據分析弄素材~_Cyber的博客-CSDN博客_小區數據前言:最近在學數據分析,包括主成分分析、因子分析、聚類。。。等等,沒有數據可不行啊,所以就把鏈家的小區數據給爬了一下,為后續的分析實戰弄素材~一、數據爬取準備鏈家的網站還是很好爬的,地址很有標準,可以看到下圖中有5391個小區,但是很多都是無效小區,而且單頁只有30個小區且最多30頁,所以我們需要從源碼上了解具體結構。從第二頁起,鏈接就變成pg2之類的,依次類推,就可以爬取30頁以后的數...https://blog.csdn.net/weixin_42029733/article/details/93064205?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_title~default-1.queryctr&spm=1001.2101.3001.4242.2&utm_relevant_index=4
1.1 數據導入
import pickle import pandas as pd import re import numpy as np import requests import json import math from tqdm import tqdm, trange# 讀取 shanghai_ershou = pickle.load(open( './shanghai_ershou_v2.pkl', 'rb')) # hangzhou_new = pickle.load(open( './hangzhou_new.pkl', 'rb'))l = [] for key in shanghai_ershou.keys():l.append(len(shanghai_ershou[key].keys()))print('爬取房屋的總數:',sum(l))# 轉化為dataframe shanghai_ershou_df = pd.DataFrame(columns = pd.DataFrame(shanghai_ershou['locationbeicaipg1']).index) for i in shanghai_ershou.keys():temp = pd.DataFrame(shanghai_ershou[i]).Tshanghai_ershou_df = pd.concat([shanghai_ershou_df, temp], ignore_index = True)1.2 已有數據進行數據預處理
# 發現dataframe中每個元素都是一個列表(有可能為空) def extract_0(x):"""提取列表中第一個元素,若列表為空,則返回none"""try:return x[0]except:return None df_shanghai = shanghai_ershou_df.copy() # dataframe中每一列數據都從列表中提取出來 for col in df_shanghai.columns:df_shanghai[col] = df_shanghai[col].apply(extract_0)# 對總價進行處理 df_shanghai.total_price = df_shanghai.total_price.astype('float')# 對單價進行處理 df_shanghai.unit_price = df_shanghai.unit_price.str.extract(r'([\d,]+)').replace(',','', regex = True).astype('float')[0]# 對面積進行處理 df_shanghai['area'] = df_shanghai.loc[:,'info'].str.extract('([\d.]+)平米')1.3 批量調用接口并解析出經緯度
res_dict = {} for i in trange(df_shanghai.shape[0]): # for i in tqdm(range(5)):url = 'https://restapi.amap.com/v3/geocode/geo?key=c00a9fc63a97c64fe63bf1ff051a285e&address=上海市{}&city=上海市'location = df_shanghai.iloc[i, 5]+df_shanghai.iloc[i,0]try:res = requests.get(url.format(location.rstrip())).textexcept:res = Nonefinally:res_dict[i] = resdf_shanghai['api'] = pd.Series(res_dict)def parse_location(res):if res != None:geocodes = json.loads(res).get('geocodes')[0]location = geocodes.get('location')return locationelse:return None# 經緯度 df_shanghai['location'] = df_shanghai.api.map(parse_location)# 經度,緯度 df_shanghai['longitude'] = df_shanghai.location.str.extract('([\d.]+),') df_shanghai['latitude'] = df_shanghai.location.str.extract(',([\d.]+)')df_shanghai['longitude'] = df_shanghai['longitude'].astype('float') df_shanghai['latitude'] = df_shanghai['latitude'].astype('float')1.4 計算距離
# 獲取人民廣場的經緯度 url = 'https://restapi.amap.com/v3/geocode/geo?key=c00a9fc63a97c64fe63bf1ff051a285e&address=上海市{}&city=上海市' location = '人民廣場' res = requests.get(url.format(location.rstrip())).text rg_location = json.loads(res).get('geocodes')[0].get('location')matchObj = re.search('([\d.]+),', rg_location) rg_longitude = float(matchObj.group(1)) # 經度 matchObj = re.search(',([\d.]+)', rg_location) rg_latitude = float(matchObj.group(1)) # 緯度 # 定義用于計算距離的函數def angle2radian(x):"角度轉換為弧度"return x*math.pi/180def rec2sphere(lng1, lat1):"球坐標系->直角坐標系"R = 6371x1 = R*math.cos(lng1)*math.cos(lat1)y1 = R*math.cos(lng1)*math.sin(lat1)z1 = R*math.sin(lat1)return x1, y1, z1def get_chord_length(x1, y1, z1, x2, y2, z2):"獲取直角坐標系中的直線距離"dx = x1 - x2dy = y1 - y2dz = z1 - z2lenth = np.sqrt(dx**2+dy**2+dz**2)return lenthdef get_distance(lng1, lat1, lng2 , lat2):"輸入經緯度,得到兩地距離(km)"R = 6371# 角度轉化為弧度lng1 = angle2radian(lng1)lat1 = angle2radian(lat1)lng2 = angle2radian(lng2)lat2 = angle2radian(lat2)# 球坐標->直角坐標x1, y1, z1 = rec2sphere(lng1, lat1)x2, y2, z2 = rec2sphere(lng2, lat2)# 三維空間中的距離(大圓中的弦長)lenth = get_chord_length(x1, y1, z1, x2, y2, z2)# 大圓中的弧長alpha = math.asin(lenth/2/R)*2r = alpha*Rreturn r # dataframe的每一行計算距離 distance_dict = {} for i in trange(df_shanghai.shape[0]):lng1 = df_shanghai.iloc[i].longitudelat1 = df_shanghai.iloc[i].latitudedistance = get_distance(lng1, lat1, rg_longitude, rg_latitude)distance_dict[i] = distancedf_shanghai['distance_rg'] = pd.Series(distance_dict)1.4 數據存儲
df_shanghai.drop(columns = ['api', 'location'], inplace=True) df_shanghai.to_csv('sh_ershou_clean_v2.csv')step2:
聚類嘗試-kmeans-step2聚類模型訓練及結果可視化_nikita_zj的博客-CSDN博客聚類嘗試-kmeans-step2聚類模型訓練及結果可視化https://blog.csdn.net/nikita_zj/article/details/122343615
總結
以上是生活随笔為你收集整理的聚类尝试-kmeans-step1数据预处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 勾股定理的毕达哥拉斯证明
- 下一篇: win7搭建nas存储服务器_FreeN