def expression_ddcq(sample_frame, ref_target, ref_sample):
    """Calculates expression of samples in a sample data frame relative to a
    single reference gene and reference sample using the ∆∆Cq method.

    For best results, the ref_sample should be defined for all targets and the
    ref_target should be defined for all samples, or else the series you get
    back will have lots of NaNs.
    
    :param DataFrame sample_frame: A sample data frame.
    :param string ref_target: A string matching an entry of the Target column;
        the target to use as the reference target (e.g. 'Gapdh')
    :param string ref_sample: A string matching an entry of the Sample column.
    :return: a Series of expression values for each row of the sample data
        frame.
    :rtype: Series
    """
    # It might be more correct to replace asarray calls (to discard indexes)
    # with proper joins.
  
    ref_target_df = sample_frame.ix[sample_frame['Target'] == ref_target, ['Sample', 'Cq']]
    ref_target_grouped = ref_target_df.groupby('Sample')
    ref_target_mean_by_sample = ref_target_grouped['Cq'].aggregate(average_cq)
    ref_target_mean_list = ref_target_mean_by_sample.ix[sample_frame['Sample']]
    ref_target_delta = asarray(ref_target_mean_list - ref_target_mean_by_sample[ref_sample])

    ref_sample_df = sample_frame.ix[sample_frame['Sample'] == ref_sample, ['Target', 'Cq']]
    ref_sample_grouped = ref_sample_df.groupby('Target')
    ref_sample_mean_by_target = ref_sample_grouped['Cq'].aggregate(average_cq)
    ref_sample_delta = asarray(sample_frame['Cq'] - asarray(ref_sample_mean_by_target.ix[sample_frame['Target']]))

    rel_exp = pd.Series(
            power(2, ref_target_delta - ref_sample_delta),
            index = sample_frame.index)

    return rel_exp
def expression_ddcq ( sample_frame , ref_target , ref_sample ) : ref_target_df = sample_frame . ix [ sample_frame [ 'Target' ] == ref_target , [ 'Sample' , 'Cq' ] ] ref_target_grouped = ref_target_df . groupby ( 'Sample' ) ref_target_mean_by_sample = ref_target_grouped [ 'Cq' ] . aggregate ( average_cq ) ref_target_mean_list = ref_target_mean_by_sample . ix [ sample_frame [ 'Sample' ] ] ref_target_delta = asarray ( ref_target_mean_list - ref_target_mean_by_sample [ ref_sample ] ) ref_sample_df = sample_frame . ix [ sample_frame [ 'Sample' ] == ref_sample , [ 'Target' , 'Cq' ] ] ref_sample_grouped = ref_sample_df . groupby ( 'Target' ) ref_sample_mean_by_target = ref_sample_grouped [ 'Cq' ] . aggregate ( average_cq ) ref_sample_delta = asarray ( sample_frame [ 'Cq' ] - asarray ( ref_sample_mean_by_target . ix [ sample_frame [ 'Target' ] ] ) ) rel_exp = pd . Series ( power ( 2 , ref_target_delta - ref_sample_delta ) , index = sample_frame . index ) return rel_exp
Calculates expression of samples in a sample data frame relative to a
    single reference gene and reference sample using the ∆∆Cq method.

    For best results, the ref_sample should be defined for all targets and the
    ref_target should be defined for all samples, or else the series you get
    back will have lots of NaNs.
    
    :param DataFrame sample_frame: A sample data frame.
    :param string ref_target: A string matching an entry of the Target column;
        the target to use as the reference target (e.g. 'Gapdh')
    :param string ref_sample: A string matching an entry of the Sample column.
    :return: a Series of expression values for each row of the sample data
        frame.
    :rtype: Series