def compute_similariy_score(stats, columns, col_name):
    """
    # Uses equality between values in the same position to determine up what % of their cells two columns are identical

    :param stats: The stats extracted up until this point for all columns
    :param columns: All the columns
    :param col_name: The name of the column we should compute the new stats for
    :return: Dictioanry containing:
        similarities: How similar this column is to other columns (with 0 being completely different and 1 being an exact copy).
        similarity_score: A score equal to the highest similarity found, ranges from 1 to 0, where 1 is lowest quality and 0 is highest quality.
    """
    col_data = columns[col_name]
    similarities = []
    for other_col_name in columns.columns:
        if other_col_name == col_name:
            continue
        else:
            similarity = 0
            X1 = list(map(str, col_data))
            X2 = list(map(str, columns[other_col_name]))
            for ii in range(len(X1)):
                if X1[ii] == X2[ii]:
                    similarity += 1
            similarity = similarity / len(X1)
            similarities.append((other_col_name, similarity))
    max_similarity = max(map(lambda x: x[1], similarities))
    most_similar_column_name = list(filter(lambda x: x[1] == max_similarity,
        similarities))[0][0]
    if max_similarity < 0:
        max_similarity = 0
    return {'max_similarity': max_similarity, 'similarities': similarities,
        'similarity_score': round(10 * (1 - max_similarity)),
        'most_similar_column_name': most_similar_column_name,
        'similarity_score_description':
        """
        This score is simple element-wise equality applied between this column and all other column.
        The score * 100 is the number of values which are similar in the column that is most similar to the scored column.
        """
        }
