def get_tpr_fpr_opt(guesses_needed, guesses_made, len_df):
    """
    Called by loanpy.sanity.postprocess2. \
    Get the true positive rate, the false positive rate and the optimum.

    :param guesses_needed: This is the column "guesses" in adrc_obj.dfety, \
    as it is calculated by loanpy.sanity.loop_thru_data.
    :type guesses_needed: pandas.core.series.Series | list | iterable \
    of float | int

    :param guesses_made: Value passed on to param \
    <guesslist> in loanpy.sanity.eval_all.
    :type guesses_made: pandas.core.series.Series | list | iterable \
    of float | int

    :param len_df: The length of the first two params passed.
    :type len_df: int

    :returns: A tuple of the true positive rate, as a list, \
    the false positive rate as a list (i.e. "if this many guesses were \
    made, this many words were correctly predicted in total"), and the \
    optimum, which in turn is again a tuple of the \
    lowest possible difference between \
    each point of the true positive rate and the false positive rate \
    (they are both percentages, so subtraction makes sense), the given \
    point of the true positive rate and the given point of the false positive \
    rate.
    :rtype: tuple of (list of int, list of int, tuple of (int, int, int))

    :Example:

    >>> from loanpy.sanity import get_tpr_fpr_opt
    >>> gn = [10, None, 20, 4, 17, None, None, 8, 9, 120]
    >>> gm = [1, 3, 5, 7, 9, 99, 999]
    >>> get_tpr_fpr_opt(\
guesses_needed=gn, \
guesses_made=gm, \
len_df=10)
    ([0.0, 0.0, 0.1, 0.1, 0.3, 0.6, 0.7],
    [0.001, 0.003, 0.005, 0.007, 0.009, 0.099, 1.0],
    (0.501, 0.6, 0.099))
    """
# keep only rows that are guess or lower = the correctly
# identified ones in the given round
# divide that number by the max amount of true positives
# -> e.g. 10/119 were correct if 100 guesses were made
    tpr, fpr = [], []
    for guess in guesses_made:  # loop through fpr
        tpr.append(round(len([
                                i for i in guesses_needed
                                if i and i <= guess])/len_df, 3))
        # how much of a fraction of the max amount of guess is our current fpr
        # e.g. 2K out out 10K would be 0.2 = 20%
        fpr.append(round(guess/(guesses_made[-1]), 3))

    # I'm gleb to see you
    # https://www.youtube.com/watch?v=jl7bMLf-f9A
    optimum = max([(tp-guess, tp, guess) for tp, guess in zip(tpr, fpr)])

    return tpr, fpr, optimum