日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

聚类尝试-kmeans-step1数据预处理

發布時間:2023/12/16 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 聚类尝试-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数据预处理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。