Source code for marxanconpy.metrics

import numpy
import geopandas as gpd
import pandas
import igraph
import marxanconpy

[docs]def graph2vertexdegree(graph,mode='ALL'): """ Connectivity graph :param graph: igraph formatted graph :param mode: String describing mode (i.e. 'ALL', 'IN', 'OUT") :return: """ vertexdegree = graph.degree(mode=mode) return vertexdegree
[docs]def graph2betweencent(graph): """ Connectivity graph to betweeness centrality :param graph: igraph formatted graph :return: """ betweencent = graph.betweenness() return betweencent
[docs]def graph2eigvectcent(graph): """ Connectivity graph to eigenvector centrality :param graph: igraph formatted graph :return: """ eigvectcent = graph.evcent(weights=graph.es["weight"]) return eigvectcent
[docs]def graph2google(graph): """ Connectivity graph to Google Page Rank :param graph: igraph formatted graph :return: """ eigvectcent = graph.pagerank(weights=graph.es["weight"]) return eigvectcent
[docs]def graph2outflow(graph): """ Connectivity graph to outflow :param graph: igraph formatted graph :return: """ return graph.strength(mode="OUT", loops=False, weights=graph.es["weight"])
[docs]def graph2inflow(graph): """ Connectivity graph to inflow :param graph: igraph formatted graph :return: """ return graph.strength(mode="IN", loops=False, weights=graph.es["weight"])
[docs]def graph2diagonal(graph): """ Connectivity graph to diagonal :param graph: igraph formatted graph :return: """ from_list = numpy.array([x[0] for x in graph.get_edgelist()]) to_list = numpy.array([x[1] for x in graph.get_edgelist()]) loops = from_list == to_list IDs = numpy.unique(numpy.concatenate((numpy.unique(from_list), numpy.unique(to_list)))) diag = numpy.repeat(0., len(IDs)) for i in from_list[loops]: diag[IDs == i] = numpy.array(graph.es["weight"])[(from_list == i) & (to_list == i)] return diag
[docs]def get_intersect_id(area_filepath, pu_filepath,pu_id='ID'): """ :param area_filepath: :param pu_filepath: :param pu_id: :return: """ area = gpd.GeoDataFrame.from_file(area_filepath) pu = gpd.GeoDataFrame.from_file(pu_filepath) if pu.crs!=area.crs: area_proj = marxanconpy.spatial.get_appropriate_projection(pu, 'area') area = area.to_crs(area_proj) pu = pu.to_crs(area_proj) area_id = () for index, arearow in area.iterrows(): for index, purow in pu.iterrows(): if purow.geometry.intersects(arearow.geometry): area_id = area_id + (purow[pu_id],) break return area_id
[docs]def graph2recipients(graph, area_filepath, pu_filepath, pu_id='ID',inverse=False): """ Connectivity graph to recipients :param graph: igraph formatted graph :param area_filepath: :param pu_filepath: :param pu_id: :param inverse: :return: """ area_id = get_intersect_id(area_filepath, pu_filepath, pu_id) recipients = numpy.array(graph.strength(area_id,mode="IN", loops=False, weights=graph.es["weight"])) if inverse: return max(recipients)-recipients else: return recipients
[docs]def graph2donors(graph, area_filepath, pu_filepath, pu_id='ID',inverse=False): """ Connectivity graph to donors :param graph: igraph formatted graph :param area_filepath: :param pu_filepath: :param pu_id: :param inverse: :return: """ area_id = get_intersect_id(area_filepath, pu_filepath, pu_id) donors = numpy.array(graph.strength(area_id, mode="OUT", loops=False, weights=graph.es["weight"])) if inverse: return max(donors)-donors else: return donors
[docs]def graph2connboundary(graph): """ Connectivity graph to spatial dependency :param graph: igraph formatted graph :return: """ id1 = numpy.array([x[0] for x in graph.get_edgelist()]) id2 = numpy.array([x[1] for x in graph.get_edgelist()]) boundary = graph.es["weight"] boundary_dat = pandas.DataFrame(data={"id1": id1, "id2": id2, "boundary": boundary}).to_json(orient='split') return boundary_dat
[docs]def graphtime2temp_conn_cov(graph_time, fa_filepath, pu_filepath): """ Connectivity graph with time to temporal connectivity covariance :param graph_time: :param fa_filepath: :param pu_filepath: :return: """ fa = gpd.GeoDataFrame.from_file(fa_filepath) pu = gpd.GeoDataFrame.from_file(pu_filepath) fa_id = () for index, farow in fa.iterrows(): for index, purow in pu.iterrows(): if purow.geometry.intersects(farow.geometry): fa_id = fa_id + (purow.ID,) break if any([fid in graph_time.id2.unique().tolist() for fid in fa_id]): cov_list = [] for fa1 in fa_id: for fa2 in fa_id: if not fa1 == fa2: con_fa = graph_time.value[(graph_time.id1 == fa1) & (graph_time.id2 == fa2)] for id1 in fa_id: for id2 in graph_time.id2.unique(): if not id1 == id2: cov = \ numpy.cov(con_fa, graph_time.value[(graph_time.id1 == id1) & (graph_time.id2 == id2)])[0, 1] cov_list.append({'id2': id2, 'cov': cov}) cov_list = pandas.DataFrame.from_dict(cov_list) score = -cov_list.groupby('id2').sum() return score['cov'].tolist() else: return [0] * len(graph_time.id2.unique())