import statistics
import csv
import matplotlib.pyplot as plt

# read csv data from a given filename
def readCSVData(filename):
    f = open(filename, 'r')
    reader = csv.reader(f)
    data = list(reader)
    f.close()
    # Question:
    # Remember what the structure of data is from last lecture
    return data

# something handy: make a dictionary mapping indices to column names
def getColumnNames(data):
    columnNames = {}
    header = data[0]
    for i in range(len(header)):
        columnNames[header[i]] = i
    return columnNames

# get column data from a 2D list given columnber number
def getColumnData(data, columnNumber):
    columnData = []
    for row in data:
        columnData.append(row[columnNumber])
    return columnData

# convert column data to floats
def convertToFloat(columnData):
    floats = []
    for num in columnData:
        # need to deal with empty strings
        if num != '':
            floats.append(float(num))
    return floats

# convert column data to ints
def convertToInt(columnData):
    ints = []
    for num in columnData:
        # need to deal with NaN empty strings
        if num != '':
            ints.append(int(num))
    return ints

# make a dicitonary of data to make 
# column data easier to find
def convertCSVToDict(data):
    result = {}
    columns = getColumnNames(data)
    for col in columns:
        # skip the header row
        result[col] = getColumnData(data[1:], columns[col])
    return result 

# make ordinal data numerical
def convertGradesToScores(grades):
    scores = []
    for grade in grades:
        if grade == 'A':
            scores.append(90)
        elif grade == 'B':
            scores.append(80)
        elif grade == 'C':
            scores.append(70)
        elif grade == 'D':
            scores.append(60)
        elif grade == 'R':
            scores.append(50)
        else:
            scores.append(grade)
    return scores


# some style code if we want nicer plots
def configureNicerPlots():
    plt.rcParams.update(plt.rcParamsDefault)
    plt.rc('font',**{'size':15, 'family':'sans-serif'}) #,'sans-serif':['Computer Modern Sans serif']})
    plt.rc('axes', **{'titlesize':15,
                    'titleweight':'bold',
                    'labelsize':15,
                    'grid':False,
                    'axisbelow':True,
                    'spines.right':False,
                    'spines.top':False,
                    'grid.axis':'x'})
    plt.rc('xtick', labelsize=15)
    plt.rc('ytick', labelsize=15)
    plt.rc('legend', fontsize=15)
    plt.rc('figure', titlesize=15, figsize=(7, 5))
    plt.rc('lines', linewidth=2)
    plt.rc('hatch', color='white')
    plt.rc('savefig', transparent=True, bbox='tight', dpi=100)
    plt.rc('legend', loc='upper center', fancybox=False, frameon=False, handlelength=1.5, columnspacing=1.5)


# load in data into a dictionary mapping column names to column data
reflectionData = readCSVData('exam-reflections.csv')
reflectionDataDict = convertCSVToDict(reflectionData)
for key in reflectionDataDict:
    print(key)
# get number of hours study for people who took both exams
# get number hours study for exam 1 as floats
timeStudyExam1 = reflectionDataDict['timeStudy:exam1']
timeStudyExam1 = convertToFloat(timeStudyExam1)
# get number hours study for exam 1 as floats
timeStudyExam2 = reflectionDataDict['timeStudy:exam2']
timeStudyExam2 = convertToFloat(timeStudyExam2)

medianExam1 = statistics.median(timeStudyExam1) 
medianExam2 = statistics.median(timeStudyExam2)
print('Median Exam 1 Study Time:', medianExam1) 
print('Median Exam 2 Study Time:', medianExam2)

exam1Grade = reflectionDataDict['exam1']
exam2Grade = reflectionDataDict['exam2']
modeExam1 = statistics.mode(exam1Grade)
modeExam2 = statistics.mode(exam2Grade)
print('Mode Exam 1 Grade:',modeExam2) 
print('Mode Exam 2 Grade:',modeExam1)


# Question: What is the probability that a student did Exam 1 Reflection
# given they did Exam 2 Reflection?
# P(exam2 reflection | exam1 reflection) = exam1 & exam2 | exam 1 reflection
didExam1Reflection = reflectionDataDict['exam1Reflection']
didExam2Reflection = reflectionDataDict['exam2Reflection']
countBoth = 0
for i in range(len(didExam1Reflection)):
    if didExam1Reflection[i] == 'True' and didExam2Reflection[i] == 'True':
        countBoth += 1
condProb = countBoth/didExam1Reflection.count('True')
print('P(exam 2 reflection | exam 1 reflection):',condProb)


# make empty plot
fig, ax = plt.subplots()
ax.set_title('Empty')
plt.show()




