import pandas as pd

def es_cohen_g(data, codes=None):
    '''
    Cohen's g
     
    This function will calculate Cohen's g
    
    Parameters
    ----------
    data : list or Pandas data series with the data
    codes : optional list with the two codes to use
        
    Returns
    -------
    testResults : Pandas dataframe with Cohen's g and classification.
   
    Notes
    -----
    Classification based on Cohen (1988, pp. 147-149)
    
    Author
    ------
    Made by P. Stikker
    
    Please visit: https://PeterStatistics.com
    
    YouTube channel: https://www.youtube.com/stikpet
    
    '''
    if codes is None:
        freq = data.value_counts()
        n = sum(freq.values)
        p1 = freq.values[0]/n
    
    else:
        #Determine number of successes
        n1 = sum(data==codes[0])
        n2 = sum(data==codes[1])
        n = n1 + n2
        p1 = n1/n
        
    g = p1 - 0.5
    
    #Using Cohen (1988, pp. 147-149):
    if (abs(g) < 0.05):
        classify = "negligible"
    elif (abs(g) < 0.15):
        classify = "small"
    elif (abs(g) < 0.25):
        classify = "medium"
    else:
        classify = "large"
    
    testResults = pd.DataFrame([[g, classify]], columns=["Cohen g", "Classification"])
    
    return (testResults)

#example
dataList = ['Female', 'Male', 'Male', 'Female', 'Male', 'Male', 'Female', 'Female', 'Male', 'Male', 'Male', 'Male', 'Male', 'Male', 'Female', 'Male', 'Female', 'Male', 'Male']
data = pd.Series(dataList)

es_cohen_g(data)