Я использую код ниже.
from pylab import plot,show
from numpy import vstack,array
from numpy.random import rand
import numpy as np
from scipy.cluster.vq import kmeans,vq
import pandas as pd
import pandas_datareader as dr
from math import sqrt
from sklearn.cluster import KMeans
from matplotlib import pyplot as plt
pd.set_option('display.max_columns', 500)
df = pd.read_csv('C:\\in_path\\raw_data.csv')
print('done!')
df = df[:100000]
df = df.fillna(0)
dataset = df[['AcctNo', 'PriceBin', 'CouponBin', 'RatingScore', 'Term', 'LRMScore', 'Spread']].copy() # 'Rating' # 'HQLACategoryOne'
#format the data as a numpy array to feed into the K-Means algorithm
data = np.asarray([np.asarray(dataset['Spread']),np.asarray(dataset['Score'])]).T
centroids,_ = kmeans(data,500)
# assign each sample to a cluster
idx,_ = vq(data,centroids)
# some plotting using numpy's logical indexing
plt.scatter(data[:, 0], data[:, 1], c=idx, s=50, cmap='viridis')
plt.scatter(centroids[:, 0], centroids[:, 1], c='red', s=200, alpha=0.5)
details = [(name,cluster) for name, cluster in zip(dataset.Cusip,idx)]
for detail in details:
print(detail)
details_df = pd.DataFrame(details)
details_df.columns = ['AccountNo','ClusterID']
finalDF = pd.merge(dataset, details_df, left_index=False, right_index=False, how='inner')
finalDF.to_csv('C:\\out_path\\test.csv')
Я смотрю на «Распространение» относительно «Оценка». Эти две особенности лишь слегка положительно коррелируют; около 14%. Я не знаю, в этом ли проблема или нет, но я думал, что кластеризация будет выполняться на основе «Spread» и «Score», но мои ClusterIDs, похоже, не связаны ни с одной из этих переменных. Я сделал что-то неправильно? Я что-то пропустил?
Наконец-то я получаю эти результаты (только небольшая выборка).
AcctNo PriceBin CouponBin RatingScore Term Score Spread ClusterID
A85771075 0 5 0 30 9.75 0.13 3
A16898795 0 7 0 30 9.75 0.13 3
A87632163 0 5 0 30 9.75 0.06 7
A32073695 0 5 0 30 9.75 0.06 7
A05966021 -1 2 0 29 9.75 0.12 2
A38865245 0 4 0 30 9.75 0.07 10
A17800838 0 3 0 30 9.75 0.06 7
A19974047 0 6 0 15 9.75 0.16 3
A93145719 0 6 0 15 9.75 0.16 3
A32581133 0 6 0 15 9.75 0.16 3
A56322331 0 6 0 15 9.75 0.16 3
A67851213 0 6 0 15 9.75 0.16 3
A51232438 0 6 0 15 9.75 0.16 3