{"cells":[{"cell_type":"code","execution_count":null,"metadata":{"_cell_guid":"e2e2c71f-b66a-c7a6-fc33-9a557a3b77bb"},"outputs":[],"source":"import numpy as np\nimport pandas as pd\nimport math\n\ndef fit_coef(col_lst):\n    global train, test\n    merge = None\n\n    def cal_x_y(col_lst):\n        col1 = col_lst[0]\n        col2 = col_lst[1]\n\n        name1 = '_'.join([''.join(x.split('_')) for x in col1])\n        mean_train = train.groupby(col1)['log_demand'].mean().reset_index(name=name1)\n        merge = pd.merge(test, mean_train, how='inner', on=col1)\n\n        name2 = '_'.join([''.join(x.split('_')) for x in col2])\n        mean_train = train.groupby(col2)['log_demand'].mean().reset_index(name=name2)\n        merge = pd.merge(merge, mean_train, how='inner', on=col2)\n\n        x1 = merge[name1].apply(np.expm1)\n        x2 = merge[name2].apply(np.expm1)\n        y = merge['log_demand']\n        return x1, x2, y\n\n    x1, x2, y = cal_x_y(col_lst)\n    n = x1.size\n\n    def f(v, x1, x2, y):\n        a = v[0]\n        b = v[1]\n        c = v[2]\n        square = (np.log1p(a*x1 + b*x2 + c) - y)**2\n        return square.sum() / n\n\n    def Df(v, x1, x2, y):\n        a = v[0]\n        b = v[1]\n        c = v[2]\n        t = a*x1 + b*x2 + c\n        tmp = 2*(np.log1p(t) - y) / (1+t) / n\n        d1 = tmp * x1\n        d2 = tmp * x2\n        d0 = tmp\n        return np.array([d1.sum(), d2.sum(), d0.sum()])\n\n    v0 = np.random.rand(3)\n    v = None\n    f1 = None\n    max_iter = 1000\n    eps = 1.0e-8\n\n    # using gradient descent method to fit coefs\n    for i in range(max_iter):\n        g = Df(v0, x1, x2, y)\n        gl2 = (g**2).sum()\n        f0 = f(v0, x1, x2, y)\n\n        alpha = 1\n        c = 0.5\n        rho = 0.5\n        # line search\n        while f(v0 - alpha * g, x1, x2, y) > f0 - c * alpha * gl2:\n            alpha = alpha * rho\n\n        v = v0 - g * alpha\n        f1 = f(v, x1, x2, y)\n        if abs(math.sqrt(f0)-math.sqrt(f1)) < eps:\n            break\n        v0 = v\n\n    return v, math.sqrt(f1)\n\n\nif __name__ == \"__main__\":\n    cols = ['Cliente_ID', 'Producto_ID', 'Ruta_SAK', 'Agencia_ID', 'Canal_ID', 'Demanda_uni_equil']\n    train = pd.read_csv('../data/train_3_8.csv')[cols]\n    test = pd.read_csv('../data/train_9.csv')[cols]\n    train['log_demand'] = train['Demanda_uni_equil'].apply(np.log1p)\n    test['log_demand'] = test['Demanda_uni_equil'].apply(np.log1p)\n\n    col_lst = [\n            ['Producto_ID', 'Cliente_ID', 'Agencia_ID'],\n            ['Producto_ID', 'Ruta_SAK'],\n            ]\n    f = open('coef.csv', 'a')\n    f.write(\"coef,log_rmse\\n\")\n    v, sqrt_f1 = fit_coef(col_lst)\n    f.write(\"%s,%s,%s\\n\" % (col_lst, v, sqrt_f1))\n    f.close()"}],"metadata":{"_change_revision":0,"_is_fork":false,"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.5.2"}},"nbformat":4,"nbformat_minor":0}