# OneRule3.py

from operator import itemgetter

dataFile = "weather.csv"

attributes = {"Clouds":["overcast", "cloudy", "clear"], 
              "Temperature":["cold", "mild", "hot"], 
              "Humidity":["low", "normal", "high"], 
              "Wind":["weak", "strong"]}
attributeNames = ["Clouds", "Temperature", "Humidity", "Wind"]
# targetValues: "sun", "rain", "snow"

def loadData(fileName):
    try:    
        fData = open(fileName, 'r')
    except:
        return []
    out = []
    for line in fData:
        line = line[:-1]  # remove \n
        if len(line) == 0:  # empty line
            continue
        li = [i for i in line.split(",")]
        out.append(li)
    fData.close()
    return out

def createRule(attribute):
    predictionRule = {}
    errorCount = {}
    print "Considering attribute: '%s' now..." %(attribute)
    for value in attributes[attribute]:
        frequencies = {"sun":0, "rain":0, "snow":0}
        k = X[0].index(attribute) # position of attribute
        for sample in X[1:]:
            if sample[k] == value:
                if sample[4] == "sun":
                    frequencies["sun"] += 1
                if sample[4] == "rain":
                    frequencies["rain"] += 1
                if sample[4] == "snow":
                    frequencies["snow"] += 1
        # sort by dictionary value
        ratings = sorted(frequencies, key = frequencies.get) 
        predictionRule[value] = ratings[2]
        errorCount[value] = frequencies[ratings[0]] + frequencies[ratings[1]]
    err = 0
    for v in errorCount.values():
        err += v
    return predictionRule, err

X = loadData(dataFile)
rules = {}
errors = {}
for attribute in attributeNames:
    rule, error = createRule(attribute)
    print "Rule", rule, "Error:", error
    rules[attribute] = rule
    errors[attribute] = error
errors = sorted(errors, key = itemgetter(1))
bestAttribute = errors[0]
print "\nResult of OneR Analysis:"
print "Best attribute:", bestAttribute
print "Rule:", rules[bestAttribute]

