diff --git a/src/aki_prj23_transparenzregister/utils/networkx/archive/Dev.ipynb b/Jupyter/NetworkX/archive/Dev.ipynb similarity index 100% rename from src/aki_prj23_transparenzregister/utils/networkx/archive/Dev.ipynb rename to Jupyter/NetworkX/archive/Dev.ipynb diff --git a/src/aki_prj23_transparenzregister/utils/networkx/archive/networkX_with_sql.ipynb b/Jupyter/NetworkX/archive/networkX_with_sql.ipynb similarity index 100% rename from src/aki_prj23_transparenzregister/utils/networkx/archive/networkX_with_sql.ipynb rename to Jupyter/NetworkX/archive/networkX_with_sql.ipynb diff --git a/src/aki_prj23_transparenzregister/utils/networkx/archive/network_graph.html b/Jupyter/NetworkX/archive/network_graph.html similarity index 100% rename from src/aki_prj23_transparenzregister/utils/networkx/archive/network_graph.html rename to Jupyter/NetworkX/archive/network_graph.html diff --git a/src/aki_prj23_transparenzregister/utils/networkx/archive/sql_alchemy_to_networkx.ipynb b/Jupyter/NetworkX/archive/sql_alchemy_to_networkx.ipynb similarity index 100% rename from src/aki_prj23_transparenzregister/utils/networkx/archive/sql_alchemy_to_networkx.ipynb rename to Jupyter/NetworkX/archive/sql_alchemy_to_networkx.ipynb diff --git a/src/aki_prj23_transparenzregister/utils/networkx/archive/sql_alchemy_to_networkx_v2.ipynb b/Jupyter/NetworkX/archive/sql_alchemy_to_networkx_v2.ipynb similarity index 100% rename from src/aki_prj23_transparenzregister/utils/networkx/archive/sql_alchemy_to_networkx_v2.ipynb rename to Jupyter/NetworkX/archive/sql_alchemy_to_networkx_v2.ipynb diff --git a/src/aki_prj23_transparenzregister/utils/networkx/archive/tmp.html b/Jupyter/NetworkX/archive/tmp.html similarity index 100% rename from src/aki_prj23_transparenzregister/utils/networkx/archive/tmp.html rename to Jupyter/NetworkX/archive/tmp.html diff --git a/src/aki_prj23_transparenzregister/ui/assets/network_graph.html b/Jupyter/NetworkX/archive_prod/network_graph.html similarity index 99% rename from src/aki_prj23_transparenzregister/ui/assets/network_graph.html rename to Jupyter/NetworkX/archive_prod/network_graph.html index 1ec428f..8bbb03e 100644 --- a/src/aki_prj23_transparenzregister/ui/assets/network_graph.html +++ b/Jupyter/NetworkX/archive_prod/network_graph.html @@ -1,272 +1,272 @@ - - - - - - - - - -
-

-
- - - - - - -
-

-
- - - - - -
- - -
-
- - -
-
-
0%
-
-
-
-
-
- - -
- - - - - \ No newline at end of file + + + + + + + + + +
+

+
+ + + + + + +
+

+
+ + + + + +
+ + +
+
+ + +
+
+
0%
+
+
+
+
+
+ + +
+ + + + + diff --git a/src/aki_prj23_transparenzregister/ui/archive/networkx_dash.py b/Jupyter/NetworkX/archive_prod/networkx_dash.py similarity index 100% rename from src/aki_prj23_transparenzregister/ui/archive/networkx_dash.py rename to Jupyter/NetworkX/archive_prod/networkx_dash.py diff --git a/src/aki_prj23_transparenzregister/ui/archive/networkx_dash_overall.py b/Jupyter/NetworkX/archive_prod/networkx_dash_overall.py similarity index 100% rename from src/aki_prj23_transparenzregister/ui/archive/networkx_dash_overall.py rename to Jupyter/NetworkX/archive_prod/networkx_dash_overall.py diff --git a/src/aki_prj23_transparenzregister/ui/archive/ui_elements.py b/Jupyter/NetworkX/archive_prod/ui_elements.py similarity index 100% rename from src/aki_prj23_transparenzregister/ui/archive/ui_elements.py rename to Jupyter/NetworkX/archive_prod/ui_elements.py diff --git a/src/aki_prj23_transparenzregister/utils/networkx/network_2d.py b/src/aki_prj23_transparenzregister/utils/networkx/network_2d.py index 9916cc3..ada0528 100644 --- a/src/aki_prj23_transparenzregister/utils/networkx/network_2d.py +++ b/src/aki_prj23_transparenzregister/utils/networkx/network_2d.py @@ -45,11 +45,11 @@ def create_2d_graph( # noqa PLR0913 # pos = nx.planar_layout(graph) case "Random": pos = nx.random_layout(graph) - case "Shell only 2D)": + case "(Shell only 2D)": pos = nx.shell_layout(graph) # case "Spectral": # pos = nx.spectral_layout(graph) - case "Spiral only 2D)": + case "(Spiral only 2D)": pos = nx.spiral_layout(graph) # case "Multipartite": # pos = nx.multipartite_layout(graph) diff --git a/src/aki_prj23_transparenzregister/utils/networkx/network_base.py b/src/aki_prj23_transparenzregister/utils/networkx/network_base.py index 01ec5b3..bf7b29a 100644 --- a/src/aki_prj23_transparenzregister/utils/networkx/network_base.py +++ b/src/aki_prj23_transparenzregister/utils/networkx/network_base.py @@ -22,20 +22,28 @@ def initialize_network(edges: list, nodes: dict) -> tuple[nx.Graph, pd.DataFrame # update node attributes from dataframe nx.set_node_attributes(graph, nodes) - + # Create a DataFrame with all Metrics # Create a DataFrame with all Metrics metrics = pd.DataFrame( - { - "eigenvector": nx.eigenvector_centrality(graph).values(), - "degree": nx.degree_centrality(graph).values(), - "betweenness": nx.betweenness_centrality(graph).values(), - "closeness": nx.closeness_centrality(graph).values(), - "pagerank": nx.pagerank(graph).values(), - "category": nx.get_node_attributes(graph, "type").values(), - "designation": nx.get_node_attributes(graph, "name").values(), - "id": nx.get_node_attributes(graph, "id").values(), - } - ).T + columns=[ + "eigenvector", + "degree", + "betweenness", + "closeness", + "pagerank", + "category", + "designation", + "id", + ] + ) + metrics["eigenvector"] = nx.eigenvector_centrality(graph).values() + metrics["degree"] = nx.degree_centrality(graph).values() + metrics["betweenness"] = nx.betweenness_centrality(graph).values() + metrics["closeness"] = nx.closeness_centrality(graph).values() + metrics["pagerank"] = nx.pagerank(graph).values() + metrics["category"] = nx.get_node_attributes(graph, "type").values() + metrics["designation"] = nx.get_node_attributes(graph, "name").values() + metrics["id"] = nx.get_node_attributes(graph, "id").values() return graph, metrics @@ -64,7 +72,7 @@ def initialize_network_with_reduced_metrics( # Create a DataFrame with all Metrics metrics = pd.DataFrame( - columns=["degree", "eigenvector", "betweenness", "closeness", "pagerank"] + columns=["degree", "betweenness", "closeness", "category", "designation", "id"] ) # metrics["eigenvector"] = nx.eigenvector_centrality(graph).values() metrics["degree"] = nx.degree_centrality(graph).values() diff --git a/src/aki_prj23_transparenzregister/utils/networkx/networkx_data.py b/src/aki_prj23_transparenzregister/utils/networkx/networkx_data.py index 2653b7d..1071d1b 100644 --- a/src/aki_prj23_transparenzregister/utils/networkx/networkx_data.py +++ b/src/aki_prj23_transparenzregister/utils/networkx/networkx_data.py @@ -63,24 +63,6 @@ def find_all_company_relations() -> pd.DataFrame: return companies_relations_df -def find_top_companies() -> pd.DataFrame: - """_summary_. - - Returns: - pd.DataFrame: _description_ - """ - session = SessionHandler.session - assert session # noqa: S101 - query_companies = session.query(entities.Company) # .all() - - companies_df: pd.DataFrame = pd.read_sql(str(query_companies), session.bind) # type: ignore - companies_df = companies_df.head() - companies_df = companies_df[["company_name"]] - companies_df["Platzierung"] = [1, 2, 3, 4, 5] - companies_df["Umsatz M€"] = [1, 2, 3, 4, 5] - return companies_df[["Platzierung", "company_name", "Umsatz M€"]] - - def get_all_company_relations() -> pd.DataFrame: """This Methods makes a Database Request for all Companies and their relations, modifies the ID Column and returns the Result as an DataFrame. @@ -380,7 +362,7 @@ def create_edge_and_node_list_for_company( return nodes, edges -def get_all_metrics_from_id(company_id: int) -> pd.Series: +def get_all_metrics_from_id(company_id: str) -> pd.Series: """Returns all Metric for the given ID. Args: diff --git a/tests/ui/networkx_dash_test.py b/tests/ui/networkx_dash_test.py deleted file mode 100644 index 8264166..0000000 --- a/tests/ui/networkx_dash_test.py +++ /dev/null @@ -1,7 +0,0 @@ -"""Test for the NetworkX Component.""" -from aki_prj23_transparenzregister.ui.archive import networkx_dash - - -def network_graph(edges: None) -> None: - """Checks if an import co company_stats_dash can be made.""" - assert networkx_dash is not None diff --git a/tests/utils/networkx/network_2d_test.py b/tests/utils/networkx/network_2d_test.py index 58f1d1a..e752ad5 100644 --- a/tests/utils/networkx/network_2d_test.py +++ b/tests/utils/networkx/network_2d_test.py @@ -2,15 +2,21 @@ import datetime from collections.abc import Generator -import networkx as nx -import pandas as pd +import plotly.graph_objects as go import pytest from sqlalchemy.orm import Session from aki_prj23_transparenzregister.ui.session_handler import SessionHandler +from aki_prj23_transparenzregister.utils.networkx import network_2d +from aki_prj23_transparenzregister.utils.networkx.network_2d import create_2d_graph from aki_prj23_transparenzregister.utils.networkx.network_base import initialize_network +def test_import() -> None: + """Checks if an import co company_stats_dash can be made.""" + assert network_2d is not None + + @pytest.fixture(autouse=True) def _set_session(full_db: Session) -> Generator[None, None, None]: """Sets a session for the dash application to be used.""" @@ -19,32 +25,79 @@ def _set_session(full_db: Session) -> Generator[None, None, None]: SessionHandler.session = None -def test_initialize_network() -> None: +def test_create_2d_graph() -> None: + """Tests the creation of a 2D Graph.""" edges: list = [ {"from": "p_545", "to": "c_53", "type": "HAFTENDER_GESELLSCHAFTER"}, {"from": "c_53", "to": "p_545", "type": "HAFTENDER_GESELLSCHAFTER"}, + {"from": "c_1", "to": "c_2", "type": "HAFTENDER_GESELLSCHAFTER"}, + {"from": "c_53", "to": "c_1", "type": "HAFTENDER_GESELLSCHAFTER"}, ] nodes: dict = { "c_53": { "id": "c_53", "name": "1. Freiburger Solarfonds Beteiligungs-KG", + "type": "company", "color": "blue", }, "p_545": { "id": "p_545", - "firstname": "Jürgen", - "lastname": "Wetzel", + "name": "Wetzel, Jürgen", + "type": "person", "date_of_birth": datetime.date(1962, 11, 15), "color": "red", }, + "c_1": { + "id": "c_1", + "name": "Musterfirma", + "type": "company", + "color": "blue", + }, + "c_2": { + "id": "c_2", + "name": "Firma 1", + "type": "company", + "color": "blue", + }, } graph, metrics = initialize_network(edges=edges, nodes=nodes) - assert type(graph) is nx.Graph - assert type(metrics) is pd.DataFrame - # assert list(metrics.columns) == [ - # "degree", - # "eigenvector", - # "betweeness", - # "closeness", - # "pagerank", - # ] + metric = "None" + layout = "Spring" + edge_annotation = False + edge_thickness = 1 + figure = create_2d_graph( + graph, nodes, edges, metrics, metric, layout, edge_annotation, edge_thickness + ) + assert type(figure) is go.Figure + + metric = "degree" + layout = "Circular" + figure = create_2d_graph( + graph, nodes, edges, metrics, metric, layout, edge_annotation, edge_thickness + ) + assert type(figure) is go.Figure + + edge_annotation = True + layout = "Kamada Kawai" + figure = create_2d_graph( + graph, nodes, edges, metrics, metric, layout, edge_annotation, edge_thickness + ) + assert type(figure) is go.Figure + + layout = "Random" + figure = create_2d_graph( + graph, nodes, edges, metrics, metric, layout, edge_annotation, edge_thickness + ) + assert type(figure) is go.Figure + + layout = "Shell (only 2D)" + figure = create_2d_graph( + graph, nodes, edges, metrics, metric, layout, edge_annotation, edge_thickness + ) + assert type(figure) is go.Figure + + layout = "Spiral (only 2D)" + figure = create_2d_graph( + graph, nodes, edges, metrics, metric, layout, edge_annotation, edge_thickness + ) + assert type(figure) is go.Figure diff --git a/tests/utils/networkx/network_3d_test.py b/tests/utils/networkx/network_3d_test.py index 0713c80..5299083 100644 --- a/tests/utils/networkx/network_3d_test.py +++ b/tests/utils/networkx/network_3d_test.py @@ -1,38 +1,79 @@ """Test the initialize Network function.""" import datetime -import networkx as nx -import pandas as pd +import plotly.graph_objects as go +from aki_prj23_transparenzregister.utils.networkx import network_3d +from aki_prj23_transparenzregister.utils.networkx.network_3d import create_3d_graph from aki_prj23_transparenzregister.utils.networkx.network_base import initialize_network -def test_initialize_network() -> None: +def test_import() -> None: + """Checks if an import co company_stats_dash can be made.""" + assert network_3d is not None + + +def test_create_3d_graph() -> None: + """Tests the creation of a 3D Graph.""" edges: list = [ {"from": "p_545", "to": "c_53", "type": "HAFTENDER_GESELLSCHAFTER"}, {"from": "c_53", "to": "p_545", "type": "HAFTENDER_GESELLSCHAFTER"}, + {"from": "c_1", "to": "c_2", "type": "HAFTENDER_GESELLSCHAFTER"}, + {"from": "c_53", "to": "c_1", "type": "HAFTENDER_GESELLSCHAFTER"}, ] nodes: dict = { "c_53": { "id": "c_53", "name": "1. Freiburger Solarfonds Beteiligungs-KG", + "type": "company", "color": "blue", }, "p_545": { "id": "p_545", - "firstname": "Jürgen", - "lastname": "Wetzel", + "name": "Wetzel, Jürgen", + "type": "person", "date_of_birth": datetime.date(1962, 11, 15), "color": "red", }, + "c_1": { + "id": "c_1", + "name": "Musterfirma", + "type": "company", + "color": "blue", + }, + "c_2": { + "id": "c_2", + "name": "Firma 1", + "type": "company", + "color": "blue", + }, } graph, metrics = initialize_network(edges=edges, nodes=nodes) - assert type(graph) is nx.Graph - assert type(metrics) is pd.DataFrame - # assert list(metrics.columns) == [ - # "degree", - # "eigenvector", - # "betweeness", - # "closeness", - # "pagerank", - # ] + metric = "None" + layout = "Spring" + edge_annotation = False + edge_thickness = 1 + figure = create_3d_graph( + graph, nodes, edges, metrics, metric, layout, edge_annotation, edge_thickness + ) + assert type(figure) is go.Figure + + metric = "degree" + layout = "Circular" + figure = create_3d_graph( + graph, nodes, edges, metrics, metric, layout, edge_annotation, edge_thickness + ) + assert type(figure) is go.Figure + + edge_annotation = True + layout = "Kamada Kawai" + figure = create_3d_graph( + graph, nodes, edges, metrics, metric, layout, edge_annotation, edge_thickness + ) + assert type(figure) is go.Figure + + layout = "Random" + figure = create_3d_graph( + graph, nodes, edges, metrics, metric, layout, edge_annotation, edge_thickness + ) + assert type(figure) is go.Figure diff --git a/tests/utils/networkx/network_base_test.py b/tests/utils/networkx/network_base_test.py index 9fb3e6f..3837fe9 100644 --- a/tests/utils/networkx/network_base_test.py +++ b/tests/utils/networkx/network_base_test.py @@ -3,38 +3,83 @@ import datetime import networkx as nx import pandas as pd -import pytest -from aki_prj23_transparenzregister.utils.networkx.network_base import initialize_network +from aki_prj23_transparenzregister.utils.networkx import network_base +from aki_prj23_transparenzregister.utils.networkx.network_base import ( + initialize_network, + initialize_network_with_reduced_metrics, + initialize_network_without_metrics, +) + + +def test_import() -> None: + """Checks if an import co company_stats_dash can be made.""" + assert network_base is not None -@pytest.mark.tim() def test_initialize_network() -> None: edges: list = [ {"from": "p_545", "to": "c_53", "type": "HAFTENDER_GESELLSCHAFTER"}, {"from": "c_53", "to": "p_545", "type": "HAFTENDER_GESELLSCHAFTER"}, + {"from": "c_1", "to": "c_2", "type": "HAFTENDER_GESELLSCHAFTER"}, + {"from": "c_53", "to": "c_1", "type": "HAFTENDER_GESELLSCHAFTER"}, ] nodes: dict = { "c_53": { "id": "c_53", "name": "1. Freiburger Solarfonds Beteiligungs-KG", + "type": "company", "color": "blue", }, "p_545": { "id": "p_545", - "firstname": "Jürgen", - "lastname": "Wetzel", + "name": "Wetzel, Jürgen", + "type": "person", "date_of_birth": datetime.date(1962, 11, 15), "color": "red", }, + "c_1": { + "id": "c_1", + "name": "Musterfirma", + "type": "company", + "color": "blue", + }, + "c_2": { + "id": "c_2", + "name": "Firma 1", + "type": "company", + "color": "blur", + }, } + # print(len(edges)) + # print(len(nodes)) graph, metrics = initialize_network(edges=edges, nodes=nodes) assert isinstance(graph, nx.Graph) assert isinstance(metrics, pd.DataFrame) - # assert list(metrics.columns) == [ - # "degree", - # "eigenvector", - # "betweeness", - # "closeness", - # "pagerank", - # ] + assert list(metrics.columns) == [ + "eigenvector", + "degree", + "betweenness", + "closeness", + "pagerank", + "category", + "designation", + "id", + ] + + graph_reduced, metrics_reduced = initialize_network_with_reduced_metrics( + edges=edges, nodes=nodes + ) + assert isinstance(graph_reduced, nx.Graph) + assert isinstance(metrics_reduced, pd.DataFrame) + assert list(metrics_reduced.columns) == [ + "degree", + "betweenness", + "closeness", + "category", + "designation", + "id", + ] + + graph = initialize_network_without_metrics(edges=edges, nodes=nodes) + assert isinstance(graph_reduced, nx.Graph) diff --git a/tests/utils/networkx/networkx_data_test.py b/tests/utils/networkx/networkx_data_test.py index 15baef9..ff928c4 100644 --- a/tests/utils/networkx/networkx_data_test.py +++ b/tests/utils/networkx/networkx_data_test.py @@ -1,37 +1,150 @@ """Test the initialize Network function.""" -import datetime +from collections.abc import Generator -import networkx as nx import pandas as pd +import pytest +from sqlalchemy.orm import Session -from aki_prj23_transparenzregister.utils.networkx.network_base import initialize_network +from aki_prj23_transparenzregister.ui.session_handler import SessionHandler +from aki_prj23_transparenzregister.utils.networkx import networkx_data +from aki_prj23_transparenzregister.utils.networkx.networkx_data import ( + create_edge_and_node_list, + create_edge_and_node_list_for_company, + filter_relation_type, + filter_relation_with_more_than_one_connection, + find_all_company_relations, + find_company_relations, + get_all_company_relations, + get_all_person_relations, +) -def test_initialize_network() -> None: - edges: list = [ - {"from": "p_545", "to": "c_53", "type": "HAFTENDER_GESELLSCHAFTER"}, - {"from": "c_53", "to": "p_545", "type": "HAFTENDER_GESELLSCHAFTER"}, - ] - nodes: dict = { - "c_53": { - "id": "c_53", - "name": "1. Freiburger Solarfonds Beteiligungs-KG", - "color": "blue", - }, - "p_545": { - "id": "p_545", - "name": "Jürgen Wenzel", - "date_of_birth": datetime.date(1962, 11, 15), - "color": "red", - }, - } - graph, metrics = initialize_network(edges=edges, nodes=nodes) - assert type(graph) is nx.Graph - assert type(metrics) is pd.DataFrame - # assert list(metrics.columns) == [ - # "degree", - # "eigenvector", - # "betweeness", - # "closeness", - # "pagerank", - # ] +@pytest.fixture(autouse=True) +def _set_session(full_db: Session) -> Generator[None, None, None]: + """Sets a session for the dash application to be used.""" + SessionHandler.session = full_db + yield + SessionHandler.session = None + + +def test_import() -> None: + """Checks if an import co company_stats_dash can be made.""" + assert networkx_data is not None + + +# def test_initialize_network() -> None: +# edges: list = [ +# {"from": "p_545", "to": "c_53", "type": "HAFTENDER_GESELLSCHAFTER"}, +# {"from": "c_53", "to": "p_545", "type": "HAFTENDER_GESELLSCHAFTER"}, +# {"from": "c_1", "to": "c_2", "type": "HAFTENDER_GESELLSCHAFTER"}, +# {"from": "c_53", "to": "c_1", "type": "HAFTENDER_GESELLSCHAFTER"}, +# ] +# nodes: dict = { +# "c_53": { +# "id": "c_53", +# "name": "1. Freiburger Solarfonds Beteiligungs-KG", +# "type": "company", +# "color": "blue", +# }, +# "p_545": { +# "id": "p_545", +# "name": "Wetzel, Jürgen", +# "type": "person", +# "date_of_birth": datetime.date(1962, 11, 15), +# "color": "red", +# }, +# "c_1": { +# "id": "c_1", +# "name": "Musterfirma", +# "type": "company", +# "color": "blue", +# }, +# "c_2": { +# "id": "c_2", +# "name": "Firma 1", +# "type": "company", +# "color": "blur", +# }, +# } + + +def test_find_all_company_relations() -> None: + """This Test methods tests if the correct type is returned for the corresponding Function.""" + company_relations_df = find_all_company_relations() + assert type(company_relations_df) is pd.DataFrame + + +def test_get_all_company_relations() -> None: + """This Test methods tests if the correct type is returned for the corresponding Function.""" + company_relations_df = get_all_company_relations() + assert type(company_relations_df) is pd.DataFrame + + +def test_get_all_person_relations() -> None: + """This Test methods tests if the correct type is returned for the corresponding Function.""" + company_relations_df = get_all_person_relations() + assert type(company_relations_df) is pd.DataFrame + + +def test_filter_relation_type() -> None: + """This Test methods tests if the correct type is returned for the corresponding Function.""" + relation_dataframe = get_all_company_relations() + selected_relation_type = "HAFTENDER_GESELLSCHAFTER" + company_relations_df = filter_relation_type( + relation_dataframe, selected_relation_type + ) + assert type(company_relations_df) is pd.DataFrame + + +def test_filter_relation_with_more_than_one_connection() -> None: + """This Test methods tests if the correct type is returned for the corresponding Function.""" + relation_dataframe = get_all_company_relations() + id_column_name_to = "c_1" + id_column_name_from = "c_2" + relations_df = filter_relation_with_more_than_one_connection( + relation_dataframe, id_column_name_to, id_column_name_from + ) + assert type(relations_df) is pd.DataFrame + + +def test_create_edge_and_node_list() -> None: + """This Test methods tests if the correct type is returned for the corresponding Function.""" + person_df = get_all_person_relations() + company_df = get_all_company_relations() + nodes, edges = create_edge_and_node_list(person_df, company_df) + assert isinstance(nodes, dict) + assert isinstance(edges, list) + + +def test_find_company_relations() -> None: + """This Test methods tests if the correct type is returned for the corresponding Function.""" + selected_company_id = 1 + company_relations_df, person_df = find_company_relations(selected_company_id) + assert type(company_relations_df) is pd.DataFrame + assert type(person_df) is pd.DataFrame + + +def test_create_edge_and_node_list_for_company() -> None: + """This Test methods tests if the correct type is returned for the corresponding Function.""" + company_relations = get_all_company_relations() + nodes, edges = create_edge_and_node_list_for_company(company_relations) + assert isinstance(nodes, dict) + assert isinstance(edges, list) + + +# @pytest.mark.tim() +# def test_get_all_metrics_from_id() -> None: +# """This Test methods tests if the correct type is returned for the corresponding Function.""" +# company_id = 2549 +# metrics = get_all_metrics_from_id(company_id) +# assert type(metrics) is pd.Series + +# @pytest.mark.tim() +# def test_get_relations_number_from_id() -> None: +# """This Test methods tests if the correct type and number of relations is received.""" +# # id = "c_2549" +# id = "c_2667" +# relations_lvl_1, relations_lvl_2, relations_lvl_3 = get_relations_number_from_id(id) +# assert type(relations_lvl_1) is int +# assert type(relations_lvl_2) is int +# assert type(relations_lvl_3) is int