Choisir une méthode pour rechercher des opérations similaires

Nous avons Ă©tĂ© confrontĂ©s Ă  la tĂąche d'identifier des groupes de clients ayant le mĂȘme comportement d'investissement lors de transactions sur des marchĂ©s de titres organisĂ©s.





Pour une solution efficace au problÚme, il est tout d'abord nécessaire de déterminer sa formulation correcte.





, . «» . – , . , , , .  , !





, :





  • ,





  • ( )





  • (/).





2 , , , , . – !





:





from matplotlib import pyplot as plt
from mpl_toolkits import mplot3d

fig = plt.figure()
ax = plt.axes(projection = '3d')
ax.scatter3D(X[:,0],X[:,1],X[:,2])
plt.show()
      
      



2 SKlearn ML – KMeans, DBSCAN () BallTree.





DBSCAN

DBSCAN (Density-based spatial clustering of applications with noise), ), , . —  Ï”- . , , , DBSCAN ? .





:





, , , . , , :





X = df[['ORDERDATETIME','SECURCODE','OPERATION']].values
model = DBSCAN(min_samples=2, eps = 0.5).fit(X)
df['LabelsDBS'] = model.labels_
df['ORDERDATETIME']=pd.to_datetime(df['ORDERDATETIME'])
gr=df.groupby(['LabelsDBS','CLIENTCODE']).count()

l=[]
ll=[]
for i in range(gr.shape[0]):
    l.append(gr.index[i][0])
    ll.append(gr.index[i][1])
l=pd.DataFrame(l)
l.rename(columns={0:'Ind'}, inplace=True)
l['Code']=ll
l=l.query('Ind > 0')
a = l.groupby('Ind').count()
a=a.query('Code>1 & Code<4').index.values
a=list(a)
l=l.query('Ind == @a')
l = pd.DataFrame(l.groupby('Ind')['Code'].apply(list))
      
      



, DBSCAN , .





KMeans

 k- .  k  – , . , .





  – ,  X. , .





  – , , . , – « k-».





  , , k- n- 1. . .. , , . .





, DBSCAN ( ) :





X = df[['ORDERDATETIME','SECURCODE','OPERATION']].values
model = KMeans(n_clusters=9900).fit(X)
      
      



, , – .





BallTree

ML – . . , , , .





, :





tree = BallTree(X, leaf_size=2)
dist, ind = tree.query(X, k=2)
l=[]
ll=[]
lll=[]
dist, ind = tree.query(X, k=2)
for i, (ind, d) in enumerate(zip(ind, dist)):
    print(f'Y index {i}, closest index X is {ind[1]}, dist {d[1]}')
    l.append(ind[0])
    ll.append(ind[1])
    lll.append(d[1])
for i in range(len(l)):
    l[i]=df.iloc[l[i]].CLIENTCODE
    ll[i]=df.iloc[ll[i]].CLIENTCODE
l=pd.DataFrame(l)
l.rename(columns={0:'Ind1'}, inplace=True)
l['Ind2']=ll
l['DIST']=lll
l = l.query('DIST>0 & Ind1 != Ind2')
l
      
      



, , , – , , , .





Sur la base des travaux effectuĂ©s, nous pouvons conclure que, malgrĂ© le fait que les mĂ©thodes pour trouver des opĂ©rations clients similaires sont diffĂ©rentes et utilisent des mĂ©thodes mathĂ©matiques diffĂ©rentes, la conclusion est Ă  peu prĂšs similaire. Cela signifie que l'une des mĂ©thodes peut ĂȘtre utilisĂ©e pour restreindre la recherche d'opĂ©rations similaires. Reste la question du choix d'un outil plus pratique pour une tĂąche spĂ©cifique - sacrifier la vitesse pour des raisons de commoditĂ© ou rechercher soi-mĂȘme l'application des distances trouvĂ©es. Tu dĂ©cides!








All Articles