{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Prediction (out of sample)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import statsmodels.api as sm"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Artificial data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "nsample = 50\n",
    "sig = 0.25\n",
    "x1 = np.linspace(0, 20, nsample)\n",
    "X = np.column_stack((x1, np.sin(x1), (x1-5)**2))\n",
    "X = sm.add_constant(X)\n",
    "beta = [5., 0.5, 0.5, -0.02]\n",
    "y_true = np.dot(X, beta)\n",
    "y = y_true + sig * np.random.normal(size=nsample)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Estimation "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "                            OLS Regression Results                            \n",
      "==============================================================================\n",
      "Dep. Variable:                      y   R-squared:                       0.979\n",
      "Model:                            OLS   Adj. R-squared:                  0.978\n",
      "Method:                 Least Squares   F-statistic:                     712.7\n",
      "Date:                Sun, 16 Aug 2020   Prob (F-statistic):           1.50e-38\n",
      "Time:                        18:00:44   Log-Likelihood:                -5.2958\n",
      "No. Observations:                  50   AIC:                             18.59\n",
      "Df Residuals:                      46   BIC:                             26.24\n",
      "Df Model:                           3                                         \n",
      "Covariance Type:            nonrobust                                         \n",
      "==============================================================================\n",
      "                 coef    std err          t      P>|t|      [0.025      0.975]\n",
      "------------------------------------------------------------------------------\n",
      "const          5.0725      0.096     53.065      0.000       4.880       5.265\n",
      "x1             0.4818      0.015     32.681      0.000       0.452       0.511\n",
      "x2             0.4161      0.058      7.179      0.000       0.299       0.533\n",
      "x3            -0.0180      0.001    -13.936      0.000      -0.021      -0.015\n",
      "==============================================================================\n",
      "Omnibus:                        3.299   Durbin-Watson:                   2.185\n",
      "Prob(Omnibus):                  0.192   Jarque-Bera (JB):                2.324\n",
      "Skew:                          -0.345   Prob(JB):                        0.313\n",
      "Kurtosis:                       3.801   Cond. No.                         221.\n",
      "==============================================================================\n",
      "\n",
      "Warnings:\n",
      "[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.\n"
     ]
    }
   ],
   "source": [
    "olsmod = sm.OLS(y, X)\n",
    "olsres = olsmod.fit()\n",
    "print(olsres.summary())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## In-sample prediction"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[ 4.62157415  5.05400303  5.45328752  5.79675163  6.06990303  6.26881405\n",
      "  6.40076706  6.48305793  6.54015441  6.59967611  6.68785671  6.82523383\n",
      "  7.02327476  7.28249239  7.59236099  7.93304553  8.2786605   8.60152287\n",
      "  8.87670031  9.08610749  9.22147749  9.28571996  9.29244317  9.2637181\n",
      "  9.22645234  9.20796918  9.23151851  9.3124569   9.4557246   9.65503382\n",
      "  9.89390183 10.14835901 10.39088702 10.59493994 10.73930572 10.81159125\n",
      " 10.81025853 10.74487732 10.6345529  10.50478709 10.38328841 10.29541961\n",
      " 10.26003067 10.28636179 10.37252525 10.50581556 10.66479693 10.82282514\n",
      " 10.95242507 11.02980478]\n"
     ]
    }
   ],
   "source": [
    "ypred = olsres.predict(X)\n",
    "print(ypred)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Create a new sample of explanatory variables Xnew, predict and plot"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[11.03052107 10.92067015 10.71656909 10.45540246 10.18611822  9.95744356\n",
      "  9.80595481  9.74712222  9.77152238  9.84714534]\n"
     ]
    }
   ],
   "source": [
    "x1n = np.linspace(20.5,25, 10)\n",
    "Xnew = np.column_stack((x1n, np.sin(x1n), (x1n-5)**2))\n",
    "Xnew = sm.add_constant(Xnew)\n",
    "ynewpred =  olsres.predict(Xnew) # predict out of sample\n",
    "print(ynewpred)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Plot comparison"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXAAAAD4CAYAAAD1jb0+AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy86wFpkAAAACXBIWXMAAAsTAAALEwEAmpwYAAA1mklEQVR4nO3dd1zV1RvA8c/hsh2ggKaYiubIBbhyJDlSSy13puVomZWVWeaoTMtyZFlZOeun5sgcpWaZ5k4zJ+6cOcABgiIKyjq/P75AgqDAvXAHz/v14qXc+733Pl9vPffc53vOc5TWGiGEEPbHydoBCCGEyBtJ4EIIYackgQshhJ2SBC6EEHZKErgQQtgp54J8MV9fX12xYsWCfEkhhLB7u3btuqS19st8e4Em8IoVK7Jz586CfEkhhLB7SqnTWd0uJRQhhLBTksCFEMJOSQIXQgg7VaA18KwkJiYSFhbGjRs3rB2KyAF3d3fKlSuHi4uLtUMRotCzegIPCwujWLFiVKxYEaWUtcMRd6C1JioqirCwMAICAqwdjhCFntUT+I0bNyR52wmlFD4+PkRGRlo7FLv0855wPvn9COeuxFPW24MhbavRKdjf2mEJO2b1BA5I8rYj8l7lzc97whm+dD/xickAhF+JZ/jS/QCSxEWe2UQCF8LRffL7kfTknSY+MZlPfj9iMwlcviHYn7vOQlFKfaeUilBKHbjltu5KqYNKqRSlVP38DTH/mUwmgoKCqFmzJoGBgXz22WekpKTc8TGnTp1i/vz5BRShsHfnrsTn6vaClvYNIfxKPJr/viH8vCc8x49vOm4dAcNW0nTcuhw/TpgnJyPwWcBXwJxbbjsAdAGm5UNMd5QfowQPDw9CQ0MBiIiIoFevXsTExDB69OhsH5OWwHv16mXWa4vCoay3B+FZJOuy3h5WiOZ25nxDyFV5KCUFtmyBy5eN37X+70cpaNYMfHwsc1KFwF1H4FrrTUB0ptsOa62P5FtU2TB3lJATpUqVYvr06Xz11VdorTl16hTNmjWjbt261K1bl61btwIwbNgwNm/eTFBQEJMmTcr2OCEAhrSthoeLKcNtHi4mhrStZqWIMjLnG8Kdkn+6mzfhu++4el91CAmBjh2Nn06doHNn6NLF+DMgAD78EK5dM+d0Co18r4ErpfoD/QHKly9v1nMVVB2xUqVKpKSkEBERQalSpVizZg3u7u4cO3aMnj17snPnTsaNG8fEiRP55ZdfAIiLi8vyOCHgv5Fo5m+PAE3HrbN63dmcbwh3TP5XrsDUqfDll3D+PGGlKzHloRGc9L8HXFJwdzYxsFUVWtxf2kjan30GI0fCV1/Bu+9C//7g5mbu6TmsfE/gWuvpwHSA+vXrm7UBZ0HWEdP2Ck1MTGTgwIGEhoZiMpk4evRolsfn9DhReHUK9s+QnG1pZsqQttUyxAI5/4aQXfJ/4tweCHjaSOKtWzOg4XC+P9yVuI1lKNHyEMUbnALg3dMubOkZZDzowQdh2zYYPhxee81I6B98AL16gcl022sUdna1lD670YCl64gnT57EZDJRqlQpJk2aROnSpdm7dy87d+4kISEhy8fk9Djh+JKTYeRXl/CpFYFb6Rh8akbSodc1Jk2Cn36C8NSKX45KDwWkU7A/Y7vUxt/bAwX4e3swtkvtHH2QZC4PmVKSeXfTLMZ//x5Ursze/+2mvctqpi17lfhTfhRvfIIiNc+lH3/bAKxRI1i3DlatghIloE8fo9wiq7VvY1fTCM0ZJeRUZGQkAwYMYODAgSiliImJoVy5cjg5OTF79mySk43XLlasGLGxsemPy+444fjSLqyfOZuCOlaJq6HliIn0xcnzJq73xBAb4c6vi91ZucA43s0NBg+GsPgEVBbVAWvNTMn8DSE3jwPjAykxLJxpv04k+N99XO8zgO5nJ/HbM+74+ED5NifQ9x/HyT0pw+OzHIApBW3bQuvWRjnl9deNGvlPP4G7e57OzxHdNYErpRYAzQFfpVQY8D7GRc3JgB+wUikVqrVum5+BQvZ1RHO/bsbHxxMUFERiYiLOzs707t2bwYMHA/Dyyy/TtWtXFi1aRIsWLShSpAgAderUwdnZmcDAQPr165ftccKx/bwnnGGL93NudVVid1UE7YR7hUh8O57Bs8pFlMkoxWkNpV2L8fXjIUyeDGPHgkuxFhRvdpgitcK5dX2UrcxMyY1Owf50unocegyB2FhOf/Q9D055muho+PRTePFFWHPUneFLNfGJ/z3urgMwJyejlOLpadTDH38cli0DD/v7N8oPKq3WWxDq16+vM1/YO3z4MPfff3+BxSDMJ+/ZfxqPWc++udWIO1KWooGnKf7ASVy8r9P4zD767VpBjYh/SVGKFKXQyolKpYpBpUoca9qPzvMe4eChYriWuULJ1gdwKxODh4spx6ULmzJ/PvTtC5Urs/HVxXQYVgs3z2T8e+ziqmdkhou2eR6A/e9/8Nxz0LIlLF9uJPVCQim1S2t925obuyqhCGFLrl6F0Jm1uXHalxItDlE66DCdD62n79IVVLt0hmiP4myuGEyKUjhpTREXRaWqvrBtG1V+fYL9Pj5sbPwEg/a9wN55jana4xBj3yppf8l7yhR45RV0SAhTH13OwNeKE1AtAdpsIcY9DvjvAu3YLrXZMqxl3l7nmWeMEfkzz0CHDrBiBRTyb7qSwIXIg4sX4dFH4ebZkvi038OrN6Yw6Jv5eN28zoHSlXmr3SBW3B/CTWdXgPSRNcH+xlXONWtQ335L82UzCU2cwnav1vScP5Wwxv4QbOWTy41x42D4cHT7Dgwu9yOfD/Ogc2c4F7SVC3FxGQ61yJTfvn2N2Sh9+0K7drByJRQtauZJ2C+7moUihC04eRKaNoUjR+C9zy7y9bl3eH/tDPaUrU63p8bT/fnJuL/wLL6+XlnP6DCZ4JFHYNEiY0rK+PE0SNnGQVNtjr/6OSOGJmPJyma+LHPXGoYNM5J3z54MLLuUz6d58NZbsHgxXIy7nuXDLHKB9umnYe5c+PNP6NrV+EAspGQELkQuXLsG7dsbK8E3Lo+h/vi+sGcNc5r3ZFTDnpQpUYSxuanr+vnB22+jevXCrf+LfP7bG2yd8CPD//mWDxffj7n7Zpg71zzL1hWBZeCVV2DqVPSLA3jb8yu+mWRi2DD4+GNjAkm+tw7o2ROuX4cXXoD33jNeuBCSEbgQOaQ1vPSSMfJeMfkU9V9vCuvXw7ff0mf9fE6Of4wtw1rmrURQrhxq5S/oOd8T5HGE0cuD+L72BG7G37mp2t2YM9c8q9YV7y3aw94Wj8HUqUx5oBsVjr3FxEkmBg78L3lDAbUOeP55Y2bK2LGwdKnlnteOSAIXIoe++8745v5o/WVU6R9M7IlT/Dl5Ljz7rGVeQClU76fx/PcQ54I78OyRoeyt1InEiMt5fkpL9jhxS0rgs0UfErjpV8Y/1JcRHh9wdl1lvALDaNEv41RIcxYG5cqXX8IDDxg18UOHLPvcdqDQl1CioqJo1aoVABcuXMBkMuHn5wfA9u3bcXV1tWZ4wkbs3w8vv6KpWm4vsw7246azK08+OZZz4V6M3RNu2cRUujQBuxaz+YnJNFr8JtGV6uGzbjHODetmOCwnnTkt1ePEMyGeGUs/pOnpfbzb+iWmqJe4svp+PKufw6vNXj5d40GXehlfO68Lg3LFzc0outerZyz02b4dvLzy9zVtSKEfgfv4+BAaGkpoaCgDBgzgjTfeSP/d1dWVpKSkuz+JcGixsdC9O3i4XGbJjW64JSXQt/toTvjem39L35Wi2aLXWPLaJhKuJ5LSuAkp02aQdnUzp505zSllpCV5r/hY5v3wLg+cOcCgDm8y1aU/0atr43HfRXw7hKKcrNzXvFw544LwiRPGSPwuvfwdSaFP4Fnp168fgwcPpkWLFgwdOpRRo0YxceLE9Ptr1arFqVOnAJg7dy4NGzYkKCiIF198UZbQOxitYcAAOH40hbne3bg/6l9ee/xtTvjem35MfiavJ79ozNJ3drMhJQSnAf3RffpCbGyOa9vm9jipci2ChfOHUSPiBC93Gs58U0+ifgvEvcIl/DruTl9pavXVoyEhxpLPZcsK1QVNmyqhDBoEqfsqWExQEHz+ee4fd/ToUf744w9MJhOjRo3K8pjDhw+zcOFCtmzZgouLCy+//DLz5s2jT58+5oQsbMisWcYiw43NRxOyYT0ftniODZUzLojL7+T1+hg/ekUsZOuML3hv7oec/3UtPh3eIrxM1duOzerDJM89Ti7up933b3AjIZnnuo1it3sHoubVxsP/Cr5ddqKcjZGuzfQ1f+012LHDaEdbr54xUd/ByQg8G927d8d0l/aVa9euZdeuXTRo0ICgoCDWrl3LyZMnCyhCkd8uXDCaTr1//4+EbPiA04/3YH6TrhmOKYjk9fOecHaX+ptJjZ+iBevRsbBk7hAGbFuM0hnLBRb5MElJgY8+gnbtcA2oSPGDe3l+wDv8uzCQoDpOzJgXz72lXPP34mReKAXTp0OdOvDUU5D6LdmR2dQIPC8j5fxyazMqZ2fnDHtk3khta6m1pm/fvowdO7bA4xP574ln4qh09RBDY/uwt0ItTo/4mLGubvm+8W/mi5NxCUncSEqmRMhR9jnfR53NB/i2WG+GbZxFs1O7ebPdYC4U97XMh0lMjFFHXrbM6ME9YwZ/7/fkscegUiX4/Xfw9S3LUyFlLXOylubpCUuWGCPwbt2M7dsceEMIGYHnQMWKFdm9ezcAu3fv5t9//wWgVatWLF68mIiICACio6M5ffq01eIUlvP+15fYtUqz0LU70Z7FefaxYQz9xdikY8uwlvw7rn3e53zfQVYXJy/H/de+z7vJcWh+ga6xK3ip1KfUPXeU9TNe5KO/5jCxZbm8x5OcDN9/b9Qcf/kFvvgC5s5l3TZP2raF0qXhjz/A19cip5m/KleG2bNh1y6jLuvAJIHnQNeuXYmOjiYoKIgpU6ZQtapRe6xRowZjxoyhTZs21KlTh9atW3P+/HkrRyvMFRcH498rwqdug6h04zSDOwwmqoh3gWy2kNXFycy8HjhJiYcPMjViMC81PoTLE0/w1OZFtO/YBEaPNrps5VRKCvzwA9SsaWyc4O0NGzbAa68xe46ibVtjksf69VCmjFmnVrA6doS33za2c5s719rR5BtpJytyzdHfsxEjYM/Y3/iNdkxr2IWxLf5bqKOAf8e1z7fXDhi2kpz8H+nhYqKleoApY0rQsCEsHn2QctNHGisSfXyMfiENGxo/lSuTYZVNbKyxnHTvXpg0CQ4ehFq1jOTfqRNaOfH++8bewg8/bEyztsup1UlJ0KoV7NxpzA+vWdPaEeWZtJMVIgcOHIDvJlxir3M/DpeoyKfNeme4P79nnGS38Mbbw4Uibs6Zau8laBVkLASt+URNpk5dQs8Ru4xEPH26UQYBY1uyBg2MMsk///y3pxtA9erGCLx7d3By4uZNo+X2vHnGn1OmYHY/FqtxdjbOLTjYaHq1YwcUK2btqCxKErgQqVJS4MX+mpmm/vjqK/TvNIoE5/+yV0HMOMlu28BRj9fMsr7dpQvUrWtMuujVC1b3q8fk+csp6p5kjKx37DBGnzt2gKurMSKtXt34qVbN+EmdbfX330bJeNs2YxLK8OEZB+52qUwZI4m3amX0TvnhBwc4qVtorQvsp169ejqzQ4cO3XabsG2O+p5Nn651H2ZpDVpPmKB/2h2mm4xdqysO/UU3GbtW/7Q7rEDiyMvrJiZqPXKk1k5OWlepovVvvxm35cT+/Vp37Gictp+f1j/8YF78NmnsWOMEv/jC2pHkCbBTZ5FTJYGLXLP39yyrBHnpktaBXv/qa6ZiOiUkROukJGuHmScbN2p9773G/9mlSmn9yita//mn1snJ/x2TkqJ1dLTWu3dr/fTTWiuldfHiWo8Zo3VsrPViz1fJyVo//rjxCbd8ubWjybXsEriUUEShkl1/7IqHi/F5zDO4FwE1Z056WcHehITA0aPw22+wYAF8+y18/TWULw9ly8L588YCpZs3jeM9PIzJGm+/DSVLWjf2fOXkZBT2W7aEJ56AtWuhSRNrR2U2SeDCoWW1KCbzNL0rZ4tQcclcmrMBPp8BFSpYJ1gLcXc3GvN17mxMOFm2zOj1FBcHzZoZZeHI5Bi2hIcR73uezd5ONDpdjU4lbWA1ZX4qWtTYgq1pU2NPzc2b7XpmCuRgHrhS6julVIRS6sAtt5VUSq1RSh1L/bNE/oaZv8LCwujYsSNVqlShcuXKvP766yQkJACwYcMGOnTocNtjfvnlF4KDgwkMDKRGjRpMmzYt3+Ps168fixcvBuD555/n0B36H2/YsIGtW7em/z516lTmzJmT7zHakrstigGjWVXx34ozgaEktmhtTL1wIMWKGTMKly2DNWuMtTpNeoazzfMvEiqewlT0ZradDB2Sn5+xnNTNzdjW7uxZa0dklpws5JkFPJLptmHAWq11FWBt6u92SWtNly5d6NSpE8eOHePo0aNcu3aNd955J9vHJCYm0r9/f1asWMHevXvZs2cPzZs3z9Pr57V74cyZM6lRo0a292dO4AMGDCh0TbZysijm+n5/vo54E+WcgsusmY41QyEb5uzS4xACAmDVKmPBU9u2EB1t7Yjy7K4JXGu9Cch8hh2B2al/nw10smxYBWfdunW4u7vzzDPPAGAymZg0aRLfffcdcZl21U4TGxtLUlISPj4+ALi5uVGt2u3Ty0aNGkXv3r1p2bIlVapUYcaMGYCRXFu0aEGvXr2oXbs2ycnJDBkyhAYNGlCnTp300bzWmoEDB1KjRg3at2+fvmQfoHnz5qQtilq1ahV169YlMDCQVq1acerUKaZOncqkSZMICgpi8+bNGVrihoaG0qhRI+rUqUPnzp25fPly+nMOHTqUhg0bUrVqVTZv3myJf2KruVub15QbznRbu4WHWcuxISONQnEhYM4uPQ4jMND4WnLiBDz2mFFfskN5rYGX1lqfB9Ban1dKlcruQKVUf6A/QPm7/Q9ihX6yBw8epF69ehluK168OOXLl+f48eNZPqZkyZI8/vjjVKhQgVatWtGhQwd69uyJk9Ptn4f79u1j27ZtXL9+neDgYNq3N1bxbd++nQMHDhAQEMD06dPx8vJix44d3Lx5k6ZNm9KmTRv27NnDkSNH2L9/PxcvXqRGjRo8m2n7rsjISF544QU2bdpEQEAA0dHRlCxZkgEDBlC0aFHeeustwOicmKZPnz5MnjyZhx56iJEjRzJ69Gg+T/03SkpKYvv27fz666+MHj2aP/74427/wjbrbotiLs93ZULCcE7XfJDgj962QoTWke8bDtuL5s2NC5tPPGEs9FmwwGglYEfyvReK1nq61rq+1rp+2lZltkRrjcria3N2t6eZOXMma9eupWHDhkycOPG2xJqmY8eOeHh44OvrS4sWLdi+fTsADRs2JCAgAIDVq1czZ84cgoKCeOCBB4iKiuLYsWNs2rSJnj17YjKZKFu2LC1btrzt+bdt20ZISEj6c5W8y1SCmJgYrly5wkMPPQRA37592bRpU/r9Xbp0AaBevXrpm1bYq+x2oxn1eE2mtmvB5/s/xNU5hQq/fF8oSidpCmTDYXvRrRtMm2ZcIAgONlYx2ZG8jsAvKqXKpI6+ywARd31ETlihn2zNmjVZsmRJhtuuXr3K2bNnqVy5MlFRUdk+tnbt2tSuXZvevXsTEBDArFmzbjsm84dA2u+3tqvVWjN58mTatm2b4dhff/31jh8iaY+92zG54ZbaetNkMtn9dnJpKxczt399PNCfCVVmMIzVXPv4a6hY0bqBWlBO9snM7t/FJnp6W8MLL0Dt2tCzpzFNZ8wYGDLEmHpo4/Ia4XKgb+rf+wLLLBNOwWvVqhVxcXHpMzSSk5N588036devH56enlk+5tq1a2zYsCH999DQUCpkM/Vs2bJl3Lhxg6ioKDZs2ECDBg1uO6Zt27ZMmTKFxERjhsTRo0e5fv06ISEh/PDDDyQnJ3P+/HnWr19/22MbN27Mxo0b01vcRqdekClWrBixsbG3He/l5UWJEiXS69vff/99+mjcEXUK9r+t/ev80cd49eQgztdoSdE3B1g7RIvJ6T6ZkPW/S6HWqBHs2WPMvRw2zJihcuGCZZ77+HF4//18uViak2mEC4C/gGpKqTCl1HPAOKC1UuoY0Dr1d7uklOKnn35i0aJFVKlShapVq+Lu7s7Ht+yrt3btWsqVK5f+s2fPHiZMmEC1atUICgri/fffz3L0DUappH379jRq1Ij33nuPsmVvb4T//PPPU6NGDerWrUutWrV48cUXSUpKonPnzlSpUoXatWvz0ksvZZlo/fz8mD59Ol26dCEwMJAePXoA8Nhjj/HTTz+lX8S81ezZsxkyZAh16tQhNDSUkSNHmvEvaF/Onkyk+pinSXZ2455Vs+1ilJVThX52ibm8vWHhQqOksnmzcaFzxQqjCVhuRUcbrWybNIEqVYzWjvkwKUDayeajUaNGZbiQ6Cjs9T3TGhZWG8mTxz7k4uQfKT2wu7VDsqjsWtHmdwtch3TwIPToYfxZsiS0aWPssfnII1AqizkbCQkQFmZMwpg3z9gUIyHBaNPbp4/Racw/799ypJ2sKPTWj9lC92MfcaB+X2o5WPIGmV1iUTVrGh0cly0z+hKsWmV0MgRju7ZGjSAyEk6fhjNnjHJL2mC4VCl45RUjcQcG5usFchmBi1yzx/fs8umrxFYKxMlZcc/5UJxLFrd2SBaXuc8LGLNLbGbTYXuWkmLUyNOS+d69Rk+CChWM9QNpP5UrG2UTZ8uOjW16BG7pmRQi/xTkB74lHX74VR5IOcOJaZsdMnmDzC7JV05Oxsi7Xj14911rR5PO6gnc3d2dqKgofHx8JInbOK01UVFRuLu7WzuUXDkwYj5Njs/hjyYjebif/Xegu5NOwf6SsAsRqyfwcuXKERYWRmRkpLVDETng7u5OuXLlrB1GjkWu2MZ9Y59lh0czmvxqOyMnISzB6gncxcUlfRWhEJaUcPQUpq4dCVflKLZ6KZ5e2W/umJMFMELYGqsncOF4bCIZXr3KpSaP4Zl4k38mbqT9g77ZHprdJg+AJHFh0ySBi2zlJRHbRDJMSuJcyJOUijrM9M6rePnN6nc8/E4LYCSBC1vmOMvQhEXlZln2rWxhNWBU38GU3fsbn1X+hhcWPnzX46W9qrBXksBFlvKaiK2ZDH/eHcaM5v3wmT+ZSS6v4/vNY7hkX/ZOl91CF1kAI2ydlFBElnKaiBMTYcsW2LoVSpQA9/PliHG6iql4PE7uiemL0PI7GS7fdgL1zIu88M9aZtGHT7p2w2vzXkr6pdy1DDKkbbUsF8AUyvaqwq5IAhdZym5ZtpeHCw3f3cy/ocXQZ8oQ/68fcddu/SIXmP435ZqI530RlAg8z+CuZSwa3631+RrON/ngu1HUO7+fd5w+ZEanNnhWiCQ+kRzVsWUBjLBXksBFlrIalTorRfgWfy6tvR9SnDAVuUHR+87x9tMeDH/eh7g4Y4/YJZuiWLQxiktn3Yk/WoawQ/4MXA9bekLv3kbffMj7bJVbL5RWjjrL1z98SOlr0TzpOpeNT1bAs8x/awpyWrqRBTDCHkkCF1nKPCotXaQIR5dU5fLesnjcdxGvpkdxLX0VpeDPJA+8vVvi7Q1lSyXxwP0uTOhdHJKSuFnSiZWrjN3Qv/oKJk2Chg2hUYdoVsUd5KY2eqCnXSTdeTqa9f9E3jGpf/L7EZLjb9DrwB8MXTub+KQiPFz8V0711Lh5x2Q4VurYwpFZvZmVsH2nT0OXLrB7N3g9eASvJseN2rbWBJ87Qvf9f9Drwh64fNlooXkrDw+4/36oVYu4gJr8cbE2Y/9owLbjvjh53KRo4FmKBZ3B2csYKSvI0BL1tmZM168z5rHXeW7bMsrEX2IrjelXegrxPS5i8kjM+NLSyEk4iOyaWUkCF3e0fr2x52tCApTttJf4MmH4XbtM54Pr6L7/D6pEnSXexR2Pbp2Nzmyenv/9KAVHj8LBg8Tv2YtH5MX05z1R9F62qQf4M7YFO2hIuJ8PcZWT8KgUiZv/FZRT6n+XWlPT5SYr25Uhec1akj79ArfYKNbRgo+dh7E9sDLeDx3FySUlfbNiqWMLRyMJXOTa+vXQujVUrQo//wyHroWx751xDFs9DdeUJHb638+yoDY8MHQAHZplv1gmrWbtEhvD/RH/EnzuCMHn/qHuuX/wu34l/bh43AmjHGHKn1gPT8onh1Ep4V+K62vpx/xCe6b4DWVnkC9uNc/g5Gbs2ymjbeHIJIGLXLlwAYKCjKmBf/8Nxd1uGk3qv/2Wv6o25N2QZ7hRuWqORrlNx63LckaL0hr/qxHUvHCCsrGR3HMlGr8LsZS5HI3XzWucMd3LSeeKnHarhFO52lwpW4N2rwTQrh2s2GcDy/WFKCA23Q9c2JbkZGOD7qtXYe1aKH7tHLTpYmTyd96h8ejRrDWZcvx82c0E0UqhK1RktVdpynp70KK6H5/vCs/RhgQya0QISeAi1a1T+pK21yBsQwCzZkHNmK3wcFeIjYXFi6Fr11w/d3Zzyv29PdgyrGWG2+pXKCkjayFyyKwErpR6HXgBY/LADK3155YIShSsW+dVx5/0I2J9AF6BYVRK/Bua9zS2ilqzxtigNQ9ys9JRRtZC5FyeE7hSqhZG8m4IJACrlFIrtdbHLBWcKBhpfU+Srrpz6ZcgXPyuUr3BWmoNGgSVKhnr5EuWzPPzy0pHIfKHOSPw+4FtWus4AKXURqAzMMESgYmCc+5KPDpFcWl5MDrZiXvb/8WMFR9iSkwwduW+S/LOyYpKGVkLYXnmdCM8AIQopXyUUp5AO+DezAcppforpXYqpXbKtmm2qay3B9f23cvN8JKUbL2PidvHUfPiST7o+Q5Uu3NDp7y2nRVCmC/PCVxrfRgYD6wBVgF7gaQsjpuuta6vta7v5+eX50BF/nmlaXViNlfFrVwUr8d9Q+dDG/iyeW8efL3vXR9rC/2/hSiszOoHrrX+VmtdV2sdAkQDUv+2Qwd+K0tynBt96v7AiA3/Y32tZlT89KMclTxkMwQhrMfcWSiltNYRSqnyQBegsWXCEgXl9Gn47DMY2OUckzeMhJo1aPHXr1C0aI4en90UQWkiJUT+M3dHniVKqUPACuAVrfVlC8QkCtCIEUbLkvEJb8D167B0aY6TNxhTBD1cMi7qkc0QhCgYZo3AtdbNLBWIKHjbt8P8+fDdk6vx/OFH+OADqFIlV88hUwSFsB7phVJIaQ3NmsGZozc4Vaw2Ts5OsG8fuLlZOzQhRCbSC0VksHSpsZflzg7jcPrlOPzxhyRvIeyM7EpfCCUkwNCh8Oh9x6i7ZpzRuapVK2uHJYTIJRmBF0Lz5sGJE5q/ggei3Nzg00+tHZIQIg8kgRcyKSkwfjwMqbAIvz2r4csvoYxld4wXQhQMKaEUMj//DGFHrjE6ZhDUrQsvv2ztkIQQeSQj8EJEaxg7FkaX/AKP6PPw1RLIxcYMQgjbIiPwQmTdOji+8zIvXZ/AphpNCFgWTdNx66TxlBB2SkbghcjYsfCex3jc42P5qFGvDN0DAZtdfJOTdrVCFEYyAi8kduyAA2svMCDhS5bXCOGIX8X0+2y5e6C0qxUie5LAC4lx42C068e4ptxk0oNP3Xa/rXYPlHa1QmRPSiiFwD//wK6lp1noNJVfGjzK6RJlbzvGVrsHSrtaIbInI/BCYMIEGG36AJOLE+6j37er7oHZfbDY6geOEAVJEriDCw+H7d8foXfKLNTLL/PIIw0Y26U2/t4eKMDf24OxXWrb7EVBaVcrRPakhOLgvvkG3ksaCUU8YfhwwL42GJZ2tUJkTxK4A4uLg01f7+cjfoQ33gU73ZPUnj5whChIUkJxYHPnwsCYMSR5FoPBg60djhDCwiSBOyitYfn4w3RnEfMadCBg/FZZdSmEg5EE7qDWrIEeJz/mhsmNL+p0kEUwQjggSeAOauFHx+nFfOYGtSPa0yv9dlkEI4TjkATugA4fhiabxpLg5MKMRp1vu18WwQjhGMxK4EqpN5RSB5VSB5RSC5RS7pYKTOTd3DGn6MMcltXtQGTRErfdL4tghHAMeU7gSil/4DWgvta6FmACnrRUYCJvoqOh4sLx4OSE94dDZRGMEA7M3BKKM+ChlHIGPIFz5ockzLFgYjh9kr/jatdn7G7VpRAid/K8kEdrHa6UmgicAeKB1Vrr1ZmPU0r1B/oDlC9fPq8vJ3IgMRHcJ0/ApFLwmTAMkEUwQjgyc0ooJYCOQABQFiiilHo683Fa6+la6/pa6/p+droS0F78MvMCva5N51yr3lCxorXDEULkM3NKKA8D/2qtI7XWicBSoIllwhK5pTXEjf4EFxIp9/UIa4cjhCgA5iTwM0AjpZSnUkoBrYDDlglL5Nbfyy/S+eIUTjR6Cqeq91k7HCFEAchzAtda/w0sBnYD+1Ofa7qF4hK5dP6tibhxk/JT37F2KEKIAmJWN0Kt9fvA+xaKReTRyW0RtDn+DVvv68aw38I4t+CYtF0VohCQdrJ26tad2t+cs5KXiWdMk0cJT11laQ+7zQshzCNL6e3QrTu1F4uOo9/5OSz2epwjZTLO8pG+J0I4NkngdujWndr7rfoDT+L4umWXLI+VvidCOC5J4HYoLSl7XYvlhbPzWer5OKer+mR5rPQ9EcJxSQK3Q2lJuc/vaynGNSY/2AMAlek46XsihGOTBG6HhrStxj0J13jhxEKWuHbiVFBxPFxMPNWovPQ9EaIQkVkodqhTsD+l3lhHEX2dzxo+TbkSMmVQiMJIErgd0idO0mDT//ix6LNsWNcVFxdrRySEsAZJ4Hbg1jnfZb09mLL4a+7TziS/N1qStxCFmNTAbdytc741UOLQPursWsq0Iq/zxKCy1g5PCGFFksBt3K1zvtGaob/PIxJfZjXvgqurdWMTQliXlFBs3K0LcUJO7qZZxE4GuU0kpvolK0YlhLAFMgK3cWlzvp1Skhm2Zg4nqMQPD7bE39fNypEJIaxNEriNG9K2Gh4uJjof3ECNmBO86zYKrwaRskBHCCElFFvXKdgfU9x1Gkyazw7qs711Az59opjM+RZCSAK3Bx0WTEZfj+CFkks58GN1PKS9iRACSeBWlXl+d5arKf/8E775mq8YSJtRTSR5CyHSSQK3krT53WlTBNM2YNh5Opr1/0Ry7ko8FYuYWDZzIDFOFZhX7WO2vGTloIUQNkUSuJVkmN+dKj4xmXnbzqBTf+/+67cUP3OCrqxm4tSiOMu7JYS4hcxCsZLsNlpIS941Lxyn/99L+ZZn2Btci2bNCi42IYR9yPOYTilVDVh4y02VgJFa68/NDcpW5ahmnUNlvT3S96/MzDk5iQm/fUmkkx9vmcZTrGkoUCbvgQshHFKeR+Ba6yNa6yCtdRBQD4gDfrJUYLYmc0+StJr1z3vC8/R8afO7b5W2IcOLfy+hZsRJXkqeigq5yL3+ptufQAhR6FmqhNIKOKG1Pm2h57M52dWs87ppcKdgf8Z2qZ1hA4anGpXnofADDNoynx+du/Jb6RaUahgmi3aEEFmy1GWxJ4EFWd2hlOoP9AcoX768hV6u4GVXszZn0+BOwf4ZSzBHjpCwbCwn3SvRP24m1Tof44NusquOECJrZidwpZQr8DgwPKv7tdbTgekA9evX11kdYw+yq1nndNPgu9bPL12C9u3RTq60u/Y73Z7zZuaU+pYKXwjhgCxRQnkU2K21vmiB57JZWdWsc7pp8F3r5zdvQufOpJwNo33ScorWDuDzzy1/DkIIx2KJBN6TbMonjiSrmnVONw2+Y/1ca3j+efjzTwb7zGavRyOWLYOiRfPpRIQQDsOsEopSyhNoDbxomXBs22016xzKtn5+OQ5Gj4a5c5l13xi+PtWDtWuhYkUzAxVCFApmJXCtdRzgY6FYHFZW9XOX5EQmbpwJO1ayvWY/njk4gunTISTESkEKIeyOrMQsAJnr577XL/PDD+/QccdK9rYfQeODMxk4UPHCC1YMUghhd6S7RgFIK7t88vsRSv6zn5k/f4TPjViW9viBbj/2oEVL+OwzKwcphLA7MgIvIJ0Cy7Cl9GlWLByGXzEP3mr0F10X9uDJJ2H5cnBxsXaEQgh7IyNwM911frfWsGoVvPMO7NnDtXohtIpezO4tfnzxBbz6KiiV/fMLIUR2ZARuhrvO7960ybgq2a4d+soVNjw7h3sOruPsDT82bIDXXpPkLYTIO0ngZshqfrfztasc/OgLaNECHnqI5GMn+PWxbwi48Q8tvutNvYYmdu+Gpk2tFLQQwmFICcUMafO73ZISaH5iJ50ObaDliR24JScSX7Yyy+p9woB9LxOzwpM2beCr6dCuHTjJx6YQwgIkgWfjrrXthAS6nQ+l0a61tD66neKJ17no7Mt0t+eYG9+X7eceoOhVRd/+MHAgVK9uvXMRQjgmSeBZyG6/SrTmwX9PEPvVbEr/9ROf3LzCZbxZRA8W0oP1hODqd52g+slU99xPnM959pR24Z/4alRHOgoKISxLEngWMte2UxIUdTYc556Jo/C98TcuFGeJUyd23fcEx2o34QgXifOKpMF9f9Gypi9LdoUTn5iMAsKvJBnJH6QtrBDCoiSBZyGttp0QUYRmG47z5qlpNNQ7OaPK8csjX1H23Wfp0cCD3q5pjygBGDWSpuPWZdu4ShK4EMKSJIFnoUxxD2JWKr7f+h7N+JOTLuUZHDicnY89xKaRbe/42PzY+EEIIbIiCTyTixehxvxkPjr4NEXUNYa0GMTSei1wdXNl7GO17vp4czd+EEKInJIJbbdY/bvmm/s+Y+rBR9Elvej/2mQWN3iYe0oWzXHvb3M2fhBCiNyQEXiqCe/FUnHMc4xmETGtunDP0v8xv3jxXD/PrY2rsp2CKIQQFlDoEnhW87tjt5fgoTEP00DtJOHDCXiNeMusNe553fhBCCFyo1Al8Kzmdw/6/DSffv86DdhBysIluHbvbOUohRAiZwpVDTzz/O6kGA9enP8zXfUSbnw4EWdJ3kIIO1KoEvitU/lSbppoO+8Iw5M+YW71Dni+84YVIxNCiNwrVAk8bSqfToHqi+KZEvs6G0s3YPrT0pRbCGF/zN2V3huYCdQCNPCs1vovC8RlEZkvWLao7seSXeF4rDSxILwPp4qUY0jvtxnRrqa1QxVCiFwz9yLmF8AqrXU3pZQr4GmBmCwiqwuWS3aF09LvXp7f8zSYNO++9AEjejWWGSNCCLuU5wSulCoOhAD9ALTWCUCCZcIyX1abLcQnJlN8zE8EE8qVaYv58bmuQA5axwohhA0ypwZeCYgE/qeU2qOUmqmUKmKhuMyWVe8R7/0pjIgcz8nq7fB+tguQg23RhBDCRpmTwJ2BusAUrXUwcB0YlvkgpVR/pdROpdTOyMhIM14udzL3HtHJivfWfIszSZT7+av0i5bZjdQ/+f1IgcUqhBB5YU4CDwPCtNZ/p/6+GCOhZ6C1nq61rq+1ru/n52fGy+VO5p4kjX4/TdfEZfzZ4U1cqwWk3y7dA4UQ9irPCVxrfQE4q5RK69LUCjhkkagsoFOwP2O71Mbf2wPXKymM3z+ekx7Vab1kZIbjsusSKN0DhRC2ztx54K8C85RS+4Ag4GOzI7KgTsH+bBnWks+3baUip3GePg1cXTMcI90DhRD2yqxphFrrUKC+ZULJH4cWHaT13olsr9mPhk+H3Ha/dA8UQtgrh29mFffSYGJVcaovm5DtMdI9UAhhjxx6Kf3xuduoH7Wa0EeGUbxywV1AFUKIguDQCfz6sA+JwofgaS9ZOxQhhLA4h03gkb/tJDD8V7Y2fpMS9xa1djhCCGFxDlsDj3ztQ0yUoNaUV6wdihBC5AuHHIHHbQ2lxvHlrK4xiIDA3O9rKYQQ9sAhE/i5l8cQQ3EqTXrN2qEIIUS+cbgEnrz3APftXcIS/9dp2Mbb2uEIIUS+cbgEfu7lMcRSFN8xg6wdihBC5CvHSuD//IP/1h/53vtV2vcuae1ohBAiXzlUAo8YPI54PHAZ8gYm092PF0IIe+Y4CTwykhK/L2C+6zP0fE1WXQohHJ/DJPDrX87EJSWBiCcGUlTW7QghCgHHSOBJSaR8PYU1PEyHt6pbOxohhCgQjpHAly+n2OWzzCzxLJ0WrKTpuHWyp6UQwuE5RAI/895nnKY86+rVkI2JhRCFhv0n8IMHKX9oC9+oAbjXuJh+s2xMLIRwdHafwJO+/Jp43Jl/32OYPBIz3CcbEwshHJl9J/CYGPTsOSygJwnB12+7WzYmFkI4MvtO4LNm4XLzOvN8BlDivssZ7pKNiYUQjs5+E3hKColffM1WGtP05YaM61Ybf28PFODv7cHYLrVln0shhEMza0MHpdQpIBZIBpK01gW3Q/2aNbj8e4yvGMWYflCpkmxMLIQoXCyxI08LrfUlCzxPruivvyHKVIpLD3ajUqWCfnUhhLA++yyhnD8PK1cyM/kZ+jzvau1ohBDCKsxN4BpYrZTapZTqn9UBSqn+SqmdSqmdkZGRZr5cqtmzUSnJLCzyHF26WOYphRDC3pibwJtqresCjwKvKKVCMh+gtZ6uta6vta7v52eBLoFakzJjJptND1G3RxU8Pc1/SiGEsEdmJXCt9bnUPyOAn4CGlgjqjjZuxOnkCaYlP8/K69uk74kQotDKcwJXShVRShVL+zvQBjhgqcCyc3bCl1xxKs5Pnu1xKx8lfU+EEIWWOSPw0sCfSqm9wHZgpdZ6lWXCysbly5RavZK5+mlM919BpUYvfU+EEIVRnqcRaq1PAoEWjOXu5s3DLTmBmbxAkRoZR9zS90QIUdjYzzRCrWHGDELdAjnoXQXXMjEZ7pa+J0KIwsZ+EviuXbBvHzMS+uNV6zxK/XeX9D0RQhRG9pPAZ84k0cWDeboX7w8qJn1PhBCFniWW0ue/69dhwQJWe3UnoJw3r3aFVylt7aiEEMKq7GMEvngxXL3KuEvP06uXtYMRQgjbYB8JfP9+LvlW508epEcPawcjhBC2wS4SuP5kIm18dtGsmaJ8eWtHI4QQtsEuEvi+fbDniKeUT4QQ4hZ2kcDnzwdnZ+jWzdqRCCGE7bD5BP7znnBWRIRStMk/dJwpjauEECKNTU8j/HlPOMOX7ie+dDJepSH8Cgxfuh9A5n0LIQo9mx6Bf/L7EeITkzPcJo2rhBDCYNMJPLsGVdK4SgghbDyBZ9egShpXCSGEjSfwIW2r4eFiynCbNK4SQgiDTV/ETLtQ+cnvRzh3JZ6y3h4MaVtNLmAKIQQ2nsDBSOKSsIUQ4nY2XUIRQgiRPUngQghhpySBCyGEnZIELoQQdkoSuBBC2CmltS64F1MqEjidx4f7ApcsGI49kHMuHOScCwdzzrmC1tov840FmsDNoZTaqbWub+04CpKcc+Eg51w45Mc5SwlFCCHslCRwIYSwU/aUwKdbOwArkHMuHOScCweLn7Pd1MCFEEJkZE8jcCGEELeQBC6EEHbKLhK4UuoRpdQRpdRxpdQwa8dTEJRSp5RS+5VSoUqpndaOJz8opb5TSkUopQ7ccltJpdQapdSx1D9LWDNGS8vmnEcppcJT3+tQpVQ7a8ZoSUqpe5VS65VSh5VSB5VSr6fe7rDv8x3O2eLvs83XwJVSJuAo0BoIA3YAPbXWh6waWD5TSp0C6mutHXaxg1IqBLgGzNFa10q9bQIQrbUel/phXUJrPdSacVpSNuc8CrimtZ5ozdjyg1KqDFBGa71bKVUM2AV0AvrhoO/zHc75CSz8PtvDCLwhcFxrfVJrnQD8AHS0ckzCArTWm4DoTDd3BGan/n02xn/4DiObc3ZYWuvzWuvdqX+PBQ4D/jjw+3yHc7Y4e0jg/sDZW34PI5/+MWyMBlYrpXYppfpbO5gCVFprfR6M/xGAUlaOp6AMVErtSy2xOEw54VZKqYpAMPA3heR9znTOYOH32R4SuMriNtuu+1hGU611XeBR4JXUr97CMU0BKgNBwHngU6tGkw+UUkWBJcAgrfVVa8dTELI4Z4u/z/aQwMOAe2/5vRxwzkqxFBit9bnUPyOAnzBKSYXBxdQaYlotMcLK8eQ7rfVFrXWy1joFmIGDvddKKReMRDZPa7009WaHfp+zOuf8eJ/tIYHvAKoopQKUUq7Ak8ByK8eUr5RSRVIvfqCUKgK0AQ7c+VEOYznQN/XvfYFlVoylQKQlslSdcaD3WimlgG+Bw1rrz265y2Hf5+zOOT/eZ5ufhQKQOt3mc8AEfKe1/si6EeUvpVQljFE3GBtPz3fEc1ZKLQCaY7TZvAi8D/wM/AiUB84A3bXWDnPRL5tzbo7xtVoDp4AX0+rD9k4p9SCwGdgPpKTePAKjJuyQ7/MdzrknFn6f7SKBCyGEuJ09lFCEEEJkQRK4EELYKUngQghhpySBCyGEnZIELoQQdkoSuBBC2ClJ4EIIYaf+D8acHX2rDQ6AAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "\n",
    "fig, ax = plt.subplots()\n",
    "ax.plot(x1, y, 'o', label=\"Data\")\n",
    "ax.plot(x1, y_true, 'b-', label=\"True\")\n",
    "ax.plot(np.hstack((x1, x1n)), np.hstack((ypred, ynewpred)), 'r', label=\"OLS prediction\")\n",
    "ax.legend(loc=\"best\");"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Predicting with Formulas"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Using formulas can make both estimation and prediction a lot easier"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "from statsmodels.formula.api import ols\n",
    "\n",
    "data = {\"x1\" : x1, \"y\" : y}\n",
    "\n",
    "res = ols(\"y ~ x1 + np.sin(x1) + I((x1-5)**2)\", data=data).fit()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We use the `I` to indicate use of the Identity transform. Ie., we do not want any expansion magic from using `**2`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Intercept           5.072539\n",
       "x1                  0.481805\n",
       "np.sin(x1)          0.416080\n",
       "I((x1 - 5) ** 2)   -0.018039\n",
       "dtype: float64"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "res.params"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now we only have to pass the single variable and we get the transformed right-hand side variables automatically"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    11.030521\n",
       "1    10.920670\n",
       "2    10.716569\n",
       "3    10.455402\n",
       "4    10.186118\n",
       "5     9.957444\n",
       "6     9.805955\n",
       "7     9.747122\n",
       "8     9.771522\n",
       "9     9.847145\n",
       "dtype: float64"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "res.predict(exog=dict(x1=x1n))"
   ]
  }
 ],
 "metadata": {
  "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.8.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
