import math
import pandas as pd

def es_cohen_h2_os(data, codes=None, p0=0.5):
    '''
    Cohen's h2 for one-sample
     
    This function will calculate Cohen's h2 for one-sample
    
    Parameters
    ----------
    data : list or Pandas data series with the data
    codes : optional list with the two codes to use
    p0 : optional probability for first category
        
    Returns
    -------
    testResults : Pandas dataframe with Cohen's h2 and classification.
   
    Notes
    -----
    Classification based on Cohen (1988, pp. 184-185)
    
    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()
        n1 = freq.values[0]        
        n = sum(freq.values)
        n2 = n - n1
    else:
        #Determine number of successes
        n1 = sum(data==codes[0])
        n2 = sum(data==codes[1])
        n = n1 + n2
        
    p1 = n1/n
    
    phi1 = 2 * math.asin(p1**0.5)
    phic = 2 * math.asin(p0**0.5)
    
    h2 = phi1 - phic
    
    #convert to Cohen h for classification
    h = abs(h2)*2**0.5
    #Using Cohen (1988, p. 198):
    if h < .20:
        qual = 'Negligible'
    elif h < .50:
        qual = 'Small'
    elif h < .80:
        qual = 'Medium'
    else:
        qual = 'Large'
    
    testResults = pd.DataFrame([[h2, qual]], columns=["Cohen h2", "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_h2_os(data)