# -*- coding: utf-8 -*-


import os, glob, sys
import numpy as np
import pandas as pd



def normal_average():

    # バリデーションデータセット
    # 推測結果ファイル名
    v_name1 = "./subm/valid_multi_1.csv"
    v_name2 = "./subm/valid_multi_2.csv"
    v_name3 = "./subm/valid_multi_3.csv"

    # 推測結果ファイルを読み込む
    predict1 = pd.read_csv(v_name1)
    predict2 = pd.read_csv(v_name2)
    predict3 = pd.read_csv(v_name3)

    # column"target" を退避
    p_target = predict1.ix[:,"target"]

    # 推測結果からcolumn"target"を削除
    del predict1['target']
    del predict2['target']
    del predict3['target']

    # 推測結果を加算し、推測結果ファイル数で除算する
    predict_all =  (predict1 + predict2 + predict3) / 3

    # 平均化された推測結果に column"target" を付ける
    predict_all = predict_all.T.append(p_target).T

    # 最終結果を出力する
    predict_all.to_csv("./subm/valid_average.csv", index=False)



    # テストデータセット
    # 6クラス分繰り返す
    for i in range(0,6):

        # 推測結果ファイル名
        filename1 = "./subm/result_multi_1_%i.csv"%i
        filename2 = "./subm/result_multi_2_%i.csv"%i
        filename3 = "./subm/result_multi_3_%i.csv"%i

        # 推測結果ファイルを読み込む
        predict1 = pd.read_csv(filename1)
        predict2 = pd.read_csv(filename2)
        predict3 = pd.read_csv(filename3)

        # column"img" を退避
        predict1_img = predict1.ix[:,"img"]

        # 推測結果からcolumn"img"を削除
        del predict1['img']
        del predict2['img']
        del predict3['img']

        # 推測結果を加算し、推測結果ファイル数で除算する
        predict_all =  (predict1 + predict2 + predict3) / 3

        # 平均化された推測結果に column"img" を付ける
        predict_all = predict_all.T.append(predict1_img).T

        # 最終結果を出力する
        predict_all.to_csv("./subm/result_average_%i.csv"%i, index=False)

        # 推測の制度を測定する。
        # 一番大きい値が入っているカラムがtest_classであるレコードを探す
        del predict_all['img']
        one_column = np.where(np.argmax(predict_all.as_matrix(), axis=1)==i)
        print ("正解数　　" + str(len(one_column[0])))
        print ("不正解数　" + str(predict_all.as_matrix().shape[0] - len(one_column[0])))


def pseudo_average():
    # テストデータセット
    # 6クラス分繰り返す
    for i in range(0,6):

        # 推測結果ファイル名
        filename1 = "./subm/result_pseudo_1_%i.csv"%i
        filename2 = "./subm/result_pseudo_2_%i.csv"%i
        filename3 = "./subm/result_pseudo_3_%i.csv"%i

        # 推測結果ファイルを読み込む
        predict1 = pd.read_csv(filename1)
        predict2 = pd.read_csv(filename2)
        predict3 = pd.read_csv(filename3)

        # column"img" を退避
        predict1_img = predict1.ix[:,"img"]

        # 推測結果からcolumn"img"を削除
        del predict1['img']
        del predict2['img']
        del predict3['img']

        # 推測結果を加算し、推測結果ファイル数で除算する
        predict_all =  (predict1 + predict2 + predict3) / 3

        # 平均化された推測結果に column"img" を付ける
        predict_all = predict_all.T.append(predict1_img).T

        # 最終結果を出力する
        predict_all.to_csv("./subm/final_average_%i.csv"%i, index=False)

        # 推測の制度を測定する。
        # 一番大きい値が入っているカラムがtest_classであるレコードを探す
        del predict_all['img']
        one_column = np.where(np.argmax(predict_all.as_matrix(), axis=1)==i)
        print ("正解数　　" + str(len(one_column[0])))
        print ("不正解数　" + str(predict_all.as_matrix().shape[0] - len(one_column[0])))





# 実行した際に呼ばれる
if __name__ == '__main__':

    # 引数を取得
    # [1] = normal or pseudo
    param = sys.argv

    # 引数の数を確認
    if len(param) != 2:
        sys.exit("Usage: python average_3models.py [normal, pseudo] ")

    run_type = param[1]

    if run_type == 'normal':
        normal_average()
    elif run_type == 'pseudo':
        pseudo_average()
    else:
        sys.exit("Usage: python average_3models.py [normal, pseudo] ")

