{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Import Functional Data\n",
    "Import CSV data into a functional attribute and update the parameters and header units."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Import required libraries\n",
    "Connect to MI and specify a table."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from datetime import datetime\n",
    "import csv\n",
    "from GRANTA_MIScriptingToolkit import granta as mpy\n",
    "\n",
    "mi = mpy.connect('http://localhost/mi_servicelayer', autologon=True)\n",
    "db = mi.get_db(db_key='MI_Training')\n",
    "tab = db.get_table('Design Data')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Create a new record to store your data\n",
    "Define names for a new record, and an attribute on that record."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "now = datetime.now().strftime(\"%c\")\n",
    "recordName = 'STK Example 7:{}'.format(now)\n",
    "funcAttributeName = 'Tensile Stress/Strain, L'"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Create the new **Record** object."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Record long name:STK Example 7:Tue Mar 23 15:54:35 2021>"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rec = tab.create_record(recordName, subsets={'Design Data'})\n",
    "rec"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Get the unpopulated functional attribute for the new record, so we can populate it."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<FloatFunctionalSeriesValue name: Tensile Stress/Strain, L, with 0 points>"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "func = rec.attributes[funcAttributeName]\n",
    "func"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Import test data\n",
    "The tensile test data to import is stored in `example.csv`.\n",
    "Read in each row of the CSV data, and add the data to the functional attribute point-by-point."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "with open('example.csv') as csvfile:\n",
    "    reader = csv.DictReader(csvfile, delimiter=',')\n",
    "    for row in reader:\n",
    "        func.add_point({'y': float(row['Tensile Stress [ksi]']),\n",
    "                        'Strain': float(row['Strain [%]']),\n",
    "                        'Temperature': float(row['Temperature [Celsius]']),\n",
    "                        'Stress/Strain Curve Type': str(row['Curve Type']),\n",
    "                        'Estimated?': bool(row['Estimated?'])})"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "Access the `func.data` property to see the underlying data structure of the attribute represented as a list of lists.\n",
    "`func.data` shows all parameters supported by the attribute. Parameters that were not populated during the import have\n",
    "been set to **None**."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[['Y min (Tensile Stress/Strain, L [ksi])',\n",
       "  'Y max (Tensile Stress/Strain, L [ksi])',\n",
       "  'Strain [% strain]',\n",
       "  'Temperature [K]',\n",
       "  'Time [hr]',\n",
       "  'Other []',\n",
       "  'Stress/Strain Curve Type []',\n",
       "  'Estimated point?'],\n",
       " [0.0, 0.0, 0.0, -73.0, None, None, 'Yield', True],\n",
       " [396.0, 396.0, 0.209, -73.0, None, None, 'Yield', True],\n",
       " [714.0, 714.0, 0.376, -73.0, None, None, 'Yield', True],\n",
       " [1031.0, 1031.0, 0.544, -73.0, None, None, 'Yield', True],\n",
       " [1269.0, 1269.0, 0.669, -73.0, None, None, 'Yield', True],\n",
       " [1427.0, 1427.0, 0.753, -73.0, None, None, 'Yield', True],\n",
       " [1507.0, 1507.0, 0.795, -73.0, None, None, 'Yield', True],\n",
       " [1570.0, 1570.0, 0.83, -73.0, None, None, 'Yield', True],\n",
       " [1633.0, 1633.0, 0.867, -73.0, None, None, 'Yield', True],\n",
       " [1681.0, 1681.0, 0.897, -73.0, None, None, 'Yield', True],\n",
       " [1721.0, 1721.0, 0.925, -73.0, None, None, 'Yield', True],\n",
       " [1752.0, 1752.0, 0.952, -73.0, None, None, 'Yield', True],\n",
       " [1784.0, 1784.0, 0.983, -73.0, None, None, 'Yield', True],\n",
       " [1808.0, 1808.0, 1.012, -73.0, None, None, 'Yield', True],\n",
       " [1824.0, 1824.0, 1.034, -73.0, None, None, 'Yield', True],\n",
       " [1840.0, 1840.0, 1.059, -73.0, None, None, 'Yield', True],\n",
       " [1855.0, 1855.0, 1.087, -73.0, None, None, 'Yield', True],\n",
       " [1871.0, 1871.0, 1.121, -73.0, None, None, 'Yield', True],\n",
       " [1887.0, 1887.0, 1.159, -73.0, None, None, 'Yield', True],\n",
       " [1903.0, 1903.0, 1.204, -73.0, None, None, 'Yield', True],\n",
       " [1919.0, 1919.0, 1.256, -73.0, None, None, 'Yield', True],\n",
       " [1935.0, 1935.0, 1.318, -73.0, None, None, 'Yield', True],\n",
       " [1951.0, 1951.0, 1.39, -73.0, None, None, 'Yield', True],\n",
       " [1958.0, 1958.0, 1.432, -73.0, None, None, 'Yield', True],\n",
       " [1966.0, 1966.0, 1.476, -73.0, None, None, 'Yield', True],\n",
       " [0.0, 0.0, 0.0, 27.0, None, None, 'Yield', True],\n",
       " [371.0, 371.0, 0.203, 27.0, None, None, 'Yield', True],\n",
       " [667.0, 667.0, 0.365, 27.0, None, None, 'Yield', True],\n",
       " [964.0, 964.0, 0.527, 27.0, None, None, 'Yield', True],\n",
       " [1186.0, 1186.0, 0.649, 27.0, None, None, 'Yield', True],\n",
       " [1334.0, 1334.0, 0.73, 27.0, None, None, 'Yield', True],\n",
       " [1408.0, 1408.0, 0.771, 27.0, None, None, 'Yield', True],\n",
       " [1468.0, 1468.0, 0.805, 27.0, None, None, 'Yield', True],\n",
       " [1527.0, 1527.0, 0.839, 27.0, None, None, 'Yield', True],\n",
       " [1571.0, 1571.0, 0.868, 27.0, None, None, 'Yield', True],\n",
       " [1608.0, 1608.0, 0.895, 27.0, None, None, 'Yield', True],\n",
       " [1638.0, 1638.0, 0.92, 27.0, None, None, 'Yield', True],\n",
       " [1668.0, 1668.0, 0.95, 27.0, None, None, 'Yield', True],\n",
       " [1690.0, 1690.0, 0.978, 27.0, None, None, 'Yield', True],\n",
       " [1705.0, 1705.0, 0.999, 27.0, None, None, 'Yield', True],\n",
       " [1720.0, 1720.0, 1.024, 27.0, None, None, 'Yield', True],\n",
       " [1734.0, 1734.0, 1.053, 27.0, None, None, 'Yield', True],\n",
       " [1749.0, 1749.0, 1.087, 27.0, None, None, 'Yield', True],\n",
       " [1764.0, 1764.0, 1.126, 27.0, None, None, 'Yield', True],\n",
       " [1779.0, 1779.0, 1.174, 27.0, None, None, 'Yield', True],\n",
       " [1794.0, 1794.0, 1.23, 27.0, None, None, 'Yield', True],\n",
       " [1808.0, 1808.0, 1.297, 27.0, None, None, 'Yield', True],\n",
       " [1823.0, 1823.0, 1.378, 27.0, None, None, 'Yield', True],\n",
       " [1831.0, 1831.0, 1.424, 27.0, None, None, 'Yield', True],\n",
       " [1838.0, 1838.0, 1.475, 27.0, None, None, 'Yield', True],\n",
       " [0.0, 0.0, 0.0, 149.0, None, None, 'Yield', True],\n",
       " [328.0, 328.0, 0.187, 149.0, None, None, 'Yield', True],\n",
       " [590.0, 590.0, 0.337, 149.0, None, None, 'Yield', True],\n",
       " [852.0, 852.0, 0.486, 149.0, None, None, 'Yield', True],\n",
       " [1048.0, 1048.0, 0.598, 149.0, None, None, 'Yield', True],\n",
       " [1179.0, 1179.0, 0.673, 149.0, None, None, 'Yield', True],\n",
       " [1245.0, 1245.0, 0.711, 149.0, None, None, 'Yield', True],\n",
       " [1297.0, 1297.0, 0.741, 149.0, None, None, 'Yield', True],\n",
       " [1349.0, 1349.0, 0.773, 149.0, None, None, 'Yield', True],\n",
       " [1389.0, 1389.0, 0.798, 149.0, None, None, 'Yield', True],\n",
       " [1421.0, 1421.0, 0.822, 149.0, None, None, 'Yield', True],\n",
       " [1448.0, 1448.0, 0.845, 149.0, None, None, 'Yield', True],\n",
       " [1474.0, 1474.0, 0.872, 149.0, None, None, 'Yield', True],\n",
       " [1493.0, 1493.0, 0.898, 149.0, None, None, 'Yield', True],\n",
       " [1507.0, 1507.0, 0.918, 149.0, None, None, 'Yield', True],\n",
       " [1520.0, 1520.0, 0.943, 149.0, None, None, 'Yield', True],\n",
       " [1533.0, 1533.0, 0.971, 149.0, None, None, 'Yield', True],\n",
       " [1546.0, 1546.0, 1.006, 149.0, None, None, 'Yield', True],\n",
       " [1559.0, 1559.0, 1.047, 149.0, None, None, 'Yield', True],\n",
       " [1572.0, 1572.0, 1.098, 149.0, None, None, 'Yield', True],\n",
       " [1585.0, 1585.0, 1.16, 149.0, None, None, 'Yield', True],\n",
       " [1598.0, 1598.0, 1.236, 149.0, None, None, 'Yield', True],\n",
       " [1611.0, 1611.0, 1.329, 149.0, None, None, 'Yield', True],\n",
       " [1618.0, 1618.0, 1.384, 149.0, None, None, 'Yield', True],\n",
       " [0.0, 0.0, 0.0, 316.0, None, None, 'Yield', True],\n",
       " [307.0, 307.0, 0.182, 316.0, None, None, 'Yield', True],\n",
       " [553.0, 553.0, 0.328, 316.0, None, None, 'Yield', True],\n",
       " [799.0, 799.0, 0.473, 316.0, None, None, 'Yield', True],\n",
       " [984.0, 984.0, 0.582, 316.0, None, None, 'Yield', True],\n",
       " [1107.0, 1107.0, 0.655, 316.0, None, None, 'Yield', True],\n",
       " [1168.0, 1168.0, 0.692, 316.0, None, None, 'Yield', True],\n",
       " [1217.0, 1217.0, 0.722, 316.0, None, None, 'Yield', True],\n",
       " [1266.0, 1266.0, 0.753, 316.0, None, None, 'Yield', True],\n",
       " [1303.0, 1303.0, 0.78, 316.0, None, None, 'Yield', True],\n",
       " [1334.0, 1334.0, 0.804, 316.0, None, None, 'Yield', True],\n",
       " [1359.0, 1359.0, 0.828, 316.0, None, None, 'Yield', True],\n",
       " [1383.0, 1383.0, 0.856, 316.0, None, None, 'Yield', True],\n",
       " [1402.0, 1402.0, 0.882, 316.0, None, None, 'Yield', True],\n",
       " [1414.0, 1414.0, 0.903, 316.0, None, None, 'Yield', True],\n",
       " [1426.0, 1426.0, 0.927, 316.0, None, None, 'Yield', True],\n",
       " [1439.0, 1439.0, 0.955, 316.0, None, None, 'Yield', True],\n",
       " [1451.0, 1451.0, 0.988, 316.0, None, None, 'Yield', True],\n",
       " [1463.0, 1463.0, 1.027, 316.0, None, None, 'Yield', True],\n",
       " [1475.0, 1475.0, 1.073, 316.0, None, None, 'Yield', True],\n",
       " [1488.0, 1488.0, 1.129, 316.0, None, None, 'Yield', True],\n",
       " [1500.0, 1500.0, 1.195, 316.0, None, None, 'Yield', True],\n",
       " [1512.0, 1512.0, 1.275, 316.0, None, None, 'Yield', True],\n",
       " [1519.0, 1519.0, 1.321, 316.0, None, None, 'Yield', True],\n",
       " [1525.0, 1525.0, 1.372, 316.0, None, None, 'Yield', True],\n",
       " [0.0, 0.0, 0.0, 427.0, None, None, 'Yield', True],\n",
       " [303.0, 303.0, 0.192, 427.0, None, None, 'Yield', True],\n",
       " [545.0, 545.0, 0.345, 427.0, None, None, 'Yield', True],\n",
       " [787.0, 787.0, 0.499, 427.0, None, None, 'Yield', True],\n",
       " [969.0, 969.0, 0.617, 427.0, None, None, 'Yield', True],\n",
       " [1090.0, 1090.0, 0.704, 427.0, None, None, 'Yield', True],\n",
       " [1151.0, 1151.0, 0.753, 427.0, None, None, 'Yield', True],\n",
       " [1199.0, 1199.0, 0.798, 427.0, None, None, 'Yield', True],\n",
       " [1247.0, 1247.0, 0.85, 427.0, None, None, 'Yield', True],\n",
       " [1284.0, 1284.0, 0.895, 427.0, None, None, 'Yield', True],\n",
       " [1314.0, 1314.0, 0.938, 427.0, None, None, 'Yield', True],\n",
       " [1338.0, 1338.0, 0.977, 427.0, None, None, 'Yield', True],\n",
       " [1362.0, 1362.0, 1.02, 427.0, None, None, 'Yield', True],\n",
       " [1381.0, 1381.0, 1.056, 427.0, None, None, 'Yield', True],\n",
       " [1393.0, 1393.0, 1.082, 427.0, None, None, 'Yield', True],\n",
       " [1405.0, 1405.0, 1.11, 427.0, None, None, 'Yield', True],\n",
       " [1417.0, 1417.0, 1.139, 427.0, None, None, 'Yield', True],\n",
       " [1429.0, 1429.0, 1.171, 427.0, None, None, 'Yield', True],\n",
       " [1441.0, 1441.0, 1.204, 427.0, None, None, 'Yield', True],\n",
       " [1453.0, 1453.0, 1.24, 427.0, None, None, 'Yield', True],\n",
       " [1465.0, 1465.0, 1.278, 427.0, None, None, 'Yield', True],\n",
       " [1478.0, 1478.0, 1.319, 427.0, None, None, 'Yield', True],\n",
       " [1490.0, 1490.0, 1.363, 427.0, None, None, 'Yield', True],\n",
       " [1496.0, 1496.0, 1.386, 427.0, None, None, 'Yield', True]]"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "func.data"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The example data uses Celsius for temperature, but the database default is Kelvin.\n",
    "Change the parameter unit before import to take account of this."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "func.parameters['Temperature'].unit = '°C'"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "After changing the units, it is good practice to update the header units in `func.data` so that the units displayed in\n",
    "MI applications are correct."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "func.update_header_units()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Write your changes to MI"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<Record long name:STK Example 7:Tue Mar 23 15:54:35 2021>]"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rec.set_attributes([func])\n",
    "mi.update([rec])"
   ]
  }
 ],
 "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.6.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
