葡萄牙波尔图市出租车分析目的地聚类部分(MeanShift)

from sklearn.cluster import MeanShift, estimate_bandwidth
from sklearn.externals import joblib
import numpy as np
import matplotlib.pyplot as plt 
import os 
import pandas as pd
import datetime 
import xlrd
import csv
import random 
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
os.chdir(r'E:\葡萄牙波尔图市出租车分析')
    #用pandas直接读取csv文件到df
    df=pd.read_csv('train.csv')
traj_sample=random.sample(list(df.POLYLINE),100000) #随机从170w条数据中选取10万
del df #由于上一步读取了太多数据,删除该变量从而释放内存空间
#将读取的10w条轨迹数据重新用CSV文件保存
import csv
with open(r'E:\1_traj_10000_sample.csv','w') as f:
    writer=csv.writer(f,lineterminator='\n')
    for i in traj_sample:
        writer.writerow([i])
print(len(traj_sample))
import csv
import re
haRegex=re.compile(r'\[.*\]')
dest_point_adj=[]
#traj_sample_adj=[]
with open(r'E:\1.5_traj_adj_10000_sample.csv','w') as f:
    writer=csv.writer(f,lineterminator='\n')
    for i in traj_sample:
        if haRegex.search(i) and len(eval(i))<1000 and i!='[]' and eval(i)[-1][0]<=-8.5 and eval(i)[-1][0]>=-8.7 and eval(i)[-1][1]<=41.24 and eval(i)[-1][1]>=41.04: #引入正则表达式对空数据,轨迹过长的数据以及不在波尔图市的数据进行一些处理
            dest_point_adj.append(eval(i)[-1])
            #traj_sample_adj.append(eval(i))
            writer.writerow([i,eval(i)[-1]])
X=np.array(dest_point_adj) #将列表转换为数组,方便在sklearn里进行处理
print(len(dest_point_adj)) #处理后数据从10w降到了9w8左右

在这里插入图片描述

with open(r'E:\2_dest_point_adj_10w.csv','w') as f:
    writer=csv.writer(f,lineterminator='\n')
    for i in dest_point_adj:
        writer.writerow([i[0],i[1]])  #这里重新处理各轨迹终点数据到excel里,方便后面在excel里进行一些格式调整
#开始调用sklearn里方法对数据做预测
clf=MeanShift(bandwidth=0.001, bin_seeding=True, cluster_all=True,n_jobs=-2).fit(X)
#winsound.PlaySound(r'E:\CDA培训\CDA项目数据\葡萄牙波尔图市出租车分析\LYNC_ringtone7.wav',flags=0)
##上一步可以调用一些提示音,如果数据处理时间很长,引入提示音,那么数据处理完后会鸣笛提示程序运行结束
centroids=clf.labels_
#print(centroids, type(centroids)) #显示每个点聚类归属
print(len(centroids)) #显示标签总数

在这里插入图片描述

#统计每个标签有多少数
arr_flag=np.zeros(4000)
for i in clf.labels_:
    arr_flag[i]=arr_flag[i]+1
print(arr_flag)
k=0
for i in arr_flag:
    if (i>0):
        k+=1
print(k) #一共有3235个簇

在这里插入图片描述

centroids_centres=clf.cluster_centers_
#print (centroids_centres) #显示中心点坐标
for i in range(k-1):
    plt.plot(centroids_centres[i][0], centroids_centres[i][1], 'Dr')#mark[i], markersize = 6)
plt.show() #画出簇在图上的投影

葡萄牙波尔图市出租车分析目的地聚类部分(MeanShift)_第1张图片

with open(r'E:\CDA培训\CDA项目数据\葡萄牙波尔图市出租车分析\4_cluster_dest_point_10w_0.001.csv','w') as f:
    writer=csv.writer(f,lineterminator='\n')
    for i in centroids_centres:
        writer.writerow([i[0],i[1]])  #将聚类出来的各个点输出到excel表中
print(centroids_centres)  #看下新统计的聚类点的形式

葡萄牙波尔图市出租车分析目的地聚类部分(MeanShift)_第2张图片

    #用pandas直接读取csv文件到df
    df=pd.read_csv('4_cluster_dest_point_10w_0.001.csv') 
    print(df)
    print(type(df))
    df.info()  #重新读入前面聚类后点的excel

葡萄牙波尔图市出租车分析目的地聚类部分(MeanShift)_第3张图片

cluster_dic={} #创建一个空字典
cluster=[]
for i in range(0,len_cluster):
    cluster.append([df.longtitude[i],df.latitude[i]])
cluster_str=[str(i) for i in cluster] #将前面簇的经纬度结合成一个字符串,方便后面用0,1,2来进行标记
print(cluster_str)

葡萄牙波尔图市出租车分析目的地聚类部分(MeanShift)_第4张图片

for i in range(0, len_cluster):
    cluster_dic[cluster_str[i]]=i  #用0,1,2来区分各个簇的点,更加方便
print(cluster_dic)

葡萄牙波尔图市出租车分析目的地聚类部分(MeanShift)_第5张图片

with open(r'E:\5_labels_10w_0.001.csv','w') as f:
    writer=csv.writer(f,lineterminator='\n')
    for i in clf.labels_:
        writer.writerow([i]) #将每个点的labels输出到excel表中

你可能感兴趣的:(葡萄牙波尔图市出租车分析目的地聚类部分(MeanShift))