In [1]:
import numpy as np

In [2]:
from numpy import genfromtxt
data = genfromtxt('http://www.biz.uiowa.edu/faculty/jledolter/DataMining/protein.csv',delimiter=',',names=True,dtype=float)

note numpy also has recfromcsv() and pandas can read_csv, with pandas DF.values giving a numpy array


In [3]:
len(data)


Out[3]:
25

In [4]:
len(data.dtype.names)


Out[4]:
10

In [5]:
data.dtype.names


Out[5]:
('Country',
 'RedMeat',
 'WhiteMeat',
 'Eggs',
 'Milk',
 'Fish',
 'Cereals',
 'Starch',
 'Nuts',
 'FrVeg')

In [6]:
type(data)


Out[6]:
numpy.ndarray

In [7]:
data


Out[7]:
array([(nan, 10.1, 1.4, 0.5, 8.9, 0.2, 42.3, 0.6, 5.5, 1.7),
       (nan, 8.9, 14.0, 4.3, 19.9, 2.1, 28.0, 3.6, 1.3, 4.3),
       (nan, 13.5, 9.3, 4.1, 17.5, 4.5, 26.6, 5.7, 2.1, 4.0),
       (nan, 7.8, 6.0, 1.6, 8.3, 1.2, 56.7, 1.1, 3.7, 4.2),
       (nan, 9.7, 11.4, 2.8, 12.5, 2.0, 34.3, 5.0, 1.1, 4.0),
       (nan, 10.6, 10.8, 3.7, 25.0, 9.9, 21.9, 4.8, 0.7, 2.4),
       (nan, 8.4, 11.6, 3.7, 11.1, 5.4, 24.6, 6.5, 0.8, 3.6),
       (nan, 9.5, 4.9, 2.7, 33.7, 5.8, 26.3, 5.1, 1.0, 1.4),
       (nan, 18.0, 9.9, 3.3, 19.5, 5.7, 28.1, 4.8, 2.4, 6.5),
       (nan, 10.2, 3.0, 2.8, 17.6, 5.9, 41.7, 2.2, 7.8, 6.5),
       (nan, 5.3, 12.4, 2.9, 9.7, 0.3, 40.1, 4.0, 5.4, 4.2),
       (nan, 13.9, 10.0, 4.7, 25.8, 2.2, 24.0, 6.2, 1.6, 2.9),
       (nan, 9.0, 5.1, 2.9, 13.7, 3.4, 36.8, 2.1, 4.3, 6.7),
       (nan, 9.5, 13.6, 3.6, 23.4, 2.5, 22.4, 4.2, 1.8, 3.7),
       (nan, 9.4, 4.7, 2.7, 23.3, 9.7, 23.0, 4.6, 1.6, 2.7),
       (nan, 6.9, 10.2, 2.7, 19.3, 3.0, 36.1, 5.9, 2.0, 6.6),
       (nan, 6.2, 3.7, 1.1, 4.9, 14.2, 27.0, 5.9, 4.7, 7.9),
       (nan, 6.2, 6.3, 1.5, 11.1, 1.0, 49.6, 3.1, 5.3, 2.8),
       (nan, 7.1, 3.4, 3.1, 8.6, 7.0, 29.2, 5.7, 5.9, 7.2),
       (nan, 9.9, 7.8, 3.5, 24.7, 7.5, 19.5, 3.7, 1.4, 2.0),
       (nan, 13.1, 10.1, 3.1, 23.8, 2.3, 25.6, 2.8, 2.4, 4.9),
       (nan, 17.4, 5.7, 4.7, 20.6, 4.3, 24.3, 4.7, 3.4, 3.3),
       (nan, 9.3, 4.6, 2.1, 16.6, 3.0, 43.6, 6.4, 3.4, 2.9),
       (nan, 11.4, 12.5, 4.1, 18.8, 3.4, 18.6, 5.2, 1.5, 3.8),
       (nan, 4.4, 5.0, 1.2, 9.5, 0.6, 55.9, 3.0, 5.7, 3.2)], 
      dtype=[('Country', '<f8'), ('RedMeat', '<f8'), ('WhiteMeat', '<f8'), ('Eggs', '<f8'), ('Milk', '<f8'), ('Fish', '<f8'), ('Cereals', '<f8'), ('Starch', '<f8'), ('Nuts', '<f8'), ('FrVeg', '<f8')])

In [8]:
data_array = data.view((np.float, len(data.dtype.names)))

In [9]:
data_array


Out[9]:
array([[  nan,  10.1,   1.4,   0.5,   8.9,   0.2,  42.3,   0.6,   5.5,
          1.7],
       [  nan,   8.9,  14. ,   4.3,  19.9,   2.1,  28. ,   3.6,   1.3,
          4.3],
       [  nan,  13.5,   9.3,   4.1,  17.5,   4.5,  26.6,   5.7,   2.1,   4. ],
       [  nan,   7.8,   6. ,   1.6,   8.3,   1.2,  56.7,   1.1,   3.7,
          4.2],
       [  nan,   9.7,  11.4,   2.8,  12.5,   2. ,  34.3,   5. ,   1.1,   4. ],
       [  nan,  10.6,  10.8,   3.7,  25. ,   9.9,  21.9,   4.8,   0.7,
          2.4],
       [  nan,   8.4,  11.6,   3.7,  11.1,   5.4,  24.6,   6.5,   0.8,
          3.6],
       [  nan,   9.5,   4.9,   2.7,  33.7,   5.8,  26.3,   5.1,   1. ,
          1.4],
       [  nan,  18. ,   9.9,   3.3,  19.5,   5.7,  28.1,   4.8,   2.4,
          6.5],
       [  nan,  10.2,   3. ,   2.8,  17.6,   5.9,  41.7,   2.2,   7.8,
          6.5],
       [  nan,   5.3,  12.4,   2.9,   9.7,   0.3,  40.1,   4. ,   5.4,
          4.2],
       [  nan,  13.9,  10. ,   4.7,  25.8,   2.2,  24. ,   6.2,   1.6,
          2.9],
       [  nan,   9. ,   5.1,   2.9,  13.7,   3.4,  36.8,   2.1,   4.3,
          6.7],
       [  nan,   9.5,  13.6,   3.6,  23.4,   2.5,  22.4,   4.2,   1.8,
          3.7],
       [  nan,   9.4,   4.7,   2.7,  23.3,   9.7,  23. ,   4.6,   1.6,
          2.7],
       [  nan,   6.9,  10.2,   2.7,  19.3,   3. ,  36.1,   5.9,   2. ,
          6.6],
       [  nan,   6.2,   3.7,   1.1,   4.9,  14.2,  27. ,   5.9,   4.7,
          7.9],
       [  nan,   6.2,   6.3,   1.5,  11.1,   1. ,  49.6,   3.1,   5.3,
          2.8],
       [  nan,   7.1,   3.4,   3.1,   8.6,   7. ,  29.2,   5.7,   5.9,
          7.2],
       [  nan,   9.9,   7.8,   3.5,  24.7,   7.5,  19.5,   3.7,   1.4,   2. ],
       [  nan,  13.1,  10.1,   3.1,  23.8,   2.3,  25.6,   2.8,   2.4,
          4.9],
       [  nan,  17.4,   5.7,   4.7,  20.6,   4.3,  24.3,   4.7,   3.4,
          3.3],
       [  nan,   9.3,   4.6,   2.1,  16.6,   3. ,  43.6,   6.4,   3.4,
          2.9],
       [  nan,  11.4,  12.5,   4.1,  18.8,   3.4,  18.6,   5.2,   1.5,
          3.8],
       [  nan,   4.4,   5. ,   1.2,   9.5,   0.6,  55.9,   3. ,   5.7,
          3.2]])

In [10]:
data_array = data_array.transpose()

In [11]:
print(data_array)


[[  nan   nan   nan   nan   nan   nan   nan   nan   nan   nan   nan   nan
    nan   nan   nan   nan   nan   nan   nan   nan   nan   nan   nan   nan
    nan]
 [ 10.1   8.9  13.5   7.8   9.7  10.6   8.4   9.5  18.   10.2   5.3  13.9
    9.    9.5   9.4   6.9   6.2   6.2   7.1   9.9  13.1  17.4   9.3  11.4
    4.4]
 [  1.4  14.    9.3   6.   11.4  10.8  11.6   4.9   9.9   3.   12.4  10.
    5.1  13.6   4.7  10.2   3.7   6.3   3.4   7.8  10.1   5.7   4.6  12.5
    5. ]
 [  0.5   4.3   4.1   1.6   2.8   3.7   3.7   2.7   3.3   2.8   2.9   4.7
    2.9   3.6   2.7   2.7   1.1   1.5   3.1   3.5   3.1   4.7   2.1   4.1
    1.2]
 [  8.9  19.9  17.5   8.3  12.5  25.   11.1  33.7  19.5  17.6   9.7  25.8
   13.7  23.4  23.3  19.3   4.9  11.1   8.6  24.7  23.8  20.6  16.6  18.8
    9.5]
 [  0.2   2.1   4.5   1.2   2.    9.9   5.4   5.8   5.7   5.9   0.3   2.2
    3.4   2.5   9.7   3.   14.2   1.    7.    7.5   2.3   4.3   3.    3.4
    0.6]
 [ 42.3  28.   26.6  56.7  34.3  21.9  24.6  26.3  28.1  41.7  40.1  24.
   36.8  22.4  23.   36.1  27.   49.6  29.2  19.5  25.6  24.3  43.6  18.6
   55.9]
 [  0.6   3.6   5.7   1.1   5.    4.8   6.5   5.1   4.8   2.2   4.    6.2
    2.1   4.2   4.6   5.9   5.9   3.1   5.7   3.7   2.8   4.7   6.4   5.2
    3. ]
 [  5.5   1.3   2.1   3.7   1.1   0.7   0.8   1.    2.4   7.8   5.4   1.6
    4.3   1.8   1.6   2.    4.7   5.3   5.9   1.4   2.4   3.4   3.4   1.5
    5.7]
 [  1.7   4.3   4.    4.2   4.    2.4   3.6   1.4   6.5   6.5   4.2   2.9
    6.7   3.7   2.7   6.6   7.9   2.8   7.2   2.    4.9   3.3   2.9   3.8
    3.2]]

In [12]:
data_array[1:10]


Out[12]:
array([[ 10.1,   8.9,  13.5,   7.8,   9.7,  10.6,   8.4,   9.5,  18. ,
         10.2,   5.3,  13.9,   9. ,   9.5,   9.4,   6.9,   6.2,   6.2,
          7.1,   9.9,  13.1,  17.4,   9.3,  11.4,   4.4],
       [  1.4,  14. ,   9.3,   6. ,  11.4,  10.8,  11.6,   4.9,   9.9,
          3. ,  12.4,  10. ,   5.1,  13.6,   4.7,  10.2,   3.7,   6.3,
          3.4,   7.8,  10.1,   5.7,   4.6,  12.5,   5. ],
       [  0.5,   4.3,   4.1,   1.6,   2.8,   3.7,   3.7,   2.7,   3.3,
          2.8,   2.9,   4.7,   2.9,   3.6,   2.7,   2.7,   1.1,   1.5,
          3.1,   3.5,   3.1,   4.7,   2.1,   4.1,   1.2],
       [  8.9,  19.9,  17.5,   8.3,  12.5,  25. ,  11.1,  33.7,  19.5,
         17.6,   9.7,  25.8,  13.7,  23.4,  23.3,  19.3,   4.9,  11.1,
          8.6,  24.7,  23.8,  20.6,  16.6,  18.8,   9.5],
       [  0.2,   2.1,   4.5,   1.2,   2. ,   9.9,   5.4,   5.8,   5.7,
          5.9,   0.3,   2.2,   3.4,   2.5,   9.7,   3. ,  14.2,   1. ,
          7. ,   7.5,   2.3,   4.3,   3. ,   3.4,   0.6],
       [ 42.3,  28. ,  26.6,  56.7,  34.3,  21.9,  24.6,  26.3,  28.1,
         41.7,  40.1,  24. ,  36.8,  22.4,  23. ,  36.1,  27. ,  49.6,
         29.2,  19.5,  25.6,  24.3,  43.6,  18.6,  55.9],
       [  0.6,   3.6,   5.7,   1.1,   5. ,   4.8,   6.5,   5.1,   4.8,
          2.2,   4. ,   6.2,   2.1,   4.2,   4.6,   5.9,   5.9,   3.1,
          5.7,   3.7,   2.8,   4.7,   6.4,   5.2,   3. ],
       [  5.5,   1.3,   2.1,   3.7,   1.1,   0.7,   0.8,   1. ,   2.4,
          7.8,   5.4,   1.6,   4.3,   1.8,   1.6,   2. ,   4.7,   5.3,
          5.9,   1.4,   2.4,   3.4,   3.4,   1.5,   5.7],
       [  1.7,   4.3,   4. ,   4.2,   4. ,   2.4,   3.6,   1.4,   6.5,
          6.5,   4.2,   2.9,   6.7,   3.7,   2.7,   6.6,   7.9,   2.8,
          7.2,   2. ,   4.9,   3.3,   2.9,   3.8,   3.2]])

Samples clustering using scipy

First, we'll implement the clustering using scipy modules


In [13]:
import numpy as np
import matplotlib.pyplot as plt
from scipy.spatial.distance import pdist, squareform
from scipy.cluster.hierarchy import linkage, dendrogram

In [14]:
data_dist = pdist(data_array[1:10]) # computing the distance
data_link = linkage(data_dist) # computing the linkage

In [15]:
dendrogram(data_link,labels=data.dtype.names)
plt.xlabel('Samples')
plt.ylabel('Distance')
plt.suptitle('Samples clustering', fontweight='bold', fontsize=14);

In [16]:
plt.show()



In [17]:
# Compute and plot first dendrogram.
fig = plt.figure(figsize=(8,8))
# x ywidth height
ax1 = fig.add_axes([0.05,0.1,0.2,0.6])
Y = linkage(data_dist, method='single')
Z1 = dendrogram(Y, orientation='right',labels=data.dtype.names) # adding/removing the axes
ax1.set_xticks([])

# Compute and plot second dendrogram.
ax2 = fig.add_axes([0.3,0.71,0.6,0.2])
Z2 = dendrogram(Y)
ax2.set_xticks([])
ax2.set_yticks([])

#Compute and plot the heatmap
axmatrix = fig.add_axes([0.3,0.1,0.6,0.6])
idx1 = Z1['leaves']
idx2 = Z2['leaves']
D = squareform(data_dist)
D = D[idx1,:]
D = D[:,idx2]
im = axmatrix.matshow(D, aspect='auto', origin='lower', cmap=plt.cm.YlGnBu)
axmatrix.set_xticks([])
axmatrix.set_yticks([])

# Plot colorbar.
axcolor = fig.add_axes([0.91,0.1,0.02,0.6])
plt.colorbar(im, cax=axcolor)


Out[17]:
<matplotlib.colorbar.Colorbar at 0x86c3cc0>

In [18]:
plt.show()



In [19]:
! pip install fastcluster


Requirement already satisfied: fastcluster in c:\users\dell\anaconda3\lib\site-packages
Requirement already satisfied: numpy>=1.9 in c:\users\dell\anaconda3\lib\site-packages (from fastcluster)

In [20]:
from fastcluster import *
%timeit data_link = linkage(data_array[1:10], method='single', metric='euclidean', preserve_input=True)
dendrogram(data_link,labels=data.dtype.names)
plt.xlabel('Samples')
plt.ylabel('Distance')
plt.suptitle('Samples clustering', fontweight='bold', fontsize=14);
plt.show()


The slowest run took 5.77 times longer than the fastest. This could mean that an intermediate result is being cached.
10000 loops, best of 3: 45.1 µs per loop

In [ ]: