Python-查找集群和集群';从相关矩阵中提取最核心的元素

Python-查找集群和集群';从相关矩阵中提取最核心的元素,python,pandas,scikit-learn,networkx,Python,Pandas,Scikit Learn,Networkx,我与pandas建立了一个相关矩阵(基于多个金融工具时间序列),即: (见下文数据) 我想通过相关元素对结果进行聚类。我已经通过使用阈值方法做到了这一点: # Create a list of correlated pairs l=list(matrix[(matrix>0.75)|(matrix<-0.75)].stack().index) li=[item for item in l if item[0]!=item[1]] # Create a list of groups

我与pandas建立了一个相关矩阵(基于多个金融工具时间序列),即:

(见下文数据)

我想通过相关元素对结果进行聚类。我已经通过使用阈值方法做到了这一点:

# Create a list of correlated pairs
l=list(matrix[(matrix>0.75)|(matrix<-0.75)].stack().index)
li=[item for item in l if item[0]!=item[1]]

# Create a list of groups with correlated instruments
import networkx as nx
gr = nx.Graph(li)
groups=list(nx.connected_components(gr))
1) 现在,我想找出哪一个是这两个群体中最“核心”的工具,即与该群体中大多数其他人相关且相关性最好的工具

2) 深入研究networkx和scikit learn的文档,我开始认为可能有更复杂的方法来创建集群,而不必输入阈值,我觉得这太随意了 或networkx的其他算法

问题1)是我实际上试图解决的问题,但我认为这将需要更好地理解可用于时间序列相关性分析这一特定任务的不同聚类算法——因此问题2)

如果有人有一个解决1)的交钥匙解决方案,那就太棒了。 或者,指向最适合聚类相关矩阵元素的算法,并对结果进行分析(如找到最中心的元素)将非常有用

数据:


关于过滤:过滤的另一种方法是使用。您可以找到与networkx兼容的解决方案。基本上,对于每个节点,它根据均匀分布的零假设测试所有相邻边的权重。您可以设置一个阈值,并仅保留那些在该值下有效的边

关于检测集群:有许多方法可以检测加权网络中的社区,而无需过滤,直到您有多个连接的组件。一种开箱即用的方法是


在检测集群中的重要节点时:如果您已经过滤并找到了集群,您可以简单地根据它们的加权程度或贴近度中心对集群中的节点进行排序。Networkx有一个用于获取给定节点列表的子图的方法。

关于筛选:筛选的另一种方法是使用。您可以找到与networkx兼容的解决方案。基本上,对于每个节点,它根据均匀分布的零假设测试所有相邻边的权重。您可以设置一个阈值,并仅保留那些在该值下有效的边

关于检测集群:有许多方法可以检测加权网络中的社区,而无需过滤,直到您有多个连接的组件。一种开箱即用的方法是

在检测集群中的重要节点时:如果您已经过滤并找到了集群,您可以简单地根据它们的加权程度或贴近度中心对集群中的节点进行排序。Networkx有一个用于获取给定节点列表的子图的方法

[{'AIGCI', 'BZ', 'CL', 'HO', 'QM'},
 {'AUD', 'M6A'},
 {'CHF', 'E7', 'EUR', 'M6E'},
 {'EMD', 'ES', 'NQ', 'RTY', 'YM'},
 {'GBP', 'M6B'},
 {'GC', 'MGC', 'SI'},
 {'GF', 'LE'},
 {'KE', 'ZW'},
 {'NIY', 'NKD'},
 {'TN', 'UB', 'ZB', 'ZF', 'ZN', 'ZT'},
 {'ZM', 'ZS'}]
dict_={'AIGCI': {'AIGCI': 1.0,
  'AUD': 0.3233391012080904,
  'BZ': 0.77450612217810844,
  'CAD': 0.37758495673263409,
  'CHF': 0.1148713675671198,
  'CL': 0.75790671332995785,
  'E7': 0.15824972293693412,
  'EMD': 0.20907406346059357,
  'ES': 0.19658499045886685,
  'EUR': 0.15900870599662253},
 'AUD': {'AIGCI': 0.3233391012080904,
  'AUD': 1.0,
  'BZ': 0.16539566069043321,
  'CAD': 0.56525172934861501,
  'CHF': 0.39333882276815396,
  'CL': 0.16369950005905545,
  'E7': 0.41552240077868813,
  'EMD': 0.20167148908243152,
  'ES': 0.24541480412857969,
  'EUR': 0.41986142158397494},
 'BZ': {'AIGCI': 0.77450612217810844,
  'AUD': 0.16539566069043321,
  'BZ': 1.0,
  'CAD': 0.41187046918391457,
  'CHF': -0.0092838918317396726,
  'CL': 0.97045709275661984,
  'E7': 0.0095197228846883777,
  'EMD': 0.20634087929447745,
  'ES': 0.1923482593409139,
  'EUR': 0.012112114472331318},
 'CAD': {'AIGCI': 0.37758495673263409,
  'AUD': 0.56525172934861501,
  'BZ': 0.41187046918391457,
  'CAD': 1.0,
  'CHF': 0.35191789369432458,
  'CL': 0.40972181454072104,
  'E7': 0.31846852856331664,
  'EMD': 0.28026489729302623,
  'ES': 0.29256826563873206,
  'EUR': 0.32757564057495203},
 'CHF': {'AIGCI': 0.1148713675671198,
  'AUD': 0.39333882276815396,
  'BZ': -0.0092838918317396726,
  'CAD': 0.35191789369432458,
  'CHF': 1.0,
  'CL': 0.012688599148050395,
  'E7': 0.8239125068633365,
  'EMD': -0.13725408324352331,
  'ES': -0.1041381030850365,
  'EUR': 0.82474780532058567},
 'CL': {'AIGCI': 0.75790671332995785,
  'AUD': 0.16369950005905545,
  'BZ': 0.97045709275661984,
  'CAD': 0.40972181454072104,
  'CHF': 0.012688599148050395,
  'CL': 1.0,
  'E7': 0.0073086434159336097,
  'EMD': 0.22554220312864581,
  'ES': 0.20407792352963819,
  'EUR': 0.011629405332006879},
 'E7': {'AIGCI': 0.15824972293693412,
  'AUD': 0.41552240077868813,
  'BZ': 0.0095197228846883777,
  'CAD': 0.31846852856331664,
  'CHF': 0.8239125068633365,
  'CL': 0.0073086434159336097,
  'E7': 1.0,
  'EMD': -0.14561549010272393,
  'ES': -0.10852020039517689,
  'EUR': 0.99165451800731141},
 'EMD': {'AIGCI': 0.20907406346059357,
  'AUD': 0.20167148908243152,
  'BZ': 0.20634087929447745,
  'CAD': 0.28026489729302623,
  'CHF': -0.13725408324352331,
  'CL': 0.22554220312864581,
  'E7': -0.14561549010272393,
  'EMD': 1.0,
  'ES': 0.85791959540783203,
  'EUR': -0.13599101777284797},
 'ES': {'AIGCI': 0.19658499045886685,
  'AUD': 0.24541480412857969,
  'BZ': 0.1923482593409139,
  'CAD': 0.29256826563873206,
  'CHF': -0.1041381030850365,
  'CL': 0.20407792352963819,
  'E7': -0.10852020039517689,
  'EMD': 0.85791959540783203,
  'ES': 1.0,
  'EUR': -0.10635681098349807},
 'EUR': {'AIGCI': 0.15900870599662253,
  'AUD': 0.41986142158397494,
  'BZ': 0.012112114472331318,
  'CAD': 0.32757564057495203,
  'CHF': 0.82474780532058567,
  'CL': 0.011629405332006879,
  'E7': 0.99165451800731141,
  'EMD': -0.13599101777284797,
  'ES': -0.10635681098349807,
  'EUR': 1.0}}

import pandas as pd
matrix=pd.DataFrame(dict_)