import pandas as pd import numpy as np from scipy.sparse import csr_matrix, lil_matrix import streamlit as st """ def calc_matches(filtered_df, project_df, similarity_matrix, top_x): # matching project2 can be any project # indecies (rows) = project1 # columns = project2 # -> find matches # filter out all row considering the filter filtered_df_indecies_list = filtered_df.index project_df_indecies_list = project_df.index np.fill_diagonal(similarity_matrix, 0) match_matrix = similarity_matrix[filtered_df_indecies_list, :][:, project_df_indecies_list] best_matches_list = np.argsort(match_matrix, axis=None) if len(best_matches_list) < top_x: top_x = len(best_matches_list) # get row (project1) and column (project2) with highest similarity in filtered df top_indices = np.unravel_index(best_matches_list[-top_x:], match_matrix.shape) # get the corresponding similarity values top_values = match_matrix[top_indices] p1_df = filtered_df.iloc[top_indices[0]] p1_df["similarity"] = top_values p2_df = project_df.iloc[top_indices[1]] p2_df["similarity"] = top_values return p1_df, p2_df """ # multi_project_matching def calc_matches(filtered_df, project_df, similarity_matrix, top_x): st.write(filtered_df.shape) st.write(project_df.shape) st.write(similarity_matrix.shape) # Ensure the matrix is in a suitable format for manipulation if not isinstance(similarity_matrix, csr_matrix): similarity_matrix = csr_matrix(similarity_matrix) # Get indices from dataframes filtered_df_indices = filtered_df.index.to_list() project_df_indices = project_df.index.to_list() # Create mapping dictionaries filtered_df_index_map = {index: i for i, index in enumerate(filtered_df_indices)} project_df_index_map = {index: i for i, index in enumerate(project_df_indices)} st.write(filtered_df_index_map) # Select submatrix based on indices from both dataframes match_matrix = similarity_matrix[filtered_df_indices, :][:, project_df_indices] st.write(match_matrix.shape) # Get the linear indices of the top 'top_x' values # (flattened index to handle the sparse matrix more effectively) linear_indices = np.argsort(match_matrix.data)[-top_x:] if len(linear_indices) < top_x: top_x = len(linear_indices) # Convert flat indices to 2D indices using the shape of the submatrix top_indices = np.unravel_index(linear_indices, match_matrix.shape) # Get the corresponding similarity values top_values = match_matrix.data[linear_indices] top_filtered_df_indices = [filtered_df_index_map[i] for i in top_indices[0]] top_project_df_indices = [project_df_index_map[i] for i in top_indices[1]] st.write(top_filtered_df_indices) # Create resulting dataframes with top matches and their similarity scores st.write(top_indices) p1_df = filtered_df.loc[top_filtered_df_indices].copy() p1_df['similarity'] = top_values st.dataframe(p1_df) p2_df = project_df.loc[top_project_df_indices].copy() p2_df['similarity'] = top_values st.dataframe(p2_df) print("finished calc matches") return p1_df, p2_df