def operator_create_network(self, method, year, discharge_type):
        folder_path = self.get_operator_folder_path(
            SharedCareAreaScript.TYPE_NETWORK)

        filename = f'{method}_{year}_{discharge_type}'
        filepath = f'{folder_path}/{filename}'

        net = NetworkSharedCare.instance(method)
        dict_match = {
            HospitalDischargeDocument.discharge_year: year,
            HospitalDischargeDocument.discharge_type: discharge_type
        }
        df = net.create_network(dict_match)

        df.to_csv(f'{filepath}.csv', index=False)
        df.to_hdf(f'{filepath}.hdf', key='df')
        G = build_from_dataframe(df)
        write_graph(G, folder=folder_path, filename=filename)
        del G

        dict_network = {
            NetworkHospitalDischargeDocument.network_method.name: method,
            NetworkHospitalDischargeDocument.network_year.name: year,
            NetworkHospitalDischargeDocument.network_type.name: discharge_type
        }
        dao = BaseDAO(NetworkHospitalDischargeDocument)
        dao.delete(**dict_network)
        #
        df = df.rename(
            columns={
                NetworkHospitalDischargeDocument.node_in.db_field:
                NetworkHospitalDischargeDocument.node_in.name,
                NetworkHospitalDischargeDocument.node_out.db_field:
                NetworkHospitalDischargeDocument.node_out.name,
                NetworkHospitalDischargeDocument.weight.db_field:
                NetworkHospitalDischargeDocument.weight.name,
            })
        df[NetworkHospitalDischargeDocument.network_method.name] = method
        df[NetworkHospitalDischargeDocument.network_year.name] = year
        df[NetworkHospitalDischargeDocument.network_type.name] = discharge_type
        # list_objects = list(
        #     map(self.get_object_network, [(dict_network, row) for (index, row) in df.iterrows()]))
        #
        # dao.insert(list_objects)

        dao.init_bulk(max_bulk_insert=100000)
        for (i, d) in df.iterrows():
            # (i, d) = next(df.iterrows())
            o = NetworkHospitalDischargeDocument(**d.to_dict())
            dao.insert_bulk(o)
        dao.exit_bulk()
        del df
    def operator_calculate_network_metrics(self, metric, method, year,
                                           discharge_type):
        dict_match = {
            NetworkHospitalDischargeDocument.network_method: method,
            NetworkHospitalDischargeDocument.network_type: discharge_type,
            NetworkHospitalDischargeDocument.network_year: year
        }
        dict_project = [
            # NetworkHospitalDischargeDocument.network_type,
            # NetworkHospitalDischargeDocument.network_year,
            NetworkHospitalDischargeDocument.node_in,
            NetworkHospitalDischargeDocument.node_out,
            NetworkHospitalDischargeDocument.weight,
        ]
        dao_network = BaseDAO(NetworkHospitalDischargeDocument)
        list_network = dao_network.obtain_pipeline(dict_match=dict_match,
                                                   dict_project=dict_project,
                                                   math_none=False)

        G = nx.Graph()
        G.add_weighted_edges_from((tuple(i.values()) for i in list_network))

        # list_metrics = NetworkMetricFactory.get_types()
        # for metric in list_metrics:
        mod_network_metric = NetworkMetricFactory.instance(metric)
        df_metric = mod_network_metric.get_metric(G)
        df_metric.columns = [
            MetricsNetworkSharedCareAreaDocument.metric_value.name
        ]

        folder_path_out = self.get_operator_folder_path(
            SharedCareAreaScript.TYPE_NETWORK_METRICS)
        filename_out = f'{method}_{year}_{discharge_type}_{metric}'
        filepath_out = f'{folder_path_out}/{filename_out}'
        df_metric.to_csv(f'{filepath_out}.csv', index=False)

        metrics_dict = {
            MetricsNetworkSharedCareAreaDocument.method.name: method,
            MetricsNetworkSharedCareAreaDocument.year.name: year,
            MetricsNetworkSharedCareAreaDocument.type_discharge.name:
            discharge_type,
            MetricsNetworkSharedCareAreaDocument.metric.name: metric,
        }
        list_metrics = list(
            map(self.get_metrics_network_shared_care,
                [(metrics_dict, row)
                 for (index, row) in df_metric.iterrows()]))
        dao_metrics = BaseDAO(MetricsNetworkSharedCareAreaDocument)
        dao_metrics.delete(**metrics_dict)
        dao_metrics.insert(list_metrics)
    def operator_extract_communities(self, method, year, discharge_type,
                                     type_community_detection):
        folder_path_in = self.get_operator_folder_path(
            SharedCareAreaScript.TYPE_NETWORK)
        filename_in = f'{method}_{year}_{discharge_type}'
        filepath_in = f'{folder_path_in}/{filename_in}'

        folder_path_out = self.get_operator_folder_path(
            SharedCareAreaScript.TYPE_COMMUNITIES)
        filename_out = f'{method}_{year}_{discharge_type}_{type_community_detection}'
        filepath_out = f'{folder_path_out}/{filename_out}'

        # exists = os.path.exists(f'{filepath_out}.csv')

        # if exists and not drop:
        #     return

        G = nx.read_pajek(f'{filepath_in}.pajek')
        community_detection = CommunityDetection.build_community_detection(
            type_community_detection)
        df_communities = community_detection.find_communities(
            (G, filepath_in, filename_in))
        df_communities.rename(
            columns={
                SharedCareArea.zcta.db_field: 'NODE_ID',
                SharedCareArea.sca_id.db_field: 'COMMUNITY_ID'
            })

        df_communities.to_csv(f'{filepath_out}.csv', index=False)
        df_communities.to_hdf(f'{filepath_out}.hdf', 'df')

        sca_dict = {
            SharedCareArea.method.name: method,
            SharedCareArea.year.name: year,
            SharedCareArea.type_discharge.name: discharge_type,
            SharedCareArea.type_community_detection.name:
            type_community_detection
        }

        dao = BaseDAO(SharedCareArea)
        dao.delete(**sca_dict)

        list_shared_care_areas = list(
            map(self.get_shared_care,
                [(sca_dict, row)
                 for (index, row) in df_communities.iterrows()]))

        dao.insert(list_shared_care_areas)