Spaces:
Sleeping
Sleeping
| # utils/causal_algorithms.py | |
| import networkx as nx | |
| import pandas as pd | |
| import numpy as np | |
| from causallearn.search.ConstraintBased.PC import pc | |
| # from causallearn.search.ScoreBased.GES import ges # Example import for GES | |
| # from notears import notears_linear # Example import for NOTEARS | |
| class CausalDiscoveryAlgorithms: | |
| def pc_algorithm(self, df, alpha=0.05): | |
| """ | |
| Run PC algorithm to learn causal graph. | |
| Returns a directed graph's adjacency matrix. | |
| Requires numerical data. | |
| """ | |
| data_array = df.to_numpy() | |
| cg = pc(data_array, alpha=alpha, indep_test="fisherz") | |
| adj_matrix = cg.G.graph | |
| return adj_matrix | |
| def ges_algorithm(self, df): | |
| """ | |
| Placeholder for GES (Greedy Equivalence Search) algorithm. | |
| Returns a directed graph's adjacency matrix. | |
| You would implement or integrate the GES algorithm here. | |
| """ | |
| # Example: G, edges = ges(data_array) | |
| # For now, returning a simplified correlation-based graph for demonstration | |
| print("GES algorithm is a placeholder. Using a simplified correlation-based graph.") | |
| G = nx.DiGraph() | |
| nodes = df.columns | |
| G.add_nodes_from(nodes) | |
| corr_matrix = df.corr().abs() | |
| threshold = 0.3 | |
| for i, col1 in enumerate(nodes): | |
| for col2 in nodes[i+1:]: | |
| if corr_matrix.loc[col1, col2] > threshold: | |
| if np.random.rand() > 0.5: | |
| G.add_edge(col1, col2) | |
| else: | |
| G.add_edge(col2, col1) | |
| return nx.to_numpy_array(G) # Convert to adjacency matrix | |
| def notears_algorithm(self, df): | |
| """ | |
| Placeholder for NOTEARS algorithm. | |
| Returns a directed graph's adjacency matrix. | |
| You would implement or integrate the NOTEARS algorithm here. | |
| """ | |
| # Example: W_est = notears_linear(data_array) | |
| print("NOTEARS algorithm is a placeholder. Using a simplified correlation-based graph.") | |
| G = nx.DiGraph() | |
| nodes = df.columns | |
| G.add_nodes_from(nodes) | |
| corr_matrix = df.corr().abs() | |
| threshold = 0.3 | |
| for i, col1 in enumerate(nodes): | |
| for col2 in nodes[i+1:]: | |
| if corr_matrix.loc[col1, col2] > threshold: | |
| if np.random.rand() > 0.5: | |
| G.add_edge(col1, col2) | |
| else: | |
| G.add_edge(col2, col1) | |
| return nx.to_numpy_array(G) # Convert to adjacency matrix |