Repository: SDXorg/pysd (language: python)

Issue:
Error when parsing subscript elements in general expressions
When parsing Vensim code, if in an expression a subscript element name (e.g. water transport) partially coincides with an actual subscript name (e.g. water), the parser crashes, giving the following error:

parsimonious.exceptions.IncompleteParseError: Rule 'expr_type' matched in its entirety, but it didn't consume all the text. The non-matching portion of the text begins with '[scenarios,final sou' (line 1, column 41).

Here's an example:

These are the subscripts and their respective elements
``
sectors: Water Transport, Inland Transport, Air Transport ~ ~ |
``
``
water: blue, green, gray ~ ~ |
``

Here's the expression that crashes the parser:
``
Required energy for water transport[fuels] = Required energy by sector and fuel[fuels, Water Transport] ~ ~ |
``

The issue is that the parser matches "water" as a subscript, and not as a subscript element (as it should), and therefore after matching only "water", there's still some text that was not "consumed" (" Transport").

I guess a regex could be used in the grammar to fix that issue. This is the part of the grammar that matches subsrcripts and subsrcript elements:

``
sub_name = ~r"(%(sub_names)s)"IU  # subscript names (if none, use non-printable character)
sub_element = ~r"(%(sub_elems)s)"IU  # subscript elements (if none, use non-printable character)
``

A final note, this only happen if "water" is the first word of the subscript element, but not in other cases (e.g. subscript element "Electricity Gas and **Water** Supply" is matched as expected)








Discussion / hints:

Fix patch:
diff --git a/dist/pysd-1.0.1-py3-none-any.whl b/dist/pysd-1.0.1-py3-none-any.whl
deleted file mode 100644
index 1a69ae7e..00000000
Binary files a/dist/pysd-1.0.1-py3-none-any.whl and /dev/null differ
diff --git a/dist/pysd-1.0.1.tar.gz b/dist/pysd-1.0.1.tar.gz
deleted file mode 100644
index 09d6ed19..00000000
Binary files a/dist/pysd-1.0.1.tar.gz and /dev/null differ
diff --git a/dist/pysd-1.1.0-py3-none-any.whl b/dist/pysd-1.1.0-py3-none-any.whl
new file mode 100644
index 00000000..61b325d9
Binary files /dev/null and b/dist/pysd-1.1.0-py3-none-any.whl differ
diff --git a/dist/pysd-1.1.0.tar.gz b/dist/pysd-1.1.0.tar.gz
new file mode 100644
index 00000000..6e25ae7c
Binary files /dev/null and b/dist/pysd-1.1.0.tar.gz differ
diff --git a/docs/_build/doctrees/basic_usage.doctree b/docs/_build/doctrees/basic_usage.doctree
index 6793de67..83a93918 100644
Binary files a/docs/_build/doctrees/basic_usage.doctree and b/docs/_build/doctrees/basic_usage.doctree differ
diff --git a/docs/_build/doctrees/development/internal_functions.doctree b/docs/_build/doctrees/development/internal_functions.doctree
index eb4b33ea..52226cf7 100644
Binary files a/docs/_build/doctrees/development/internal_functions.doctree and b/docs/_build/doctrees/development/internal_functions.doctree differ
diff --git a/docs/_build/doctrees/development/vensim_translation.doctree b/docs/_build/doctrees/development/vensim_translation.doctree
index 8b798df5..8fb898c6 100644
Binary files a/docs/_build/doctrees/development/vensim_translation.doctree and b/docs/_build/doctrees/development/vensim_translation.doctree differ
diff --git a/docs/_build/doctrees/environment.pickle b/docs/_build/doctrees/environment.pickle
index 8f30dc34..8195c3d0 100644
Binary files a/docs/_build/doctrees/environment.pickle and b/docs/_build/doctrees/environment.pickle differ
diff --git a/docs/_build/doctrees/functions.doctree b/docs/_build/doctrees/functions.doctree
index 278eab4b..7e5a2ca5 100644
Binary files a/docs/_build/doctrees/functions.doctree and b/docs/_build/doctrees/functions.doctree differ
diff --git a/docs/_build/html/.buildinfo b/docs/_build/html/.buildinfo
index 22ef124a..7f8aa3b6 100644
--- a/docs/_build/html/.buildinfo
+++ b/docs/_build/html/.buildinfo
@@ -1,4 +1,4 @@
 # Sphinx build info version 1
 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done.
-config: ff86efc2833b51eb9fe3747f4d29d7fc
+config: ca8296b50e91bd3cdd0bf700014e9712
 tags: 645f666f9bcd5a90fca523b33c5a78b7
diff --git a/docs/_build/html/_modules/index.html b/docs/_build/html/_modules/index.html
index af3cd84a..956d8739 100644
--- a/docs/_build/html/_modules/index.html
+++ b/docs/_build/html/_modules/index.html
@@ -7,7 +7,7 @@
   
   <meta name="viewport" content="width=device-width, initial-scale=1.0" />
   
-  <title>Overview: module code &mdash; PySD 1.0.0 documentation</title>
+  <title>Overview: module code &mdash; PySD 1.1.0 documentation</title>
   
 
   
@@ -61,7 +61,7 @@
             
             
               <div class="version">
-                1.0
+                1.1
               </div>
             
           
diff --git a/docs/_build/html/advanced_usage.html b/docs/_build/html/advanced_usage.html
index 8a050f54..31fd2fe9 100644
--- a/docs/_build/html/advanced_usage.html
+++ b/docs/_build/html/advanced_usage.html
@@ -7,7 +7,7 @@
   
   <meta name="viewport" content="width=device-width, initial-scale=1.0" />
   
-  <title>Advanced Usage &mdash; PySD 1.0.0 documentation</title>
+  <title>Advanced Usage &mdash; PySD 1.1.0 documentation</title>
   
 
   
@@ -63,7 +63,7 @@
             
             
               <div class="version">
-                1.0
+                1.1
               </div>
             
           
diff --git a/docs/_build/html/basic_usage.html b/docs/_build/html/basic_usage.html
index 740c11c0..32530d9a 100644
--- a/docs/_build/html/basic_usage.html
+++ b/docs/_build/html/basic_usage.html
@@ -7,7 +7,7 @@
   
   <meta name="viewport" content="width=device-width, initial-scale=1.0" />
   
-  <title>Basic Usage &mdash; PySD 1.0.0 documentation</title>
+  <title>Basic Usage &mdash; PySD 1.1.0 documentation</title>
   
 
   
@@ -63,7 +63,7 @@
             
             
               <div class="version">
-                1.0
+                1.1
               </div>
             
           
@@ -185,6 +185,22 @@ <h2>Importing a model and getting started<a class="headerlink" href="#importing-
 <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="nb">print</span> <span class="n">model</span><span class="o">.</span><span class="n">doc</span><span class="p">()</span>
 </pre></div>
 </div>
+<div class="admonition note">
+<p class="admonition-title">Note</p>
+<p>You can also load an already translated model file, what will be faster as you will load a Python file:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">pysd</span>
+<span class="n">model</span> <span class="o">=</span> <span class="n">pysd</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="s1">&#39;Teacup.py&#39;</span><span class="p">)</span>
+</pre></div>
+</div>
+</div>
+<div class="admonition note">
+<p class="admonition-title">Note</p>
+<p>The functions <code class="xref py py-func docutils literal notranslate"><span class="pre">read_vensim()</span></code>,  <code class="xref py py-func docutils literal notranslate"><span class="pre">read_xmile()</span></code> and <code class="xref py py-func docutils literal notranslate"><span class="pre">load()</span></code> have optional arguments for advanced usage, you can check the full description in <a class="reference internal" href="functions.html"><span class="doc">User Functions Reference</span></a> or using <a class="reference external" href="https://docs.python.org/2.7/library/functions.html#help" title="(in Python v2.7)"><code class="xref py py-func docutils literal notranslate"><span class="pre">help()</span></code></a> e.g.:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">pysd</span>
+<span class="n">help</span><span class="p">(</span><span class="n">pysd</span><span class="o">.</span><span class="n">load</span><span class="p">)</span>
+</pre></div>
+</div>
+</div>
 </div>
 <div class="section" id="running-the-model">
 <h2>Running the Model<a class="headerlink" href="#running-the-model" title="Permalink to this headline">¶</a></h2>
diff --git a/docs/_build/html/development/about.html b/docs/_build/html/development/about.html
index d30255a0..08cfb2a5 100644
--- a/docs/_build/html/development/about.html
+++ b/docs/_build/html/development/about.html
@@ -7,7 +7,7 @@
   
   <meta name="viewport" content="width=device-width, initial-scale=1.0" />
   
-  <title>About the Project &mdash; PySD 1.0.0 documentation</title>
+  <title>About the Project &mdash; PySD 1.1.0 documentation</title>
   
 
   
@@ -63,7 +63,7 @@
             
             
               <div class="version">
-                1.0
+                1.1
               </div>
             
           
diff --git a/docs/_build/html/development/complement.html b/docs/_build/html/development/complement.html
index 63ed3c79..df8d06f3 100644
--- a/docs/_build/html/development/complement.html
+++ b/docs/_build/html/development/complement.html
@@ -7,7 +7,7 @@
   
   <meta name="viewport" content="width=device-width, initial-scale=1.0" />
   
-  <title>Complementary Projects &mdash; PySD 1.0.0 documentation</title>
+  <title>Complementary Projects &mdash; PySD 1.1.0 documentation</title>
   
 
   
@@ -62,7 +62,7 @@
             
             
               <div class="version">
-                1.0
+                1.1
               </div>
             
           
diff --git a/docs/_build/html/development/contributing.html b/docs/_build/html/development/contributing.html
index 6270e401..897f0fa9 100644
--- a/docs/_build/html/development/contributing.html
+++ b/docs/_build/html/development/contributing.html
@@ -7,7 +7,7 @@
   
   <meta name="viewport" content="width=device-width, initial-scale=1.0" />
   
-  <title>Contributing to PySD &mdash; PySD 1.0.0 documentation</title>
+  <title>Contributing to PySD &mdash; PySD 1.1.0 documentation</title>
   
 
   
@@ -63,7 +63,7 @@
             
             
               <div class="version">
-                1.0
+                1.1
               </div>
             
           
diff --git a/docs/_build/html/development/development_index.html b/docs/_build/html/development/development_index.html
index a7d1d144..d6ba237b 100644
--- a/docs/_build/html/development/development_index.html
+++ b/docs/_build/html/development/development_index.html
@@ -7,7 +7,7 @@
   
   <meta name="viewport" content="width=device-width, initial-scale=1.0" />
   
-  <title>Developer Documentation &mdash; PySD 1.0.0 documentation</title>
+  <title>Developer Documentation &mdash; PySD 1.1.0 documentation</title>
   
 
   
@@ -63,7 +63,7 @@
             
             
               <div class="version">
-                1.0
+                1.1
               </div>
             
           
diff --git a/docs/_build/html/development/internal_functions.html b/docs/_build/html/development/internal_functions.html
index dd798621..b14dcc20 100644
--- a/docs/_build/html/development/internal_functions.html
+++ b/docs/_build/html/development/internal_functions.html
@@ -7,7 +7,7 @@
   
   <meta name="viewport" content="width=device-width, initial-scale=1.0" />
   
-  <title>Internal Functions &mdash; PySD 1.0.0 documentation</title>
+  <title>Internal Functions &mdash; PySD 1.1.0 documentation</title>
   
 
   
@@ -63,7 +63,7 @@
             
             
               <div class="version">
-                1.0
+                1.1
               </div>
             
           
@@ -618,7 +618,7 @@ <h2>Building the python model file<a class="headerlink" href="#building-the-pyth
 
 <dl class="py method">
 <dt id="py_backend.external.Excels.read">
-<em class="property">classmethod </em><code class="sig-name descname">read</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">file_name</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/py_backend/external.html#Excels.read"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#py_backend.external.Excels.read" title="Permalink to this definition">¶</a></dt>
+<em class="property">classmethod </em><code class="sig-name descname">read</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">file_name</span></em>, <em class="sig-param"><span class="n">sheet_name</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/py_backend/external.html#Excels.read"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#py_backend.external.Excels.read" title="Permalink to this definition">¶</a></dt>
 <dd><p>Read the Excel file or return the previously read one</p>
 </dd></dl>
 
@@ -632,7 +632,7 @@ <h2>Building the python model file<a class="headerlink" href="#building-the-pyth
 
 <dl class="py class">
 <dt id="py_backend.external.ExtConstant">
-<em class="property">class </em><code class="sig-prename descclassname">py_backend.external.</code><code class="sig-name descname">ExtConstant</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">file_name</span></em>, <em class="sig-param"><span class="n">tab</span></em>, <em class="sig-param"><span class="n">cell</span></em>, <em class="sig-param"><span class="n">coords</span></em>, <em class="sig-param"><span class="n">root</span></em>, <em class="sig-param"><span class="n">py_name</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/py_backend/external.html#ExtConstant"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#py_backend.external.ExtConstant" title="Permalink to this definition">¶</a></dt>
+<em class="property">class </em><code class="sig-prename descclassname">py_backend.external.</code><code class="sig-name descname">ExtConstant</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">file_name</span></em>, <em class="sig-param"><span class="n">sheet</span></em>, <em class="sig-param"><span class="n">cell</span></em>, <em class="sig-param"><span class="n">coords</span></em>, <em class="sig-param"><span class="n">root</span></em>, <em class="sig-param"><span class="n">py_name</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/py_backend/external.html#ExtConstant"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#py_backend.external.ExtConstant" title="Permalink to this definition">¶</a></dt>
 <dd><p>Class for Vensim GET XLS CONSTANTS/GET DIRECT CONSTANTS</p>
 <dl class="py method">
 <dt id="py_backend.external.ExtConstant._get_constant_data">
@@ -665,7 +665,7 @@ <h2>Building the python model file<a class="headerlink" href="#building-the-pyth
 
 <dl class="py method">
 <dt id="py_backend.external.ExtConstant.add">
-<code class="sig-name descname">add</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">file_name</span></em>, <em class="sig-param"><span class="n">tab</span></em>, <em class="sig-param"><span class="n">cell</span></em>, <em class="sig-param"><span class="n">coords</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/py_backend/external.html#ExtConstant.add"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#py_backend.external.ExtConstant.add" title="Permalink to this definition">¶</a></dt>
+<code class="sig-name descname">add</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">file_name</span></em>, <em class="sig-param"><span class="n">sheet</span></em>, <em class="sig-param"><span class="n">cell</span></em>, <em class="sig-param"><span class="n">coords</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/py_backend/external.html#ExtConstant.add"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#py_backend.external.ExtConstant.add" title="Permalink to this definition">¶</a></dt>
 <dd><p>Add information to retrieve new dimension in an already declared object</p>
 </dd></dl>
 
@@ -679,11 +679,11 @@ <h2>Building the python model file<a class="headerlink" href="#building-the-pyth
 
 <dl class="py class">
 <dt id="py_backend.external.ExtData">
-<em class="property">class </em><code class="sig-prename descclassname">py_backend.external.</code><code class="sig-name descname">ExtData</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">file_name</span></em>, <em class="sig-param"><span class="n">tab</span></em>, <em class="sig-param"><span class="n">time_row_or_col</span></em>, <em class="sig-param"><span class="n">cell</span></em>, <em class="sig-param"><span class="n">interp</span></em>, <em class="sig-param"><span class="n">coords</span></em>, <em class="sig-param"><span class="n">root</span></em>, <em class="sig-param"><span class="n">py_name</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/py_backend/external.html#ExtData"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#py_backend.external.ExtData" title="Permalink to this definition">¶</a></dt>
+<em class="property">class </em><code class="sig-prename descclassname">py_backend.external.</code><code class="sig-name descname">ExtData</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">file_name</span></em>, <em class="sig-param"><span class="n">sheet</span></em>, <em class="sig-param"><span class="n">time_row_or_col</span></em>, <em class="sig-param"><span class="n">cell</span></em>, <em class="sig-param"><span class="n">interp</span></em>, <em class="sig-param"><span class="n">coords</span></em>, <em class="sig-param"><span class="n">root</span></em>, <em class="sig-param"><span class="n">py_name</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/py_backend/external.html#ExtData"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#py_backend.external.ExtData" title="Permalink to this definition">¶</a></dt>
 <dd><p>Class for Vensim GET XLS DATA/GET DIRECT DATA</p>
 <dl class="py method">
 <dt id="py_backend.external.ExtData.add">
-<code class="sig-name descname">add</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">file_name</span></em>, <em class="sig-param"><span class="n">tab</span></em>, <em class="sig-param"><span class="n">time_row_or_col</span></em>, <em class="sig-param"><span class="n">cell</span></em>, <em class="sig-param"><span class="n">interp</span></em>, <em class="sig-param"><span class="n">coords</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/py_backend/external.html#ExtData.add"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#py_backend.external.ExtData.add" title="Permalink to this definition">¶</a></dt>
+<code class="sig-name descname">add</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">file_name</span></em>, <em class="sig-param"><span class="n">sheet</span></em>, <em class="sig-param"><span class="n">time_row_or_col</span></em>, <em class="sig-param"><span class="n">cell</span></em>, <em class="sig-param"><span class="n">interp</span></em>, <em class="sig-param"><span class="n">coords</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/py_backend/external.html#ExtData.add"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#py_backend.external.ExtData.add" title="Permalink to this definition">¶</a></dt>
 <dd><p>Add information to retrieve new dimension in an already declared object</p>
 </dd></dl>
 
@@ -697,11 +697,11 @@ <h2>Building the python model file<a class="headerlink" href="#building-the-pyth
 
 <dl class="py class">
 <dt id="py_backend.external.ExtLookup">
-<em class="property">class </em><code class="sig-prename descclassname">py_backend.external.</code><code class="sig-name descname">ExtLookup</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">file_name</span></em>, <em class="sig-param"><span class="n">tab</span></em>, <em class="sig-param"><span class="n">x_row_or_col</span></em>, <em class="sig-param"><span class="n">cell</span></em>, <em class="sig-param"><span class="n">coords</span></em>, <em class="sig-param"><span class="n">root</span></em>, <em class="sig-param"><span class="n">py_name</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/py_backend/external.html#ExtLookup"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#py_backend.external.ExtLookup" title="Permalink to this definition">¶</a></dt>
+<em class="property">class </em><code class="sig-prename descclassname">py_backend.external.</code><code class="sig-name descname">ExtLookup</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">file_name</span></em>, <em class="sig-param"><span class="n">sheet</span></em>, <em class="sig-param"><span class="n">x_row_or_col</span></em>, <em class="sig-param"><span class="n">cell</span></em>, <em class="sig-param"><span class="n">coords</span></em>, <em class="sig-param"><span class="n">root</span></em>, <em class="sig-param"><span class="n">py_name</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/py_backend/external.html#ExtLookup"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#py_backend.external.ExtLookup" title="Permalink to this definition">¶</a></dt>
 <dd><p>Class for Vensim GET XLS LOOKUPS/GET DIRECT LOOKUPS</p>
 <dl class="py method">
 <dt id="py_backend.external.ExtLookup.add">
-<code class="sig-name descname">add</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">file_name</span></em>, <em class="sig-param"><span class="n">tab</span></em>, <em class="sig-param"><span class="n">x_row_or_col</span></em>, <em class="sig-param"><span class="n">cell</span></em>, <em class="sig-param"><span class="n">coords</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/py_backend/external.html#ExtLookup.add"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#py_backend.external.ExtLookup.add" title="Permalink to this definition">¶</a></dt>
+<code class="sig-name descname">add</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">file_name</span></em>, <em class="sig-param"><span class="n">sheet</span></em>, <em class="sig-param"><span class="n">x_row_or_col</span></em>, <em class="sig-param"><span class="n">cell</span></em>, <em class="sig-param"><span class="n">coords</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/py_backend/external.html#ExtLookup.add"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#py_backend.external.ExtLookup.add" title="Permalink to this definition">¶</a></dt>
 <dd><p>Add information to retrieve new dimension in an already declared object</p>
 </dd></dl>
 
@@ -715,7 +715,7 @@ <h2>Building the python model file<a class="headerlink" href="#building-the-pyth
 
 <dl class="py class">
 <dt id="py_backend.external.ExtSubscript">
-<em class="property">class </em><code class="sig-prename descclassname">py_backend.external.</code><code class="sig-name descname">ExtSubscript</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">file_name</span></em>, <em class="sig-param"><span class="n">tab</span></em>, <em class="sig-param"><span class="n">firstcell</span></em>, <em class="sig-param"><span class="n">lastcell</span></em>, <em class="sig-param"><span class="n">prefix</span></em>, <em class="sig-param"><span class="n">root</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/py_backend/external.html#ExtSubscript"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#py_backend.external.ExtSubscript" title="Permalink to this definition">¶</a></dt>
+<em class="property">class </em><code class="sig-prename descclassname">py_backend.external.</code><code class="sig-name descname">ExtSubscript</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">file_name</span></em>, <em class="sig-param"><span class="n">sheet</span></em>, <em class="sig-param"><span class="n">firstcell</span></em>, <em class="sig-param"><span class="n">lastcell</span></em>, <em class="sig-param"><span class="n">prefix</span></em>, <em class="sig-param"><span class="n">root</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/py_backend/external.html#ExtSubscript"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#py_backend.external.ExtSubscript" title="Permalink to this definition">¶</a></dt>
 <dd><p>Class for Vensim GET XLS SUBSCRIPT/GET DIRECT SUBSCRIPT</p>
 </dd></dl>
 
@@ -723,6 +723,53 @@ <h2>Building the python model file<a class="headerlink" href="#building-the-pyth
 <dt id="py_backend.external.External">
 <em class="property">class </em><code class="sig-prename descclassname">py_backend.external.</code><code class="sig-name descname">External</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">py_name</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/py_backend/external.html#External"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#py_backend.external.External" title="Permalink to this definition">¶</a></dt>
 <dd><p>Main class of external objects</p>
+<dl class="py attribute">
+<dt id="py_backend.external.External.py_name">
+<code class="sig-name descname">py_name</code><a class="headerlink" href="#py_backend.external.External.py_name" title="Permalink to this definition">¶</a></dt>
+<dd><p>The python name of the object</p>
+<dl class="field-list simple">
+<dt class="field-odd">Type</dt>
+<dd class="field-odd"><p><a class="reference external" href="https://docs.python.org/2.7/library/functions.html#str" title="(in Python v2.7)">str</a></p>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py attribute">
+<dt id="py_backend.external.External.missing">
+<code class="sig-name descname">missing</code><a class="headerlink" href="#py_backend.external.External.missing" title="Permalink to this definition">¶</a></dt>
+<dd><p>What to do with missing values. If “warning” (default)
+shows a warning message and interpolates the values.
+If “raise” raises an error. If “ignore” interpolates
+the values without showing anything.</p>
+<dl class="field-list simple">
+<dt class="field-odd">Type</dt>
+<dd class="field-odd"><p><a class="reference external" href="https://docs.python.org/2.7/library/functions.html#str" title="(in Python v2.7)">str</a> (“warning”, “error”, “ignore”)</p>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py attribute">
+<dt id="py_backend.external.External.file">
+<code class="sig-name descname">file</code><a class="headerlink" href="#py_backend.external.External.file" title="Permalink to this definition">¶</a></dt>
+<dd><p>File name from which the data is read.</p>
+<dl class="field-list simple">
+<dt class="field-odd">Type</dt>
+<dd class="field-odd"><p><a class="reference external" href="https://docs.python.org/2.7/library/functions.html#str" title="(in Python v2.7)">str</a></p>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py attribute">
+<dt id="py_backend.external.External.sheet">
+<code class="sig-name descname">sheet</code><a class="headerlink" href="#py_backend.external.External.sheet" title="Permalink to this definition">¶</a></dt>
+<dd><p>Sheet name from which the data is read.</p>
+<dl class="field-list simple">
+<dt class="field-odd">Type</dt>
+<dd class="field-odd"><p><a class="reference external" href="https://docs.python.org/2.7/library/functions.html#str" title="(in Python v2.7)">str</a></p>
+</dd>
+</dl>
+</dd></dl>
+
 <dl class="py method">
 <dt id="py_backend.external.External._col_to_num">
 <em class="property">static </em><code class="sig-name descname">_col_to_num</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">col</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/py_backend/external.html#External._col_to_num"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#py_backend.external.External._col_to_num" title="Permalink to this definition">¶</a></dt>
@@ -746,6 +793,26 @@ <h2>Building the python model file<a class="headerlink" href="#building-the-pyth
 <dd><p>Returns file and sheet name in a string</p>
 </dd></dl>
 
+<dl class="py method">
+<dt id="py_backend.external.External._fill_missing">
+<code class="sig-name descname">_fill_missing</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">series</span></em>, <em class="sig-param"><span class="n">data</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/py_backend/external.html#External._fill_missing"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#py_backend.external.External._fill_missing" title="Permalink to this definition">¶</a></dt>
+<dd><p>Fills missing values in excel read data. Mutates the values in data.</p>
+<dl class="field-list simple">
+<dt class="field-odd">Parameters</dt>
+<dd class="field-odd"><ul class="simple">
+<li><p><strong>series</strong> – the time series without missing values</p></li>
+<li><p><strong>data</strong> – the data with missing values</p></li>
+</ul>
+</dd>
+<dt class="field-even">Returns</dt>
+<dd class="field-even"><p></p>
+</dd>
+<dt class="field-odd">Return type</dt>
+<dd class="field-odd"><p><a class="reference external" href="https://docs.python.org/2.7/library/constants.html#None" title="(in Python v2.7)">None</a></p>
+</dd>
+</dl>
+</dd></dl>
+
 <dl class="py method">
 <dt id="py_backend.external.External._get_data_from_file">
 <code class="sig-name descname">_get_data_from_file</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">rows</span></em>, <em class="sig-param"><span class="n">cols</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/py_backend/external.html#External._get_data_from_file"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#py_backend.external.External._get_data_from_file" title="Permalink to this definition">¶</a></dt>
@@ -753,17 +820,8 @@ <h2>Building the python model file<a class="headerlink" href="#building-the-pyth
 <dl class="field-list simple">
 <dt class="field-odd">Parameters</dt>
 <dd class="field-odd"><ul class="simple">
-<li><p><strong>rows</strong> (<a class="reference external" href="https://docs.python.org/2.7/library/functions.html#int" title="(in Python v2.7)"><em>int</em></a><em>, </em><em>list</em><em> or </em><em>array</em>) – if int, then will start reading the table for the given row number
-if list, then will read between first and second row of the lis
-if array, then will read the given row numbers</p></li>
-<li><p><strong>cols</strong> (<a class="reference external" href="https://docs.python.org/2.7/library/constants.html#None" title="(in Python v2.7)"><em>None</em></a><em>, </em><a class="reference external" href="https://docs.python.org/2.7/library/functions.html#str" title="(in Python v2.7)"><em>str</em></a><em>, </em><a class="reference external" href="https://docs.python.org/2.7/library/functions.html#int" title="(in Python v2.7)"><em>int</em></a><em>, </em><em>list</em><em> or </em><em>array</em>) – <dl class="simple">
-<dt>if None, then will continue reading until no more data is</dt><dd><p>available in the new column</p>
-</dd>
-</dl>
-<p>if str, then will read only the given column by its name
-if list, then will read between the given columns
-if array, then will read the given columns names/numbers</p>
-</p></li>
+<li><p><strong>rows</strong> (<em>list of len 2</em>) – first row and last row+1 to be read, starting from 0</p></li>
+<li><p><strong>cols</strong> (<em>list of len 2</em>) – first col and last col+1 to be read, starting from 0</p></li>
 </ul>
 </dd>
 <dt class="field-even">Returns</dt>
@@ -831,12 +889,11 @@ <h2>Building the python model file<a class="headerlink" href="#building-the-pyth
 
 <dl class="py method">
 <dt id="py_backend.external.External._initialize_data">
-<code class="sig-name descname">_initialize_data</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">dim_name</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/py_backend/external.html#External._initialize_data"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#py_backend.external.External._initialize_data" title="Permalink to this definition">¶</a></dt>
+<code class="sig-name descname">_initialize_data</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">element_type</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/py_backend/external.html#External._initialize_data"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#py_backend.external.External._initialize_data" title="Permalink to this definition">¶</a></dt>
 <dd><p>Initialize one element of DATA or LOOKUPS</p>
 <dl class="field-list simple">
 <dt class="field-odd">Parameters</dt>
-<dd class="field-odd"><p><strong>dim_name</strong> (<a class="reference external" href="https://docs.python.org/2.7/library/functions.html#str" title="(in Python v2.7)"><em>str</em></a>) – Dimension name.
-“lookup_dim” for LOOKUPS, “time” for DATA.</p>
+<dd class="field-odd"><p><strong>element_type</strong> (<a class="reference external" href="https://docs.python.org/2.7/library/functions.html#str" title="(in Python v2.7)"><em>str</em></a>) – “lookup” for LOOKUPS, “data” for data.</p>
 </dd>
 <dt class="field-even">Returns</dt>
 <dd class="field-even"><p><strong>data</strong> – Dataarray with the time or interpolation dimension
@@ -849,18 +906,22 @@ <h2>Building the python model file<a class="headerlink" href="#building-the-pyth
 </dd></dl>
 
 <dl class="py method">
-<dt id="py_backend.external.External._num_to_col">
-<em class="property">static </em><code class="sig-name descname">_num_to_col</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">num</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/py_backend/external.html#External._num_to_col"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#py_backend.external.External._num_to_col" title="Permalink to this definition">¶</a></dt>
-<dd><p>Transforms the column number to name. Also working with lists.</p>
+<dt id="py_backend.external.External._interpolate_missing">
+<code class="sig-name descname">_interpolate_missing</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">x</span></em>, <em class="sig-param"><span class="n">xr</span></em>, <em class="sig-param"><span class="n">yr</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/py_backend/external.html#External._interpolate_missing"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#py_backend.external.External._interpolate_missing" title="Permalink to this definition">¶</a></dt>
+<dd><p>Interpolates a list of missing values from _fill_missing</p>
 <dl class="field-list simple">
 <dt class="field-odd">Parameters</dt>
-<dd class="field-odd"><p><strong>col_v</strong> (<a class="reference external" href="https://docs.python.org/2.7/library/functions.html#int" title="(in Python v2.7)"><em>int</em></a><em> or </em><em>list of ints</em>) – Column number(s)</p>
+<dd class="field-odd"><ul class="simple">
+<li><p><strong>x</strong> – list of missing values interpolate</p></li>
+<li><p><strong>xr</strong> – non-missing x values</p></li>
+<li><p><strong>yr</strong> – non-missing y values</p></li>
+</ul>
 </dd>
 <dt class="field-even">Returns</dt>
-<dd class="field-even"><p>Column name(s)</p>
+<dd class="field-even"><p>Result after interpolating x with self.interp method</p>
 </dd>
 <dt class="field-odd">Return type</dt>
-<dd class="field-odd"><p>int/list</p>
+<dd class="field-odd"><p>y</p>
 </dd>
 </dl>
 </dd></dl>
@@ -893,7 +954,7 @@ <h2>Building the python model file<a class="headerlink" href="#building-the-pyth
 
 <dl class="py method">
 <dt id="py_backend.external.External._series_selector">
-<em class="property">classmethod </em><code class="sig-name descname">_series_selector</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">x_row_or_col</span></em>, <em class="sig-param"><span class="n">cell</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/py_backend/external.html#External._series_selector"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#py_backend.external.External._series_selector" title="Permalink to this definition">¶</a></dt>
+<code class="sig-name descname">_series_selector</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">x_row_or_col</span></em>, <em class="sig-param"><span class="n">cell</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/py_backend/external.html#External._series_selector"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#py_backend.external.External._series_selector" title="Permalink to this definition">¶</a></dt>
 <dd><p>Selects if a series data (DATA/LOOKUPS), should be read by columns,
 rows or cellrange name.
 Based on the input format of x_row_or_col and cell.
@@ -920,7 +981,7 @@ <h2>Building the python model file<a class="headerlink" href="#building-the-pyth
 
 <dl class="py method">
 <dt id="py_backend.external.External._split_excel_cell">
-<em class="property">static </em><code class="sig-name descname">_split_excel_cell</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">cell</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/py_backend/external.html#External._split_excel_cell"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#py_backend.external.External._split_excel_cell" title="Permalink to this definition">¶</a></dt>
+<code class="sig-name descname">_split_excel_cell</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">cell</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/py_backend/external.html#External._split_excel_cell"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#py_backend.external.External._split_excel_cell" title="Permalink to this definition">¶</a></dt>
 <dd><p>Splits a cell value given in a string.
 Returns None for non-valid cell formats.</p>
 <dl class="field-list simple">
@@ -929,14 +990,20 @@ <h2>Building the python model file<a class="headerlink" href="#building-the-pyth
 If it is not a cell like string will return None.</p>
 </dd>
 <dt class="field-even">Returns</dt>
-<dd class="field-even"><p><strong>row number, column name</strong> – If the cell input is valid.</p>
+<dd class="field-even"><p><strong>row number, column number</strong> – If the cell input is valid. Both numbers are given in Python
+enumeration, i.e., first row and first column are 0.</p>
 </dd>
 <dt class="field-odd">Return type</dt>
-<dd class="field-odd"><p><a class="reference external" href="https://docs.python.org/2.7/library/functions.html#int" title="(in Python v2.7)">int</a>, <a class="reference external" href="https://docs.python.org/2.7/library/functions.html#str" title="(in Python v2.7)">str</a></p>
+<dd class="field-odd"><p><a class="reference external" href="https://docs.python.org/2.7/library/functions.html#int" title="(in Python v2.7)">int</a>, <a class="reference external" href="https://docs.python.org/2.7/library/functions.html#int" title="(in Python v2.7)">int</a></p>
 </dd>
 </dl>
 </dd></dl>
 
+<dl class="py attribute">
+<dt id="id0">
+<code class="sig-name descname">missing</code><em class="property"> = 'warning'</em><a class="headerlink" href="#id0" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
 </dd></dl>
 
 </div>
diff --git a/docs/_build/html/development/pathway.html b/docs/_build/html/development/pathway.html
index 5f6cb0ce..e15362eb 100644
--- a/docs/_build/html/development/pathway.html
+++ b/docs/_build/html/development/pathway.html
@@ -7,7 +7,7 @@
   
   <meta name="viewport" content="width=device-width, initial-scale=1.0" />
   
-  <title>PySD Development Pathway &mdash; PySD 1.0.0 documentation</title>
+  <title>PySD Development Pathway &mdash; PySD 1.1.0 documentation</title>
   
 
   
@@ -63,7 +63,7 @@
             
             
               <div class="version">
-                1.0
+                1.1
               </div>
             
           
diff --git a/docs/_build/html/development/structure.html b/docs/_build/html/development/structure.html
index 192836cb..1434aa4f 100644
--- a/docs/_build/html/development/structure.html
+++ b/docs/_build/html/development/structure.html
@@ -7,7 +7,7 @@
   
   <meta name="viewport" content="width=device-width, initial-scale=1.0" />
   
-  <title>Structure of the PySD module &mdash; PySD 1.0.0 documentation</title>
+  <title>Structure of the PySD module &mdash; PySD 1.1.0 documentation</title>
   
 
   
@@ -63,7 +63,7 @@
             
             
               <div class="version">
-                1.0
+                1.1
               </div>
             
           
@@ -193,7 +193,7 @@ <h2>Translation<a class="headerlink" href="#translation" title="Permalink to thi
 <ul>
 <li class="toctree-l1"><a class="reference internal" href="vensim_translation.html">Vensim Translation</a><ul>
 <li class="toctree-l2"><a class="reference internal" href="vensim_translation.html#translated-functions">Translated Functions</a></li>
-<li class="toctree-l2"><a class="reference internal" href="vensim_translation.html#module-py_backend.vensim.vensim2py">Used Functions for Translation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="vensim_translation.html#used-functions-for-translation">Used Functions for Translation</a></li>
 </ul>
 </li>
 <li class="toctree-l1"><a class="reference internal" href="xmile_translation.html">XMILE Translation</a></li>
diff --git a/docs/_build/html/development/supported_vensim_functions.html b/docs/_build/html/development/supported_vensim_functions.html
index a2119a65..b2146893 100644
--- a/docs/_build/html/development/supported_vensim_functions.html
+++ b/docs/_build/html/development/supported_vensim_functions.html
@@ -7,7 +7,7 @@
   
   <meta name="viewport" content="width=device-width, initial-scale=1.0" />
   
-  <title>&lt;no title&gt; &mdash; PySD 1.0.0 documentation</title>
+  <title>&lt;no title&gt; &mdash; PySD 1.1.0 documentation</title>
   
 
   
@@ -61,7 +61,7 @@
             
             
               <div class="version">
-                1.0
+                1.1
               </div>
             
           
diff --git a/docs/_build/html/development/vensim_translation.html b/docs/_build/html/development/vensim_translation.html
index e2455a4c..76386f86 100644
--- a/docs/_build/html/development/vensim_translation.html
+++ b/docs/_build/html/development/vensim_translation.html
@@ -7,7 +7,7 @@
   
   <meta name="viewport" content="width=device-width, initial-scale=1.0" />
   
-  <title>Vensim Translation &mdash; PySD 1.0.0 documentation</title>
+  <title>Vensim Translation &mdash; PySD 1.1.0 documentation</title>
   
 
   
@@ -63,7 +63,7 @@
             
             
               <div class="version">
-                1.0
+                1.1
               </div>
             
           
@@ -378,262 +378,8 @@ <h2>Translated Functions<a class="headerlink" href="#translated-functions" title
 <p>There are some constructs (such as tagging variables as ‘suplementary’) which are not currently
 parsed, and may throw an error. Future releases will handle this with more grace.</p>
 </div>
-<div class="section" id="module-py_backend.vensim.vensim2py">
-<span id="used-functions-for-translation"></span><h2>Used Functions for Translation<a class="headerlink" href="#module-py_backend.vensim.vensim2py" title="Permalink to this headline">¶</a></h2>
-<p>These functions translate vensim .mdl file to pieces needed by the builder
-module to write a python version of the model. Everything that requires
-knowledge of vensim syntax should be here.</p>
-<dl class="py function">
-<dt id="py_backend.vensim.vensim2py._include_common_grammar">
-<code class="sig-prename descclassname">py_backend.vensim.vensim2py.</code><code class="sig-name descname">_include_common_grammar</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">source_grammar</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/py_backend/vensim/vensim2py.html#_include_common_grammar"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#py_backend.vensim.vensim2py._include_common_grammar" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
-
-<dl class="py function">
-<dt id="py_backend.vensim.vensim2py.get_equation_components">
-<code class="sig-prename descclassname">py_backend.vensim.vensim2py.</code><code class="sig-name descname">get_equation_components</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">equation_str</span></em>, <em class="sig-param"><span class="n">root_path</span><span class="o">=</span><span class="default_value">None</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/py_backend/vensim/vensim2py.html#get_equation_components"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#py_backend.vensim.vensim2py.get_equation_components" title="Permalink to this definition">¶</a></dt>
-<dd><p>Breaks down a string representing only the equation part of a model element.
-Recognizes the various types of model elements that may exist, and identifies them.</p>
-<dl class="field-list simple">
-<dt class="field-odd">Parameters</dt>
-<dd class="field-odd"><ul class="simple">
-<li><p><strong>equation_str</strong> (<em>basestring</em>) – the first section in each model element - the full equation.</p></li>
-<li><p><strong>root_path</strong> (<em>basestring</em>) – the root path of the vensim file (necessary to resolve external data file paths)</p></li>
-</ul>
-</dd>
-<dt class="field-even">Returns</dt>
-<dd class="field-even"><p><ul class="simple">
-<li><p><em>Returns a dictionary containing the following</em></p></li>
-<li><p><strong>real_name</strong> (<em>basestring</em>) – The name of the element as given in the original vensim file</p></li>
-<li><p><strong>subs</strong> (<em>list of strings</em>) – list of subscripts or subscript elements</p></li>
-<li><p><strong>expr</strong> (<em>basestring</em>)</p></li>
-<li><p><strong>kind</strong> (<em>basestring</em>) – What type of equation have we found?
-- <em>component</em> - normal model expression or constant
-- <em>lookup</em> - a lookup table
-- <em>subdef</em> - a subscript definition
-- <em>data</em> -  a data variable</p></li>
-<li><p><strong>keyword</strong> (<em>basestring or None</em>)</p></li>
-</ul>
-</p>
-</dd>
-</dl>
-<p class="rubric">Examples</p>
-<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">get_equation_components</span><span class="p">(</span><span class="sa">r</span><span class="s1">&#39;constant = 25&#39;</span><span class="p">)</span>
-<span class="go">{&#39;expr&#39;: &#39;25&#39;, &#39;kind&#39;: &#39;component&#39;, &#39;subs&#39;: [], &#39;real_name&#39;: &#39;constant&#39;}</span>
-</pre></div>
-</div>
-<p class="rubric">Notes</p>
-<p>in this function we don’t create python identifiers, we use real names.
-This is so that when everything comes back together, we can manage
-any potential namespace conflicts properly</p>
-</dd></dl>
-
-<dl class="py function">
-<dt id="py_backend.vensim.vensim2py.get_external_data">
-<code class="sig-prename descclassname">py_backend.vensim.vensim2py.</code><code class="sig-name descname">get_external_data</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">func_str</span></em>, <em class="sig-param"><span class="n">args_str</span></em>, <em class="sig-param"><span class="n">root_path</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/py_backend/vensim/vensim2py.html#get_external_data"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#py_backend.vensim.vensim2py.get_external_data" title="Permalink to this definition">¶</a></dt>
-<dd><p>Gets the subscripts from external files calling the class external.ExtSubscript</p>
-</dd></dl>
-
-<dl class="py function">
-<dt id="py_backend.vensim.vensim2py.get_file_sections">
-<code class="sig-prename descclassname">py_backend.vensim.vensim2py.</code><code class="sig-name descname">get_file_sections</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">file_str</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/py_backend/vensim/vensim2py.html#get_file_sections"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#py_backend.vensim.vensim2py.get_file_sections" title="Permalink to this definition">¶</a></dt>
-<dd><p>This is where we separate out the macros from the rest of the model file.
-Working based upon documentation at: <a class="reference external" href="https://www.vensim.com/documentation/index.html?macros.htm">https://www.vensim.com/documentation/index.html?macros.htm</a></p>
-<p>Macros will probably wind up in their own python modules eventually.</p>
-<dl class="field-list simple">
-<dt class="field-odd">Parameters</dt>
-<dd class="field-odd"><p><strong>file_str</strong> – </p>
-</dd>
-<dt class="field-even">Returns</dt>
-<dd class="field-even"><p><p><strong>entries</strong> – Each dictionary represents a different section of the model file, either a macro,
-or the main body of the model file. The dictionaries contain various elements:
-- returns: list of strings</p>
-<blockquote>
-<div><p>represents what is returned from a macro (for macros) or empty for main model</p>
-</div></blockquote>
-<ul class="simple">
-<li><dl class="simple">
-<dt>params: list of strings</dt><dd><p>represents what is passed into a macro (for macros) or empty for main model</p>
-</dd>
-</dl>
-</li>
-<li><dl class="simple">
-<dt>name: string</dt><dd><p>the name of the macro, or ‘main’ for main body of model</p>
-</dd>
-</dl>
-</li>
-<li><dl class="simple">
-<dt>string: string</dt><dd><p>string representing the model section</p>
-</dd>
-</dl>
-</li>
-</ul>
-</p>
-</dd>
-<dt class="field-odd">Return type</dt>
-<dd class="field-odd"><p>list of dictionaries</p>
-</dd>
-</dl>
-<p class="rubric">Examples</p>
-<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">get_file_sections</span><span class="p">(</span><span class="sa">r</span><span class="s1">&#39;a~b~c| d~e~f| g~h~i|&#39;</span><span class="p">)</span>
-<span class="go">[{&#39;returns&#39;: [], &#39;params&#39;: [], &#39;name&#39;: &#39;main&#39;, &#39;string&#39;: &#39;a~b~c| d~e~f| g~h~i|&#39;}]</span>
-</pre></div>
-</div>
-</dd></dl>
-
-<dl class="py function">
-<dt id="py_backend.vensim.vensim2py.get_model_elements">
-<code class="sig-prename descclassname">py_backend.vensim.vensim2py.</code><code class="sig-name descname">get_model_elements</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">model_str</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/py_backend/vensim/vensim2py.html#get_model_elements"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#py_backend.vensim.vensim2py.get_model_elements" title="Permalink to this definition">¶</a></dt>
-<dd><p>Takes in a string representing model text and splits it into elements</p>
-<p>I think we’re making the assumption that all newline characters are removed…</p>
-<dl class="field-list simple">
-<dt class="field-odd">Parameters</dt>
-<dd class="field-odd"><p><strong>model_str</strong> (<em>string</em>) – </p>
-</dd>
-<dt class="field-even">Returns</dt>
-<dd class="field-even"><p><strong>entries</strong> – Each dictionary contains the components of a different model element, separated into the
-equation, units, and docstring.</p>
-</dd>
-<dt class="field-odd">Return type</dt>
-<dd class="field-odd"><p>array of dictionaries</p>
-</dd>
-</dl>
-<p class="rubric">Examples</p>
-<p># Basic Parsing:
-&gt;&gt;&gt; get_model_elements(r’a~b~c| d~e~f| g~h~i|’)
-[{‘doc’: ‘c’, ‘unit’: ‘b’, ‘eqn’: ‘a’}, {‘doc’: ‘f’, ‘unit’: ‘e’, ‘eqn’: ‘d’}, {‘doc’: ‘i’, ‘unit’: ‘h’, ‘eqn’: ‘g’}]</p>
-<p># Special characters are escaped within double-quotes:
-&gt;&gt;&gt; get_model_elements(r’a~b~c| d~e”~”~f| g~h~i|’)
-[{‘doc’: ‘c’, ‘unit’: ‘b’, ‘eqn’: ‘a’}, {‘doc’: ‘f’, ‘unit’: ‘e”~”’, ‘eqn’: ‘d’}, {‘doc’: ‘i’, ‘unit’: ‘h’, ‘eqn’: ‘g’}]
-&gt;&gt;&gt; get_model_elements(r’a~b~c| d~e~”|”f| g~h~i|’)
-[{‘doc’: ‘c’, ‘unit’: ‘b’, ‘eqn’: ‘a’}, {‘doc’: ‘”|”f’, ‘unit’: ‘e’, ‘eqn’: ‘d’}, {‘doc’: ‘i’, ‘unit’: ‘h’, ‘eqn’: ‘g’}]</p>
-<p># Double-quotes within escape groups are themselves escaped with backslashes:
-&gt;&gt;&gt; get_model_elements(r’a~b~c| d~e”&quot;~”~f| g~h~i|’)
-[{‘doc’: ‘c’, ‘unit’: ‘b’, ‘eqn’: ‘a’}, {‘doc’: ‘f’, ‘unit’: ‘e”\”~”’, ‘eqn’: ‘d’}, {‘doc’: ‘i’, ‘unit’: ‘h’, ‘eqn’: ‘g’}]
-&gt;&gt;&gt; get_model_elements(r’a~b~c| d~e~”&quot;|”f| g~h~i|’)
-[{‘doc’: ‘c’, ‘unit’: ‘b’, ‘eqn’: ‘a’}, {‘doc’: ‘”\”|”f’, ‘unit’: ‘e’, ‘eqn’: ‘d’}, {‘doc’: ‘i’, ‘unit’: ‘h’, ‘eqn’: ‘g’}]
-&gt;&gt;&gt; get_model_elements(r’a~b~c| d~e”xnx”~f| g~h~|’)
-[{‘doc’: ‘c’, ‘unit’: ‘b’, ‘eqn’: ‘a’}, {‘doc’: ‘f’, ‘unit’: ‘e”x\nx”’, ‘eqn’: ‘d’}, {‘doc’: ‘’, ‘unit’: ‘h’, ‘eqn’: ‘g’}]</p>
-<p># Todo: Handle model-level or section-level documentation
-&gt;&gt;&gt; get_model_elements(r’<a href="#id1"><span class="problematic" id="id2">**</span></a>* .model doc <a href="#id3"><span class="problematic" id="id4">**</span></a><a href="#id5"><span class="problematic" id="id6">*</span></a>~ Docstring!| d~e~f| g~h~i|’)
-[{‘doc’: ‘Docstring!’, ‘unit’: ‘’, ‘eqn’: ‘’}, {‘doc’: ‘f’, ‘unit’: ‘e’, ‘eqn’: ‘d’}, {‘doc’: ‘i’, ‘unit’: ‘h’, ‘eqn’: ‘g’}]</p>
-<p># Handle control sections, returning appropriate docstring pieces
-&gt;&gt;&gt; get_model_elements(r’a~b~c| <a href="#id7"><span class="problematic" id="id8">**</span></a><a href="#id9"><span class="problematic" id="id10">**</span></a>.Control***~ Simulation Control Parameters | g~h~i|’)
-[{‘doc’: ‘c’, ‘unit’: ‘b’, ‘eqn’: ‘a’}, {‘doc’: ‘i’, ‘unit’: ‘h’, ‘eqn’: ‘g’}]</p>
-<p># Handle the model display elements (ignore them)
-&gt;&gt;&gt; get_model_elements(r’a~b~c| d~e~f| \—///junk|junk~junk’)
-[{‘doc’: ‘c’, ‘unit’: ‘b’, ‘eqn’: ‘a’}, {‘doc’: ‘f’, ‘unit’: ‘e’, ‘eqn’: ‘d’}]</p>
-<p class="rubric">Notes</p>
-<ul class="simple">
-<li><p>Tildes and pipes are not allowed in element docstrings, but we should still handle them there</p></li>
-</ul>
-</dd></dl>
-
-<dl class="py function">
-<dt id="py_backend.vensim.vensim2py.parse_general_expression">
-<code class="sig-prename descclassname">py_backend.vensim.vensim2py.</code><code class="sig-name descname">parse_general_expression</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">element</span></em>, <em class="sig-param"><span class="n">namespace</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">subscript_dict</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">macro_list</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">elements_subs_dict</span><span class="o">=</span><span class="default_value">None</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/py_backend/vensim/vensim2py.html#parse_general_expression"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#py_backend.vensim.vensim2py.parse_general_expression" title="Permalink to this definition">¶</a></dt>
-<dd><p>Parses a normal expression
-# its annoying that we have to construct and compile the grammar every time…</p>
-<dl class="field-list simple">
-<dt class="field-odd">Parameters</dt>
-<dd class="field-odd"><ul class="simple">
-<li><p><strong>element</strong> (<em>dictionary</em>) – </p></li>
-<li><p><strong>namespace</strong> (<em>dictionary</em>) – </p></li>
-<li><p><strong>subscript_dict</strong> (<em>dictionary</em>) – </p></li>
-<li><p><strong>macro_list</strong> (<em>list of dictionaries</em>) – [{‘name’: ‘M’, ‘py_name’:’m’, ‘filename’:’path/to/file’, ‘args’:[‘arg1’, ‘arg2’]}]</p></li>
-<li><p><strong>elements_subs_dict</strong> (<em>dictionary</em>) – The dictionary with element python names as keys and their merged
-subscripts as values.</p></li>
-</ul>
-</dd>
-<dt class="field-even">Returns</dt>
-<dd class="field-even"><p><ul class="simple">
-<li><p><em>translation</em></p></li>
-<li><p><strong>new_elements</strong> (<em>list of dictionaries</em>) – If the expression contains builder functions, those builders will
-create new elements to add to our running list (that will eventually
-be output to a file) such as stock initialization and derivative
-funcs, etc.</p></li>
-</ul>
-</p>
-</dd>
-</dl>
-<p class="rubric">Examples</p>
-<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">parse_general_expression</span><span class="p">({</span><span class="s1">&#39;expr&#39;</span><span class="p">:</span> <span class="s1">&#39;INTEG (FlowA, -10)&#39;</span><span class="p">,</span>
-<span class="gp">... </span>                          <span class="s1">&#39;py_name&#39;</span><span class="p">:</span><span class="s1">&#39;test_stock&#39;</span><span class="p">,</span>
-<span class="gp">... </span>                          <span class="s1">&#39;subs&#39;</span><span class="p">:</span><span class="kc">None</span><span class="p">},</span>
-<span class="gp">... </span>                         <span class="p">{</span><span class="s1">&#39;FlowA&#39;</span><span class="p">:</span> <span class="s1">&#39;flowa&#39;</span><span class="p">}),</span>
-<span class="go">({&#39;kind&#39;: &#39;component&#39;, &#39;py_expr&#39;: &quot;_state[&#39;test_stock&#39;]&quot;},</span>
-<span class="go"> [{&#39;kind&#39;: &#39;implicit&#39;,</span>
-<span class="go">   &#39;subs&#39;: None,</span>
-<span class="go">   &#39;doc&#39;: &#39;Provides initial conditions for test_stock function&#39;,</span>
-<span class="go">   &#39;py_name&#39;: &#39;init_test_stock&#39;,</span>
-<span class="go">   &#39;real_name&#39;: None,</span>
-<span class="go">   &#39;unit&#39;: &#39;See docs for test_stock&#39;,</span>
-<span class="go">   &#39;py_expr&#39;: &#39;-10&#39;},</span>
-<span class="go">  {&#39;py_name&#39;: &#39;dtest_stock_dt&#39;,</span>
-<span class="go">   &#39;kind&#39;: &#39;implicit&#39;,</span>
-<span class="go">   &#39;py_expr&#39;: &#39;flowa&#39;,</span>
-<span class="go">   &#39;real_name&#39;: None}])</span>
-</pre></div>
-</div>
-</dd></dl>
-
-<dl class="py function">
-<dt id="py_backend.vensim.vensim2py.parse_lookup_expression">
-<code class="sig-prename descclassname">py_backend.vensim.vensim2py.</code><code class="sig-name descname">parse_lookup_expression</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">element</span></em>, <em class="sig-param"><span class="n">subscript_dict</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/py_backend/vensim/vensim2py.html#parse_lookup_expression"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#py_backend.vensim.vensim2py.parse_lookup_expression" title="Permalink to this definition">¶</a></dt>
-<dd><p>This syntax parses lookups that are defined with their own element</p>
-</dd></dl>
-
-<dl class="py function">
-<dt id="py_backend.vensim.vensim2py.parse_units">
-<code class="sig-prename descclassname">py_backend.vensim.vensim2py.</code><code class="sig-name descname">parse_units</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">units_str</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/py_backend/vensim/vensim2py.html#parse_units"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#py_backend.vensim.vensim2py.parse_units" title="Permalink to this definition">¶</a></dt>
-<dd><p>Extract and parse the units
-Extract the bounds over which the expression is assumed to apply.</p>
-<dl class="field-list simple">
-<dt class="field-odd">Parameters</dt>
-<dd class="field-odd"><p><strong>units_str</strong> – </p>
-</dd>
-</dl>
-<p class="rubric">Examples</p>
-<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">parse_units</span><span class="p">(</span><span class="s1">&#39;Widgets/Month [-10,10,1]&#39;</span><span class="p">)</span>
-<span class="go">(&#39;Widgets/Month&#39;, (-10,10,1))</span>
-</pre></div>
-</div>
-<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">parse_units</span><span class="p">(</span><span class="s1">&#39;Month [0,?]&#39;</span><span class="p">)</span>
-<span class="go">(&#39;Month&#39;, [-10, None])</span>
-</pre></div>
-</div>
-<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">parse_units</span><span class="p">(</span><span class="s1">&#39;Widgets [0,100]&#39;</span><span class="p">)</span>
-<span class="go">(&#39;Widgets&#39;, (0, 100))</span>
-</pre></div>
-</div>
-<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">parse_units</span><span class="p">(</span><span class="s1">&#39;Widgets&#39;</span><span class="p">)</span>
-<span class="go">(&#39;Widgets&#39;, (None, None))</span>
-</pre></div>
-</div>
-<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">parse_units</span><span class="p">(</span><span class="s1">&#39;[0, 100]&#39;</span><span class="p">)</span>
-<span class="go">(&#39;&#39;, (0, 100))</span>
-</pre></div>
-</div>
-</dd></dl>
-
-<dl class="py function">
-<dt id="py_backend.vensim.vensim2py.translate_section">
-<code class="sig-prename descclassname">py_backend.vensim.vensim2py.</code><code class="sig-name descname">translate_section</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">section</span></em>, <em class="sig-param"><span class="n">macro_list</span></em>, <em class="sig-param"><span class="n">root_path</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/py_backend/vensim/vensim2py.html#translate_section"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#py_backend.vensim.vensim2py.translate_section" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
-
-<dl class="py function">
-<dt id="py_backend.vensim.vensim2py.translate_vensim">
-<code class="sig-prename descclassname">py_backend.vensim.vensim2py.</code><code class="sig-name descname">translate_vensim</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">mdl_file</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/py_backend/vensim/vensim2py.html#translate_vensim"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#py_backend.vensim.vensim2py.translate_vensim" title="Permalink to this definition">¶</a></dt>
-<dd><dl class="field-list simple">
-<dt class="field-odd">Parameters</dt>
-<dd class="field-odd"><p><strong>mdl_file</strong> (<em>basestring</em>) – file path of a vensim model file to translate to python</p>
-</dd>
-</dl>
-<p class="rubric">Examples</p>
-<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">translate_vensim</span><span class="p">(</span><span class="s1">&#39;../tests/test-models/tests/subscript_3d_arrays/test_subscript_3d_arrays.mdl&#39;</span><span class="p">)</span>
-</pre></div>
-</div>
-</dd></dl>
-
+<div class="section" id="used-functions-for-translation">
+<h2>Used Functions for Translation<a class="headerlink" href="#used-functions-for-translation" title="Permalink to this headline">¶</a></h2>
 </div>
 </div>
 
diff --git a/docs/_build/html/development/xmile_translation.html b/docs/_build/html/development/xmile_translation.html
index 4545d70f..3987358d 100644
--- a/docs/_build/html/development/xmile_translation.html
+++ b/docs/_build/html/development/xmile_translation.html
@@ -7,7 +7,7 @@
   
   <meta name="viewport" content="width=device-width, initial-scale=1.0" />
   
-  <title>XMILE Translation &mdash; PySD 1.0.0 documentation</title>
+  <title>XMILE Translation &mdash; PySD 1.1.0 documentation</title>
   
 
   
@@ -63,7 +63,7 @@
             
             
               <div class="version">
-                1.0
+                1.1
               </div>
             
           
diff --git a/docs/_build/html/functions.html b/docs/_build/html/functions.html
index 7b807aac..9f0c9756 100644
--- a/docs/_build/html/functions.html
+++ b/docs/_build/html/functions.html
@@ -7,7 +7,7 @@
   
   <meta name="viewport" content="width=device-width, initial-scale=1.0" />
   
-  <title>User Functions Reference &mdash; PySD 1.0.0 documentation</title>
+  <title>User Functions Reference &mdash; PySD 1.1.0 documentation</title>
   
 
   
@@ -63,7 +63,7 @@
             
             
               <div class="version">
-                1.0
+                1.1
               </div>
             
           
@@ -166,11 +166,17 @@ <h1>User Functions Reference<a class="headerlink" href="#user-functions-referenc
 <p>These are the primary functions that control model import and execution.</p>
 <dl class="py function">
 <dt id="pysd.read_vensim">
-<code class="sig-prename descclassname">pysd.</code><code class="sig-name descname">read_vensim</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">mdl_file</span></em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pysd.html#read_vensim"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pysd.read_vensim" title="Permalink to this definition">¶</a></dt>
+<code class="sig-prename descclassname">pysd.</code><code class="sig-name descname">read_vensim</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">mdl_file</span></em>, <em class="sig-param"><span class="n">missing_values</span><span class="o">=</span><span class="default_value">'warning'</span></em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pysd.html#read_vensim"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pysd.read_vensim" title="Permalink to this definition">¶</a></dt>
 <dd><p>Construct a model from Vensim <cite>.mdl</cite> file.</p>
 <dl class="field-list simple">
 <dt class="field-odd">Parameters</dt>
-<dd class="field-odd"><p><strong>mdl_file</strong> (<em>&lt;string&gt;</em>) – The relative path filename for a raw Vensim <cite>.mdl</cite> file</p>
+<dd class="field-odd"><ul class="simple">
+<li><p><strong>mdl_file</strong> (<em>&lt;string&gt;</em>) – The relative path filename for a raw Vensim <cite>.mdl</cite> file</p></li>
+<li><p><strong>missing_values</strong> (<em>&lt;string&gt;</em><em> (</em><em>optional</em><em>)</em>) – What to do with missing values in external objects.
+If “warning” (default) shows a warning message and
+interpolates the values. If “raise” raises an error.
+If “ignore” interpolates the values without showing anything.</p></li>
+</ul>
 </dd>
 <dt class="field-even">Returns</dt>
 <dd class="field-even"><p><strong>model</strong> – Elements from the python model are loaded into the PySD class
@@ -186,14 +192,48 @@ <h1>User Functions Reference<a class="headerlink" href="#user-functions-referenc
 </div>
 </dd></dl>
 
+<dl class="py function">
+<dt id="pysd.read_xmile">
+<code class="sig-prename descclassname">pysd.</code><code class="sig-name descname">read_xmile</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">xmile_file</span></em>, <em class="sig-param"><span class="n">missing_values</span><span class="o">=</span><span class="default_value">'warning'</span></em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pysd.html#read_xmile"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pysd.read_xmile" title="Permalink to this definition">¶</a></dt>
+<dd><p>Construct a model from <cite>.xmile</cite> file.</p>
+<dl class="field-list simple">
+<dt class="field-odd">Parameters</dt>
+<dd class="field-odd"><ul class="simple">
+<li><p><strong>xmile_file</strong> (<em>&lt;string&gt;</em>) – The relative path filename for a raw <cite>.xmile</cite> file</p></li>
+<li><p><strong>missing_values</strong> (<em>&lt;string&gt;</em><em> (</em><em>optional</em><em>)</em>) – What to do with missing values in external objects.
+If “warning” (default) shows a warning message and
+interpolates the values. If “raise” raises an error.
+If “ignore” interpolates the values without showing anything.</p></li>
+</ul>
+</dd>
+<dt class="field-even">Returns</dt>
+<dd class="field-even"><p><strong>model</strong> – Elements from the python model are loaded into the PySD class
+and ready to run</p>
+</dd>
+<dt class="field-odd">Return type</dt>
+<dd class="field-odd"><p>a PySD class object</p>
+</dd>
+</dl>
+<p class="rubric">Examples</p>
+<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">model</span> <span class="o">=</span> <span class="n">read_xmile</span><span class="p">(</span><span class="s1">&#39;../tests/test-models/samples/teacup/teacup.xmile&#39;</span><span class="p">)</span>
+</pre></div>
+</div>
+</dd></dl>
+
 <dl class="py function">
 <dt id="pysd.load">
-<code class="sig-prename descclassname">pysd.</code><code class="sig-name descname">load</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">py_model_file</span></em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pysd.html#load"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pysd.load" title="Permalink to this definition">¶</a></dt>
+<code class="sig-prename descclassname">pysd.</code><code class="sig-name descname">load</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">py_model_file</span></em>, <em class="sig-param"><span class="n">missing_values</span><span class="o">=</span><span class="default_value">'warning'</span></em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pysd.html#load"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pysd.load" title="Permalink to this definition">¶</a></dt>
 <dd><p>Load a python-converted model file.</p>
 <dl class="field-list simple">
 <dt class="field-odd">Parameters</dt>
-<dd class="field-odd"><p><strong>py_model_file</strong> (<em>&lt;string&gt;</em>) – Filename of a model which has already been converted into a
-python format.</p>
+<dd class="field-odd"><ul class="simple">
+<li><p><strong>py_model_file</strong> (<em>&lt;string&gt;</em>) – Filename of a model which has already been converted into a
+python format.</p></li>
+<li><p><strong>missing_values</strong> (<em>&lt;string&gt;</em><em> (</em><em>optional</em><em>)</em>) – What to do with missing values in external objects.
+If “warning” (default) shows a warning message and
+interpolates the values. If “raise” raises an error.
+If “ignore” interpolates the values without showing anything.</p></li>
+</ul>
 </dd>
 </dl>
 <p class="rubric">Examples</p>
diff --git a/docs/_build/html/genindex.html b/docs/_build/html/genindex.html
index 8f8c28b1..6e4a5204 100644
--- a/docs/_build/html/genindex.html
+++ b/docs/_build/html/genindex.html
@@ -7,7 +7,7 @@
   
   <meta name="viewport" content="width=device-width, initial-scale=1.0" />
   
-  <title>Index &mdash; PySD 1.0.0 documentation</title>
+  <title>Index &mdash; PySD 1.1.0 documentation</title>
   
 
   
@@ -61,7 +61,7 @@
             
             
               <div class="version">
-                1.0
+                1.1
               </div>
             
           
@@ -174,7 +174,6 @@ <h1 id="index">Index</h1>
  | <a href="#P"><strong>P</strong></a>
  | <a href="#R"><strong>R</strong></a>
  | <a href="#S"><strong>S</strong></a>
- | <a href="#T"><strong>T</strong></a>
  | <a href="#V"><strong>V</strong></a>
  | <a href="#X"><strong>X</strong></a>
  
@@ -189,32 +188,32 @@ <h2 id="_">_</h2>
       <li><a href="development/internal_functions.html#py_backend.external.Excels._Excels_opyxl">_Excels_opyxl (py_backend.external.Excels attribute)</a>
 </li>
       <li><a href="development/internal_functions.html#py_backend.external.External._file_sheet">_file_sheet() (py_backend.external.External property)</a>
+</li>
+      <li><a href="development/internal_functions.html#py_backend.external.External._fill_missing">_fill_missing() (py_backend.external.External method)</a>
 </li>
       <li><a href="development/internal_functions.html#py_backend.external.ExtConstant._get_constant_data">_get_constant_data() (py_backend.external.ExtConstant method)</a>
 </li>
       <li><a href="development/internal_functions.html#py_backend.external.External._get_data_from_file">_get_data_from_file() (py_backend.external.External method)</a>
 </li>
       <li><a href="development/internal_functions.html#py_backend.external.External._get_data_from_file_opyxl">_get_data_from_file_opyxl() (py_backend.external.External method)</a>
-</li>
-      <li><a href="development/internal_functions.html#py_backend.external.External._get_series_data">_get_series_data() (py_backend.external.External method)</a>
 </li>
   </ul></td>
   <td style="width: 33%; vertical-align: top;"><ul>
-      <li><a href="development/vensim_translation.html#py_backend.vensim.vensim2py._include_common_grammar">_include_common_grammar() (in module py_backend.vensim.vensim2py)</a>
+      <li><a href="development/internal_functions.html#py_backend.external.External._get_series_data">_get_series_data() (py_backend.external.External method)</a>
 </li>
       <li><a href="development/internal_functions.html#py_backend.external.ExtConstant._initialize">_initialize() (py_backend.external.ExtConstant method)</a>
 </li>
       <li><a href="development/internal_functions.html#py_backend.external.External._initialize_data">_initialize_data() (py_backend.external.External method)</a>
 </li>
-      <li><a href="development/internal_functions.html#py_backend.external.External._num_to_col">_num_to_col() (py_backend.external.External static method)</a>
+      <li><a href="development/internal_functions.html#py_backend.external.External._interpolate_missing">_interpolate_missing() (py_backend.external.External method)</a>
 </li>
       <li><a href="development/internal_functions.html#py_backend.external.External._reshape">_reshape() (py_backend.external.External static method)</a>
 </li>
       <li><a href="development/internal_functions.html#py_backend.external.External._resolve_file">_resolve_file() (py_backend.external.External method)</a>
 </li>
-      <li><a href="development/internal_functions.html#py_backend.external.External._series_selector">_series_selector() (py_backend.external.External class method)</a>
+      <li><a href="development/internal_functions.html#py_backend.external.External._series_selector">_series_selector() (py_backend.external.External method)</a>
 </li>
-      <li><a href="development/internal_functions.html#py_backend.external.External._split_excel_cell">_split_excel_cell() (py_backend.external.External static method)</a>
+      <li><a href="development/internal_functions.html#py_backend.external.External._split_excel_cell">_split_excel_cell() (py_backend.external.External method)</a>
 </li>
   </ul></td>
 </tr></table>
@@ -292,6 +291,8 @@ <h2 id="F">F</h2>
 </li>
   </ul></td>
   <td style="width: 33%; vertical-align: top;"><ul>
+      <li><a href="development/internal_functions.html#py_backend.external.External.file">file (py_backend.external.External attribute)</a>
+</li>
       <li><a href="development/internal_functions.html#py_backend.utils.find_subscript_name">find_subscript_name() (in module py_backend.utils)</a>
 </li>
   </ul></td>
@@ -300,18 +301,10 @@ <h2 id="F">F</h2>
 <h2 id="G">G</h2>
 <table style="width: 100%" class="indextable genindextable"><tr>
   <td style="width: 33%; vertical-align: top;"><ul>
-      <li><a href="development/vensim_translation.html#py_backend.vensim.vensim2py.get_equation_components">get_equation_components() (in module py_backend.vensim.vensim2py)</a>
-</li>
-      <li><a href="development/vensim_translation.html#py_backend.vensim.vensim2py.get_external_data">get_external_data() (in module py_backend.vensim.vensim2py)</a>
-</li>
-      <li><a href="development/vensim_translation.html#py_backend.vensim.vensim2py.get_file_sections">get_file_sections() (in module py_backend.vensim.vensim2py)</a>
+      <li><a href="development/internal_functions.html#py_backend.utils.get_return_elements">get_return_elements() (in module py_backend.utils)</a>
 </li>
   </ul></td>
   <td style="width: 33%; vertical-align: top;"><ul>
-      <li><a href="development/vensim_translation.html#py_backend.vensim.vensim2py.get_model_elements">get_model_elements() (in module py_backend.vensim.vensim2py)</a>
-</li>
-      <li><a href="development/internal_functions.html#py_backend.utils.get_return_elements">get_return_elements() (in module py_backend.utils)</a>
-</li>
       <li><a href="development/internal_functions.html#py_backend.utils.get_value_by_insensitive_key_or_value">get_value_by_insensitive_key_or_value() (in module py_backend.utils)</a>
 </li>
   </ul></td>
@@ -352,6 +345,8 @@ <h2 id="M">M</h2>
 </li>
   </ul></td>
   <td style="width: 33%; vertical-align: top;"><ul>
+      <li><a href="development/internal_functions.html#id0">missing (py_backend.external.External attribute)</a>, <a href="development/internal_functions.html#py_backend.external.External.missing">[1]</a>
+</li>
       <li>
     module
 
@@ -361,8 +356,6 @@ <h2 id="M">M</h2>
         <li><a href="development/internal_functions.html#module-py_backend.external">py_backend.external</a>
 </li>
         <li><a href="development/internal_functions.html#module-py_backend.utils">py_backend.utils</a>
-</li>
-        <li><a href="development/vensim_translation.html#module-py_backend.vensim.vensim2py">py_backend.vensim.vensim2py</a>
 </li>
       </ul></li>
   </ul></td>
@@ -371,12 +364,6 @@ <h2 id="M">M</h2>
 <h2 id="P">P</h2>
 <table style="width: 100%" class="indextable genindextable"><tr>
   <td style="width: 33%; vertical-align: top;"><ul>
-      <li><a href="development/vensim_translation.html#py_backend.vensim.vensim2py.parse_general_expression">parse_general_expression() (in module py_backend.vensim.vensim2py)</a>
-</li>
-      <li><a href="development/vensim_translation.html#py_backend.vensim.vensim2py.parse_lookup_expression">parse_lookup_expression() (in module py_backend.vensim.vensim2py)</a>
-</li>
-      <li><a href="development/vensim_translation.html#py_backend.vensim.vensim2py.parse_units">parse_units() (in module py_backend.vensim.vensim2py)</a>
-</li>
       <li>
     py_backend.decorators
 
@@ -384,8 +371,6 @@ <h2 id="P">P</h2>
         <li><a href="development/internal_functions.html#module-py_backend.decorators">module</a>
 </li>
       </ul></li>
-  </ul></td>
-  <td style="width: 33%; vertical-align: top;"><ul>
       <li>
     py_backend.external
 
@@ -393,6 +378,8 @@ <h2 id="P">P</h2>
         <li><a href="development/internal_functions.html#module-py_backend.external">module</a>
 </li>
       </ul></li>
+  </ul></td>
+  <td style="width: 33%; vertical-align: top;"><ul>
       <li>
     py_backend.utils
 
@@ -400,13 +387,8 @@ <h2 id="P">P</h2>
         <li><a href="development/internal_functions.html#module-py_backend.utils">module</a>
 </li>
       </ul></li>
-      <li>
-    py_backend.vensim.vensim2py
-
-      <ul>
-        <li><a href="development/vensim_translation.html#module-py_backend.vensim.vensim2py">module</a>
+      <li><a href="development/internal_functions.html#py_backend.external.External.py_name">py_name (py_backend.external.External attribute)</a>
 </li>
-      </ul></li>
   </ul></td>
 </tr></table>
 
@@ -418,6 +400,8 @@ <h2 id="R">R</h2>
       <li><a href="development/internal_functions.html#py_backend.external.Excels.read_opyxl">read_opyxl() (py_backend.external.Excels class method)</a>
 </li>
       <li><a href="functions.html#pysd.read_vensim">read_vensim() (in module pysd)</a>
+</li>
+      <li><a href="functions.html#pysd.read_xmile">read_xmile() (in module pysd)</a>
 </li>
   </ul></td>
   <td style="width: 33%; vertical-align: top;"><ul>
@@ -435,23 +419,13 @@ <h2 id="R">R</h2>
 <h2 id="S">S</h2>
 <table style="width: 100%" class="indextable genindextable"><tr>
   <td style="width: 33%; vertical-align: top;"><ul>
-      <li><a href="development/internal_functions.html#py_backend.decorators.Cache.step">step() (py_backend.decorators.Cache method)</a>
-</li>
-  </ul></td>
-  <td style="width: 33%; vertical-align: top;"><ul>
-      <li><a href="development/internal_functions.html#py_backend.decorators.subs">subs() (in module py_backend.decorators)</a>
+      <li><a href="development/internal_functions.html#py_backend.external.External.sheet">sheet (py_backend.external.External attribute)</a>
 </li>
   </ul></td>
-</tr></table>
-
-<h2 id="T">T</h2>
-<table style="width: 100%" class="indextable genindextable"><tr>
   <td style="width: 33%; vertical-align: top;"><ul>
-      <li><a href="development/vensim_translation.html#py_backend.vensim.vensim2py.translate_section">translate_section() (in module py_backend.vensim.vensim2py)</a>
+      <li><a href="development/internal_functions.html#py_backend.decorators.Cache.step">step() (py_backend.decorators.Cache method)</a>
 </li>
-  </ul></td>
-  <td style="width: 33%; vertical-align: top;"><ul>
-      <li><a href="development/vensim_translation.html#py_backend.vensim.vensim2py.translate_vensim">translate_vensim() (in module py_backend.vensim.vensim2py)</a>
+      <li><a href="development/internal_functions.html#py_backend.decorators.subs">subs() (in module py_backend.decorators)</a>
 </li>
   </ul></td>
 </tr></table>
diff --git a/docs/_build/html/index.html b/docs/_build/html/index.html
index 43e13f33..b9313f9e 100644
--- a/docs/_build/html/index.html
+++ b/docs/_build/html/index.html
@@ -7,7 +7,7 @@
   
   <meta name="viewport" content="width=device-width, initial-scale=1.0" />
   
-  <title>PySD &mdash; PySD 1.0.0 documentation</title>
+  <title>PySD &mdash; PySD 1.1.0 documentation</title>
   
 
   
@@ -62,7 +62,7 @@
             
             
               <div class="version">
-                1.0
+                1.1
               </div>
             
           
diff --git a/docs/_build/html/installation.html b/docs/_build/html/installation.html
index 96977c4f..f46b51a1 100644
--- a/docs/_build/html/installation.html
+++ b/docs/_build/html/installation.html
@@ -7,7 +7,7 @@
   
   <meta name="viewport" content="width=device-width, initial-scale=1.0" />
   
-  <title>Installation &mdash; PySD 1.0.0 documentation</title>
+  <title>Installation &mdash; PySD 1.1.0 documentation</title>
   
 
   
@@ -63,7 +63,7 @@
             
             
               <div class="version">
-                1.0
+                1.1
               </div>
             
           
diff --git a/docs/_build/html/objects.inv b/docs/_build/html/objects.inv
index 1684f573..4488c49d 100644
Binary files a/docs/_build/html/objects.inv and b/docs/_build/html/objects.inv differ
diff --git a/docs/_build/html/py-modindex.html b/docs/_build/html/py-modindex.html
index 06b24c95..a2f1047f 100644
--- a/docs/_build/html/py-modindex.html
+++ b/docs/_build/html/py-modindex.html
@@ -7,7 +7,7 @@
   
   <meta name="viewport" content="width=device-width, initial-scale=1.0" />
   
-  <title>Python Module Index &mdash; PySD 1.0.0 documentation</title>
+  <title>Python Module Index &mdash; PySD 1.1.0 documentation</title>
   
 
   
@@ -64,7 +64,7 @@
             
             
               <div class="version">
-                1.0
+                1.1
               </div>
             
           
@@ -190,11 +190,6 @@ <h1>Python Module Index</h1>
        <td>&#160;&#160;&#160;
        <a href="development/internal_functions.html#module-py_backend.utils"><code class="xref">py_backend.utils</code></a></td><td>
        <em></em></td></tr>
-     <tr class="cg-1">
-       <td></td>
-       <td>&#160;&#160;&#160;
-       <a href="development/vensim_translation.html#module-py_backend.vensim.vensim2py"><code class="xref">py_backend.vensim.vensim2py</code></a></td><td>
-       <em></em></td></tr>
    </table>
 
 
diff --git a/docs/_build/html/search.html b/docs/_build/html/search.html
index 0995748c..2496b4a4 100644
--- a/docs/_build/html/search.html
+++ b/docs/_build/html/search.html
@@ -7,7 +7,7 @@
   
   <meta name="viewport" content="width=device-width, initial-scale=1.0" />
   
-  <title>Search &mdash; PySD 1.0.0 documentation</title>
+  <title>Search &mdash; PySD 1.1.0 documentation</title>
   
 
   
@@ -64,7 +64,7 @@
             
             
               <div class="version">
-                1.0
+                1.1
               </div>
             
           
diff --git a/docs/_build/html/searchindex.js b/docs/_build/html/searchindex.js
index bed9fd79..753a8e3f 100644
--- a/docs/_build/html/searchindex.js
+++ b/docs/_build/html/searchindex.js
@@ -1,1 +1,1 @@
-Search.setIndex({docnames:["advanced_usage","basic_usage","development/about","development/complement","development/contributing","development/development_index","development/internal_functions","development/pathway","development/structure","development/supported_vensim_functions","development/vensim_translation","development/xmile_translation","functions","index","installation"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":3,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":2,"sphinx.domains.rst":2,"sphinx.domains.std":1,"sphinx.ext.intersphinx":1,"sphinx.ext.todo":2,"sphinx.ext.viewcode":1,sphinx:56},filenames:["advanced_usage.rst","basic_usage.rst","development/about.rst","development/complement.rst","development/contributing.rst","development/development_index.rst","development/internal_functions.rst","development/pathway.rst","development/structure.rst","development/supported_vensim_functions.rst","development/vensim_translation.rst","development/xmile_translation.rst","functions.rst","index.rst","installation.rst"],objects:{"py_backend.decorators":{Cache:[6,1,1,""],subs:[6,3,1,""]},"py_backend.decorators.Cache":{clean:[6,2,1,""],reset:[6,2,1,""],run:[6,2,1,""],step:[6,2,1,""]},"py_backend.external":{Excels:[6,1,1,""],ExtConstant:[6,1,1,""],ExtData:[6,1,1,""],ExtLookup:[6,1,1,""],ExtSubscript:[6,1,1,""],External:[6,1,1,""]},"py_backend.external.Excels":{_Excels:[6,4,1,""],_Excels_opyxl:[6,4,1,""],clean:[6,2,1,""],read:[6,2,1,""],read_opyxl:[6,2,1,""]},"py_backend.external.ExtConstant":{_get_constant_data:[6,2,1,""],_initialize:[6,2,1,""],add:[6,2,1,""],initialize:[6,2,1,""]},"py_backend.external.ExtData":{add:[6,2,1,""],initialize:[6,2,1,""]},"py_backend.external.ExtLookup":{add:[6,2,1,""],initialize:[6,2,1,""]},"py_backend.external.External":{_col_to_num:[6,2,1,""],_file_sheet:[6,2,1,""],_get_data_from_file:[6,2,1,""],_get_data_from_file_opyxl:[6,2,1,""],_get_series_data:[6,2,1,""],_initialize_data:[6,2,1,""],_num_to_col:[6,2,1,""],_reshape:[6,2,1,""],_resolve_file:[6,2,1,""],_series_selector:[6,2,1,""],_split_excel_cell:[6,2,1,""]},"py_backend.utils":{add_entries_underscore:[6,3,1,""],compute_shape:[6,3,1,""],ddir:[6,3,1,""],edir:[6,3,1,""],fdir:[6,3,1,""],find_subscript_name:[6,3,1,""],get_return_elements:[6,3,1,""],get_value_by_insensitive_key_or_value:[6,3,1,""],make_add_identifier:[6,3,1,""],make_coord_dict:[6,3,1,""],make_flat_df:[6,3,1,""],make_python_identifier:[6,3,1,""],rearrange:[6,3,1,""],round_:[6,3,1,""],visit_addresses:[6,3,1,""],xrmerge:[6,3,1,""]},"py_backend.vensim":{vensim2py:[10,0,0,"-"]},"py_backend.vensim.vensim2py":{_include_common_grammar:[10,3,1,""],get_equation_components:[10,3,1,""],get_external_data:[10,3,1,""],get_file_sections:[10,3,1,""],get_model_elements:[10,3,1,""],parse_general_expression:[10,3,1,""],parse_lookup_expression:[10,3,1,""],parse_units:[10,3,1,""],translate_section:[10,3,1,""],translate_vensim:[10,3,1,""]},py_backend:{decorators:[6,0,0,"-"],external:[6,0,0,"-"],utils:[6,0,0,"-"]},pysd:{load:[12,3,1,""],read_vensim:[12,3,1,""]}},objnames:{"0":["py","module","Python module"],"1":["py","class","Python class"],"2":["py","method","Python method"],"3":["py","function","Python function"],"4":["py","attribute","Python attribute"]},objtypes:{"0":"py:module","1":"py:class","2":"py:method","3":"py:function","4":"py:attribute"},terms:{"000":1,"000000":1,"100":10,"112":1,"123abc":6,"124":1,"125":1,"130753818":6,"1415":[],"151":1,"169":1,"175":1,"177":1,"178":1,"180":1,"250":1,"284091":1,"2nd":6,"375":1,"490002":1,"532119":1,"541515":1,"624385":1,"633556":1,"742":6,"951387":1,"abstract":8,"break":10,"case":[1,8],"class":[1,4,5,6,10,12],"default":[1,6],"final":[1,3],"float":6,"function":[0,2,4,7,8,9,13],"g\u00f6nen\u00e7":3,"import":[0,2,7,8,12,13],"int":[1,6,9,10],"long":2,"new":[0,1,2,6,10],"public":0,"return":[0,1,6,7,8,10,12],"short":4,"static":[2,6],"switch":6,"throw":[6,10],"true":6,"try":6,"var":1,"while":2,"y\u00fccel":3,ABS:[1,9,10],But:[],COS:[1,9,10],For:[0,1,6,10,13],Not:5,THEN:[1,9,10],That:[1,3],The:[0,1,3,4,5,6,10,11,12,13,14],Then:[],There:[1,2,4,10],These:[4,6,8,10,12,13,14],Use:4,Used:[6,8],Will:6,XLS:[1,6,9,10],__call__:[],__dir__:6,_build_euler_timeseri:[],_col_to_num:6,_constant_compon:[],_default_return_column:[],_euler_step:[],_excel:6,_excels_opyxl:6,_file_sheet:6,_format_return_timestamp:[],_get_constant_data:6,_get_data_from_fil:6,_get_data_from_file_opyxl:6,_get_series_data:6,_include_common_grammar:10,_initi:6,_initialize_data:6,_integr:[],_num_to_col:6,_reshap:6,_resolve_fil:6,_series_selector:6,_split_excel_cel:6,_state:10,_timeseries_compon:[],_xarrai:[],abc:6,abdel:2,abil:[0,1,2],abm:4,about:[4,5,13],abov:[1,13,14],abs:[1,9,10],ac19:6,acc:6,accept_new:6,access:[0,1,6,10],accord:8,account:8,activ:[2,7],active_initi:[],actual:[],adapt:8,add:[2,4,6,10],add_:6,add_entries_underscor:6,add_ext_const:[],add_ext_data:[],add_ext_lookup:[],add_incomplet:[],add_initi:[],add_macro:[],add_n_delai:[],add_n_smooth:[],add_n_trend:[],add_stock:[],added:6,adding:6,addit:8,addition:[1,10,14],address:6,advanc:13,advantag:[2,4,7,8],after:[1,4],again:[],age:5,aggreg:[],algorithm:[2,6],all:[0,1,4,6,8,10],allow:[8,10],along:4,alphanumer:[8,10],alreadi:[4,6,12],also:[1,4,6,8],altern:1,altogeth:6,alwai:[2,4],amount:[],analog:[],analys:[2,7,8],analysi:[0,2,3,13,14],analyt:[0,5,8,13,14],analyz:[2,3],ani:[0,4,8,10],annoi:10,anoth:[1,2,7],anyth:[3,4],append:[4,6],appli:10,applic:2,approach:5,appropri:[1,2,7,8,10],approv:3,approxim:8,arbitrari:[6,8,10],arcco:[1,9,10],architectur:7,arcsin:[1,9,10],arctan:[1,9,10],area:4,arg1:10,arg2:10,arg:[6,10],arg_nam:[],arg_val:[],args_str:10,argument:[1,13],around:[],arrai:[6,7,10],ask:1,aspir:4,assembl:[],assist:[6,7],associ:1,assum:[0,10],assumpt:[1,10],attach:[],attatch:6,attempt:2,automat:14,auxiliari:[0,8],avail:[0,2,6,8,13],average_tim:[],avoid:[4,6],b16:6,back:10,backend:[7,10],backslash:10,backward:6,base:[6,8,10],basestr:[6,10],basic:[0,2,3,4,7,8,10,13],bat:[2,3],beauti:3,becaus:[0,6],becom:[2,10],been:[1,2,3,12],befor:[1,2,4,6],begin:1,behaind:6,behav:1,behavior:[1,2,3,8],behind:0,being:[2,3,6,8],believ:1,belong:2,benefit:[2,6],best:4,better:3,between:[0,1,3,6,8],beyond:2,big:[5,13],bigger:6,binari:6,birth:[],birth_rat:[],black:14,bobbi:3,bodi:10,bool:6,boom:2,both:4,bottleneck:4,bound:[7,10],boundari:3,bounded_norm:[1,9,10],branch:4,breadth:8,bring:[2,14],brought:2,browser:4,bug:[4,7,13],build:[7,8,14],build_el:[],build_function_cal:[],build_nam:6,builder:[6,10],built:[2,14],busi:2,bypass:[],cach:6,cache_typ:6,calcul:[0,8],call:[0,1,3,6,10,14],can:[0,1,2,4,6,8,10,13,14],cannot:2,capabl:[1,2,8,14],capit:6,captur:[],capture_el:6,care:[0,1],carlo:[2,7,14],categor:[2,3],categori:2,cater:2,causal:2,cell:6,cellnam:6,cellrang:6,central:2,chach:6,chain:[2,14],chang:[1,4,8],charact:[6,8,10],check:[0,1,4],checker:[4,7],choic:8,choos:1,chunk:1,classmethod:6,clean:6,clear:[],clear_cach:[],clone:14,closest:[],code:[1,2,4,8,13,14],col:6,col_v:6,collect:[2,6],column:6,com:[6,10,11,13,14],combin:[],come:[1,5,10],command:[1,8,14],commingl:2,commit:4,common:4,commun:[2,3,11],compar:[1,2],comparison:4,compat:6,compil:[2,10],complementari:[5,8,13],complet:6,complex:[2,13],complier:[],compon:[1,3,4,7,8,10,13],comput:[2,6,8,10],compute_shap:6,condit:[7,8,10,13],conduct:4,confin:2,conflict:[6,10],connect:0,consid:2,consist:6,constan:1,constant:[0,1,6,9,10],constitut:8,construct:[2,4,7,8,10,12,14],consult:13,contact:13,contain:[1,6,8,10,14],continu:[1,6],contribut:[5,7],control:[10,12],conveni:[1,10],convent:[6,7],convert:[6,12],cookbook:14,cool:1,coord:[1,6],coordin:[0,1,6],core:[4,8,14],correct:6,correspon:6,correspond:[1,2,6,8,9,10],cos:[1,9,10],could:[0,3,6],cours:1,cover:6,cprofil:4,cprofilev:4,crawl:8,creat:[1,2,3,4,6,8,10,13],creation:4,cross:2,cup:1,current:[0,4,5,8,10,13],cython:7,d_dt:8,das:6,data:[0,1,5,7,8,9,10,13,14],data_across:6,data_arrai:6,dataarrai:[1,6],dataarray_:[],dataarrays_:[],datafram:[1,6,8],date:4,ddir:6,ddt:[],deal:[2,6],dealt:2,debug:4,declar:6,decor:8,def:0,defin:[0,1,10],definit:10,degre:1,delai:[1,7,8,9,10],delay1:[1,9,10],delay3:[1,9,10],delay_input:[],delay_tim:[],delft:3,delvelop:3,demand:2,demonstr:[7,13],denomin:[],denot:6,depend:[2,4,6,13],deploi:10,depth:2,deriv:[8,10],describ:[],descript:[],design:[2,5,8],desir:6,determin:3,develop:[2,3,6,10,13,14],devid:[],diagram:7,dict:6,dict_find:[],dictionari:[1,6,8,10],didn:0,differ:[1,6,10],differenti:[6,8],digit:6,dim1:[1,6],dim2:[1,6],dim3:6,dim:[1,6],dim_nam:6,dimens:[0,1,6],dir:6,direct:[1,4,6,8,9,10],directli:0,directori:[4,10,14],disciplin:4,discontinu:8,discov:8,discret:4,discuss:0,displai:[3,4,7,10],distribut:10,divid:[],divis:[],doc8:2,doc:[1,6,10],docs_df:[],docstr:[7,8,10],doctest:7,document:[1,2,6,7,8,10,11,13],doe:[],doesn:4,dollar:10,don:[6,10],doubl:[6,10],down:10,download:[4,14],downsid:8,draft:3,drew:0,drop:6,dtest_stock_dt:10,durat:[],dynam:[1,3,4,5,7,8,13,14],each:[2,4,6,8,10],earli:4,eas:4,easi:4,easili:1,edir:6,edit:4,effici:2,effort:[2,7],eigenvector:2,either:[1,4,6,10],element:[1,6,7,10,12],element_list:[],elements_subs_dict:10,els:[1,3,6,9,10],ema:[2,3],emerg:2,emphas:4,empti:10,enabl:[2,7,8],enclav:2,end:[2,3,6],endem:4,endpoint:[],engin:[2,3],enough:4,ensur:[0,4,6,8],entir:[4,8],entri:[6,10],environ:[0,2,7,10,14],eqn:10,equal:[],equat:[0,1,8,10],equation_str:10,equip:8,equival:[1,6,8,10],erik:3,error:[6,10],escap:10,essenti:8,establish:[2,7,8,14],etc:[4,6,7,8,10],euler:[],evalu:[],event:4,eventu:10,everi:[1,10],everyth:[4,10],exampl:[0,1,2,4,6,10,12],excel:[3,6],except:6,execut:[4,8,10,12,13],exexut:7,exist:[0,3,6,7,10],exogen:7,exogenous_const:[],exogenous_vari:[],exp:[1,9,10],expand:6,expect:[1,8],explain:[0,1],explor:[3,4],exploratori:[2,3],exponenti:[1,9,10],expr:10,express:[6,8,10],exprnd:[1,9,10],extconst:[1,6,9,10],extdata:[1,6,9,10],extend:[2,7],extent:2,extern:[1,4,7,8,9,10],extlookup:[1,6,9,10],extract:10,extrapol:[],extsubscript:[1,6,9,10],facilit:[3,8],fail:14,fals:6,famili:6,far:[1,2],fast:4,fdir:6,featur:[4,5,13],feedback:[2,4],few:[1,2,3],field:2,file:[0,1,2,4,8,10,12,13],file_nam:6,file_str:10,filenam:[10,12],filepath:[],find:[1,4,13],find_subscript_nam:6,finish:[],firefight:4,first:[1,2,6,10],firstcel:6,fit:[0,2,4],flag:6,flow:[0,8],flowa:10,flowrat:0,focuss:4,follow:[4,6,8,10],for_1:6,forc:6,fork:[4,13],form:[0,1,2,13],format:[0,6,7,8,12,14],formula:[],fortran:8,forward:1,found:[4,10],frame:6,freez:1,from:[0,1,2,6,8,10,12,13],front:[2,3],full:[6,8,10],fulli:2,func:[6,10],func_arg:[],func_str:10,function_def:[],further:2,futur:[6,8,10],gain:2,gawad:2,gener:[1,4,5,6],geograph:14,geopanda:14,get:[4,6,7,8,9,10,13,14],get_coord:[0,1],get_equation_compon:10,get_external_data:10,get_file_sect:10,get_model_el:10,get_pysd_compiler_vers:[],get_return_el:6,get_test:4,get_value_by_insensitive_key_or_valu:6,git:14,github:[4,6,7,13,14],give:[1,4],given:[1,6,10],global:4,gmail:13,goe:0,going:6,good:4,grace:10,grammar:[8,10],graphic:2,great:2,group:10,growth:2,h40t_tr21ck:6,had:0,handi:[6,10],handl:[6,7,8,10],happen:0,happi:4,has:[1,2,8,10,12],have:[1,2,3,6,10],haven:4,heat:0,heat_loss_to_room:0,height:[],hello:1,help:[2,4,13,14],helper:[],here:[0,1,6,10],hex:6,hexidecim:6,high:5,highli:8,histori:[],hoewev:14,hold:[],horizon:6,host:2,houghton:13,how:[0,1,2,4,6,8],howev:[0,2],ht_trck:6,htm:10,html:[6,10],http:[6,10,11,13,14],idea:5,ident:[],identif:6,identifi:[4,6,8,10],if_then_els:[1,9,10],ignor:[2,6,10],implement:[3,4,6,7],impli:6,implicit:10,impos:2,improv:[4,7,8,13],in_dict:[],includ:[1,3,4,6,10,13],inclus:2,incomplet:[],incorpor:2,increas:2,indentifi:6,independ:[2,10],index:[0,1,10,13,14],indic:1,individu:[4,8],inf:[],infer:2,infinit:8,influenc:4,info:4,inform:[4,6,13],inher:8,init:[],init_test_stock:10,init_v:[],initi:[6,8,9,10,13],initial_condit:1,initial_input:[],initial_trend:[],initial_valu:[],initialization_ord:[],input:[0,6,7],insid:6,insight:2,instal:[4,13],instanc:[0,1],instanti:[],instead:[0,6,8],intact:4,integ:[1,9,10],integr:[1,3,4,5,7,8,13],intellig:7,intention:8,interact:[2,8],interest:[2,4,6,13],interfac:[2,7],intermedi:[],intern:[0,8],interp:[0,6],interpol:[0,1,6],interpret:8,interv:[],intg_kwarg:0,investig:1,involv:7,ipython:[3,13],irregular:1,iseesystem:11,isn:[],issu:[4,6,7,13],iter:[],ithink11:2,its:[0,1,4,6,8,10],itself:[2,8],jame:13,jamesphoughton:[13,14],jan:3,javascript:3,jcmgrai:6,joint:2,json:4,junk:10,just:[1,6],kei:[1,6,10],key1:[],key2:[],keyword:[0,1,6,10],kind:10,know:[0,1,4],knowledg:10,kwakkel:3,lambda:[],languag:[2,3,4,6],larg:2,larger:7,largest:2,last:[0,1,2,6,14],lastcel:6,lastli:8,late:6,latest:14,launch:4,lead:[4,6],learn:[0,2,7,13,14],least:14,left:6,lefttop:6,length:6,let:4,letter:6,level:[4,6,8,10],lexical_analysi:6,librari:[3,4,6,7,8,13,14],like:[0,2,6,8],likewis:2,limit:[2,4,7,8,10],linear:[],linearli:[0,1],linspac:[],lint:[4,7],lis:6,list:[1,4,6,7,8,10,13],littl:4,load:[1,12,14],loc:6,local:[4,13],locat:11,log:[1,8,9,10],logarithm:[],lognorm:[1,9,10],longer:4,look:6,lookup:[1,6,9,10],lookup_dim:6,lookup_discret:[],lookup_extrapol:[],lost:0,lot:[0,6],low:[5,8],lower:[],lowest:6,lsoda:8,machin:[2,7,13,14],machineri:8,macro:10,macro_list:10,macro_nam:[],made:[0,4],magnitud:[],mai:[1,2,6,10],main:[4,6,10],maintain:[4,8],major:[],make:[1,2,4,6,7,8,10],make_add_identifi:6,make_coord_dict:6,make_flat_df:6,make_python_identifi:6,manag:10,mani:[1,2,8],manipul:[7,14],manual:4,map:6,markov:[2,8,14],massiv:[2,10],match:1,matplotlib:14,matrix:1,matur:2,max:[1,9,10],maximum:8,mdl:[1,8,10,12],mdl_file:[10,12],mean:[1,6,8],measur:[1,8],medium:5,meet:[2,4],member:6,memoiz:7,memori:8,mere:1,merg:[6,10],merge_partial_el:[],method:[0,1,2,3,7,8,10,13],methodolog:2,might:[1,4],min:[1,9,10],minimum:[],minut:1,mod:[1,9,10],mode:3,model:[3,4,5,7,10,12,13,14],model_str:10,modif:7,modifi:[0,1,8,10,13],modul:[1,4,5,10,13,14],modulo:[1,9,10],mont:[2,7,14],month:[3,10],more:[1,2,4,6,7,10,13],most:[3,6,8],mostli:[],motiv:[0,5],move:[4,8],much:[2,8],multidimension:[],multipl:6,multiple_spac:6,multiple_word:6,must:[0,1,6,8],mutabl:6,name:[0,1,6,8,10],nameerror:6,namespac:[6,10],nativ:[2,8],natur:2,ndarrai:6,neat:3,necessari:[6,10],need:[0,1,2,4,8,10],network:14,networkx:14,new_el:10,new_func:[],new_heatflow_funct:0,new_structur:[],new_valu:1,newlin:10,next:3,non:[6,7],none:[1,6,10],normal:[1,9,10],note:10,notebook:13,noth:[],now:6,num:6,numba:7,number:[4,6],numer:2,numpi:[1,6,9,10,14],obei:8,object:[6,8,12,13],observ:13,odeint:[0,8],odepack14:8,off:7,often:2,old:6,omit:4,onc:[0,1],one:[0,2,6,8],oner:4,ones:6,ongo:10,oni:6,onli:[1,6,8,10],openpyxl:[6,14],oper:4,oppos:[],optim:8,option:[1,6,8,13],order:[6,8],ordinari:8,org:[6,13],origin:[0,1,2,8,10,14],other:[0,1,4,5,6,8,10,14],otherwis:[],our:[0,1,10],ourselv:0,out:10,outdict:6,outfile_nam:[],outflow:[],outlin:6,output:[0,6,7,8,10,13],outright:6,outsourc:7,over:[0,1,7,10],overwrit:1,own:[4,10],packag:[0,1,3,4,7,9,10,13,14],pair:[],panda:[1,6,8,14],paradigm:2,parallel:[7,10],param:[1,6,10],paramet:[0,3,6,7,8,10,12,13],pars:[0,8,10,14],parse_general_express:10,parse_lookup_express:10,parse_unit:10,parser:[7,8],parsimoni:14,parsimonious13:8,part:[0,10],parti:[8,14],partial:1,particular:[6,13],pass:[0,1,6,8,10],past:[],path:[4,10,12],pathwai:[4,5,13],pdf:11,peopl:4,perfect:4,perform:[2,7,10,14],perman:1,philosophi:5,pick:1,piec:[8,10],pip:13,pipe:10,pipelin:[],place:[0,6],plan:5,plot:[1,4],plt:1,point:[2,8],poisson:[1,9,10],posit:[1,4,6],possibl:4,possible_ext:6,potenti:10,power:[0,2,3],practic:[2,4],practition:4,predict:0,prefix:6,present:[],prevent:8,previou:[0,1],previous:6,primari:[8,12],print:[1,6],prior:[],prioriti:5,probabl:10,problem:2,process:0,prod:[1,9,10],product:[2,10],profile_pysd:4,program:[2,6],programmat:[7,8],progress:[],project:[4,5,13,14],prone:[],proper:4,properli:[6,8,10],properti:[6,8],provid:[2,3,6,8,10,13],prticular:6,pruyt:3,pull:[4,13],puls:[1,8,9,10],pulse_magnitud:[],pulse_train:[1,9,10],purpos:13,put:6,py_backend:[6,10],py_expr:10,py_model_fil:12,py_nam:[6,10],pydata:6,pylint:4,pymc:14,pysaf:[],pysd:[0,1,2,3,5,10,12,14],python:[0,1,2,3,7,8,9,10,12,13,14],quantiti:6,queri:[8,13],question:[2,4],quickli:4,quot:10,rage:[],rais:6,ramp:[1,9,10],rand:[1,9,10],random:[1,9,10],random_uniform:[],rang:[1,6,7],rate:0,rather:[],raw:12,read:[2,4,8,10,14],read_opyxl:6,read_vensim:[1,12],readi:[12,13],readthedoc:13,real:10,real_nam:10,realli:[1,3],rearang:6,rearrang:6,reason:2,recent:6,recip:[13,14],recogn:[0,10],recommend:1,record:7,redefinit:6,refactor:7,refer:[6,11,13],referenc:[],regress:0,rel:12,releas:10,relev:2,reload:[],remain:[1,4],rememb:[],remov:[6,10],render:3,repeat:1,repeat_tim:[],replac:[1,2,6,8,13],repositori:4,repres:[0,6,8,10],represent:6,request:[1,4,6,13],requir:[8,10,13],reserv:6,reserved_word:6,reset:6,reset_st:[],reshap:6,reshape_len:6,resist:4,resolv:[6,10],resourc:2,respect:6,respond:2,respons:[],rest:10,result:[1,4,6,8,10],retriev:6,return_address:6,return_column:[1,6],return_func:[],return_timestamp:1,revolut:2,rework:8,rich:2,ripe:4,robert:14,robust:4,room:[0,1],room_temp:0,room_temperatur:0,root:[6,10],root_path:10,round:6,round_:6,routin:8,row:6,run:[0,2,4,6,7,8,10,12,13],run_profil:4,runner:4,runtim:8,rush:4,safe:[1,6,8],same:[0,1,6,8,10,14],sampl:[1,12,13],save:6,savep:[],saw:0,scalar:1,scale:2,scene:[0,6],scienc:[2,7],scientist:2,scikit:[0,14],scipi:[0,8,14],scope:[],scratch:[],sdlab:3,sdm:2,sdxchang:7,second:[2,6],secondli:6,section:[0,1,6,10],see:[1,7,10,13],seed:[],seek:2,seen:8,select:6,self:[1,6,9,10],separ:10,seri:[0,1,6],series_across:6,series_row_or_col:6,serv:[],set:[4,6,8,13,14],set_compon:1,set_initial_condit:[],set_stat:[],setup:14,sever:[1,6,8],shape:6,share:4,sheet:6,should:[1,2,3,4,6,8,10,14],show:4,sign:10,signific:8,similar:[0,6,8,14],simpl:[1,6,13],simplest:1,simpli:1,simplifi:8,simul:[2,4,7,8,10,13],sin:[1,9,10],singl:[0,8],situat:1,size:[6,8],skip:[],sklearn:0,slope:[],smaller:6,smile:11,smilev4:11,smooth3:[1,9,10],smooth3i:[1,9,10],smooth:[1,9,10],smooth_input:[],smooth_tim:[],social:2,softwar:[2,3,4],solver:8,some:[4,10],someth:0,sourc:[6,8,10,12,13],source_grammar:10,space:[2,3,6,8],special:[2,8,10],specif:[3,4,6,8],specifi:[1,8],speed:[7,8],speed_test:4,speedtest_result:4,spend:1,split:[6,10],sqrt:[1,9,10],stack:[8,14],standalon:3,standard:[2,3,4,8,14],start:[4,6,8,13],state:[0,6,8],state_vector:8,stateful:8,statist:[2,7],std:[],stella:2,step:[1,2,6,8,9,10],stick:4,still:10,stock:[1,7,8,10],store:[7,8],str:6,string:[6,7,10,12],strong:4,structur:[0,2,3,5,7,13],sub1:6,sub2:6,sub:[6,10],subclass:1,subcoord:6,subdef:10,sublist:[],submiss:4,submit:[4,13],submodel:[],subscript:[0,1,6,7,9,10],subscript_3d_arrai:10,subscript_dict:[6,10],subset:10,substitut:[0,2],suit:13,sum:[1,9,10],summari:2,suplementari:10,suposs:1,suppli:[1,8,13],support:[0,2,8,10,11],suppos:0,sure:4,svm:0,svr:0,symbol:8,synopsi:1,syntact:8,syntax:[8,10,14],system:[0,1,3,4,5,8,13,14],tab:6,tabl:[6,10],tag:10,take:[0,1,2,4,6,7,8,10],taken:2,tan:[1,9,10],task:13,tea:1,tea_temp:0,teacup:[0,1,10,12],teacup_temperatur:[0,1],technic:[],techniqu:2,tell:6,temp:1,temperatur:[0,1],term:4,ters:6,tes:4,test:[1,2,3,7,10,12],test_ab:[],test_limit:[],test_pysd:4,test_stock:10,test_subscript_3d_arrai:10,text:[6,10],than:[1,2,4,6],thank:6,thar:6,theano:7,thei:[1,2,4,6,8,14],them:[1,3,7,8,10,14],themselv:10,therefor:8,thi:[0,1,2,3,4,6,8,10,13],thing:6,think:[4,10],third:[2,8,14],thirti:1,those:[0,2,3,8,10,13],three:[1,8],through:[0,2,8],throughout:[],thu:6,tie:0,tightli:[2,3],tild:10,time:[0,1,6,7,8,10],time_initi:[],time_row_or_col:6,time_step:[],timeit:4,timeseri:7,timeseries_input:[],timestamp:[1,8],timestep:8,todo:10,togeth:[2,10],tool9:2,tool:[2,5,6,7],toolbox:2,toolset:7,top:6,toward:2,trace:7,traceback:6,track:7,tracker:[7,13],tractabl:2,tradit:2,tradition:2,trail:6,train:[1,9,10],transform:6,translat:[0,1,5,6,7,9,13,14],translate_sect:10,translate_vensim:10,tree:8,trend:[],trend_initi:[],trend_input:[],tri:[],tricki:[],tstep:[],tupl:[1,6],turn:7,two:[2,6],type:[2,6,10,12],ultim:2,under:1,underscor:[6,8],understand:[2,4],uniform:[1,9,10],uniqu:[2,3,6],unit:[1,7,8,10],units_str:10,unstructur:2,unsupport:8,until:6,unverifi:8,unwieldi:2,updat:[4,6,8],upon:[2,8,10],urg:4,usabl:2,usag:13,use:[0,1,2,4,8,10,14],used:[1,2,4,8],useful:[1,14],user:[0,6,8,13],user_argu:[],uses:[2,4,8],using:[0,1,2,4,6,7,8,13,14],util:[6,8,14],vaild:6,val_if_fals:[],val_if_tru:[],valid:6,valu:[0,6,7,8,10,13],valuabl:3,value_if_denom_is_zero:[],valueerror:6,var_nam:[],vari:0,variabl:[0,1,6,7,8,10],variable_1:6,variable_2:6,variable__nam:1,variable_nam:0,variant:[2,7],varieti:[2,3,8,13],variou:[2,10,13],varnam:6,vector:[0,1,6,8],vendor:4,vensim10:2,vensim2pi:10,vensim:[1,2,6,7,8,9,12,13],veri:3,version:[4,6,10,14],via:13,view:[1,4],visit:6,visit_address:6,visual:2,vmax:[1,9,10],vmin:[1,9,10],volum:2,wai:[1,2,6,7,8],want:[0,1,2,6],ward:14,warn:[],webpag:14,well:[2,8],were:[1,6],what:[6,10],when:[0,1,2,4,6,7,10,13],whenev:4,where:[1,4,6,8,10],which:[1,2,4,6,8,10,12],white:6,whitespac:6,who:[2,4],whose:[1,6],wide:[],widget:[3,10],wind:10,wise:[],wish:0,wit:2,within:[1,6,7,8,10],without:[1,2],word:6,work:[2,3,4,6,10],workbench6:2,workbench:3,workflow:13,world:1,would:[6,8],wrap:8,wrapper:0,write:[0,7,10],www:[10,11],x_row_or_col:6,x_train:0,xarrai:[1,6],xidz:[1,9,10],xlabel:1,xmile:[3,4,7,8,10,13,14],xmilev4:11,xml:8,xnx:10,xrmerg:6,y_train:0,year:2,yet:2,yield:[],ylabel:1,you:[0,1,4,6,13,14],your:[4,13],zero:1,zidz:[1,9,10]},titles:["Advanced Usage","Basic Usage","About the Project","Complementary Projects","Contributing to PySD","Developer Documentation","Internal Functions","PySD Development Pathway","Structure of the PySD module","&lt;no title&gt;","Vensim Translation","XMILE Translation","User Functions Reference","PySD","Installation"],titleterms:{"class":8,"function":[1,6,10,12],"import":1,Not:7,The:[2,8],Used:10,about:2,addit:[0,13,14],advanc:0,age:2,analyt:2,approach:2,argument:0,basic:1,big:2,build:6,come:2,complementari:3,complex:0,compon:0,condit:1,content:13,contribut:[4,13],cookbook:13,current:[1,7],data:[2,6],decor:6,depend:14,design:4,develop:[4,5,7],document:5,dynam:2,execut:6,extern:6,featur:7,file:6,from:14,gener:2,get:1,high:7,idea:7,indic:13,inform:1,initi:1,instal:14,integr:[0,2],intern:6,linter:4,low:7,medium:7,model:[0,1,2,6,8],modul:8,more:0,motiv:2,need:6,object:0,option:14,other:7,output:1,paramet:1,pathwai:7,philosophi:4,pip:14,plan:7,prioriti:7,profil:4,project:[2,3,7],pysd:[4,7,8,13],python:[4,6],queri:1,read:6,refer:12,replac:0,requir:14,resourc:[13,14],run:1,set:1,simul:1,sourc:14,special:6,speed:4,start:1,structur:8,suit:4,suppli:0,support:[1,13],system:2,tabl:13,test:4,tool:4,translat:[8,10,11],usag:[0,1],used:6,user:12,valu:1,variou:1,vensim:10,via:14,xmile:11}})
\ No newline at end of file
+Search.setIndex({docnames:["advanced_usage","basic_usage","development/about","development/complement","development/contributing","development/development_index","development/internal_functions","development/pathway","development/structure","development/supported_vensim_functions","development/vensim_translation","development/xmile_translation","functions","index","installation"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":3,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":2,"sphinx.domains.rst":2,"sphinx.domains.std":1,"sphinx.ext.intersphinx":1,"sphinx.ext.todo":2,"sphinx.ext.viewcode":1,sphinx:56},filenames:["advanced_usage.rst","basic_usage.rst","development/about.rst","development/complement.rst","development/contributing.rst","development/development_index.rst","development/internal_functions.rst","development/pathway.rst","development/structure.rst","development/supported_vensim_functions.rst","development/vensim_translation.rst","development/xmile_translation.rst","functions.rst","index.rst","installation.rst"],objects:{"py_backend.decorators":{Cache:[6,1,1,""],subs:[6,3,1,""]},"py_backend.decorators.Cache":{clean:[6,2,1,""],reset:[6,2,1,""],run:[6,2,1,""],step:[6,2,1,""]},"py_backend.external":{Excels:[6,1,1,""],ExtConstant:[6,1,1,""],ExtData:[6,1,1,""],ExtLookup:[6,1,1,""],ExtSubscript:[6,1,1,""],External:[6,1,1,""]},"py_backend.external.Excels":{_Excels:[6,4,1,""],_Excels_opyxl:[6,4,1,""],clean:[6,2,1,""],read:[6,2,1,""],read_opyxl:[6,2,1,""]},"py_backend.external.ExtConstant":{_get_constant_data:[6,2,1,""],_initialize:[6,2,1,""],add:[6,2,1,""],initialize:[6,2,1,""]},"py_backend.external.ExtData":{add:[6,2,1,""],initialize:[6,2,1,""]},"py_backend.external.ExtLookup":{add:[6,2,1,""],initialize:[6,2,1,""]},"py_backend.external.External":{_col_to_num:[6,2,1,""],_file_sheet:[6,2,1,""],_fill_missing:[6,2,1,""],_get_data_from_file:[6,2,1,""],_get_data_from_file_opyxl:[6,2,1,""],_get_series_data:[6,2,1,""],_initialize_data:[6,2,1,""],_interpolate_missing:[6,2,1,""],_reshape:[6,2,1,""],_resolve_file:[6,2,1,""],_series_selector:[6,2,1,""],_split_excel_cell:[6,2,1,""],file:[6,4,1,""],missing:[6,4,1,"id0"],py_name:[6,4,1,""],sheet:[6,4,1,""]},"py_backend.utils":{add_entries_underscore:[6,3,1,""],compute_shape:[6,3,1,""],ddir:[6,3,1,""],edir:[6,3,1,""],fdir:[6,3,1,""],find_subscript_name:[6,3,1,""],get_return_elements:[6,3,1,""],get_value_by_insensitive_key_or_value:[6,3,1,""],make_add_identifier:[6,3,1,""],make_coord_dict:[6,3,1,""],make_flat_df:[6,3,1,""],make_python_identifier:[6,3,1,""],rearrange:[6,3,1,""],round_:[6,3,1,""],visit_addresses:[6,3,1,""],xrmerge:[6,3,1,""]},py_backend:{decorators:[6,0,0,"-"],external:[6,0,0,"-"],utils:[6,0,0,"-"]},pysd:{load:[12,3,1,""],read_vensim:[12,3,1,""],read_xmile:[12,3,1,""]}},objnames:{"0":["py","module","Python module"],"1":["py","class","Python class"],"2":["py","method","Python method"],"3":["py","function","Python function"],"4":["py","attribute","Python attribute"]},objtypes:{"0":"py:module","1":"py:class","2":"py:method","3":"py:function","4":"py:attribute"},terms:{"000":1,"000000":1,"100":[],"112":1,"123abc":6,"124":1,"125":1,"130753818":6,"1415":[],"151":1,"169":1,"175":1,"177":1,"178":1,"180":1,"250":1,"284091":1,"2nd":6,"375":1,"490002":1,"532119":1,"541515":1,"624385":1,"633556":1,"742":6,"951387":1,"abstract":8,"break":[],"case":[1,8],"class":[1,4,5,6,12],"default":[1,6,12],"final":[1,3],"float":6,"function":[0,2,4,7,8,9,13],"g\u00f6nen\u00e7":3,"import":[0,2,7,8,12,13],"int":[1,6,9,10],"long":2,"new":[0,1,2,6,10],"public":0,"return":[0,1,6,7,8,12],"short":4,"static":[2,6],"switch":6,"throw":[6,10],"true":6,"try":6,"var":1,"while":2,"y\u00fccel":3,ABS:[1,9,10],But:[],COS:[1,9,10],For:[0,1,6,10,13],Not:5,THEN:[1,9,10],That:[1,3],The:[0,1,3,4,5,6,10,11,12,13,14],Then:[],There:[1,2,4,10],These:[4,6,8,10,12,13,14],Use:4,Used:[6,8],Will:6,XLS:[1,6,9,10],__call__:[],__dir__:6,_build_euler_timeseri:[],_col_to_num:6,_constant_compon:[],_default_return_column:[],_euler_step:[],_excel:6,_excels_opyxl:6,_file_sheet:6,_fill_miss:6,_format_return_timestamp:[],_get_constant_data:6,_get_data_from_fil:6,_get_data_from_file_opyxl:6,_get_series_data:6,_include_common_grammar:[],_initi:6,_initialize_data:6,_integr:[],_interpolate_miss:6,_num_to_col:[],_reshap:6,_resolve_fil:6,_series_selector:6,_split_excel_cel:6,_state:[],_timeseries_compon:[],_xarrai:[],abc:6,abdel:2,abil:[0,1,2],abm:4,about:[4,5,13],abov:[1,13,14],abs:[1,9,10],ac19:6,acc:6,accept_new:6,access:[0,1,6,10],accord:8,account:8,activ:[2,7],active_initi:[],actual:[],adapt:8,add:[2,4,6],add_:6,add_entries_underscor:6,add_ext_const:[],add_ext_data:[],add_ext_lookup:[],add_incomplet:[],add_initi:[],add_macro:[],add_n_delai:[],add_n_smooth:[],add_n_trend:[],add_stock:[],added:6,adding:6,addit:8,addition:[1,10,14],address:6,advanc:[1,13],advantag:[2,4,7,8],after:[1,4,6],again:[],age:5,aggreg:[],algorithm:[2,6],all:[0,1,4,6,8],allow:[8,10],along:4,alphanumer:[8,10],alreadi:[1,4,6,12],also:[1,4,6,8],altern:1,altogeth:6,alwai:[2,4],amount:[],analog:[],analys:[2,7,8],analysi:[0,2,3,13,14],analyt:[0,5,8,13,14],analyz:[2,3],ani:[0,4,8],annoi:[],anoth:[1,2,7],anyth:[3,4,6,12],append:[4,6],appli:[],applic:2,approach:5,appropri:[1,2,7,8],approv:3,approxim:8,arbitrari:[6,8,10],arcco:[1,9,10],architectur:7,arcsin:[1,9,10],arctan:[1,9,10],area:4,arg1:[],arg2:[],arg:6,arg_nam:[],arg_val:[],args_str:[],argument:[1,13],around:[],arrai:[6,7,10],ask:1,aspir:4,assembl:[],assist:[6,7],associ:1,assum:0,assumpt:1,attach:[],attatch:6,attempt:2,automat:14,auxiliari:[0,8],avail:[0,2,8,13],average_tim:[],avoid:[4,6],b16:6,back:[],backend:[7,10],backslash:[],backward:6,base:[6,8],basestr:6,basic:[0,2,3,4,7,8,13],bat:[2,3],beauti:3,becaus:[0,6],becom:[2,10],been:[1,2,3,12],befor:[1,2,4,6],begin:1,behaind:6,behav:1,behavior:[1,2,3,8],behind:0,being:[2,3,6,8],believ:1,belong:2,benefit:[2,6],best:4,better:3,between:[0,1,3,8],beyond:2,big:[5,13],bigger:6,binari:6,birth:[],birth_rat:[],black:14,bobbi:3,bodi:[],bool:6,boom:2,both:[4,6],bottleneck:4,bound:7,boundari:3,bounded_norm:[1,9,10],branch:4,breadth:8,bring:[2,14],brought:2,browser:4,bug:[4,7,13],build:[7,8,14],build_el:[],build_function_cal:[],build_nam:6,builder:6,built:[2,14],busi:2,bypass:[],cach:6,cache_typ:6,calcul:[0,8],call:[0,1,3,6,14],can:[0,1,2,4,6,8,10,13,14],cannot:2,capabl:[1,2,8,14],capit:6,captur:[],capture_el:6,care:[0,1],carlo:[2,7,14],categor:[2,3],categori:2,cater:2,causal:2,cell:6,cellnam:6,cellrang:6,central:2,chach:6,chain:[2,14],chang:[1,4,8],charact:[6,8,10],check:[0,1,4],checker:[4,7],choic:8,choos:1,chunk:1,classmethod:6,clean:6,clear:[],clear_cach:[],clone:14,closest:[],code:[1,2,4,8,13,14],col:6,col_v:[],collect:[2,6],column:6,com:[6,11,13,14],combin:[],come:[1,5],command:[1,8,14],commingl:2,commit:4,common:4,commun:[2,3,11],compar:[1,2],comparison:4,compat:6,compil:2,complementari:[5,8,13],complet:6,complex:[2,13],complier:[],compon:[1,3,4,7,8,13],comput:[2,6,8,10],compute_shap:6,condit:[7,8,13],conduct:4,confin:2,conflict:6,connect:0,consid:2,consist:6,constan:1,constant:[0,1,6,9,10],constitut:8,construct:[2,4,7,8,10,12,14],consult:13,contact:13,contain:[1,6,8,14],continu:1,contribut:[5,7],control:12,conveni:[1,10],convent:[6,7],convert:[6,12],cookbook:14,cool:1,coord:[1,6],coordin:[0,1,6],core:[4,8,14],correct:6,correspon:6,correspond:[1,2,6,8,9,10],cos:[1,9,10],could:[0,3,6],cours:1,cover:6,cprofil:4,cprofilev:4,crawl:8,creat:[1,2,3,4,6,8,10,13],creation:4,cross:2,cup:1,current:[0,4,5,8,10,13],cython:7,d_dt:8,das:6,data:[0,1,5,7,8,9,10,13,14],data_across:6,data_arrai:6,dataarrai:[1,6],dataarray_:[],dataarrays_:[],datafram:[1,6,8],date:4,ddir:6,ddt:[],deal:[2,6],dealt:2,debug:4,declar:6,decor:8,def:0,defin:[0,1],definit:[],degre:1,delai:[1,7,8,9,10],delay1:[1,9,10],delay3:[1,9,10],delay_input:[],delay_tim:[],delft:3,delvelop:3,demand:2,demonstr:[7,13],denomin:[],denot:6,depend:[2,4,6,13],deploi:10,depth:2,deriv:8,describ:[],descript:1,design:[2,5,8],desir:6,determin:3,develop:[2,3,6,10,13,14],devid:[],diagram:7,dict:6,dict_find:[],dictionari:[1,6,8],didn:0,differ:[1,6],differenti:[6,8],digit:6,dim1:[1,6],dim2:[1,6],dim3:6,dim:[1,6],dim_nam:[],dimens:[0,1,6],dir:6,direct:[1,4,6,8,9,10],directli:0,directori:[4,10,14],disciplin:4,discontinu:8,discov:8,discret:4,discuss:0,displai:[3,4,7],distribut:10,divid:[],divis:[],doc8:2,doc:[1,6],docs_df:[],docstr:[7,8],doctest:7,document:[1,2,6,7,8,11,13],doe:[],doesn:4,dollar:10,don:6,doubl:6,down:[],download:[4,14],downsid:8,draft:3,drew:0,drop:6,dtest_stock_dt:[],durat:[],dynam:[1,3,4,5,7,8,13,14],each:[2,4,6,8],earli:4,eas:4,easi:4,easili:1,edir:6,edit:4,effici:2,effort:[2,7],eigenvector:2,either:[1,4,6],element:[1,6,7,12],element_list:[],element_typ:6,elements_subs_dict:[],els:[1,3,6,9,10],ema:[2,3],emerg:2,emphas:4,empti:[],enabl:[2,7,8],enclav:2,end:[2,3,6],endem:4,endpoint:[],engin:[2,3],enough:4,ensur:[0,4,6,8],entir:[4,8],entri:6,enumer:6,environ:[0,2,7,10,14],eqn:[],equal:[],equat:[0,1,8],equation_str:[],equip:8,equival:[1,6,8,10],erik:3,error:[6,10,12],escap:[],essenti:8,establish:[2,7,8,14],etc:[4,6,7,8],euler:[],evalu:[],event:4,eventu:[],everi:1,everyth:4,exampl:[0,1,2,4,6,10,12],excel:[3,6],except:6,execut:[4,8,10,12,13],exexut:7,exist:[0,3,6,7],exogen:7,exogenous_const:[],exogenous_vari:[],exp:[1,9,10],expand:6,expect:[1,8],explain:[0,1],explor:[3,4],exploratori:[2,3],exponenti:[1,9,10],expr:[],express:[6,8],exprnd:[1,9,10],extconst:[1,6,9,10],extdata:[1,6,9,10],extend:[2,7],extent:2,extern:[1,4,7,8,9,10,12],extlookup:[1,6,9,10],extract:[],extrapol:[],extsubscript:[1,6,9,10],facilit:[3,8],fail:14,fals:6,famili:6,far:[1,2],fast:4,faster:1,fdir:6,featur:[4,5,13],feedback:[2,4],few:[1,2,3],field:2,file:[0,1,2,4,8,10,12,13],file_nam:6,file_str:[],filenam:12,filepath:[],fill:6,find:[1,4,13],find_subscript_nam:6,finish:[],firefight:4,first:[1,2,6],firstcel:6,fit:[0,2,4],flag:6,flow:[0,8],flowa:[],flowrat:0,focuss:4,follow:[4,6,8,10],for_1:6,forc:6,fork:[4,13],form:[0,1,2,13],format:[0,6,7,8,12,14],formula:[],fortran:8,forward:1,found:4,frame:6,freez:1,from:[0,1,2,6,8,12,13],front:[2,3],full:[1,6,8,10],fulli:2,func:6,func_arg:[],func_str:[],function_def:[],further:2,futur:[6,8,10],gain:2,gawad:2,gener:[1,4,5,6],geograph:14,geopanda:14,get:[4,6,7,8,9,10,13,14],get_coord:[0,1],get_equation_compon:[],get_external_data:[],get_file_sect:[],get_model_el:[],get_pysd_compiler_vers:[],get_return_el:6,get_test:4,get_value_by_insensitive_key_or_valu:6,git:14,github:[4,6,7,13,14],give:[1,4],given:[1,6],global:4,gmail:13,goe:0,going:6,good:4,grace:10,grammar:8,graphic:2,great:2,group:[],growth:2,h40t_tr21ck:6,had:0,handi:[6,10],handl:[6,7,8,10],happen:0,happi:4,has:[1,2,8,10,12],have:[1,2,3,6],haven:4,heat:0,heat_loss_to_room:0,height:[],hello:1,help:[1,2,4,13,14],helper:[],here:[0,1,6],hex:6,hexidecim:6,high:5,highli:8,histori:[],hoewev:14,hold:[],horizon:6,host:2,houghton:13,how:[0,1,2,4,6,8],howev:[0,2],ht_trck:6,htm:[],html:6,http:[6,11,13,14],idea:5,ident:[],identif:6,identifi:[4,6,8,10],if_then_els:[1,9,10],ignor:[2,6,12],implement:[3,4,6,7],impli:6,implicit:[],impos:2,improv:[4,7,8,13],in_dict:[],includ:[1,3,4,6,10,13],inclus:2,incomplet:[],incorpor:2,increas:2,indentifi:6,independ:[2,10],index:[0,1,13,14],indic:1,individu:[4,8],inf:[],infer:2,infinit:8,influenc:4,info:4,inform:[4,6,13],inher:8,init:[],init_test_stock:[],init_v:[],initi:[6,8,9,10,13],initial_condit:1,initial_input:[],initial_trend:[],initial_valu:[],initialization_ord:[],input:[0,6,7],insid:6,insight:2,instal:[4,13],instanc:[0,1],instanti:[],instead:[0,6,8],intact:4,integ:[1,9,10],integr:[1,3,4,5,7,8,13],intellig:7,intention:8,interact:[2,8],interest:[2,4,6,13],interfac:[2,7],intermedi:[],intern:[0,8],interp:[0,6],interpol:[0,1,6,12],interpret:8,interv:[],intg_kwarg:0,investig:1,involv:7,ipython:[3,13],irregular:1,iseesystem:11,isn:[],issu:[4,6,7,13],iter:[],ithink11:2,its:[0,1,4,6,8],itself:[2,8],jame:13,jamesphoughton:[13,14],jan:3,javascript:3,jcmgrai:6,joint:2,json:4,junk:[],just:[1,6],kei:[1,6],key1:[],key2:[],keyword:[0,1,6],kind:[],know:[0,1,4],knowledg:[],kwakkel:3,lambda:[],languag:[2,3,4,6],larg:2,larger:7,largest:2,last:[0,1,2,6,14],lastcel:6,lastli:8,late:6,latest:14,launch:4,lead:[4,6],learn:[0,2,7,13,14],least:14,left:6,lefttop:6,len:6,length:6,let:4,letter:6,level:[4,6,8],lexical_analysi:6,librari:[3,4,6,7,8,13,14],like:[0,2,6,8],likewis:2,limit:[2,4,7,8,10],linear:[],linearli:[0,1],linspac:[],lint:[4,7],lis:[],list:[1,4,6,7,8,13],littl:4,load:[1,12,14],loc:6,local:[4,13],locat:11,log:[1,8,9,10],logarithm:[],lognorm:[1,9,10],longer:4,look:6,lookup:[1,6,9,10],lookup_dim:[],lookup_discret:[],lookup_extrapol:[],lost:0,lot:[0,6],low:[5,8],lower:[],lowest:6,lsoda:8,machin:[2,7,13,14],machineri:8,macro:[],macro_list:[],macro_nam:[],made:[0,4],magnitud:[],mai:[1,2,6,10],main:[4,6],maintain:[4,8],major:[],make:[1,2,4,6,7,8],make_add_identifi:6,make_coord_dict:6,make_flat_df:6,make_python_identifi:6,manag:[],mani:[1,2,8],manipul:[7,14],manual:4,map:6,markov:[2,8,14],massiv:[2,10],match:1,matplotlib:14,matrix:1,matur:2,max:[1,9,10],maximum:8,mdl:[1,8,10,12],mdl_file:12,mean:[1,6,8],measur:[1,8],medium:5,meet:[2,4],member:6,memoiz:7,memori:8,mere:1,merg:6,merge_partial_el:[],messag:[6,12],method:[0,1,2,3,6,7,8,10,13],methodolog:2,might:[1,4],min:[1,9,10],minimum:[],minut:1,miss:[6,12],missing_valu:12,mod:[1,9,10],mode:3,model:[3,4,5,7,10,12,13,14],model_str:[],modif:7,modifi:[0,1,8,10,13],modul:[1,4,5,13,14],modulo:[1,9,10],mont:[2,7,14],month:3,more:[1,2,4,7,10,13],most:[3,6,8],mostli:[],motiv:[0,5],move:[4,8],much:[2,8],multidimension:[],multipl:6,multiple_spac:6,multiple_word:6,must:[0,1,6,8],mutabl:6,mutat:6,name:[0,1,6,8],nameerror:6,namespac:6,nativ:[2,8],natur:2,ndarrai:6,neat:3,necessari:6,need:[0,1,2,4,8],network:14,networkx:14,new_el:[],new_func:[],new_heatflow_funct:0,new_structur:[],new_valu:1,newlin:[],next:3,non:[6,7],none:[1,6],normal:[1,9,10],note:[],notebook:13,noth:[],now:6,num:[],numba:7,number:[4,6],numer:2,numpi:[1,6,9,10,14],obei:8,object:[6,8,12,13],observ:13,odeint:[0,8],odepack14:8,off:7,often:2,old:6,omit:4,onc:[0,1],one:[0,2,6,8],oner:4,ones:6,ongo:10,oni:6,onli:[1,6,8],openpyxl:[6,14],oper:4,oppos:[],optim:8,option:[1,6,8,12,13],order:[6,8],ordinari:8,org:[6,13],origin:[0,1,2,8,10,14],other:[0,1,4,5,6,8,10,14],otherwis:[],our:[0,1],ourselv:0,out:[],outdict:6,outfile_nam:[],outflow:[],outlin:6,output:[0,6,7,8,13],outright:6,outsourc:7,over:[0,1,7],overwrit:1,own:4,packag:[0,1,3,4,7,9,10,13,14],pair:[],panda:[1,6,8,14],paradigm:2,parallel:[7,10],param:[1,6],paramet:[0,3,6,7,8,12,13],pars:[0,8,10,14],parse_general_express:[],parse_lookup_express:[],parse_unit:[],parser:[7,8],parsimoni:14,parsimonious13:8,part:0,parti:[8,14],partial:1,particular:[6,13],pass:[0,1,6,8],past:[],path:[4,12],pathwai:[4,5,13],pdf:11,peopl:4,perfect:4,perform:[2,7,10,14],perman:1,philosophi:5,pick:1,piec:8,pip:13,pipe:[],pipelin:[],place:[0,6],plan:5,plot:[1,4],plt:1,point:[2,8],poisson:[1,9,10],posit:[1,4,6],possibl:4,possible_ext:6,potenti:[],power:[0,2,3],practic:[2,4],practition:4,predict:0,prefix:6,present:[],prevent:8,previou:[0,1],previous:6,primari:[8,12],print:[1,6],prior:[],prioriti:5,probabl:[],problem:2,process:0,prod:[1,9,10],product:[2,10],profile_pysd:4,program:[2,6],programmat:[7,8],progress:[],project:[4,5,13,14],prone:[],proper:4,properli:[6,8],properti:[6,8],provid:[2,3,6,8,10,13],prticular:6,pruyt:3,pull:[4,13],puls:[1,8,9,10],pulse_magnitud:[],pulse_train:[1,9,10],purpos:13,put:6,py_backend:6,py_expr:[],py_model_fil:12,py_nam:6,pydata:6,pylint:4,pymc:14,pysaf:[],pysd:[0,1,2,3,5,10,12,14],python:[0,1,2,3,7,8,9,10,12,13,14],quantiti:6,queri:[8,13],question:[2,4],quickli:4,quot:[],rage:[],rais:[6,12],ramp:[1,9,10],rand:[1,9,10],random:[1,9,10],random_uniform:[],rang:[1,6,7],rate:0,rather:[],raw:12,read:[2,4,8,10,14],read_opyxl:6,read_vensim:[1,12],read_xmil:[1,12],readi:[12,13],readthedoc:13,real:[],real_nam:[],realli:[1,3],rearang:6,rearrang:6,reason:2,recent:6,recip:[13,14],recogn:0,recommend:1,record:7,redefinit:6,refactor:7,refer:[1,6,11,13],referenc:[],regress:0,rel:12,releas:10,relev:2,reload:[],remain:[1,4],rememb:[],remov:6,render:3,repeat:1,repeat_tim:[],replac:[1,2,6,8,13],repositori:4,repres:[0,6,8],represent:6,request:[1,4,6,13],requir:[8,13],reserv:6,reserved_word:6,reset:6,reset_st:[],reshap:6,reshape_len:6,resist:4,resolv:6,resourc:2,respect:6,respond:2,respons:[],rest:[],result:[1,4,6,8,10],retriev:6,return_address:6,return_column:[1,6],return_func:[],return_timestamp:1,revolut:2,rework:8,rich:2,ripe:4,robert:14,robust:4,room:[0,1],room_temp:0,room_temperatur:0,root:6,root_path:[],round:6,round_:6,routin:8,row:6,run:[0,2,4,6,7,8,10,12,13],run_profil:4,runner:4,runtim:8,rush:4,safe:[1,6,8],same:[0,1,6,8,10,14],sampl:[1,12,13],save:6,savep:[],saw:0,scalar:1,scale:2,scene:[0,6],scienc:[2,7],scientist:2,scikit:[0,14],scipi:[0,8,14],scope:[],scratch:[],sdlab:3,sdm:2,sdxchang:7,second:2,secondli:6,section:[0,1,6],see:[1,7,13],seed:[],seek:2,seen:8,select:6,self:[1,6,9,10],separ:[],seri:[0,1,6],series_across:6,series_row_or_col:6,serv:[],set:[4,6,8,13,14],set_compon:1,set_initial_condit:[],set_stat:[],setup:14,sever:[1,6,8],shape:6,share:4,sheet:6,sheet_nam:6,should:[1,2,3,4,6,8,14],show:[4,6,12],sign:10,signific:8,similar:[0,6,8,14],simpl:[1,6,13],simplest:1,simpli:1,simplifi:8,simul:[2,4,7,8,10,13],sin:[1,9,10],singl:[0,8],situat:1,size:[6,8],skip:[],sklearn:0,slope:[],smaller:6,smile:11,smilev4:11,smooth3:[1,9,10],smooth3i:[1,9,10],smooth:[1,9,10],smooth_input:[],smooth_tim:[],social:2,softwar:[2,3,4],solver:8,some:[4,10],someth:0,sourc:[6,8,12,13],source_grammar:[],space:[2,3,6,8],special:[2,8],specif:[3,4,6,8],specifi:[1,8],speed:[7,8],speed_test:4,speedtest_result:4,spend:1,split:6,sqrt:[1,9,10],stack:[8,14],standalon:3,standard:[2,3,4,8,14],start:[4,6,8,13],state:[0,6,8],state_vector:8,stateful:8,statist:[2,7],std:[],stella:2,step:[1,2,6,8,9,10],stick:4,still:[],stock:[1,7,8],store:[7,8],str:6,string:[6,7,12],strong:4,structur:[0,2,3,5,7,13],sub1:6,sub2:6,sub:6,subclass:1,subcoord:6,subdef:[],sublist:[],submiss:4,submit:[4,13],submodel:[],subscript:[0,1,6,7,9,10],subscript_3d_arrai:[],subscript_dict:6,subset:10,substitut:[0,2],suit:13,sum:[1,9,10],summari:2,suplementari:10,suposs:1,suppli:[1,8,13],support:[0,2,8,10,11],suppos:0,sure:4,svm:0,svr:0,symbol:8,synopsi:1,syntact:8,syntax:[8,14],system:[0,1,3,4,5,8,13,14],tab:[],tabl:6,tag:10,take:[0,1,2,4,6,7,8],taken:2,tan:[1,9,10],task:13,tea:1,tea_temp:0,teacup:[0,1,10,12],teacup_temperatur:[0,1],technic:[],techniqu:2,tell:6,temp:1,temperatur:[0,1],term:4,ters:6,tes:4,test:[1,2,3,7,12],test_ab:[],test_limit:[],test_pysd:4,test_stock:[],test_subscript_3d_arrai:[],text:6,than:[1,2,4,6],thank:6,thar:6,theano:7,thei:[1,2,4,6,8,14],them:[1,3,7,8,14],themselv:[],therefor:8,thi:[0,1,2,3,4,6,8,10,13],thing:6,think:4,third:[2,8,14],thirti:1,those:[0,2,3,8,13],three:[1,8],through:[0,2,8],throughout:[],thu:6,tie:0,tightli:[2,3],tild:[],time:[0,1,6,7,8],time_initi:[],time_row_or_col:6,time_step:[],timeit:4,timeseri:7,timeseries_input:[],timestamp:[1,8],timestep:8,todo:[],togeth:2,tool9:2,tool:[2,5,6,7],toolbox:2,toolset:7,top:6,toward:2,trace:7,traceback:6,track:7,tracker:[7,13],tractabl:2,tradit:2,tradition:2,trail:6,train:[1,9,10],transform:6,translat:[0,1,5,6,7,9,13,14],translate_sect:[],translate_vensim:[],tree:8,trend:[],trend_initi:[],trend_input:[],tri:[],tricki:[],tstep:[],tupl:[1,6],turn:7,two:[2,6],type:[2,6,12],ultim:2,under:1,underscor:[6,8],understand:[2,4],uniform:[1,9,10],uniqu:[2,3,6],unit:[1,7,8],units_str:[],unstructur:2,unsupport:8,until:[],unverifi:8,unwieldi:2,updat:[4,6,8],upon:[2,8],urg:4,usabl:2,usag:13,use:[0,1,2,4,8,14],used:[1,2,4,8],useful:[1,14],user:[0,1,6,8,13],user_argu:[],uses:[2,4,8],using:[0,1,2,4,6,7,8,13,14],util:[6,8,14],vaild:6,val_if_fals:[],val_if_tru:[],valid:6,valu:[0,6,7,8,12,13],valuabl:3,value_if_denom_is_zero:[],valueerror:6,var_nam:[],vari:0,variabl:[0,1,6,7,8,10],variable_1:6,variable_2:6,variable__nam:1,variable_nam:0,variant:[2,7],varieti:[2,3,8,13],variou:[2,13],varnam:6,vector:[0,1,6,8],vendor:4,vensim10:2,vensim2pi:[],vensim:[1,2,6,7,8,9,12,13],veri:3,version:[4,6,14],via:13,view:[1,4],visit:6,visit_address:6,visual:2,vmax:[1,9,10],vmin:[1,9,10],volum:2,wai:[1,2,6,7,8],want:[0,1,2,6],ward:14,warn:[6,12],webpag:14,well:[2,8],were:[1,6],what:[1,6,12],when:[0,1,2,4,6,7,13],whenev:4,where:[1,4,6,8],which:[1,2,4,6,8,10,12],white:6,whitespac:6,who:[2,4],whose:[1,6],wide:[],widget:3,wind:[],wise:[],wish:0,wit:2,within:[1,6,7,8],without:[1,2,6,12],word:6,work:[2,3,4,6],workbench6:2,workbench:3,workflow:13,world:1,would:[6,8],wrap:8,wrapper:0,write:[0,7],www:11,x_row_or_col:6,x_train:0,xarrai:[1,6],xidz:[1,9,10],xlabel:1,xmile:[3,4,7,8,10,12,13,14],xmile_fil:12,xmilev4:11,xml:8,xnx:[],xrmerg:6,y_train:0,year:2,yet:2,yield:[],ylabel:1,you:[0,1,4,6,13,14],your:[4,13],zero:1,zidz:[1,9,10]},titles:["Advanced Usage","Basic Usage","About the Project","Complementary Projects","Contributing to PySD","Developer Documentation","Internal Functions","PySD Development Pathway","Structure of the PySD module","&lt;no title&gt;","Vensim Translation","XMILE Translation","User Functions Reference","PySD","Installation"],titleterms:{"class":8,"function":[1,6,10,12],"import":1,Not:7,The:[2,8],Used:10,about:2,addit:[0,13,14],advanc:0,age:2,analyt:2,approach:2,argument:0,basic:1,big:2,build:6,come:2,complementari:3,complex:0,compon:0,condit:1,content:13,contribut:[4,13],cookbook:13,current:[1,7],data:[2,6],decor:6,depend:14,design:4,develop:[4,5,7],document:5,dynam:2,execut:6,extern:6,featur:7,file:6,from:14,gener:2,get:1,high:7,idea:7,indic:13,inform:1,initi:1,instal:14,integr:[0,2],intern:6,linter:4,low:7,medium:7,model:[0,1,2,6,8],modul:8,more:0,motiv:2,need:6,object:0,option:14,other:7,output:1,paramet:1,pathwai:7,philosophi:4,pip:14,plan:7,prioriti:7,profil:4,project:[2,3,7],pysd:[4,7,8,13],python:[4,6],queri:1,read:6,refer:12,replac:0,requir:14,resourc:[13,14],run:1,set:1,simul:1,sourc:14,special:6,speed:4,start:1,structur:8,suit:4,suppli:0,support:[1,13],system:2,tabl:13,test:4,tool:4,translat:[8,10,11],usag:[0,1],used:6,user:12,valu:1,variou:1,vensim:10,via:14,xmile:11}})
\ No newline at end of file
diff --git a/docs/basic_usage.rst b/docs/basic_usage.rst
index 89af18fb..514b3981 100644
--- a/docs/basic_usage.rst
+++ b/docs/basic_usage.rst
@@ -18,6 +18,19 @@ To view a synopsis of the model equations and documentation, call the :py:func:`
 
    >>> print model.doc()
 
+.. note::
+  You can also load an already translated model file, what will be faster as you will load a Python file::
+
+     import pysd
+     model = pysd.load('Teacup.py')
+
+.. note::
+  The functions :py:func:`read_vensim()`,  :py:func:`read_xmile()` and :py:func:`load()` have optional arguments for advanced usage, you can check the full description in :doc:`User Functions Reference <../functions>` or using :py:func:`help()` e.g.::
+
+     import pysd
+     help(pysd.load)
+
+
 Running the Model
 -----------------
 The simplest way to simulate the model is to use the :py:func:`.run()` command with no options. This runs the model with the default parameters supplied by the model file, and returns a Pandas dataframe of the values of the stocks at every timestamp::
@@ -142,4 +155,4 @@ Supported functions
 
 Vensim functions include:
 
-.. include:: development/supported_vensim_functions.rst
\ No newline at end of file
+.. include:: development/supported_vensim_functions.rst
diff --git a/docs/functions.rst b/docs/functions.rst
index e1c0b1a5..1a844796 100644
--- a/docs/functions.rst
+++ b/docs/functions.rst
@@ -6,4 +6,7 @@ These are the primary functions that control model import and execution.
 
 .. autofunction:: pysd.read_vensim
 
-.. autofunction:: pysd.load
\ No newline at end of file
+.. autofunction:: pysd.read_xmile
+
+.. autofunction:: pysd.load
+
diff --git a/pysd/_version.py b/pysd/_version.py
index f24c16cc..aebf1b89 100644
--- a/pysd/_version.py
+++ b/pysd/_version.py
@@ -1,2 +1,2 @@
-__version__ = "1.0.1"
+__version__ = "1.1.0"
 
diff --git a/pysd/py_backend/builder.py b/pysd/py_backend/builder.py
index 88544b67..ccb47850 100644
--- a/pysd/py_backend/builder.py
+++ b/pysd/py_backend/builder.py
@@ -318,7 +318,7 @@ def merge_partial_elements(element_list):
                     'unit': element['unit'],
                     'subs': [element['subs']],
                     'lims': element['lims'],
-                    'eqn': [eqn],
+                    'eqn': [eqn.replace(r'\ ', '')],
                     'kind': element['kind'],
                     'arguments': element['arguments']
                 }
@@ -329,8 +329,7 @@ def merge_partial_elements(element_list):
                 outs[name]['doc'] = outs[name]['doc'] or element['doc']
                 outs[name]['unit'] = outs[name]['unit'] or element['unit']
                 outs[name]['lims'] = outs[name]['lims'] or element['lims']
-                outs[name]['eqn'] = outs[name]['eqn'] or element['eqn']
-                outs[name]['eqn'] += [eqn]
+                outs[name]['eqn'] += [eqn.replace(r'\ ', '')]
                 outs[name]['py_expr'] += [element['py_expr']]
                 outs[name]['subs'] += [element['subs']]
                 outs[name]['arguments'] = element['arguments']
diff --git a/pysd/py_backend/decorators.py b/pysd/py_backend/decorators.py
index 937ad084..5a0df123 100644
--- a/pysd/py_backend/decorators.py
+++ b/pysd/py_backend/decorators.py
@@ -29,9 +29,11 @@ def wrapper(*args):
                 # The coordinates are expanded or transposed
                 return xr.DataArray(0, coords, dims) + data
 
-            else:
+            elif data is not None:
                 return xr.DataArray(data, coords, dims)
 
+            return data
+
         return wrapper
     return decorator
 
diff --git a/pysd/py_backend/external.py b/pysd/py_backend/external.py
index 9dd826a6..20dff663 100644
--- a/pysd/py_backend/external.py
+++ b/pysd/py_backend/external.py
@@ -21,15 +21,19 @@ class Excels():
     _Excels, _Excels_opyxl = {}, {}
 
     @classmethod
-    def read(cls, file_name):
+    def read(cls, file_name, sheet_name):
         """
         Read the Excel file or return the previously read one
         """
-        if file_name in cls._Excels:
-            return cls._Excels[file_name]
+        if file_name + sheet_name in cls._Excels:
+            return cls._Excels[file_name + sheet_name]
         else:
-            excel = pd.ExcelFile(file_name)
-            cls._Excels[file_name] = excel
+            excel = np.array([
+                pd.to_numeric(ex, errors='coerce')
+                for ex in
+                pd.read_excel(file_name, sheet_name, header=None).values
+                ])
+            cls._Excels[file_name + sheet_name] = excel
             return excel
 
     @classmethod
@@ -55,10 +59,28 @@ def clean(cls):
 class External(object):
     """
     Main class of external objects
+
+    Attributes
+    ----------
+    py_name: str
+        The python name of the object
+    missing: str ("warning", "error", "ignore")
+        What to do with missing values. If "warning" (default)
+        shows a warning message and interpolates the values.
+        If "raise" raises an error. If "ignore" interpolates
+        the values without showing anything.
+    file: str
+        File name from which the data is read.
+    sheet: str
+        Sheet name from which the data is read.
     """
 
+    missing = "warning"
+
     def __init__(self, py_name):
         self.py_name = py_name
+        self.file = None
+        self.sheet = None
 
     def __str__(self):
         return self.py_name
@@ -69,16 +91,10 @@ def _get_data_from_file(self, rows, cols):
 
         Parameters
         ----------
-        rows: int, list or array
-            if int, then will start reading the table for the given row number
-            if list, then will read between first and second row of the lis
-            if array, then will read the given row numbers
-        cols:  None, str, int, list or array
-            if None, then will continue reading until no more data is
-              available in the new column
-            if str, then will read only the given column by its name
-            if list, then will read between the given columns
-            if array, then will read the given columns names/numbers
+        rows: list of len 2
+            first row and last row+1 to be read, starting from 0
+        cols:  list of len 2
+            first col and last col+1 to be read, starting from 0
 
         Returns
         -------
@@ -88,49 +104,17 @@ def _get_data_from_file(self, rows, cols):
         # TODO move to openpyxl to avoid pandas dependency in this file.
         ext = os.path.splitext(self.file)[1].lower()
         if ext in ['.xls', '.xlsx']:
-            # rows is an int of the first value
-            if isinstance(rows, int):
-                skip = rows
-                nrows = None
-            # rows my be a list of first and last value or a numpy.ndarray
-            # of valid values
-            else:
-                skip = rows[0] - 1
-                nrows = rows[-1] - skip if rows[-1] is not None else None
-            # cols is a list of first and last value
-            if isinstance(cols, list):
-                cols = [self._num_to_col(c) if isinstance(c, int)
-                        else c for c in cols]
-                usecols = cols[0] + ":" + cols[1]
-            # cols is a int/col_name or a np.ndarray of valid values
-            else:
-                usecols = cols
-
             # read data
-            excel = Excels.read(self.file)
-
-            data = excel.parse(sheet_name=self.tab, header=None, skiprows=skip,
-                               nrows=nrows, usecols=usecols)
-
-            # avoid the rows not passed in rows numpy.ndarray
-            if isinstance(rows, np.ndarray):
-                data = data.iloc[(rows - rows[0])]
+            data = Excels.read(
+                self.file,
+                self.sheet)[rows[0]:rows[1], cols[0]:cols[1]].copy()
 
+            shape = data.shape
             # if it is a single row remove its dimension
-            if isinstance(rows, int) or\
-               (isinstance(rows, list) and rows[0] == rows[1]):
-                data = data.iloc[0]
-
-            # if it is a single col remove its dimension
-            if isinstance(cols, str) or\
-               (isinstance(cols, list) and cols[0].lower() == cols[1].lower()):
-                if len(data.shape) == 2:
-                    # if there are multile rows
-                    data = data.iloc[:, 0]
-                else:
-                    # if there are no rows
-                    data = data.iloc[0]
-
+            if shape[1] == 1:
+                data = data[:, 0]
+            if shape[0] == 1:
+                data = data[0]
             return data
 
         raise NotImplementedError(self.py_name + "\n"
@@ -156,7 +140,7 @@ def _get_data_from_file_opyxl(self, cellname):
         try:
             # Get the local id of the sheet
             # needed for searching in locals names
-            sheetId = excel.sheetnames.index(self.tab)
+            sheetId = excel.sheetnames.index(self.sheet)
         except ValueError:
             # Error if it is not able to get the localSheetId
             raise ValueError(self.py_name + "\n"
@@ -169,7 +153,7 @@ def _get_data_from_file_opyxl(self, cellname):
                         or excel.defined_names.get(cellname)
             coordinates = cellrange.destinations
             for sheet, cells in coordinates:
-                if sheet == self.tab:
+                if sheet == self.sheet:
                     values = excel[sheet][cells]
                     try:
                         return np.array([[i.value for i in j] for j in values],
@@ -179,11 +163,12 @@ def _get_data_from_file_opyxl(self, cellname):
             raise AttributeError
 
         except (KeyError, AttributeError):
-            # key error if the cellrange doesn't exist in the file or tab
-            raise AttributeError(self.py_name + "\n"
-                + "The cell range name:\t {}\n".format(cellname)
-                + "Doesn't exist in:\n"
-                + self._file_sheet)
+            # key error if the cellrange doesn't exist in the file or sheet
+            raise AttributeError(
+              self.py_name + "\n"
+              + "The cell range name:\t {}\n".format(cellname)
+              + "Doesn't exist in:\n" + self._file_sheet
+              )
 
     def _get_series_data(self, series_across, series_row_or_col, cell, size):
         """
@@ -217,100 +202,102 @@ def _get_series_data(self, series_across, series_row_or_col, cell, size):
             # Horizontal data (dimension values in a row)
 
             # get the dimension values
-            series = self._get_data_from_file(rows=int(series_row_or_col)-1,
-                                              cols=None)
-
-            first_data_row, first_col = self._split_excel_cell(cell)
-
-            first_col = first_col.upper()
-            first_col_float = self._col_to_num(first_col)
-
-            # get a vector of the series index
-            original_index = np.array(series.index)[first_col_float:]
-            series = series[first_col_float:]
+            first_row, first_col = self._split_excel_cell(cell)
+            series = self._get_data_from_file(
+                rows=[int(series_row_or_col)-1, int(series_row_or_col)],
+                cols=[first_col, None])
 
             # remove nan or missing values from dimension
-            series = pd.to_numeric(series, errors='coerce')
             valid_values = ~np.isnan(series)
-            original_index = original_index[valid_values]
+            index_valid = np.arange(len(series))[valid_values]
             series = series[valid_values]
 
             # check if the series has no len 0
             if len(series) == 0:
-                raise ValueError(self.py_name + "\n"
-                    + "Dimension given in:\n"
-                    + self._file_sheet
-                    + "\tRow number:\t{}\n".format(series_row_or_col)
-                    + " has length 0")
-
-            last_col = self._num_to_col(original_index[-1])
-            last_data_row = first_data_row + size - 1
-
-            # Warning if there is missing value in the dimension
-            if (np.diff(original_index) != 1).any():
-                missing_index = np.arange(original_index[0],
-                                          original_index[-1] + 1)
-                missing_index = np.setdiff1d(missing_index, original_index)
-                cols = self._num_to_col(missing_index)
-                cells = [col + series_row_or_col for col in cols]
-                warnings.warn(self.py_name + "\n"
-                    + "Dimension value missing or non-valid in:\n"
-                    + self._file_sheet
-                    + "\tCell(s):\t{}\n".format(cells)
-                    + " the corresponding column(s) to the "
-                    + "missing/non-valid value(s) will be ignored\n\n")
+                raise ValueError(
+                  self.py_name + "\n"
+                  + "Dimension given in:\n"
+                  + self._file_sheet
+                  + "\tRow number:\t{}\n".format(series_row_or_col)
+                  + " has length 0"
+                  )
+
+            # warning/error if missing data in the series
+            if (np.diff(index_valid) != 1).any() or index_valid[0] != 0:
+                if self.missing == "warning":
+                    warnings.warn(
+                      self.py_name + "\n"
+                      + "Dimension value missing or non-valid in:\n"
+                      + self._file_sheet
+                      + "\tColumn:\t{}\n".format(series_row_or_col)
+                      + " the corresponding column(s) to the "
+                      + "missing/non-valid value(s) will be ignored\n\n"
+                      )
+                elif self.missing == "raise":
+                    raise ValueError(
+                      self.py_name + "\n"
+                      + "Dimension value missing or non-valid in:\n"
+                      + self._file_sheet
+                      + "\tColumn:\t{}\n".format(series_row_or_col)
+                      )
+
+            last_row = first_row + size
 
             # read data
             data = self._get_data_from_file(
-                rows=[first_data_row, last_data_row],
-                cols=original_index)
-            data = data.transpose()
+                rows=[first_row, last_row],
+                cols=[first_col, None]).transpose()[valid_values]
 
         elif series_across == "column":
             # Vertical data (dimension values in a column)
 
             # get the dimension values
             first_row, first_col = self._split_excel_cell(cell)
-            series = self._get_data_from_file(rows=[first_row, None],
-                                              cols=series_row_or_col)
-
-            # get a vector of the series index
-            original_index = np.array(series.index)
-            series = pd.to_numeric(series, errors='coerce')
+            series_col = self._col_to_num(series_row_or_col)
+            series = self._get_data_from_file(
+                rows=[first_row, None],
+                cols=[series_col, series_col+1])
 
             # remove nan or missing values from dimension
             valid_values = ~np.isnan(series)
-            original_index = original_index[valid_values]
+            index_valid = np.arange(len(series))[valid_values]
             series = series[valid_values]
 
             # check if the series has no len 0
             if len(series) == 0:
-                raise ValueError(self.py_name + "\n"
+                raise ValueError(
+                  self.py_name + "\n"
                   + "Dimension given in:\n"
                   + self._file_sheet
                   + "\tColumn:\t{}\n".format(series_row_or_col)
-                  + " has length 0")
-
-            last_col = self._num_to_col(self._col_to_num(first_col) + size - 1)
-
-            # Warning if there is missing value in the dimension
-            if (np.diff(original_index) != 1).any():
-                missing_index = np.arange(original_index[0],
-                                          original_index[-1] + 1)
-                missing_index = np.setdiff1d(missing_index, original_index)\
-                                + first_row
-                cells = [series_row_or_col + str(row) for row in missing_index]
-                warnings.warn(self.py_name + "\n"
-                  + "Dimension value missing or non-valid in:\n"
-                  + self._file_sheet
-                  + "\tCell(s):\t{}\n".format(cells)
-                  + " the corresponding column(s) to the "
-                  + "missing/non-valid value(s) will be ignored\n\n")
+                  + " has length 0"
+                  )
+
+            # warning/error if missing data in the series
+            if (np.diff(index_valid) != 1).any() or index_valid[0] != 0:
+                if self.missing == "warning":
+                    warnings.warn(
+                      self.py_name + "\n"
+                      + "Dimension value missing or non-valid in:\n"
+                      + self._file_sheet
+                      + "\tRow:\t{}\n".format(series_row_or_col)
+                      + " the corresponding column(s) to the "
+                      + "missing/non-valid value(s) will be ignored\n\n"
+                      )
+                elif self.missing == "raise":
+                    raise ValueError(
+                      self.py_name + "\n"
+                      + "Dimension value missing or non-valid in:\n"
+                      + self._file_sheet
+                      + "\tRow:\t{}\n".format(series_row_or_col)
+                      )
+
+            last_col = first_col + size
 
             # read data
             data = self._get_data_from_file(
-                rows=first_row+original_index,
-                cols=[first_col, last_col])
+                rows=[first_row, None],
+                cols=[first_col, last_col])[valid_values]
 
         else:
             # get series data
@@ -332,33 +319,48 @@ def _get_series_data(self, series_across, series_row_or_col, cell, size):
 
             else:
                 # Error if the lookup/time dimension is 2D
-                raise ValueError(self.py_name + "\n"
+                raise ValueError(
+                  self.py_name + "\n"
                   + "Dimension given in:\n"
                   + self._file_sheet
                   + "\tDimentime_missingsion name:"
                   + "\t{}\n".format(series_row_or_col)
-                  + " is a table and not a vector")
+                  + " is a table and not a vector"
+                  )
             # Substract missing values in the series
             nan_index = np.isnan(series)
 
             if nan_index.all():
-                raise ValueError(self.py_name + "\n"
+                raise ValueError(
+                  self.py_name + "\n"
                   + "Dimension given in:\n"
                   + self._file_sheet
                   + "\tDimension name:"
                   + "\t{}\n".format(series_row_or_col)
-                  + " has length 0")
+                  + " has length 0"
+                  )
 
             if nan_index.any():
                 series = series[~nan_index]
-                warnings.warn(self.py_name + "\n"
-                  + "Dimension value missing or non-valid in:\n"
-                  + self._file_sheet
-                  + "\tDimension name:"
-                  + "\t{}\n".format(series_row_or_col)
-                  + " the corresponding data value(s) to the "
-                  + "missing/non-valid value(s) "
-                  + "will be ignored\n\n")
+                if self.missing == "warning":
+                    warnings.warn(
+                      self.py_name + "\n"
+                      + "Dimension value missing or non-valid in:\n"
+                      + self._file_sheet
+                      + "\tDimension name:"
+                      + "\t{}\n".format(series_row_or_col)
+                      + " the corresponding data value(s) to the "
+                      + "missing/non-valid value(s) "
+                      + "will be ignored\n\n"
+                      )
+                elif self.missing == "raise":
+                    raise ValueError(
+                      self.py_name + "\n"
+                      + "Dimension value missing or non-valid in:\n"
+                      + self._file_sheet
+                      + "\tDimension name:"
+                      + "\t{}\n".format(series_row_or_col)
+                      )
 
             # get data
             data = self._get_data_from_file_opyxl(cell)
@@ -373,11 +375,13 @@ def _get_series_data(self, series_across, series_row_or_col, cell, size):
             if data.shape[1] != size:
                 # Given coordinates length is different than
                 # the lentgh of 2nd dimension
-                raise ValueError(self.py_name + "\n"
+                raise ValueError(
+                  self.py_name + "\n"
                   + "Data given in:\n"
                   + self._file_sheet
                   + "\tData name:\t{}\n".format(cell)
-                  + " has not the same size as the given coordinates")
+                  + " has not the same size as the given coordinates"
+                  )
 
             if data.shape[1] == 1:
                 # remove second dimension of data if its shape is (N, 1)
@@ -387,14 +391,15 @@ def _get_series_data(self, series_across, series_row_or_col, cell, size):
                 # substract missing values from series and check 1st dimension
                 data = data[~nan_index]
             except IndexError:
-                raise ValueError(self.py_name + "\n"
+                raise ValueError(
+                  self.py_name + "\n"
                   + "Dimension and data given in:\n"
                   + self._file_sheet
                   + "\tDimension name:\t{}\n".format(series_row_or_col)
                   + "\tData name:\t{}\n".format(cell)
-                  + " don't have the same length in the 1st dimension")
+                  + " don't have the same length in the 1st dimension"
+                  )
 
-        # TODO manage data NA and missing values
         return series, data
 
     def _resolve_file(self, root=None, possible_ext=None):
@@ -418,21 +423,21 @@ def _resolve_file(self, root=None, possible_ext=None):
         else:
             return
 
-    def _initialize_data(self, dim_name):
+    def _initialize_data(self, element_type):
         """
         Initialize one element of DATA or LOOKUPS
 
         Parameters
         ----------
-        dim_name: str
-            Dimension name.
-            "lookup_dim" for LOOKUPS, "time" for DATA.
+        element_type: str
+            "lookup" for LOOKUPS, "data" for data.
 
         Returns
         -------
         data: xarray.DataArray
             Dataarray with the time or interpolation dimension
             as first dimension.
+
         """
         self._resolve_file(root=self.root)
         series_across = self._series_selector(self.x_row_or_col, self.cell)
@@ -454,11 +459,44 @@ def _initialize_data(self, dim_name):
                   + "\t{}:\t{}\n".format(series_across, self.x_row_or_col)
                   + " is not strictly monotonous")
 
+        # Check for missing values in data
+        if np.any(np.isnan(data)):
+            if series_across == "name":
+                cell_type = "Cellrange name"
+            else:
+                cell_type = "Reference cell"
+
+            if self.missing == "warning":
+                # Fill missing values with the chosen interpolation method
+                # what Vensim does during running for DATA
+                warnings.warn(
+                    self.py_name + "\n"
+                    + "Data value missing or non-valid in:\n"
+                    + self._file_sheet
+                    + "\t{}:\t{}\n".format(cell_type, self.cell)
+                    + " the corresponding value will be filled "
+                    + "with the interpolation method of the object.\n\n"
+                    )
+            elif self.missing == "raise":
+                raise ValueError(
+                    self.py_name + "\n"
+                    + "Data value missing or non-valid in:\n"
+                    + self._file_sheet
+                    + "\t{}:\t{}\n".format(cell_type, self.cell)
+                    )
+            # fill values
+            self._fill_missing(series, data)
+
         reshape_dims = tuple([len(series)] + utils.compute_shape(self.coords))
 
         if len(reshape_dims) > 1:
             data = self._reshape(data, reshape_dims)
 
+        if element_type == "lookup":
+            dim_name = "lookup_dim"
+        else:
+            dim_name = "time"
+
         data = xr.DataArray(
             data=data,
             coords={dim_name: series, **self.coords},
@@ -467,13 +505,77 @@ def _initialize_data(self, dim_name):
 
         return data
 
+    def _fill_missing(self, series, data):
+        """
+        Fills missing values in excel read data. Mutates the values in data.
+
+        Parameters
+        ----------
+        series:
+          the time series without missing values
+        data:
+          the data with missing values
+
+        Returns
+        -------
+        None
+        """
+        # if data is 2dims we need to interpolate
+        datanan = np.isnan(data)
+        if len(data.shape) == 1:
+            data[datanan] = self._interpolate_missing(
+                series[datanan],
+                series[~datanan],
+                data[~datanan])
+        else:
+            for i, nanlist in enumerate(list(datanan.transpose())):
+                data[nanlist, i] = self._interpolate_missing(
+                    series[nanlist],
+                    series[~nanlist],
+                    data[~nanlist][:, i])
+
+    def _interpolate_missing(self, x, xr, yr):
+        """
+        Interpolates a list of missing values from _fill_missing
+
+        Parameters
+        ----------
+        x:
+          list of missing values interpolate
+        xr:
+          non-missing x values
+        yr:
+          non-missing y values
+
+        Returns
+        -------
+        y:
+          Result after interpolating x with self.interp method
+
+        """
+        y = np.empty_like(x, dtype=float)
+        for i, value in enumerate(x):
+            if self.interp == "raw":
+                y[i] = np.nan
+            elif value >= xr[-1]:
+                y[i] = yr[-1]
+            elif value <= xr[0]:
+                y[i] = yr[0]
+            elif self.interp == 'look forward':
+                y[i] = yr[xr >= value][0]
+            elif self.interp == 'hold backward':
+                y[i] = yr[xr <= value][-1]
+            else:
+                y[i] = np.interp(value, xr, yr)
+        return y
+
     @property
     def _file_sheet(self):
         """
         Returns file and sheet name in a string
         """
         return "\tFile name:\t{}\n".format(self.file)\
-               + "\tSheet name:\t{}\n".format(self.tab)
+               + "\tSheet name:\t{}\n".format(self.sheet)
 
     @staticmethod
     def _col_to_num(col):
@@ -501,37 +603,10 @@ def _col_to_num(col):
             center = ord(col[1].upper()) - ord('A') + 1
             right = ord(col[2].upper()) - ord('A')
             return left * ((ord('Z')-ord('A')+1)**2)\
-                   + center * (ord('Z')-ord('A')+1)\
-                   + right
-
-    @staticmethod
-    def _num_to_col(num):
-        """
-        Transforms the column number to name. Also working with lists.
-
-        Parameters
-        ----------
-        col_v: int or list of ints
-          Column number(s)
-
-        Returns
-        -------
-        int/list
-          Column name(s)
-        """
-        def _to_ABC(x):
-            if x < 26:
-                return chr(ord('A')+x)
-            return _to_ABC(int(x / 26) - 1) + _to_ABC(int(x % 26))
-
-        try:
-            len(num)
-            return [_to_ABC(col) for col in num]
-        except TypeError:
-            return _to_ABC(num)
+                + center * (ord('Z')-ord('A')+1)\
+                + right
 
-    @staticmethod
-    def _split_excel_cell(cell):
+    def _split_excel_cell(self, cell):
         """
         Splits a cell value given in a string.
         Returns None for non-valid cell formats.
@@ -544,11 +619,12 @@ def _split_excel_cell(cell):
 
         Returns
         -------
-        row number, column name: int, str
-          If the cell input is valid.
+        row number, column number: int, int
+          If the cell input is valid. Both numbers are given in Python
+          enumeration, i.e., first row and first column are 0.
 
         """
-        split = re.findall('\d+|\D+', cell)
+        split = re.findall(r'\d+|\D+', cell)
         try:
             # check that we only have two values [column, row]
             assert len(split) == 2
@@ -558,7 +634,7 @@ def _split_excel_cell(cell):
             assert int(split[1]) != 0
             # the column name has as maximum 3 letters
             assert len(split[0]) <= 3
-            return int(split[1]), split[0]
+            return int(split[1])-1, self._col_to_num(split[0])
         except AssertionError:
             return
 
@@ -587,8 +663,7 @@ def _reshape(data, dims):
 
         return data.reshape(dims)
 
-    @classmethod
-    def _series_selector(cls, x_row_or_col, cell):
+    def _series_selector(self, x_row_or_col, cell):
         """
         Selects if a series data (DATA/LOOKUPS), should be read by columns,
         rows or cellrange name.
@@ -618,7 +693,7 @@ def _series_selector(cls, x_row_or_col, cell):
             return "row"
 
         except ValueError:
-            if cls._split_excel_cell(cell):
+            if self._split_excel_cell(cell):
                 # if the cell can be splitted means that the format is
                 # "A1" like then the series must be a column
                 return "column"
@@ -631,11 +706,11 @@ class ExtData(External):
     Class for Vensim GET XLS DATA/GET DIRECT DATA
     """
 
-    def __init__(self, file_name, tab, time_row_or_col, cell,
+    def __init__(self, file_name, sheet, time_row_or_col, cell,
                  interp, coords, root, py_name):
         super().__init__(py_name)
         self.files = [file_name]
-        self.tabs = [tab]
+        self.sheets = [sheet]
         self.time_row_or_cols = [time_row_or_col]
         self.cells = [cell]
         self.coordss = [coords]
@@ -643,25 +718,29 @@ def __init__(self, file_name, tab, time_row_or_col, cell,
         self.interp = interp
 
         # check if the interpolation method is valid
-        if self.interp and\
-           self.interp not in ["interpolate", "raw",
+        if not interp:
+            self.interp = "interpolate"
+
+        if self.interp not in ["interpolate", "raw",
                                "look forward", "hold backward"]:
             raise ValueError(self.py_name + "\n"
                              + " The interpolation method (interp) must be "
                              + "'raw', 'interpolate', "
                              + "'look forward' or 'hold backward")
 
-    def add(self, file_name, tab, time_row_or_col, cell,
+    def add(self, file_name, sheet, time_row_or_col, cell,
             interp, coords):
         """
         Add information to retrieve new dimension in an already declared object
         """
         self.files.append(file_name)
-        self.tabs.append(tab)
+        self.sheets.append(sheet)
         self.time_row_or_cols.append(time_row_or_col)
         self.cells.append(cell)
         self.coordss.append(coords)
 
+        if not interp:
+            interp = "interpolate"
         if interp != self.interp:
             raise ValueError(self.py_name + "\n"
                              + "Error matching interpolation method with "
@@ -676,39 +755,44 @@ def initialize(self):
         Initialize all elements and create the self.data xarray.DataArray
         """
         data = []
-        zipped = zip(self.files, self.tabs, self.time_row_or_cols,
+        zipped = zip(self.files, self.sheets, self.time_row_or_cols,
                      self.cells, self.coordss)
-        for (self.file, self.tab, self.x_row_or_col,
+        for (self.file, self.sheet, self.x_row_or_col,
              self.cell, self.coords) in zipped:
-            data.append(self._initialize_data("time"))
+            data.append(self._initialize_data("data"))
         self.data = utils.xrmerge(data)
 
     def __call__(self, time):
 
-        if self.interp == "raw":
-            try:
-                outdata = self.data.sel(time=time)
-            except KeyError:
-                return np.nan
+        if time in self.data['time'].values:
+            outdata = self.data.sel(time=time)
+        elif self.interp == "raw":
+            return np.nan
         elif time > self.data['time'].values[-1]:
+            warnings.warn(
+              self.py_name + "\n"
+              + "extrapolating data above the maximum value of the time")
             outdata = self.data[-1]
         elif time < self.data['time'].values[0]:
+            warnings.warn(
+              self.py_name + "\n"
+              + "extrapolating data below the minimum value of the time")
             outdata = self.data[0]
+        elif self.interp == "interpolate":
+            outdata = self.data.interp(time=time)
         elif self.interp == 'look forward':
             next_t = self.data['time'][self.data['time'] >= time][0]
             outdata = self.data.sel(time=next_t)
         elif self.interp == 'hold backward':
             last_t = self.data['time'][self.data['time'] <= time][-1]
             outdata = self.data.sel(time=last_t)
-        else:
-            outdata = self.data.interp(time=time)
 
-        # if output from the lookup is a float return as float and not xarray
-        try:
-            return float(outdata)
-        except TypeError:
+        if self.coordss[0]:
             # Remove time coord from the DataArray
             return outdata.reset_coords('time', drop=True)
+        else:
+            # if data has no-coords return a float
+            return float(outdata)
 
 
 class ExtLookup(External):
@@ -716,22 +800,23 @@ class ExtLookup(External):
     Class for Vensim GET XLS LOOKUPS/GET DIRECT LOOKUPS
     """
 
-    def __init__(self, file_name, tab, x_row_or_col, cell,
+    def __init__(self, file_name, sheet, x_row_or_col, cell,
                  coords, root, py_name):
         super().__init__(py_name)
         self.files = [file_name]
-        self.tabs = [tab]
+        self.sheets = [sheet]
         self.x_row_or_cols = [x_row_or_col]
         self.cells = [cell]
         self.root = root
         self.coordss = [coords]
+        self.interp = "interpolate"
 
-    def add(self, file_name, tab, x_row_or_col, cell, coords):
+    def add(self, file_name, sheet, x_row_or_col, cell, coords):
         """
         Add information to retrieve new dimension in an already declared object
         """
         self.files.append(file_name)
-        self.tabs.append(tab)
+        self.sheets.append(sheet)
         self.x_row_or_cols.append(x_row_or_col)
         self.cells.append(cell)
         self.coordss.append(coords)
@@ -745,11 +830,11 @@ def initialize(self):
         Initialize all elements and create the self.data xarray.DataArray
         """
         data = []
-        zipped = zip(self.files, self.tabs, self.x_row_or_cols,
+        zipped = zip(self.files, self.sheets, self.x_row_or_cols,
                      self.cells, self.coordss)
-        for (self.file, self.tab, self.x_row_or_col,
+        for (self.file, self.sheet, self.x_row_or_col,
              self.cell, self.coords) in zipped:
-            data.append(self._initialize_data("lookup_dim"))
+            data.append(self._initialize_data("lookup"))
         self.data = utils.xrmerge(data)
 
     def __call__(self, x):
@@ -760,19 +845,27 @@ def __call__(self, x):
                             + "the argument of the Lookup must be float"
                             + "or 0 dimensional array. ")
 
-        if x > self.data['lookup_dim'].values[-1]:
+        if x in self.data['lookup_dim'].values:
+            outdata = self.data.sel(lookup_dim=x)
+        elif x > self.data['lookup_dim'].values[-1]:
             outdata = self.data[-1]
+            warnings.warn(
+              self.py_name + "\n"
+              + "extrapolating data above the maximum value of the series")
         elif x < self.data['lookup_dim'].values[0]:
             outdata = self.data[0]
+            warnings.warn(
+              self.py_name + "\n"
+              + "extrapolating data below the minimum value of the series")
         else:
             outdata = self.data.interp(lookup_dim=x)
 
-        # if output from the lookup is a float return as float and not xarray
-        try:
-            return float(outdata)
-        except TypeError:
+        if self.coordss[0]:
             # Remove lookup dimension coord from the DataArray
             return outdata.reset_coords('lookup_dim', drop=True)
+        else:
+            # if lookup has no-coords return a float
+            return float(outdata)
 
 
 class ExtConstant(External):
@@ -780,21 +873,21 @@ class ExtConstant(External):
     Class for Vensim GET XLS CONSTANTS/GET DIRECT CONSTANTS
     """
 
-    def __init__(self, file_name, tab, cell, coords, root, py_name):
+    def __init__(self, file_name, sheet, cell, coords, root, py_name):
         super().__init__(py_name)
         self.files = [file_name]
-        self.tabs = [tab]
+        self.sheets = [sheet]
         self.transposes = [cell[-1] == '*']
         self.cells = [cell.strip('*')]
         self.root = root
         self.coordss = [coords]
 
-    def add(self, file_name, tab, cell, coords):
+    def add(self, file_name, sheet, cell, coords):
         """
         Add information to retrieve new dimension in an already declared object
         """
         self.files.append(file_name)
-        self.tabs.append(tab)
+        self.sheets.append(sheet)
         self.transposes.append(cell[-1] == '*')
         self.cells.append(cell.strip('*'))
         self.coordss.append(coords)
@@ -808,9 +901,9 @@ def initialize(self):
         Initialize all elements and create the self.data xarray.DataArray
         """
         data = []
-        zipped = zip(self.files, self.tabs, self.transposes,
+        zipped = zip(self.files, self.sheets, self.transposes,
                      self.cells, self.coordss)
-        for (self.file, self.tab, self.transpose,
+        for (self.file, self.sheet, self.transpose,
              self.cell, self.coords) in zipped:
             data.append(self._initialize())
         self.data = utils.xrmerge(data)
@@ -876,12 +969,10 @@ def _get_constant_data(self, data_across, cell, shape):
         if data_across == "cell":
             # read data from topleft cell name using pandas
             start_row, start_col = cell
-            end_row = start_row + shape[0] - 1
-            end_col = self._num_to_col(self._col_to_num(start_col)
-                                       + shape[1] - 1)
 
-            return self._get_data_from_file(rows=[start_row, end_row],
-                                            cols=[start_col, end_col])
+            return self._get_data_from_file(
+                rows=[start_row, start_row + shape[0]],
+                cols=[start_col, start_col + shape[1]])
 
         else:
             # read data from cell range name using OpenPyXL
@@ -927,15 +1018,19 @@ class ExtSubscript(External):
     Class for Vensim GET XLS SUBSCRIPT/GET DIRECT SUBSCRIPT
     """
 
-    def __init__(self, file_name, tab, firstcell, lastcell, prefix, root):
+    def __init__(self, file_name, sheet, firstcell, lastcell, prefix, root):
         super().__init__("Hardcoded external subscript")
         self.file = file_name
-        self.tab = tab
+        self.sheet = sheet
         self._resolve_file(root=root)
 
         row_first, col_first = self._split_excel_cell(firstcell)
         row_last, col_last = self._split_excel_cell(lastcell)
-        data = self._get_data_from_file(rows=[row_first, row_last],
-                                        cols=[col_first, col_last])
+        data = pd.read_excel(
+            self.file, sheet,
+            skiprows=row_first-1,
+            nrows=row_last-row_first+1,
+            usecols=np.arange(col_first, col_last+1)
+            )
 
         self.subscript = [prefix + str(d) for d in data.values.flatten()]
diff --git a/pysd/py_backend/functions.py b/pysd/py_backend/functions.py
index 7ad76403..95976669 100644
--- a/pysd/py_backend/functions.py
+++ b/pysd/py_backend/functions.py
@@ -135,13 +135,11 @@ def __init__(self, delay_input, delay_time, initial_value, order):
 
     def initialize(self):
         order = self.order_func()
-        if isinstance(order, xr.DataArray):
-            order = order.values
-        while isinstance(order, np.ndarray):
-            order = order[0]
+
         if order != int(order):
             warnings.warn('Casting delay order from %f to %i' % (
                 order, int(order)))
+
         self.order = int(order)  # The order can only be set once
 
         init_state_value = self.init_func() * self.delay_time_func()\
@@ -268,7 +266,8 @@ def __init__(self, py_model_file, params=None, return_func=None,
             self.components = SourceFileLoader(module_name,
                                                py_model_file).load_module()
         except TypeError:
-            raise ImportError("\n\nNot able to import the model. "
+            raise ImportError(
+                "\n\nNot able to import the model. "
                 + "This may be because the model was compiled with an "
                 + "earlier version of PySD, you can check on the top of "
                 + " the model file you are trying to load."
@@ -277,12 +276,13 @@ def __init__(self, py_model_file, params=None, return_func=None,
                 + "Please translate again the model with the function"
                 + " read_vensim or read_xmile.")
 
-        if __version__.split(".")[0] !=\
-          self.components.__pysd_version__.split(".")[0]:
-            raise ImportError("\n\nNot able to import the model. "
+        if __version__.split(".")[0]\
+           != self.get_pysd_compiler_version().split(".")[0]:
+            raise ImportError(
+                "\n\nNot able to import the model. "
                 + "The model was compiled with a "
                 + "not compatible version of PySD:"
-                + "\n\tPySD " + self.components.__pysd_version__
+                + "\n\tPySD " + self.get_pysd_compiler_version()
                 + "\n\nThe current version of PySd is:"
                 + "\n\tPySD " + __version__ + "\n\n"
                 + "Please translate again the model with the function"
@@ -639,16 +639,18 @@ def update(self, value):
 
 
 class Model(Macro):
-    def __init__(self, py_model_file):
+    def __init__(self, py_model_file, missing_values):
         """ Sets up the python objects """
         super().__init__(py_model_file, None, None, Time())
         self.time.stage = 'Load'
+        self.missing_values = missing_values
         self.initialize()
 
     def initialize(self):
         """ Initializes the simulation model """
         self.time.update(self.components.initial_time())
         self.time.stage = 'Initialization'
+        External.missing = self.missing_values
         super().initialize()
 
     def _build_euler_timeseries(self, return_timestamps=None):
@@ -788,7 +790,7 @@ def reload(self):
         """Reloads the model from the translated model file, so that all the
         parameters are back to their original value.
         """
-        self.__init__(self.py_model_file)
+        self.__init__(self.py_model_file, missing_values=self.missing_values)
 
     def _default_return_columns(self):
         """
@@ -804,7 +806,7 @@ def _default_return_columns(self):
                 # The `*args` reference handles the py2.7 decorator.
                 if len(set(sig.parameters) - {'args'}) == 0:
                     expr = self.components._namespace[key]
-                    if not expr in parsed_expr:
+                    if expr not in parsed_expr:
                         return_columns.append(key)
                         parsed_expr.append(expr)
 
@@ -1005,16 +1007,18 @@ def pulse_magnitude(time, magnitude, start, repeat_time=0):
 
 def lookup(x, xs, ys):
     """
-    Intermediate values are calculated with linear interpolation between the intermediate points.
-    Out-of-range values are the same as the closest endpoint (i.e, no extrapolation is performed).
+    Intermediate values are calculated with linear interpolation between
+    the intermediate points. Out-of-range values are the same as the
+    closest endpoint (i.e, no extrapolation is performed).
     """
     return np.interp(x, xs, ys)
 
 
 def lookup_extrapolation(x, xs, ys):
     """
-    Intermediate values are calculated with linear interpolation between the intermediate points.
-    Out-of-range values are calculated with linear extrapolation from the last two values at either end.
+    Intermediate values are calculated with linear interpolation between
+    the intermediate points. Out-of-range values are calculated with linear
+    extrapolation from the last two values at either end.
     """
     if x < xs[0]:
         dx = xs[1] - xs[0]
@@ -1031,8 +1035,11 @@ def lookup_extrapolation(x, xs, ys):
 
 def lookup_discrete(x, xs, ys):
     """
-    Intermediate values take on the value associated with the next lower x-coordinate (also called a step-wise function). The last two points of a discrete graphical function must have the same y value.
-    Out-of-range values are the same as the closest endpoint (i.e, no extrapolation is performed).
+    Intermediate values take on the value associated with the next lower
+    x-coordinate (also called a step-wise function). The last two points
+    of a discrete graphical function must have the same y value.
+    Out-of-range values are the same as the closest endpoint
+    (i.e, no extrapolation is performed).
     """
     for index in range(0, len(xs)):
         if x < xs[index]:
@@ -1154,8 +1161,9 @@ def random_uniform(m, x, s):
 
 
 def incomplete(*args):
-    warnings.warn('Call to undefined function, calling dependencies and returning NaN',
-                  RuntimeWarning, stacklevel=2)
+    warnings.warn(
+        'Call to undefined function, calling dependencies and returning NaN',
+        RuntimeWarning, stacklevel=2)
 
     return np.nan
 
diff --git a/pysd/py_backend/utils.py b/pysd/py_backend/utils.py
index ed1a9699..046eb138 100644
--- a/pysd/py_backend/utils.py
+++ b/pysd/py_backend/utils.py
@@ -521,16 +521,25 @@ def rearrange(data, dims, coords):
     # subset used coords in general coords will be the subscript_dict
     coords = {dim: coords[dim] for dim in dims}
     if isinstance(data, xr.DataArray):
-        if data.shape == tuple(compute_shape(coords)):
+        shape = tuple(compute_shape(coords))
+        if data.shape == shape:
             # Allows switching dimensions names and transpositions
             return xr.DataArray(data=data.values, coords=coords, dims=dims)
+        elif len(shape) == len(data.shape) and\
+          all([shape[i] < data.shape[i] for i in range(len(shape))]):
+            # Allows subscripting a subrange
+            return data.rename({
+                dim: new_dim for dim, new_dim in zip(data.dims, dims)
+                }).loc[coords]
 
         # The coordinates are expanded or transposed
         return xr.DataArray(0, coords, dims) + data
 
-    else:
+    elif data is not None:
         return xr.DataArray(data, coords, dims)
 
+    return None
+
 
 def round_(x):
     """
diff --git a/pysd/py_backend/vensim/vensim2py.py b/pysd/py_backend/vensim/vensim2py.py
index d54c3984..b1508d43 100644
--- a/pysd/py_backend/vensim/vensim2py.py
+++ b/pysd/py_backend/vensim/vensim2py.py
@@ -814,7 +814,7 @@ def parse_general_expression(element, namespace=None, subscript_dict=None,
     arguments = (expr _ ","? _)*
 
     reference = id _ subscript_list?
-    subscript_list = "[" _ ~"\""? _ ((sub_name / sub_element) _ ~"\""? _ "!"? _ ","? _)+ _ "]"
+    subscript_list = "[" _ ~"\""? _ (subs _ ~"\""? _ "!"? _ ","? _)+ _ "]"
 
 
     array = (number _ ("," / ";")? _)+ !~r"."  # negative lookahead for anything other than an array
@@ -822,8 +822,7 @@ def parse_general_expression(element, namespace=None, subscript_dict=None,
 
     id = ( basic_id / escape_group )
 
-    sub_name = ~r"(%(sub_names)s)"IU  # subscript names (if none, use non-printable character)
-    sub_element = ~r"(%(sub_elems)s)"IU  # subscript elements (if none, use non-printable character)
+    subs = ~r"(%(subs)s)"IU  # subscript names and elements (if none, use non-printable character)
 
     func = ~r"(%(funcs)s)"IU  # functions (case insensitive)
     in_oper = ~r"(%(in_ops)s)"IU  # infix operators (case insensitive)
@@ -835,8 +834,7 @@ def parse_general_expression(element, namespace=None, subscript_dict=None,
     """ % {
         # In the following, we have to sort keywords in decreasing order of length so that the
         # peg parser doesn't quit early when finding a partial keyword
-        'sub_names': '|'.join(reversed(sorted(sub_names_list, key=len))),
-        'sub_elems': '|'.join(reversed(sorted(sub_elems_list, key=len))),
+        'subs': '|'.join(reversed(sorted(sub_names_list + sub_elems_list, key=len))),
         'funcs': '|'.join(reversed(sorted(functions.keys(), key=len))),
         'in_ops': '|'.join(reversed(sorted(in_ops_list, key=len))),
         'pre_ops': '|'.join(reversed(sorted(pre_ops_list, key=len))),
diff --git a/pysd/pysd.py b/pysd/pysd.py
index e711b395..cf9b3e9b 100644
--- a/pysd/pysd.py
+++ b/pysd/pysd.py
@@ -7,7 +7,7 @@
 --------
 August 15, 2014: created
 June 6 2015: Major updates - version 0.2.5
-Jan 2016: Rework to handle subscripts 
+Jan 2016: Rework to handle subscripts
 May 2016: Updates to handle grammar refactoring
 Sept 2016: Major refactor, putting most internal code into the Model and Macro objects
 """
@@ -15,7 +15,8 @@
 import sys
 
 if sys.version_info[:2] < (3, 7):
-    raise RuntimeError("\n\n"
+    raise RuntimeError(
+        "\n\n"
         + "Your Python version is not longer supported by PySD.\n"
         + "The current version needs to run at least Python 3.7."
         + " You are running:\n\tPython " + sys.version + "."
@@ -23,7 +24,8 @@
         + " supported version:\n\t"
         + "https://github.com/JamesPHoughton/pysd/releases/tag/LastPy2")
 
-def read_xmile(xmile_file):
+
+def read_xmile(xmile_file, missing_values="warning"):
     """
     Construct a model from `.xmile` file.
 
@@ -31,6 +33,11 @@ def read_xmile(xmile_file):
     ----------
     xmile_file : <string>
         The relative path filename for a raw `.xmile` file
+    missing_values : <string> (optional)
+        What to do with missing values in external objects.
+        If "warning" (default) shows a warning message and
+        interpolates the values. If "raise" raises an error.
+        If "ignore" interpolates the values without showing anything.
 
     Returns
     -------
@@ -45,12 +52,12 @@ def read_xmile(xmile_file):
     """
     from .py_backend.xmile.xmile2py import translate_xmile
     py_model_file = translate_xmile(xmile_file)
-    model = load(py_model_file)
+    model = load(py_model_file, missing_values)
     model.xmile_file = xmile_file
     return model
 
 
-def read_vensim(mdl_file):
+def read_vensim(mdl_file, missing_values="warning"):
     """
     Construct a model from Vensim `.mdl` file.
 
@@ -58,6 +65,11 @@ def read_vensim(mdl_file):
     ----------
     mdl_file : <string>
         The relative path filename for a raw Vensim `.mdl` file
+    missing_values : <string> (optional)
+        What to do with missing values in external objects.
+        If "warning" (default) shows a warning message and
+        interpolates the values. If "raise" raises an error.
+        If "ignore" interpolates the values without showing anything.
 
     Returns
     -------
@@ -72,12 +84,12 @@ def read_vensim(mdl_file):
     """
     from .py_backend.vensim.vensim2py import translate_vensim
     py_model_file = translate_vensim(mdl_file)
-    model = load(py_model_file)
+    model = load(py_model_file, missing_values)
     model.mdl_file = mdl_file
     return model
 
 
-def load(py_model_file):
+def load(py_model_file, missing_values="warning"):
     """
     Load a python-converted model file.
 
@@ -86,6 +98,11 @@ def load(py_model_file):
     py_model_file : <string>
         Filename of a model which has already been converted into a
         python format.
+    missing_values : <string> (optional)
+        What to do with missing values in external objects.
+        If "warning" (default) shows a warning message and
+        interpolates the values. If "raise" raises an error.
+        If "ignore" interpolates the values without showing anything.
 
     Examples
     --------
@@ -93,4 +110,4 @@ def load(py_model_file):
 
     """
     from .py_backend import functions
-    return functions.Model(py_model_file)
+    return functions.Model(py_model_file, missing_values)


Test patch:
diff --git a/tests/data/input.xlsx b/tests/data/input.xlsx
index 2b2356af..c370ac3e 100644
Binary files a/tests/data/input.xlsx and b/tests/data/input.xlsx differ
diff --git a/tests/integration_test_vensim_pathway.py b/tests/integration_test_vensim_pathway.py
index 0d98b95f..3aa416de 100644
--- a/tests/integration_test_vensim_pathway.py
+++ b/tests/integration_test_vensim_pathway.py
@@ -125,6 +125,27 @@ def test_get_lookups_data_3d_xls(self):
         )
         assert_frames_close(output, canon, rtol=rtol)
 
+    def test_get_with_missing_values_xlsx(self):
+        from.test_utils import runner, assert_frames_close
+        import warnings
+
+        with warnings.catch_warnings():
+            warnings.simplefilter("ignore")
+            output, canon = runner(
+                'test-models/tests/get_with_missing_values_xlsx/'
+                + 'test_get_with_missing_values_xlsx.mdl'
+            )
+
+        assert_frames_close(output, canon, rtol=rtol)
+
+    def test_get_mixed_definitions(self):
+        from.test_utils import runner, assert_frames_close
+        output, canon = runner(
+          'test-models/tests/get_mixed_definitions/'
+          + 'test_get_mixed_definitions.mdl'
+        )
+        assert_frames_close(output, canon, rtol=rtol)
+
     def test_get_subscript_3d_arrays_xls(self):
         """
         Test for usage of GET DIRECT/XLS SUBSCRIPTS/CONSTANTS from a Excel file
@@ -351,7 +372,6 @@ def test_subscript_docs(self):
         output, canon = runner('test-models/tests/subscript_docs/subscript_docs.mdl')
         assert_frames_close(output, canon, rtol=rtol)
 
-    @unittest.skip('working on it #216')
     def test_subscript_element_name(self):
         # issue https://github.com/JamesPHoughton/pysd/issues/216
         from.test_utils import runner, assert_frames_close
@@ -388,7 +408,6 @@ def test_subscript_selection(self):
         output, canon = runner('test-models/tests/subscript_selection/subscript_selection.mdl')
         assert_frames_close(output, canon, rtol=rtol)
 
-    @unittest.skip('failing in py3')
     def test_subscript_subranges(self):
         from.test_utils import runner, assert_frames_close
         output, canon = runner('test-models/tests/subscript_subranges/test_subscript_subrange.mdl')
diff --git a/tests/test-models b/tests/test-models
index 8fe779fb..555362de 160000
--- a/tests/test-models
+++ b/tests/test-models
@@ -1,1 +1,1 @@
-Subproject commit 8fe779fb9b84eb8426ddf3e4e7e1e796d180d636
+Subproject commit 555362dece6a87ce21bc215eb0a767e70add3bd4
diff --git a/tests/unit_test_builder.py b/tests/unit_test_builder.py
index fefaa164..49ac1c5f 100644
--- a/tests/unit_test_builder.py
+++ b/tests/unit_test_builder.py
@@ -217,3 +217,10 @@ def test_non_set(self):
 
         self.assertIn(actual[0], expected)
         self.assertIn(actual[1], expected)
+
+    def test_bad_value_kind(self):
+        from pysd.py_backend.builder import build_element
+
+        with self.assertRaises(AttributeError):
+            build_element({'kind': 'nonvalid'}, {})
+
diff --git a/tests/unit_test_external.py b/tests/unit_test_external.py
index 09acb8ef..67fdb028 100644
--- a/tests/unit_test_external.py
+++ b/tests/unit_test_external.py
@@ -17,21 +17,22 @@ def test_read_clean(self):
         Test for reading files with pandas
         """
         import pysd
-        import pandas as pd
 
         file_name = "data/input.xlsx"
+        sheet_name = "Vertical"
+        sheet_name2 = "Horizontal"
 
         # reading a file
-        excel = pysd.external.Excels.read(file_name)
-        self.assertTrue(isinstance(excel, pd.ExcelFile))
+        excel = pysd.external.Excels.read(file_name, sheet_name)
+        self.assertTrue(isinstance(excel, np.ndarray))
 
         # check if it is in the dictionary
-        self.assertEqual(list(pysd.external.Excels._Excels),
-                         [file_name])
+        self.assertTrue(file_name+sheet_name in
+                        list(pysd.external.Excels._Excels))
 
-        pysd.external.Excels.read(file_name)
-        self.assertEqual(list(pysd.external.Excels._Excels),
-                         [file_name])
+        pysd.external.Excels.read(file_name, sheet_name2)
+        self.assertTrue(file_name+sheet_name2 in
+                        list(pysd.external.Excels._Excels))
 
         # clean
         pysd.external.Excels.clean()
@@ -70,13 +71,12 @@ class TestExternalMethods(unittest.TestCase):
     Test for simple methods of External
     """
 
-    def test_num_to_col_and_col_to_num(self):
+    def test_col_to_num(self):
         """
         External._num_to_col and External._col_to_num test
         """
         import pysd
 
-        num_to_col = pysd.external.External._num_to_col
         col_to_num = pysd.external.External._col_to_num
 
         # Check col_to_num
@@ -86,40 +86,32 @@ def test_num_to_col_and_col_to_num(self):
         self.assertEqual(col_to_num("Z"), col_to_num("aa")-1)
         self.assertEqual(col_to_num("Zz"), col_to_num("AaA")-1)
 
-        cols = ["A", "AA", "AAA", "Z", "ZZ", "ZZZ",
-                "N", "WB", "ASJ", "K", "HG", "BTF"]
-
-        # Check num_to_col inverts col_to_num
-        for col in cols:
-            self.assertEqual(num_to_col(col_to_num(col)), col)
-
     def test_split_excel_cell(self):
         """
         External._split_excel_cell test
         """
         import pysd
 
-        split_excel_cell = pysd.external.External._split_excel_cell
+        ext = pysd.external.External('external')
 
         # No cells, function must return nothing
         nocells = ["A2A", "H0", "0", "5A", "A_1", "ZZZZ1", "A"]
 
         for nocell in nocells:
-            self.assertFalse(split_excel_cell(nocell))
+            self.assertFalse(ext._split_excel_cell(nocell))
 
         # Cells
-        cells = [(2, "A", "A2"), (574, "h", "h574"),
-                 (2, "Va", "Va2"), (2, "ABA", "ABA2")]
+        cells = [(1, 0, "A2"), (573, 7, "h574"),
+                 (1, 572, "Va2"), (1, 728, "ABA2")]
 
         for row, col, cell in cells:
-            self.assertEqual((row, col), split_excel_cell(cell))
+            self.assertEqual((row, col), ext._split_excel_cell(cell))
 
     def test_reshape(self):
         """
         External._reshape test
         """
         import pysd
-        import numpy as np
         import pandas as pd
 
         reshape = pysd.external.External._reshape
@@ -148,22 +140,59 @@ def test_series_selector(self):
         """
         import pysd
 
-        series_selector = pysd.external.External._series_selector
+        ext = pysd.external.External('external')
 
         # row selector
-        self.assertEqual(series_selector("12", "A5"), "row")
+        self.assertEqual(ext._series_selector("12", "A5"), "row")
 
         # column selector
-        self.assertEqual(series_selector("A", "a44"), "column")
-        self.assertEqual(series_selector("A", "AC44"), "column")
-        self.assertEqual(series_selector("A", "Bae2"), "column")
+        self.assertEqual(ext._series_selector("A", "a44"), "column")
+        self.assertEqual(ext._series_selector("A", "AC44"), "column")
+        self.assertEqual(ext._series_selector("A", "Bae2"), "column")
 
         # name selector
-        self.assertEqual(series_selector("Att", "a44b"), "name")
-        self.assertEqual(series_selector("Adfs", "a0"), "name")
-        self.assertEqual(series_selector("Ae_23", "aa_44"), "name")
-        self.assertEqual(series_selector("Aeee3", "3a"), "name")
-        self.assertEqual(series_selector("Aeee", "aajh2"), "name")
+        self.assertEqual(ext._series_selector("Att", "a44b"), "name")
+        self.assertEqual(ext._series_selector("Adfs", "a0"), "name")
+        self.assertEqual(ext._series_selector("Ae_23", "aa_44"), "name")
+        self.assertEqual(ext._series_selector("Aeee3", "3a"), "name")
+        self.assertEqual(ext._series_selector("Aeee", "aajh2"), "name")
+
+    def test_fill_missing(self):
+        import pysd
+
+        # simple casses are tested with 1 dimensional data
+        # 1 and 2 dimensional data is tested with test-models
+        ext = pysd.external.External("external")
+        series = np.arange(12)
+        data = np.array([np.nan, np.nan, 1., 3., np.nan, 4.,
+                         np.nan, np.nan, 7., 8., np.nan, np.nan])
+        hold_back = np.array([1., 1., 1., 3., 3., 4.,
+                              4., 4., 7., 8., 8., 8.])
+        look_for = np.array([1., 1., 1., 3., 4., 4.,
+                             7., 7., 7., 8., 8., 8.])
+        interp = np.array([1., 1., 1., 3., 3.5, 4.,
+                           5., 6., 7., 8., 8., 8.])
+
+        ext.interp = "raw"
+        datac = data.copy()
+        ext._fill_missing(series, datac)
+        self.assertTrue(np.all(data[~np.isnan(data)]
+                        == datac[~np.isnan(datac)]))
+
+        ext.interp = "hold backward"
+        datac = data.copy()
+        ext._fill_missing(series, datac)
+        self.assertTrue(np.all(hold_back == datac))
+
+        ext.interp = "look forward"
+        datac = data.copy()
+        ext._fill_missing(series, datac)
+        self.assertTrue(np.all(look_for == datac))
+
+        ext.interp = "interpolate"
+        datac = data.copy()
+        ext._fill_missing(series, datac)
+        self.assertTrue(np.all(interp == datac))
 
 
 class TestData(unittest.TestCase):
@@ -186,7 +215,7 @@ def test_data_interp_h1d_1(self):
 
         # test as well no file extension
         file_name = "data/input"
-        tab = "Horizontal"
+        sheet = "Horizontal"
         time_row_or_col = "16"
         cell = "B17"
         coords = {}
@@ -194,7 +223,7 @@ def test_data_interp_h1d_1(self):
         py_name = "test_data_interp_h1d_1"
 
         data = pysd.external.ExtData(file_name=file_name,
-                                     tab=tab,
+                                     sheet=sheet,
                                      time_row_or_col=time_row_or_col,
                                      root=_root,
                                      cell=cell,
@@ -219,7 +248,7 @@ def test_data_interp_hn1d_1(self):
         import xarray as xr
 
         file_name = "data/input.xlsx"
-        tab = "Horizontal"
+        sheet = "Horizontal"
         time_row_or_col = "time_1"
         cell = "data_1"
         coords = {}
@@ -227,7 +256,7 @@ def test_data_interp_hn1d_1(self):
         py_name = "test_data_interp_h1d_1"
 
         data = pysd.external.ExtData(file_name=file_name,
-                                     tab=tab,
+                                     sheet=sheet,
                                      time_row_or_col=time_row_or_col,
                                      root=_root,
                                      cell=cell,
@@ -246,9 +275,10 @@ def test_data_interp_h1d(self):
         ExtData test for 1d horizontal series interpolation
         """
         import pysd
+        import warnings
 
         file_name = "data/input.xlsx"
-        tab = "Horizontal"
+        sheet = "Horizontal"
         time_row_or_col = "4"
         cell = "C5"
         coords = {}
@@ -256,7 +286,7 @@ def test_data_interp_h1d(self):
         py_name = "test_data_interp_h1d"
 
         data = pysd.external.ExtData(file_name=file_name,
-                                     tab=tab,
+                                     sheet=sheet,
                                      time_row_or_col=time_row_or_col,
                                      root=_root,
                                      cell=cell,
@@ -266,17 +296,20 @@ def test_data_interp_h1d(self):
 
         data.initialize()
 
-        for x, y in zip(_exp.xpts, _exp.interp_1d):
-            self.assertEqual(y, data(x), "Wrong result at X=" + str(x))
+        with warnings.catch_warnings():
+            warnings.simplefilter("ignore")
+            for x, y in zip(_exp.xpts, _exp.interp_1d):
+                self.assertEqual(y, data(x), "Wrong result at X=" + str(x))
 
     def test_data_interp_v1d(self):
         """
         ExtData test for 1d vertical series interpolation
         """
         import pysd
+        import warnings
 
         file_name = "data/input.xlsx"
-        tab = "Vertical"
+        sheet = "Vertical"
         time_row_or_col = "B"
         cell = "C5"
         coords = {}
@@ -284,7 +317,7 @@ def test_data_interp_v1d(self):
         py_name = "test_data_interp_v1d"
 
         data = pysd.external.ExtData(file_name=file_name,
-                                     tab=tab,
+                                     sheet=sheet,
                                      time_row_or_col=time_row_or_col,
                                      root=_root,
                                      cell=cell,
@@ -294,17 +327,20 @@ def test_data_interp_v1d(self):
 
         data.initialize()
 
-        for x, y in zip(_exp.xpts, _exp.interp_1d):
-            self.assertEqual(y, data(x), "Wrong result at X=" + str(x))
+        with warnings.catch_warnings():
+            warnings.simplefilter("ignore")
+            for x, y in zip(_exp.xpts, _exp.interp_1d):
+                self.assertEqual(y, data(x), "Wrong result at X=" + str(x))
 
     def test_data_interp_hn1d(self):
         """
         ExtData test for 1d horizontal series interpolation by cellrange names
         """
         import pysd
+        import warnings
 
         file_name = "data/input.xlsx"
-        tab = "Horizontal"
+        sheet = "Horizontal"
         time_row_or_col = "time"
         cell = "data_1d"
         coords = {}
@@ -312,7 +348,7 @@ def test_data_interp_hn1d(self):
         py_name = "test_data_interp_h1nd"
 
         data = pysd.external.ExtData(file_name=file_name,
-                                     tab=tab,
+                                     sheet=sheet,
                                      time_row_or_col=time_row_or_col,
                                      root=_root,
                                      cell=cell,
@@ -322,17 +358,20 @@ def test_data_interp_hn1d(self):
 
         data.initialize()
 
-        for x, y in zip(_exp.xpts, _exp.interp_1d):
-            self.assertEqual(y, data(x), "Wrong result at X=" + str(x))
+        with warnings.catch_warnings():
+            warnings.simplefilter("ignore")
+            for x, y in zip(_exp.xpts, _exp.interp_1d):
+                self.assertEqual(y, data(x), "Wrong result at X=" + str(x))
 
     def test_data_interp_vn1d(self):
         """
         ExtData test for 1d vertical series interpolation by cellrange names
         """
         import pysd
+        import warnings
 
         file_name = "data/input.xlsx"
-        tab = "Vertical"
+        sheet = "Vertical"
         time_row_or_col = "time"
         cell = "data_1d"
         coords = {}
@@ -340,7 +379,7 @@ def test_data_interp_vn1d(self):
         py_name = "test_data_interp_vn1d"
 
         data = pysd.external.ExtData(file_name=file_name,
-                                     tab=tab,
+                                     sheet=sheet,
                                      time_row_or_col=time_row_or_col,
                                      root=_root,
                                      cell=cell,
@@ -350,17 +389,20 @@ def test_data_interp_vn1d(self):
 
         data.initialize()
 
-        for x, y in zip(_exp.xpts, _exp.interp_1d):
-            self.assertEqual(y, data(x), "Wrong result at X=" + str(x))
+        with warnings.catch_warnings():
+            warnings.simplefilter("ignore")
+            for x, y in zip(_exp.xpts, _exp.interp_1d):
+                self.assertEqual(y, data(x), "Wrong result at X=" + str(x))
 
     def test_data_forward_h1d(self):
         """
         ExtData test for 1d horizontal series look forward
         """
         import pysd
+        import warnings
 
         file_name = "data/input.xlsx"
-        tab = "Horizontal"
+        sheet = "Horizontal"
         time_row_or_col = "4"
         cell = "C5"
         coords = {}
@@ -368,7 +410,7 @@ def test_data_forward_h1d(self):
         py_name = "test_data_forward_h1d"
 
         data = pysd.external.ExtData(file_name=file_name,
-                                     tab=tab,
+                                     sheet=sheet,
                                      time_row_or_col=time_row_or_col,
                                      root=_root,
                                      cell=cell,
@@ -378,17 +420,20 @@ def test_data_forward_h1d(self):
 
         data.initialize()
 
-        for x, y in zip(_exp.xpts, _exp.forward_1d):
-            self.assertEqual(y, data(x), "Wrong result at X=" + str(x))
+        with warnings.catch_warnings():
+            warnings.simplefilter("ignore")
+            for x, y in zip(_exp.xpts, _exp.forward_1d):
+                self.assertEqual(y, data(x), "Wrong result at X=" + str(x))
 
     def test_data_forward_v1d(self):
         """
         ExtData test for 1d vertical series look forward
         """
         import pysd
+        import warnings
 
         file_name = "data/input.xlsx"
-        tab = "Vertical"
+        sheet = "Vertical"
         time_row_or_col = "B"
         cell = "C5"
         coords = {}
@@ -396,7 +441,7 @@ def test_data_forward_v1d(self):
         py_name = "test_data_forward_v1d"
 
         data = pysd.external.ExtData(file_name=file_name,
-                                     tab=tab,
+                                     sheet=sheet,
                                      time_row_or_col=time_row_or_col,
                                      root=_root,
                                      cell=cell,
@@ -406,17 +451,20 @@ def test_data_forward_v1d(self):
 
         data.initialize()
 
-        for x, y in zip(_exp.xpts, _exp.forward_1d):
-            self.assertEqual(y, data(x), "Wrong result at X=" + str(x))
+        with warnings.catch_warnings():
+            warnings.simplefilter("ignore")
+            for x, y in zip(_exp.xpts, _exp.forward_1d):
+                self.assertEqual(y, data(x), "Wrong result at X=" + str(x))
 
     def test_data_forward_hn1d(self):
         """
         ExtData test for 1d horizontal series look forward by cell range names
         """
         import pysd
+        import warnings
 
         file_name = "data/input.xlsx"
-        tab = "Horizontal"
+        sheet = "Horizontal"
         time_row_or_col = "time"
         cell = "data_1d"
         coords = {}
@@ -424,7 +472,7 @@ def test_data_forward_hn1d(self):
         py_name = "test_data_forward_hn1d"
 
         data = pysd.external.ExtData(file_name=file_name,
-                                     tab=tab,
+                                     sheet=sheet,
                                      time_row_or_col=time_row_or_col,
                                      root=_root,
                                      cell=cell,
@@ -434,17 +482,20 @@ def test_data_forward_hn1d(self):
 
         data.initialize()
 
-        for x, y in zip(_exp.xpts, _exp.forward_1d):
-            self.assertEqual(y, data(x), "Wrong result at X=" + str(x))
+        with warnings.catch_warnings():
+            warnings.simplefilter("ignore")
+            for x, y in zip(_exp.xpts, _exp.forward_1d):
+                self.assertEqual(y, data(x), "Wrong result at X=" + str(x))
 
     def test_data_forward_vn1d(self):
         """
         ExtData test for 1d vertical series look forward by cell range names
         """
         import pysd
+        import warnings
 
         file_name = "data/input.xlsx"
-        tab = "Vertical"
+        sheet = "Vertical"
         time_row_or_col = "time"
         cell = "data_1d"
         coords = {}
@@ -452,7 +503,7 @@ def test_data_forward_vn1d(self):
         py_name = "test_data_forward_vn1d"
 
         data = pysd.external.ExtData(file_name=file_name,
-                                     tab=tab,
+                                     sheet=sheet,
                                      time_row_or_col=time_row_or_col,
                                      root=_root,
                                      cell=cell,
@@ -462,17 +513,20 @@ def test_data_forward_vn1d(self):
 
         data.initialize()
 
-        for x, y in zip(_exp.xpts, _exp.forward_1d):
-            self.assertEqual(y, data(x), "Wrong result at X=" + str(x))
+        with warnings.catch_warnings():
+            warnings.simplefilter("ignore")
+            for x, y in zip(_exp.xpts, _exp.forward_1d):
+                self.assertEqual(y, data(x), "Wrong result at X=" + str(x))
 
     def test_data_backward_h1d(self):
         """
         ExtData test for 1d horizontal series hold backward
         """
         import pysd
+        import warnings
 
         file_name = "data/input.xlsx"
-        tab = "Horizontal"
+        sheet = "Horizontal"
         time_row_or_col = "4"
         cell = "C5"
         coords = {}
@@ -480,7 +534,7 @@ def test_data_backward_h1d(self):
         py_name = "test_data_backward_h1d"
 
         data = pysd.external.ExtData(file_name=file_name,
-                                     tab=tab,
+                                     sheet=sheet,
                                      time_row_or_col=time_row_or_col,
                                      root=_root,
                                      cell=cell,
@@ -490,17 +544,20 @@ def test_data_backward_h1d(self):
 
         data.initialize()
 
-        for x, y in zip(_exp.xpts, _exp.backward_1d):
-            self.assertEqual(y, data(x), "Wrong result at X=" + str(x))
+        with warnings.catch_warnings():
+            warnings.simplefilter("ignore")
+            for x, y in zip(_exp.xpts, _exp.backward_1d):
+                self.assertEqual(y, data(x), "Wrong result at X=" + str(x))
 
     def test_data_backward_v1d(self):
         """
         ExtData test for 1d vertical series hold backward by cell range names
         """
         import pysd
+        import warnings
 
         file_name = "data/input.xlsx"
-        tab = "Vertical"
+        sheet = "Vertical"
         time_row_or_col = "B"
         cell = "C5"
         coords = {}
@@ -508,7 +565,7 @@ def test_data_backward_v1d(self):
         py_name = "test_data_backward_v1d"
 
         data = pysd.external.ExtData(file_name=file_name,
-                                     tab=tab,
+                                     sheet=sheet,
                                      time_row_or_col=time_row_or_col,
                                      root=_root,
                                      cell=cell,
@@ -518,17 +575,20 @@ def test_data_backward_v1d(self):
 
         data.initialize()
 
-        for x, y in zip(_exp.xpts, _exp.backward_1d):
-            self.assertEqual(y, data(x), "Wrong result at X=" + str(x))
+        with warnings.catch_warnings():
+            warnings.simplefilter("ignore")
+            for x, y in zip(_exp.xpts, _exp.backward_1d):
+                self.assertEqual(y, data(x), "Wrong result at X=" + str(x))
 
     def test_data_backward_hn1d(self):
         """
         ExtData test for 1d horizontal series hold backward by cell range names
         """
         import pysd
+        import warnings
 
         file_name = "data/input.xlsx"
-        tab = "Horizontal"
+        sheet = "Horizontal"
         time_row_or_col = "time"
         cell = "data_1d"
         coords = {}
@@ -536,7 +596,7 @@ def test_data_backward_hn1d(self):
         py_name = "test_data_backward_hn1d"
 
         data = pysd.external.ExtData(file_name=file_name,
-                                     tab=tab,
+                                     sheet=sheet,
                                      time_row_or_col=time_row_or_col,
                                      root=_root,
                                      cell=cell,
@@ -546,17 +606,20 @@ def test_data_backward_hn1d(self):
 
         data.initialize()
 
-        for x, y in zip(_exp.xpts, _exp.backward_1d):
-            self.assertEqual(y, data(x), "Wrong result at X=" + str(x))
+        with warnings.catch_warnings():
+            warnings.simplefilter("ignore")
+            for x, y in zip(_exp.xpts, _exp.backward_1d):
+                self.assertEqual(y, data(x), "Wrong result at X=" + str(x))
 
     def test_data_backward_vn1d(self):
         """
         ExtData test for 1d vertical series hold backward by cell range names
         """
         import pysd
+        import warnings
 
         file_name = "data/input.xlsx"
-        tab = "Vertical"
+        sheet = "Vertical"
         time_row_or_col = "time"
         cell = "data_1d"
         coords = {}
@@ -564,7 +627,7 @@ def test_data_backward_vn1d(self):
         py_name = "test_data_backward_vn1d"
 
         data = pysd.external.ExtData(file_name=file_name,
-                                     tab=tab,
+                                     sheet=sheet,
                                      time_row_or_col=time_row_or_col,
                                      root=_root,
                                      cell=cell,
@@ -574,17 +637,20 @@ def test_data_backward_vn1d(self):
 
         data.initialize()
 
-        for x, y in zip(_exp.xpts, _exp.backward_1d):
-            self.assertEqual(y, data(x), "Wrong result at X=" + str(x))
+        with warnings.catch_warnings():
+            warnings.simplefilter("ignore")
+            for x, y in zip(_exp.xpts, _exp.backward_1d):
+                self.assertEqual(y, data(x), "Wrong result at X=" + str(x))
 
     def test_data_interp_vn2d(self):
         """
         ExtData test for 2d vertical series interpolation by cell range names
         """
         import pysd
+        import warnings
 
         file_name = "data/input.xlsx"
-        tab = "Vertical"
+        sheet = "Vertical"
         time_row_or_col = "time"
         cell = "data_2d"
         coords = {'ABC': ['A', 'B', 'C']}
@@ -592,7 +658,7 @@ def test_data_interp_vn2d(self):
         py_name = "test_data_interp_vn2d"
 
         data = pysd.external.ExtData(file_name=file_name,
-                                     tab=tab,
+                                     sheet=sheet,
                                      time_row_or_col=time_row_or_col,
                                      root=_root,
                                      cell=cell,
@@ -601,18 +667,21 @@ def test_data_interp_vn2d(self):
                                      py_name=py_name)
 
         data.initialize()
-
-        for x, y in zip(_exp.xpts, _exp.interp_2d):
-            self.assertTrue(y.equals(data(x)), "Wrong result at X=" + str(x))
+        with warnings.catch_warnings():
+            warnings.simplefilter("ignore")
+            for x, y in zip(_exp.xpts, _exp.interp_2d):
+                self.assertTrue(y.equals(data(x)),
+                                "Wrong result at X=" + str(x))
 
     def test_data_forward_hn2d(self):
         """
         ExtData test for 2d vertical series look forward by cell range names
         """
         import pysd
+        import warnings
 
         file_name = "data/input.xlsx"
-        tab = "Horizontal"
+        sheet = "Horizontal"
         time_row_or_col = "time"
         cell = "data_2d"
         coords = {'ABC': ['A', 'B', 'C']}
@@ -620,7 +689,7 @@ def test_data_forward_hn2d(self):
         py_name = "test_data_forward_hn2d"
 
         data = pysd.external.ExtData(file_name=file_name,
-                                     tab=tab,
+                                     sheet=sheet,
                                      time_row_or_col=time_row_or_col,
                                      root=_root,
                                      cell=cell,
@@ -629,18 +698,21 @@ def test_data_forward_hn2d(self):
                                      py_name=py_name)
 
         data.initialize()
-
-        for x, y in zip(_exp.xpts, _exp.forward_2d):
-            self.assertTrue(y.equals(data(x)), "Wrong result at X=" + str(x))
+        with warnings.catch_warnings():
+            warnings.simplefilter("ignore")
+            for x, y in zip(_exp.xpts, _exp.forward_2d):
+                self.assertTrue(y.equals(data(x)),
+                                "Wrong result at X=" + str(x))
 
     def test_data_backward_v2d(self):
         """
         ExtData test for 2d vertical series hold backward
         """
         import pysd
+        import warnings
 
         file_name = "data/input.xlsx"
-        tab = "Vertical"
+        sheet = "Vertical"
         time_row_or_col = "B"
         cell = "C5"
         coords = {'ABC': ['A', 'B', 'C']}
@@ -648,7 +720,7 @@ def test_data_backward_v2d(self):
         py_name = "test_data_backward_v2d"
 
         data = pysd.external.ExtData(file_name=file_name,
-                                     tab=tab,
+                                     sheet=sheet,
                                      time_row_or_col=time_row_or_col,
                                      root=_root,
                                      cell=cell,
@@ -658,17 +730,21 @@ def test_data_backward_v2d(self):
 
         data.initialize()
 
-        for x, y in zip(_exp.xpts, _exp.backward_2d):
-            self.assertTrue(y.equals(data(x)), "Wrong result at X=" + str(x))
+        with warnings.catch_warnings():
+            warnings.simplefilter("ignore")
+            for x, y in zip(_exp.xpts, _exp.backward_2d):
+                self.assertTrue(y.equals(data(x)),
+                                "Wrong result at X=" + str(x))
 
     def test_data_interp_h3d(self):
         """
         ExtData test for 3d horizontal series interpolation
         """
         import pysd
+        import warnings
 
         file_name = "data/input.xlsx"
-        tab = "Horizontal"
+        sheet = "Horizontal"
         time_row_or_col = "4"
         cell_1 = "C5"
         cell_2 = "C8"
@@ -678,7 +754,7 @@ def test_data_interp_h3d(self):
         py_name = "test_data_interp_h3d"
 
         data = pysd.external.ExtData(file_name=file_name,
-                                     tab=tab,
+                                     sheet=sheet,
                                      time_row_or_col=time_row_or_col,
                                      root=_root,
                                      cell=cell_1,
@@ -687,7 +763,7 @@ def test_data_interp_h3d(self):
                                      py_name=py_name)
 
         data.add(file_name=file_name,
-                 tab=tab,
+                 sheet=sheet,
                  time_row_or_col=time_row_or_col,
                  cell=cell_2,
                  coords=coords_2,
@@ -695,17 +771,21 @@ def test_data_interp_h3d(self):
 
         data.initialize()
 
-        for x, y in zip(_exp.xpts, _exp.interp_3d):
-            self.assertTrue(y.equals(data(x)), "Wrong result at X=" + str(x))
+        with warnings.catch_warnings():
+            warnings.simplefilter("ignore")
+            for x, y in zip(_exp.xpts, _exp.interp_3d):
+                self.assertTrue(y.equals(data(x)),
+                                "Wrong result at X=" + str(x))
 
     def test_data_forward_v3d(self):
         """
         ExtData test for 3d vertical series look forward
         """
         import pysd
+        import warnings
 
         file_name = "data/input.xlsx"
-        tab = "Vertical"
+        sheet = "Vertical"
         time_row_or_col = "B"
         cell_1 = "C5"
         cell_2 = "F5"
@@ -715,7 +795,7 @@ def test_data_forward_v3d(self):
         py_name = "test_data_forward_v3d"
 
         data = pysd.external.ExtData(file_name=file_name,
-                                     tab=tab,
+                                     sheet=sheet,
                                      time_row_or_col=time_row_or_col,
                                      root=_root,
                                      cell=cell_1,
@@ -724,7 +804,7 @@ def test_data_forward_v3d(self):
                                      py_name=py_name)
 
         data.add(file_name=file_name,
-                 tab=tab,
+                 sheet=sheet,
                  time_row_or_col=time_row_or_col,
                  cell=cell_2,
                  coords=coords_2,
@@ -732,17 +812,21 @@ def test_data_forward_v3d(self):
 
         data.initialize()
 
-        for x, y in zip(_exp.xpts, _exp.forward_3d):
-            self.assertTrue(y.equals(data(x)), "Wrong result at X=" + str(x))
+        with warnings.catch_warnings():
+            warnings.simplefilter("ignore")
+            for x, y in zip(_exp.xpts, _exp.forward_3d):
+                self.assertTrue(y.equals(data(x)),
+                                "Wrong result at X=" + str(x))
 
     def test_data_backward_hn3d(self):
         """
         ExtData test for 3d horizontal series hold backward by cellrange names
         """
         import pysd
+        import warnings
 
         file_name = "data/input.xlsx"
-        tab = "Horizontal"
+        sheet = "Horizontal"
         time_row_or_col = "time"
         cell_1 = "data_2d"
         cell_2 = "data_2db"
@@ -752,7 +836,7 @@ def test_data_backward_hn3d(self):
         py_name = "test_data_backward_hn3d"
 
         data = pysd.external.ExtData(file_name=file_name,
-                                     tab=tab,
+                                     sheet=sheet,
                                      time_row_or_col=time_row_or_col,
                                      root=_root,
                                      cell=cell_1,
@@ -761,7 +845,7 @@ def test_data_backward_hn3d(self):
                                      py_name=py_name)
 
         data.add(file_name=file_name,
-                 tab=tab,
+                 sheet=sheet,
                  time_row_or_col=time_row_or_col,
                  cell=cell_2,
                  coords=coords_2,
@@ -769,8 +853,11 @@ def test_data_backward_hn3d(self):
 
         data.initialize()
 
-        for x, y in zip(_exp.xpts, _exp.backward_3d):
-            self.assertTrue(y.equals(data(x)), "Wrong result at X=" + str(x))
+        with warnings.catch_warnings():
+            warnings.simplefilter("ignore")
+            for x, y in zip(_exp.xpts, _exp.backward_3d):
+                self.assertTrue(y.equals(data(x)),
+                                "Wrong result at X=" + str(x))
 
     def test_data_raw_h1d(self):
         """
@@ -779,7 +866,7 @@ def test_data_raw_h1d(self):
         import pysd
 
         file_name = "data/input.xlsx"
-        tab = "Horizontal"
+        sheet = "Horizontal"
         time_row_or_col = "4"
         cell = "C5"
         coords = {}
@@ -787,7 +874,7 @@ def test_data_raw_h1d(self):
         py_name = "test_data_forward_h1d"
 
         data = pysd.external.ExtData(file_name=file_name,
-                                     tab=tab,
+                                     sheet=sheet,
                                      time_row_or_col=time_row_or_col,
                                      root=_root,
                                      cell=cell,
@@ -820,16 +907,17 @@ def test_lookup_h1d(self):
         ExtLookup test for 1d horizontal series
         """
         import pysd
+        import warnings
 
         file_name = "data/input.xlsx"
-        tab = "Horizontal"
+        sheet = "Horizontal"
         x_row_or_col = "4"
         cell = "C5"
         coords = {}
         py_name = "test_lookup_h1d"
 
         data = pysd.external.ExtLookup(file_name=file_name,
-                                       tab=tab,
+                                       sheet=sheet,
                                        x_row_or_col=x_row_or_col,
                                        root=_root,
                                        cell=cell,
@@ -838,24 +926,27 @@ def test_lookup_h1d(self):
 
         data.initialize()
 
-        for x, y in zip(_exp.xpts, _exp.interp_1d):
-            self.assertEqual(y, data(x), "Wrong result at X=" + str(x))
+        with warnings.catch_warnings():
+            warnings.simplefilter("ignore")
+            for x, y in zip(_exp.xpts, _exp.interp_1d):
+                self.assertEqual(y, data(x), "Wrong result at X=" + str(x))
 
     def test_lookup_v1d(self):
         """
         ExtLookup test for 1d vertical series
         """
         import pysd
+        import warnings
 
         file_name = "data/input.xlsx"
-        tab = "Vertical"
+        sheet = "Vertical"
         x_row_or_col = "B"
         cell = "C5"
         coords = {}
         py_name = "test_lookup_v1d"
 
         data = pysd.external.ExtLookup(file_name=file_name,
-                                       tab=tab,
+                                       sheet=sheet,
                                        x_row_or_col=x_row_or_col,
                                        root=_root,
                                        cell=cell,
@@ -864,24 +955,27 @@ def test_lookup_v1d(self):
 
         data.initialize()
 
-        for x, y in zip(_exp.xpts, _exp.interp_1d):
-            self.assertEqual(y, data(x), "Wrong result at X=" + str(x))
+        with warnings.catch_warnings():
+            warnings.simplefilter("ignore")
+            for x, y in zip(_exp.xpts, _exp.interp_1d):
+                self.assertEqual(y, data(x), "Wrong result at X=" + str(x))
 
     def test_lookup_hn1d(self):
         """
         ExtLookup test for 1d horizontal series by cellrange names
         """
         import pysd
+        import warnings
 
         file_name = "data/input.xlsx"
-        tab = "Horizontal"
+        sheet = "Horizontal"
         x_row_or_col = "time"
         cell = "data_1d"
         coords = {}
         py_name = "test_lookup_h1nd"
 
         data = pysd.external.ExtLookup(file_name=file_name,
-                                       tab=tab,
+                                       sheet=sheet,
                                        x_row_or_col=x_row_or_col,
                                        root=_root,
                                        cell=cell,
@@ -890,24 +984,27 @@ def test_lookup_hn1d(self):
 
         data.initialize()
 
-        for x, y in zip(_exp.xpts, _exp.interp_1d):
-            self.assertEqual(y, data(x), "Wrong result at X=" + str(x))
+        with warnings.catch_warnings():
+            warnings.simplefilter("ignore")
+            for x, y in zip(_exp.xpts, _exp.interp_1d):
+                self.assertEqual(y, data(x), "Wrong result at X=" + str(x))
 
     def test_lookup_vn1d(self):
         """
         ExtLookup test for 1d vertical series by cellrange names
         """
         import pysd
+        import warnings
 
         file_name = "data/input.xlsx"
-        tab = "Vertical"
+        sheet = "Vertical"
         x_row_or_col = "time"
         cell = "data_1d"
         coords = {}
         py_name = "test_lookup_vn1d"
 
         data = pysd.external.ExtLookup(file_name=file_name,
-                                       tab=tab,
+                                       sheet=sheet,
                                        x_row_or_col=x_row_or_col,
                                        root=_root,
                                        cell=cell,
@@ -916,24 +1013,27 @@ def test_lookup_vn1d(self):
 
         data.initialize()
 
-        for x, y in zip(_exp.xpts, _exp.interp_1d):
-            self.assertEqual(y, data(x), "Wrong result at X=" + str(x))
+        with warnings.catch_warnings():
+            warnings.simplefilter("ignore")
+            for x, y in zip(_exp.xpts, _exp.interp_1d):
+                self.assertEqual(y, data(x), "Wrong result at X=" + str(x))
 
     def test_lookup_h2d(self):
         """
         ExtLookup test for 2d horizontal series
         """
         import pysd
+        import warnings
 
         file_name = "data/input.xlsx"
-        tab = "Horizontal"
+        sheet = "Horizontal"
         x_row_or_col = "4"
         cell = "C5"
         coords = {'ABC': ['A', 'B', 'C']}
         py_name = "test_lookup_h2d"
 
         data = pysd.external.ExtLookup(file_name=file_name,
-                                       tab=tab,
+                                       sheet=sheet,
                                        x_row_or_col=x_row_or_col,
                                        root=_root,
                                        cell=cell,
@@ -942,17 +1042,21 @@ def test_lookup_h2d(self):
 
         data.initialize()
 
-        for x, y in zip(_exp.xpts, _exp.interp_2d):
-            self.assertTrue(y.equals(data(x)), "Wrong result at X=" + str(x))
+        with warnings.catch_warnings():
+            warnings.simplefilter("ignore")
+            for x, y in zip(_exp.xpts, _exp.interp_2d):
+                self.assertTrue(y.equals(data(x)),
+                                "Wrong result at X=" + str(x))
 
     def test_lookup_vn3d(self):
         """
         ExtLookup test for 3d vertical series by cellrange names
         """
         import pysd
+        import warnings
 
         file_name = "data/input.xlsx"
-        tab = "Vertical"
+        sheet = "Vertical"
         x_row_or_col = "time"
         cell_1 = "data_2d"
         cell_2 = "data_2db"
@@ -961,7 +1065,7 @@ def test_lookup_vn3d(self):
         py_name = "test_lookup_vn3d"
 
         data = pysd.external.ExtLookup(file_name=file_name,
-                                       tab=tab,
+                                       sheet=sheet,
                                        x_row_or_col=x_row_or_col,
                                        root=_root,
                                        cell=cell_1,
@@ -969,15 +1073,18 @@ def test_lookup_vn3d(self):
                                        py_name=py_name)
 
         data.add(file_name=file_name,
-                 tab=tab,
+                 sheet=sheet,
                  x_row_or_col=x_row_or_col,
                  cell=cell_2,
                  coords=coords_2)
 
         data.initialize()
 
-        for x, y in zip(_exp.xpts, _exp.interp_3d):
-            self.assertTrue(y.equals(data(x)), "Wrong result at X=" + str(x))
+        with warnings.catch_warnings():
+            warnings.simplefilter("ignore")
+            for x, y in zip(_exp.xpts, _exp.interp_3d):
+                self.assertTrue(y.equals(data(x)),
+                                "Wrong result at X=" + str(x))
 
 
 class TestConstant(unittest.TestCase):
@@ -994,21 +1101,21 @@ def test_constant_0d(self):
         import pysd
 
         file_name = "data/input.xlsx"
-        tab = "Horizontal"
+        sheet = "Horizontal"
         cell = "F7"
         cell2 = "C5"
         coords = {}
         py_name = "test_constant_0d"
 
         data = pysd.external.ExtConstant(file_name=file_name,
-                                         tab=tab,
+                                         sheet=sheet,
                                          root=_root,
                                          cell=cell,
                                          coords=coords,
                                          py_name=py_name)
 
         data2 = pysd.external.ExtConstant(file_name=file_name,
-                                          tab=tab,
+                                          sheet=sheet,
                                           root=_root,
                                           cell=cell2,
                                           coords=coords,
@@ -1026,21 +1133,21 @@ def test_constant_n0d(self):
         import pysd
 
         file_name = "data/input.xlsx"
-        tab = "Horizontal"
+        sheet = "Horizontal"
         cell = "constant"
         cell2 = "constant2"
         coords = {}
         py_name = "test_constant_0d"
 
         data = pysd.external.ExtConstant(file_name=file_name,
-                                         tab=tab,
+                                         sheet=sheet,
                                          root=_root,
                                          cell=cell,
                                          coords=coords,
                                          py_name=py_name)
 
         data2 = pysd.external.ExtConstant(file_name=file_name,
-                                          tab=tab,
+                                          sheet=sheet,
                                           root=_root,
                                           cell=cell2,
                                           coords=coords,
@@ -1058,13 +1165,13 @@ def test_constant_h1d(self):
         import pysd
 
         file_name = "data/input.xlsx"
-        tab = "Horizontal"
+        sheet = "Horizontal"
         cell = "C5"
         coords = {'val': [0, 1, 2, 3, 5, 6, 7, 8]}
         py_name = "test_constant_h1d"
 
         data = pysd.external.ExtConstant(file_name=file_name,
-                                         tab=tab,
+                                         sheet=sheet,
                                          root=_root,
                                          cell=cell,
                                          coords=coords,
@@ -1080,13 +1187,13 @@ def test_constant_v1d(self):
         import pysd
 
         file_name = "data/input.xlsx"
-        tab = "Vertical"
+        sheet = "Vertical"
         cell = "C5*"
         coords = {'val': [0, 1, 2, 3, 5, 6, 7, 8]}
         py_name = "test_constant_v1d"
 
         data = pysd.external.ExtConstant(file_name=file_name,
-                                         tab=tab,
+                                         sheet=sheet,
                                          root=_root,
                                          cell=cell,
                                          coords=coords,
@@ -1102,13 +1209,13 @@ def test_constant_hn1d(self):
         import pysd
 
         file_name = "data/input.xlsx"
-        tab = "Horizontal"
+        sheet = "Horizontal"
         cell = "data_1d"
         coords = {'val': [0, 1, 2, 3, 5, 6, 7, 8]}
         py_name = "test_constant_hn1d"
 
         data = pysd.external.ExtConstant(file_name=file_name,
-                                         tab=tab,
+                                         sheet=sheet,
                                          root=_root,
                                          cell=cell,
                                          coords=coords,
@@ -1124,13 +1231,13 @@ def test_constant_vn1d(self):
         import pysd
 
         file_name = "data/input.xlsx"
-        tab = "Vertical"
+        sheet = "Vertical"
         cell = "data_1d*"
         coords = {'val': [0, 1, 2, 3, 5, 6, 7, 8]}
         py_name = "test_constant_vn1d"
 
         data = pysd.external.ExtConstant(file_name=file_name,
-                                         tab=tab,
+                                         sheet=sheet,
                                          root=_root,
                                          cell=cell,
                                          coords=coords,
@@ -1146,13 +1253,13 @@ def test_constant_h2d(self):
         import pysd
 
         file_name = "data/input.xlsx"
-        tab = "Horizontal"
+        sheet = "Horizontal"
         cell = "C5"
         coords = {'ABC': ['A', 'B', 'C'], 'val': [0, 1, 2, 3, 5, 6, 7, 8]}
         py_name = "test_constant_h2d"
 
         data = pysd.external.ExtConstant(file_name=file_name,
-                                         tab=tab,
+                                         sheet=sheet,
                                          root=_root,
                                          cell=cell,
                                          coords=coords,
@@ -1168,13 +1275,13 @@ def test_constant_v2d(self):
         import pysd
 
         file_name = "data/input.xlsx"
-        tab = "Vertical"
+        sheet = "Vertical"
         cell = "C5*"
         coords = {'ABC': ['A', 'B', 'C'], 'val': [0, 1, 2, 3, 5, 6, 7, 8]}
         py_name = "test_constant_v2d"
 
         data = pysd.external.ExtConstant(file_name=file_name,
-                                         tab=tab,
+                                         sheet=sheet,
                                          root=_root,
                                          cell=cell,
                                          coords=coords,
@@ -1190,13 +1297,13 @@ def test_constant_hn2d(self):
         import pysd
 
         file_name = "data/input.xlsx"
-        tab = "Horizontal"
+        sheet = "Horizontal"
         cell = "data_2d"
         coords = {'ABC': ['A', 'B', 'C'], 'val': [0, 1, 2, 3, 5, 6, 7, 8]}
         py_name = "test_constant_hn2d"
 
         data = pysd.external.ExtConstant(file_name=file_name,
-                                         tab=tab,
+                                         sheet=sheet,
                                          root=_root,
                                          cell=cell,
                                          coords=coords,
@@ -1212,13 +1319,13 @@ def test_constant_vn2d(self):
         import pysd
 
         file_name = "data/input.xlsx"
-        tab = "Vertical"
+        sheet = "Vertical"
         cell = "data_2d*"
         coords = {'ABC': ['A', 'B', 'C'], 'val': [0, 1, 2, 3, 5, 6, 7, 8]}
         py_name = "test_constant_vn2d"
 
         data = pysd.external.ExtConstant(file_name=file_name,
-                                         tab=tab,
+                                         sheet=sheet,
                                          root=_root,
                                          cell=cell,
                                          coords=coords,
@@ -1234,11 +1341,11 @@ def test_constant_h3d(self):
         import pysd
 
         file_name = "data/input.xlsx"
-        tab = "Horizontal"
+        sheet = "Horizontal"
         cell = "C5"
         cell2 = "C8"
         coords = {'ABC': ['A', 'B', 'C'],
-                   'XY': ['X'],
+                  'XY': ['X'],
                   'val': [0, 1, 2, 3, 5, 6, 7, 8]}
         coords2 = {'ABC': ['A', 'B', 'C'],
                    'XY': ['Y'],
@@ -1246,14 +1353,14 @@ def test_constant_h3d(self):
         py_name = "test_constant_h3d"
 
         data = pysd.external.ExtConstant(file_name=file_name,
-                                         tab=tab,
+                                         sheet=sheet,
                                          root=_root,
                                          cell=cell,
                                          coords=coords,
                                          py_name=py_name)
 
         data.add(file_name=file_name,
-                 tab=tab,
+                 sheet=sheet,
                  cell=cell2,
                  coords=coords2)
 
@@ -1268,7 +1375,7 @@ def test_constant_v3d(self):
         import pysd
 
         file_name = "data/input.xlsx"
-        tab = "Vertical"
+        sheet = "Vertical"
         cell = "C5*"
         cell2 = "F5*"
         coords = {'ABC': ['A', 'B', 'C'],
@@ -1280,14 +1387,14 @@ def test_constant_v3d(self):
         py_name = "test_constant_v3d"
 
         data = pysd.external.ExtConstant(file_name=file_name,
-                                         tab=tab,
+                                         sheet=sheet,
                                          root=_root,
                                          cell=cell,
                                          coords=coords,
                                          py_name=py_name)
 
         data.add(file_name=file_name,
-                 tab=tab,
+                 sheet=sheet,
                  cell=cell2,
                  coords=coords2)
 
@@ -1302,7 +1409,7 @@ def test_constant_hn3d(self):
         import pysd
 
         file_name = "data/input.xlsx"
-        tab = "Horizontal"
+        sheet = "Horizontal"
         cell = "data_2d"
         cell2 = "data_2db"
         coords = {'ABC': ['A', 'B', 'C'],
@@ -1314,14 +1421,14 @@ def test_constant_hn3d(self):
         py_name = "test_constant_hn3d"
 
         data = pysd.external.ExtConstant(file_name=file_name,
-                                         tab=tab,
+                                         sheet=sheet,
                                          root=_root,
                                          cell=cell,
                                          coords=coords,
                                          py_name=py_name)
 
         data.add(file_name=file_name,
-                 tab=tab,
+                 sheet=sheet,
                  cell=cell2,
                  coords=coords2)
 
@@ -1336,7 +1443,7 @@ def test_constant_vn3d(self):
         import pysd
 
         file_name = "data/input.xlsx"
-        tab = "Vertical"
+        sheet = "Vertical"
         cell = "data_2d*"
         cell2 = "data_2db*"
         coords = {'ABC': ['A', 'B', 'C'],
@@ -1348,20 +1455,19 @@ def test_constant_vn3d(self):
         py_name = "test_constant_vn2d"
 
         data = pysd.external.ExtConstant(file_name=file_name,
-                                         tab=tab,
+                                         sheet=sheet,
                                          root=_root,
                                          cell=cell,
                                          coords=coords,
                                          py_name=py_name)
 
         data.add(file_name=file_name,
-                 tab=tab,
+                 sheet=sheet,
                  cell=cell2,
                  coords=coords2)
 
         data.initialize()
 
-        print(data())
         self.assertTrue(data().equals(_exp.constant_3d))
 
 
@@ -1378,7 +1484,7 @@ def test_subscript_h(self):
         import pysd
 
         file_name = "data/input.xlsx"
-        tab = "Horizontal"
+        sheet = "Horizontal"
         firstcell = "C4"
         lastcell = "J4"
         prefix = 'val'
@@ -1386,7 +1492,7 @@ def test_subscript_h(self):
                     'val5', 'val6', 'val7', 'val8']
 
         data = pysd.external.ExtSubscript(file_name=file_name,
-                                          tab=tab,
+                                          sheet=sheet,
                                           root=_root,
                                           firstcell=firstcell,
                                           lastcell=lastcell,
@@ -1401,14 +1507,14 @@ def test_subscript_v(self):
         import pysd
 
         file_name = "data/input.xlsx"
-        tab = "Horizontal"
+        sheet = "Horizontal"
         firstcell = "B5"
         lastcell = "B7"
         prefix = ''
         expected = ['A', 'B', 'C']
 
         data = pysd.external.ExtSubscript(file_name=file_name,
-                                          tab=tab,
+                                          sheet=sheet,
                                           root=_root,
                                           firstcell=firstcell,
                                           lastcell=lastcell,
@@ -1429,7 +1535,7 @@ def test_not_implemented_file(self):
         import pysd
 
         file_name = "data/not_implemented_file.ods"
-        tab = "Horizontal"
+        sheet = "Horizontal"
         time_row_or_col = "4"
         cell = "C5"
         coords = {}
@@ -1437,7 +1543,7 @@ def test_not_implemented_file(self):
         py_name = "test_not_implemented_file"
 
         data = pysd.external.ExtData(file_name=file_name,
-                                     tab=tab,
+                                     sheet=sheet,
                                      time_row_or_col=time_row_or_col,
                                      root=_root,
                                      cell=cell,
@@ -1455,7 +1561,7 @@ def test_non_existent_file(self):
         import pysd
 
         file_name = "data/non_existent.xls"
-        tab = "Horizontal"
+        sheet = "Horizontal"
         time_row_or_col = "4"
         cell = "C5"
         coords = {}
@@ -1463,7 +1569,7 @@ def test_non_existent_file(self):
         py_name = "test_non_existent_file"
 
         data = pysd.external.ExtData(file_name=file_name,
-                                     tab=tab,
+                                     sheet=sheet,
                                      time_row_or_col=time_row_or_col,
                                      root=_root,
                                      cell=cell,
@@ -1481,7 +1587,7 @@ def test_non_existent_sheet_pyxl(self):
         import pysd
 
         file_name = "data/input.xlsx"
-        tab = "Non-Existent"
+        sheet = "Non-Existent"
         time_row_or_col = "time"
         cell = "data_1d"
         coords = {}
@@ -1489,7 +1595,7 @@ def test_non_existent_sheet_pyxl(self):
         py_name = "test_non_existent_sheet_pyxl"
 
         data = pysd.external.ExtData(file_name=file_name,
-                                     tab=tab,
+                                     sheet=sheet,
                                      time_row_or_col=time_row_or_col,
                                      root=_root,
                                      cell=cell,
@@ -1507,7 +1613,7 @@ def test_non_existent_cellrange_name_pyxl(self):
         import pysd
 
         file_name = "data/input.xlsx"
-        tab = "Horizontal"
+        sheet = "Horizontal"
         time_row_or_col = "time"
         cell = "non_exixtent"
         coords = {}
@@ -1515,7 +1621,7 @@ def test_non_existent_cellrange_name_pyxl(self):
         py_name = "est_non_existent_cellrange_name_pyxl"
 
         data = pysd.external.ExtData(file_name=file_name,
-                                     tab=tab,
+                                     sheet=sheet,
                                      time_row_or_col=time_row_or_col,
                                      root=_root,
                                      cell=cell,
@@ -1533,13 +1639,13 @@ def test_non_existent_cellrange_name_in_sheet_pyxl(self):
         import pysd
 
         file_name = "data/input.xlsx"
-        tab = "Horizontal missing"
+        sheet = "Horizontal missing"
         cell = "constant"
         coords = {}
         py_name = "est_non_existent_cellrange_name_in_sheet_pyxl"
 
         data = pysd.external.ExtConstant(file_name=file_name,
-                                         tab=tab,
+                                         sheet=sheet,
                                          root=_root,
                                          cell=cell,
                                          coords=coords,
@@ -1550,24 +1656,26 @@ def test_non_existent_cellrange_name_in_sheet_pyxl(self):
 
     # Following test are for ExtData class only
     # as the initialization of ExtLookup uses the same function
-
     def test_data_interp_h1dm(self):
         """
-        Test for warning 1d horizontal series interpolation with missing data
+        Test for warning 1d horizontal series interpolation when series
+        has missing or NaN data
         """
         import pysd
         from warnings import catch_warnings
 
         file_name = "data/input.xlsx"
-        tab = "Horizontal missing"
+        sheet = "Horizontal missing"
         time_row_or_col = "4"
         cell = "C5"
         coords = {}
         interp = None
         py_name = "test_data_interp_h1dm"
 
+        pysd.external.External.missing = "warning"
+
         data = pysd.external.ExtData(file_name=file_name,
-                                     tab=tab,
+                                     sheet=sheet,
                                      time_row_or_col=time_row_or_col,
                                      root=_root,
                                      cell=cell,
@@ -1581,27 +1689,104 @@ def test_data_interp_h1dm(self):
             self.assertEqual(len(wu), 1)
             self.assertTrue("missing" in str(wu[-1].message))
 
-        print(data.data)
-        for x, y in zip(_exp.xpts, _exp.interp_1d):
-            self.assertEqual(y, data(x), "Wrong result at X=" + str(x))
+        with catch_warnings(record=True) as w:
+            for x, y in zip(_exp.xpts, _exp.interp_1d):
+                self.assertEqual(y, data(x), "Wrong result at X=" + str(x))
+            self.assertEqual(len(w), 2)
+            self.assertTrue("extrapolating data below the minimum value"
+                            + " of the time" in str(w[0].message))
+            self.assertTrue("extrapolating data above the maximum value"
+                            + " of the time" in str(w[1].message))
+
+    def test_data_interp_h1dm_ignore(self):
+        """
+        Test ignore warning 1d horizontal series interpolation when series
+        has missing or NaN data
+        """
+        import pysd
+        from warnings import catch_warnings
+
+        file_name = "data/input.xlsx"
+        sheet = "Horizontal missing"
+        time_row_or_col = "4"
+        cell = "C5"
+        coords = {}
+        interp = None
+        py_name = "test_data_interp_h1dm_ignore"
+
+        pysd.external.External.missing = "ignore"
+
+        data = pysd.external.ExtData(file_name=file_name,
+                                     sheet=sheet,
+                                     time_row_or_col=time_row_or_col,
+                                     root=_root,
+                                     cell=cell,
+                                     coords=coords,
+                                     interp=interp,
+                                     py_name=py_name)
+
+        with catch_warnings(record=True) as w:
+            data.initialize()
+            self.assertEqual(len(w), 0)
+
+        with catch_warnings(record=True) as w:
+            for x, y in zip(_exp.xpts, _exp.interp_1d):
+                self.assertEqual(y, data(x), "Wrong result at X=" + str(x))
+            self.assertEqual(len(w), 2)
+            self.assertTrue("extrapolating data below the minimum value"
+                            + " of the time" in str(w[0].message))
+            self.assertTrue("extrapolating data above the maximum value"
+                            + " of the time" in str(w[1].message))
+
+    def test_data_interp_h1dm_raise(self):
+        """
+        Test error 1d horizontal series interpolation when series
+        has missing or NaN data
+        """
+        import pysd
+
+        file_name = "data/input.xlsx"
+        sheet = "Horizontal missing"
+        time_row_or_col = "4"
+        cell = "C5"
+        coords = {}
+        interp = None
+        py_name = "test_data_interp_h1dm_ignore"
+
+        pysd.external.External.missing = "raise"
+
+        data = pysd.external.ExtData(file_name=file_name,
+                                     sheet=sheet,
+                                     time_row_or_col=time_row_or_col,
+                                     root=_root,
+                                     cell=cell,
+                                     coords=coords,
+                                     interp=interp,
+                                     py_name=py_name)
+
+        with self.assertRaises(ValueError):
+            data.initialize()
 
     def test_data_interp_v1dm(self):
         """
-        Test for warning 1d vertical series interpolation with missing data
+        Test for warning 1d vertical series interpolation when series has
+        missing or NaN data
         """
         import pysd
         from warnings import catch_warnings
 
         file_name = "data/input.xlsx"
-        tab = "Vertical missing"
+        sheet = "Vertical missing"
         time_row_or_col = "B"
         cell = "C5"
         coords = {}
         interp = None
         py_name = "test_data_interp_v1dm"
 
+        pysd.external.External.missing = "warning"
+
         data = pysd.external.ExtData(file_name=file_name,
-                                     tab=tab,
+                                     sheet=sheet,
                                      time_row_or_col=time_row_or_col,
                                      root=_root,
                                      cell=cell,
@@ -1615,8 +1800,83 @@ def test_data_interp_v1dm(self):
             self.assertTrue(issubclass(w[-1].category, UserWarning))
             self.assertTrue("missing" in str(w[-1].message))
 
-        for x, y in zip(_exp.xpts, _exp.interp_1d):
-            self.assertEqual(y, data(x), "Wrong result at X=" + str(x))
+        with catch_warnings(record=True) as w:
+            for x, y in zip(_exp.xpts, _exp.interp_1d):
+                self.assertEqual(y, data(x), "Wrong result at X=" + str(x))
+            self.assertEqual(len(w), 2)
+            self.assertTrue("extrapolating data below the minimum value"
+                            + " of the time" in str(w[0].message))
+            self.assertTrue("extrapolating data above the maximum value"
+                            + " of the time" in str(w[1].message))
+
+    def test_data_interp_v1dm_ignore(self):
+        """
+        Test ignore warning 1d vertical series interpolation when series has
+        missing or NaN data
+        """
+        import pysd
+        from warnings import catch_warnings
+
+        file_name = "data/input.xlsx"
+        sheet = "Vertical missing"
+        time_row_or_col = "B"
+        cell = "C5"
+        coords = {}
+        interp = None
+        py_name = "test_data_interp_v1dm_ignore"
+
+        pysd.external.External.missing = "ignore"
+
+        data = pysd.external.ExtData(file_name=file_name,
+                                     sheet=sheet,
+                                     time_row_or_col=time_row_or_col,
+                                     root=_root,
+                                     cell=cell,
+                                     coords=coords,
+                                     interp=interp,
+                                     py_name=py_name)
+
+        with catch_warnings(record=True) as w:
+            data.initialize()
+            self.assertEqual(len(w), 0)
+
+        with catch_warnings(record=True) as w:
+            for x, y in zip(_exp.xpts, _exp.interp_1d):
+                self.assertEqual(y, data(x), "Wrong result at X=" + str(x))
+            self.assertEqual(len(w), 2)
+            self.assertTrue("extrapolating data below the minimum value"
+                            + " of the time" in str(w[0].message))
+            self.assertTrue("extrapolating data above the maximum value"
+                            + " of the time" in str(w[1].message))
+
+    def test_data_interp_v1dm_raise(self):
+        """
+        Test error 1d vertical series interpolation when series has
+        missing or NaN data
+        """
+        import pysd
+
+        file_name = "data/input.xlsx"
+        sheet = "Vertical missing"
+        time_row_or_col = "B"
+        cell = "C5"
+        coords = {}
+        interp = None
+        py_name = "test_data_interp_v1dm_ignore"
+
+        pysd.external.External.missing = "raise"
+
+        data = pysd.external.ExtData(file_name=file_name,
+                                     sheet=sheet,
+                                     time_row_or_col=time_row_or_col,
+                                     root=_root,
+                                     cell=cell,
+                                     coords=coords,
+                                     interp=interp,
+                                     py_name=py_name)
+
+        with self.assertRaises(ValueError):
+            data.initialize()
 
     def test_data_interp_hn1dm(self):
         """
@@ -1627,15 +1887,17 @@ def test_data_interp_hn1dm(self):
         from warnings import catch_warnings
 
         file_name = "data/input.xlsx"
-        tab = "Horizontal missing"
+        sheet = "Horizontal missing"
         time_row_or_col = "time_missing"
         cell = "data_1d"
         coords = {}
         interp = None
         py_name = "test_data_interp_h1dm"
 
+        pysd.external.External.missing = "warning"
+
         data = pysd.external.ExtData(file_name=file_name,
-                                     tab=tab,
+                                     sheet=sheet,
                                      time_row_or_col=time_row_or_col,
                                      root=_root,
                                      cell=cell,
@@ -1649,8 +1911,218 @@ def test_data_interp_hn1dm(self):
             self.assertTrue(issubclass(w[-1].category, UserWarning))
             self.assertTrue("missing" in str(w[-1].message))
 
-        for x, y in zip(_exp.xpts, _exp.interp_1d):
-            self.assertEqual(y, data(x), "Wrong result at X=" + str(x))
+        with catch_warnings(record=True) as w:
+            for x, y in zip(_exp.xpts, _exp.interp_1d):
+                self.assertEqual(y, data(x), "Wrong result at X=" + str(x))
+            self.assertEqual(len(w), 2)
+            self.assertTrue("extrapolating data below the minimum value"
+                            + " of the time" in str(w[0].message))
+            self.assertTrue("extrapolating data above the maximum value"
+                            + " of the time" in str(w[1].message))
+
+    def test_data_interp_hn1dm_ignore(self):
+        """
+        Test ignore warning 1d horizontal series by cellrange names
+        when series has missing or NaN data
+        """
+        import pysd
+        from warnings import catch_warnings
+
+        file_name = "data/input.xlsx"
+        sheet = "Horizontal missing"
+        time_row_or_col = "time_missing"
+        cell = "data_1d"
+        coords = {}
+        interp = None
+        py_name = "test_data_interp_h1dm_ignore"
+
+        pysd.external.External.missing = "ignore"
+
+        data = pysd.external.ExtData(file_name=file_name,
+                                     sheet=sheet,
+                                     time_row_or_col=time_row_or_col,
+                                     root=_root,
+                                     cell=cell,
+                                     coords=coords,
+                                     interp=interp,
+                                     py_name=py_name)
+
+        with catch_warnings(record=True) as w:
+            data.initialize()
+            self.assertEqual(len(w), 0)
+
+        with catch_warnings(record=True) as w:
+            for x, y in zip(_exp.xpts, _exp.interp_1d):
+                self.assertEqual(y, data(x), "Wrong result at X=" + str(x))
+            self.assertEqual(len(w), 2)
+            self.assertTrue("extrapolating data below the minimum value"
+                            + " of the time" in str(w[0].message))
+            self.assertTrue("extrapolating data above the maximum value"
+                            + " of the time" in str(w[1].message))
+
+    def test_data_interp_hn1dm_raise(self):
+        """
+        Test for error 1d horizontal series by cellrange names
+        when series has missing or NaN data
+        """
+        import pysd
+
+        file_name = "data/input.xlsx"
+        sheet = "Horizontal missing"
+        time_row_or_col = "time_missing"
+        cell = "data_1d"
+        coords = {}
+        interp = None
+        py_name = "test_data_interp_h1dm_raise"
+
+        pysd.external.External.missing = "raise"
+
+        data = pysd.external.ExtData(file_name=file_name,
+                                     sheet=sheet,
+                                     time_row_or_col=time_row_or_col,
+                                     root=_root,
+                                     cell=cell,
+                                     coords=coords,
+                                     interp=interp,
+                                     py_name=py_name)
+
+        with self.assertRaises(ValueError):
+            data.initialize()
+
+    def test_data_interp_hn3dmd(self):
+        """
+        Test for warning 3d horizontal series interpolation by cellrange names
+        with missing data values. More cases are tested with test-models
+        """
+        import pysd
+        from warnings import catch_warnings
+
+        file_name = "data/input.xlsx"
+        sheet = "Horizontal missing"
+        time_row_or_col = "time"
+        cell_1 = "data_2d"
+        cell_2 = "data_2db"
+        coords_1 = {'XY': ['X'], 'ABC': ['A', 'B', 'C']}
+        coords_2 = {'XY': ['Y'], 'ABC': ['A', 'B', 'C']}
+        interp = "interpolate"
+        py_name = "test_data_interp_hn3dmd"
+
+        pysd.external.External.missing = "warning"
+
+        data = pysd.external.ExtData(file_name=file_name,
+                                     sheet=sheet,
+                                     time_row_or_col=time_row_or_col,
+                                     root=_root,
+                                     cell=cell_1,
+                                     interp=interp,
+                                     coords=coords_1,
+                                     py_name=py_name)
+
+        data.add(file_name=file_name,
+                 sheet=sheet,
+                 time_row_or_col=time_row_or_col,
+                 cell=cell_2,
+                 interp=interp,
+                 coords=coords_2)
+
+        with catch_warnings(record=True) as ws:
+            data.initialize()
+            self.assertTrue(np.all(
+                [issubclass(w.category, UserWarning) for w in ws]
+                ))
+            self.assertTrue(np.all(
+                ["missing" in str(w.message) for w in ws]
+                ))
+
+        with catch_warnings(record=True) as w:
+            for x, y in zip(_exp.xpts, _exp.interp_3d):
+                self.assertTrue(y.equals(data(x)),
+                                "Wrong result at X=" + str(x))
+            self.assertEqual(len(w), 2)
+            self.assertTrue("extrapolating data below the minimum value"
+                            + " of the time" in str(w[0].message))
+            self.assertTrue("extrapolating data above the maximum value"
+                            + " of the time" in str(w[1].message))
+
+    def test_lookup_hn3dmd_raise(self):
+        """
+        Test for error 3d horizontal series interpolation with missing data
+        values.
+        """
+        import pysd
+
+        file_name = "data/input.xlsx"
+        sheet = "Horizontal missing"
+        x_row_or_col = "15"
+        cell_1 = "C16"
+        cell_2 = "C19"
+        coords_1 = {'XY': ['X'], 'ABC': ['A', 'B', 'C']}
+        coords_2 = {'XY': ['Y'], 'ABC': ['A', 'B', 'C']}
+        py_name = "test_lookup_hn3dmd"
+        pysd.external.External.missing = "raise"
+
+        data = pysd.external.ExtLookup(file_name=file_name,
+                                       sheet=sheet,
+                                       x_row_or_col=x_row_or_col,
+                                       root=_root,
+                                       cell=cell_1,
+                                       coords=coords_1,
+                                       py_name=py_name)
+
+        data.add(file_name=file_name,
+                 sheet=sheet,
+                 x_row_or_col=x_row_or_col,
+                 cell=cell_2,
+                 coords=coords_2)
+
+        with self.assertRaises(ValueError):
+            data.initialize()
+
+    def test_lookup_hn3dmd_ignore(self):
+        """
+        Test for ignore warnings 3d horizontal series interpolation with
+        missing data values.
+        """
+        import pysd
+        from warnings import catch_warnings
+
+        file_name = "data/input.xlsx"
+        sheet = "Horizontal missing"
+        x_row_or_col = "15"
+        cell_1 = "C16"
+        cell_2 = "C19"
+        coords_1 = {'XY': ['X'], 'ABC': ['A', 'B', 'C']}
+        coords_2 = {'XY': ['Y'], 'ABC': ['A', 'B', 'C']}
+        py_name = "test_lookup_hn3dmd"
+        pysd.external.External.missing = "ignore"
+
+        data = pysd.external.ExtLookup(file_name=file_name,
+                                       sheet=sheet,
+                                       x_row_or_col=x_row_or_col,
+                                       root=_root,
+                                       cell=cell_1,
+                                       coords=coords_1,
+                                       py_name=py_name)
+
+        data.add(file_name=file_name,
+                 sheet=sheet,
+                 x_row_or_col=x_row_or_col,
+                 cell=cell_2,
+                 coords=coords_2)
+
+        with catch_warnings(record=True) as ws:
+            data.initialize()
+            self.assertEqual(len(ws), 0)
+
+        with catch_warnings(record=True) as w:
+            for x, y in zip(_exp.xpts, _exp.interp_3d):
+                self.assertTrue(y.equals(data(x)),
+                                "Wrong result at X=" + str(x))
+            self.assertEqual(len(w), 2)
+            self.assertTrue("extrapolating data below the minimum value"
+                            + " of the series" in str(w[0].message))
+            self.assertTrue("extrapolating data above the maximum value"
+                            + " of the series" in str(w[1].message))
 
     def test_data_interp_h1d0(self):
         """
@@ -1659,7 +2131,7 @@ def test_data_interp_h1d0(self):
         import pysd
 
         file_name = "data/input.xlsx"
-        tab = "Horizontal missing"
+        sheet = "Horizontal missing"
         time_row_or_col = "3"
         cell = "C5"
         coords = {}
@@ -1667,7 +2139,7 @@ def test_data_interp_h1d0(self):
         py_name = "test_data_interp_h1d0"
 
         data = pysd.external.ExtData(file_name=file_name,
-                                     tab=tab,
+                                     sheet=sheet,
                                      time_row_or_col=time_row_or_col,
                                      root=_root,
                                      cell=cell,
@@ -1685,7 +2157,7 @@ def test_data_interp_v1d0(self):
         import pysd
 
         file_name = "data/input.xlsx"
-        tab = "Vertical missing"
+        sheet = "Vertical missing"
         time_row_or_col = "A"
         cell = "C5"
         coords = {}
@@ -1693,7 +2165,7 @@ def test_data_interp_v1d0(self):
         py_name = "test_data_interp_v1d0"
 
         data = pysd.external.ExtData(file_name=file_name,
-                                     tab=tab,
+                                     sheet=sheet,
                                      time_row_or_col=time_row_or_col,
                                      root=_root,
                                      cell=cell,
@@ -1712,7 +2184,7 @@ def test_data_interp_hn1d0(self):
         import pysd
 
         file_name = "data/input.xlsx"
-        tab = "Horizontal missing"
+        sheet = "Horizontal missing"
         time_row_or_col = "len_0"
         cell = "data_1d"
         coords = {}
@@ -1720,7 +2192,7 @@ def test_data_interp_hn1d0(self):
         py_name = "test_data_interp_h1d0"
 
         data = pysd.external.ExtData(file_name=file_name,
-                                     tab=tab,
+                                     sheet=sheet,
                                      time_row_or_col=time_row_or_col,
                                      root=_root,
                                      cell=cell,
@@ -1734,12 +2206,12 @@ def test_data_interp_hn1d0(self):
     def test_data_interp_hn1dt(self):
         """
         Test for error in series by cellrange names
-        when series is a table
+        when series is a sheetle
         """
         import pysd
 
         file_name = "data/input.xlsx"
-        tab = "Horizontal"
+        sheet = "Horizontal"
         time_row_or_col = "data_2d"
         cell = "data_1d"
         coords = {}
@@ -1747,7 +2219,7 @@ def test_data_interp_hn1dt(self):
         py_name = "test_data_interp_h1dt"
 
         data = pysd.external.ExtData(file_name=file_name,
-                                     tab=tab,
+                                     sheet=sheet,
                                      time_row_or_col=time_row_or_col,
                                      root=_root,
                                      cell=cell,
@@ -1766,7 +2238,7 @@ def test_data_interp_hns(self):
         import pysd
 
         file_name = "data/input.xlsx"
-        tab = "Horizontal"
+        sheet = "Horizontal"
         time_row_or_col = "time"
         cell = "data_2d"
         coords = {'ABC': ['A', 'B']}
@@ -1774,7 +2246,7 @@ def test_data_interp_hns(self):
         py_name = "test_data_interp_hns"
 
         data = pysd.external.ExtData(file_name=file_name,
-                                     tab=tab,
+                                     sheet=sheet,
                                      time_row_or_col=time_row_or_col,
                                      root=_root,
                                      cell=cell,
@@ -1793,7 +2265,7 @@ def test_data_interp_vnss(self):
         import pysd
 
         file_name = "data/input.xlsx"
-        tab = "Vertical missing"
+        sheet = "Vertical missing"
         time_row_or_col = "time_short"
         cell = "data_2d_short"
         coords = {'ABC': ['A', 'B', 'C']}
@@ -1801,7 +2273,7 @@ def test_data_interp_vnss(self):
         py_name = "test_data_interp_vnss"
 
         data = pysd.external.ExtData(file_name=file_name,
-                                     tab=tab,
+                                     sheet=sheet,
                                      time_row_or_col=time_row_or_col,
                                      root=_root,
                                      cell=cell,
@@ -1821,7 +2293,7 @@ def test_data_interp_hnnm(self):
         import pysd
 
         file_name = "data/input.xlsx"
-        tab = "No monotonous"
+        sheet = "No monotonous"
         time_row_or_col = "time"
         cell = "data_1d"
         coords = {}
@@ -1829,7 +2301,7 @@ def test_data_interp_hnnm(self):
         py_name = "test_data_interp_hnnm"
 
         data = pysd.external.ExtData(file_name=file_name,
-                                     tab=tab,
+                                     sheet=sheet,
                                      time_row_or_col=time_row_or_col,
                                      root=_root,
                                      cell=cell,
@@ -1847,7 +2319,7 @@ def test_data_h3d_interpnv(self):
         import pysd
 
         file_name = "data/input.xlsx"
-        tab = "Horizontal"
+        sheet = "Horizontal"
         time_row_or_col = "4"
         cell = "C5"
         coords = {'ABC': ['A', 'B', 'C'], 'XY': ['X']}
@@ -1856,7 +2328,7 @@ def test_data_h3d_interpnv(self):
 
         with self.assertRaises(ValueError):
             pysd.external.ExtData(file_name=file_name,
-                                  tab=tab,
+                                  sheet=sheet,
                                   time_row_or_col=time_row_or_col,
                                   root=_root,
                                   cell=cell,
@@ -1871,7 +2343,7 @@ def test_data_h3d_interp(self):
         import pysd
 
         file_name = "data/input.xlsx"
-        tab = "Horizontal"
+        sheet = "Horizontal"
         time_row_or_col = "4"
         cell_1 = "C5"
         cell_2 = "C8"
@@ -1882,7 +2354,7 @@ def test_data_h3d_interp(self):
         py_name = "test_data_h3d_interp"
 
         data = pysd.external.ExtData(file_name=file_name,
-                                     tab=tab,
+                                     sheet=sheet,
                                      time_row_or_col=time_row_or_col,
                                      root=_root,
                                      cell=cell_1,
@@ -1892,7 +2364,7 @@ def test_data_h3d_interp(self):
 
         with self.assertRaises(ValueError):
             data.add(file_name=file_name,
-                     tab=tab,
+                     sheet=sheet,
                      time_row_or_col=time_row_or_col,
                      cell=cell_2,
                      coords=coords_2,
@@ -1905,7 +2377,7 @@ def test_data_h3d_add(self):
         import pysd
 
         file_name = "data/input.xlsx"
-        tab = "Horizontal"
+        sheet = "Horizontal"
         time_row_or_col = "4"
         cell_1 = "C5"
         cell_2 = "C8"
@@ -1915,7 +2387,7 @@ def test_data_h3d_add(self):
         py_name = "test_data_h3d_add"
 
         data = pysd.external.ExtData(file_name=file_name,
-                                     tab=tab,
+                                     sheet=sheet,
                                      time_row_or_col=time_row_or_col,
                                      root=_root,
                                      cell=cell_1,
@@ -1925,7 +2397,7 @@ def test_data_h3d_add(self):
 
         with self.assertRaises(ValueError):
             data.add(file_name=file_name,
-                     tab=tab,
+                     sheet=sheet,
                      time_row_or_col=time_row_or_col,
                      cell=cell_2,
                      coords=coords_2,
@@ -1938,7 +2410,7 @@ def test_lookup_h3d_add(self):
         import pysd
 
         file_name = "data/input.xlsx"
-        tab = "Horizontal"
+        sheet = "Horizontal"
         x_row_or_col = "4"
         cell_1 = "C5"
         cell_2 = "C8"
@@ -1947,7 +2419,7 @@ def test_lookup_h3d_add(self):
         py_name = "test_lookup_h3d_add"
 
         data = pysd.external.ExtLookup(file_name=file_name,
-                                       tab=tab,
+                                       sheet=sheet,
                                        x_row_or_col=x_row_or_col,
                                        root=_root,
                                        cell=cell_1,
@@ -1956,7 +2428,7 @@ def test_lookup_h3d_add(self):
 
         with self.assertRaises(ValueError):
             data.add(file_name=file_name,
-                     tab=tab,
+                     sheet=sheet,
                      x_row_or_col=x_row_or_col,
                      cell=cell_2,
                      coords=coords_2)
@@ -1968,7 +2440,7 @@ def test_constant_h3d_add(self):
         import pysd
 
         file_name = "data/input.xlsx"
-        tab = "Horizontal"
+        sheet = "Horizontal"
         cell = "C5"
         cell2 = "C8"
         coords = {'XY': ['X'],
@@ -1980,7 +2452,7 @@ def test_constant_h3d_add(self):
         py_name = "test_constant_h3d_add"
 
         data = pysd.external.ExtConstant(file_name=file_name,
-                                         tab=tab,
+                                         sheet=sheet,
                                          root=_root,
                                          cell=cell,
                                          coords=coords,
@@ -1988,7 +2460,7 @@ def test_constant_h3d_add(self):
 
         with self.assertRaises(ValueError):
             data.add(file_name=file_name,
-                     tab=tab,
+                     sheet=sheet,
                      cell=cell2,
                      coords=coords2)
 
@@ -2000,14 +2472,14 @@ def test_lookup_h1d_nf(self):
         import xarray as xr
 
         file_name = "data/input.xlsx"
-        tab = "Horizontal"
+        sheet = "Horizontal"
         x_row_or_col = "4"
         cell = "C5"
         coords = {}
         py_name = "test_lookup_h1d"
 
         data = pysd.external.ExtLookup(file_name=file_name,
-                                       tab=tab,
+                                       sheet=sheet,
                                        x_row_or_col=x_row_or_col,
                                        root=_root,
                                        cell=cell,
@@ -2031,13 +2503,13 @@ def test_constant_hns(self):
         import pysd
 
         file_name = "data/input.xlsx"
-        tab = "Horizontal"
+        sheet = "Horizontal"
         cell = "data_2d"
         coords = {'ABC': ['A', 'B']}
         py_name = "test_constant_hns"
 
         data = pysd.external.ExtConstant(file_name=file_name,
-                                         tab=tab,
+                                         sheet=sheet,
                                          root=_root,
                                          cell=cell,
                                          coords=coords,
@@ -2045,4 +2517,3 @@ def test_constant_hns(self):
 
         with self.assertRaises(ValueError):
             data.initialize()
-
diff --git a/tests/unit_test_functions.py b/tests/unit_test_functions.py
index 191f1205..7a6aa2da 100644
--- a/tests/unit_test_functions.py
+++ b/tests/unit_test_functions.py
@@ -14,6 +14,8 @@ def test_ramp(self):
 
         self.assertEqual(functions.ramp(lambda: 24, .5, 10, 18), 4)
 
+        self.assertEqual(functions.ramp(lambda: 24, .5, 10, -1), 7)
+
     def test_step(self):
         from pysd import functions
 
@@ -502,3 +504,11 @@ def test_vmax(self):
         self.assertEqual(pysd.functions.vmax(data, dim=['d1', 'd2']), 4)
         self.assertEqual(pysd.functions.vmax(data), 4)
 
+    def test_incomplete(self):
+        import pysd
+        from warnings import catch_warnings
+
+        with catch_warnings(record=True) as w:
+            pysd.functions.incomplete()
+            self.assertEqual(len(w), 1)
+            self.assertTrue('Call to undefined function' in str(w[-1].message))
diff --git a/tests/unit_test_pysd.py b/tests/unit_test_pysd.py
index 533fd423..00ab7270 100644
--- a/tests/unit_test_pysd.py
+++ b/tests/unit_test_pysd.py
@@ -76,6 +76,39 @@ def test_run(self):
         self.assertGreater(len(stocks), 3)  # has multiple rows
         self.assertTrue(stocks.notnull().all().all())  # there are no null values in the set
 
+    def test_run_ignore_missing(self):
+        import pysd
+        from warnings import catch_warnings
+
+        model_mdl = 'test-models/tests/get_with_missing_values_xlsx/'\
+                    + 'test_get_with_missing_values_xlsx.mdl'
+        model_py = 'test-models/tests/get_with_missing_values_xlsx/'\
+                    + 'test_get_with_missing_values_xlsx.py'
+
+        with catch_warnings(record=True) as ws:
+            # warnings for missing values
+            model = pysd.read_vensim(model_mdl, missing_values="ignore")
+            self.assertTrue(all(["missing" not in str(w.message) for w in ws]))
+        
+        with catch_warnings(record=True) as ws:
+            # warnings for missing values
+            model.run()
+            self.assertTrue(all(["missing" not in str(w.message) for w in ws]))
+
+        with catch_warnings(record=True) as ws:
+            # ignore warnings for missing values
+            model = pysd.load(model_py)
+            self.assertTrue(any(["missing" in str(w.message) for w in ws]))
+
+        with catch_warnings(record=True) as ws:
+            # ignore warnings for missing values
+            model.run()
+            self.assertTrue(any(["missing" in str(w.message) for w in ws]))
+
+        with self.assertRaises(ValueError):
+            # errors for missing values
+            pysd.load(model_py, missing_values="raise")
+
     def test_run_includes_last_value(self):
         import pysd
         model = pysd.read_vensim(test_model)
@@ -1012,6 +1045,51 @@ def test_restart_cache(self):
         self.assertEqual(new, 345)
         self.assertNotEqual(old, new)
 
+    def test_circular_reference(self):
+        import os
+        import pysd
+
+        model_main = """
+        from pysd import cache, external
+        from pysd.py_backend.functions import Integ, Delay
+
+        _subscript_dict = {}
+        _namespace = {'integ': 'integ', 'delay': 'delay'}
+        __pysd_version__ = "1.1.1"
+
+        __data = {'scope': None, 'time': lambda: 0}
+
+        def _init_outer_references(data):
+            for key in data:
+                __data[key] = data[key]
+
+        def time():
+            return __data["time"]()
+
+        def initial_time():
+            return 0
+
+        def integ():
+            return _integ_integ()
+
+        def delay():
+            return _delay_delay()
+
+        _integ_integ = Integ(lambda: 2, lambda: delay())
+
+        _delay_delay = Delay(lambda: 2, lambda: 1, lambda: integ(), 1)
+        """
+
+        model_main = model_main.replace("\n        ", "\n")
+
+        with open("circular.py", "w") as f:
+            f.write(model_main)
+
+        with self.assertRaises(KeyError):
+            pysd.load("circular.py")
+
+        os.remove("circular.py")
+ 
 
 class TestMultiRun(unittest.TestCase):
     def test_delay_reinitializes(self):
diff --git a/tests/unit_test_testing.py b/tests/unit_test_testing.py
index 78498e8b..577f0ba5 100644
--- a/tests/unit_test_testing.py
+++ b/tests/unit_test_testing.py
@@ -9,7 +9,7 @@
 class TestBoundsChecker(unittest.TestCase):
     @classmethod
     def setUpClass(cls):
-        cls.file_name = 'test_range.xls'
+        cls.file_name = 'test_range.xlsx'
         model = pysd.read_vensim('test-models/tests/variable_ranges/test_variable_ranges.mdl')
         pysd.testing.create_bounds_test_matrix(model, cls.file_name)
         cls.bounds = pysd.testing.create_bounds_test_matrix(model, filename=None)
@@ -55,7 +55,7 @@ def tearDownClass(cls):
 class TestExtremeConditions(unittest.TestCase):
     @classmethod
     def setUpClass(cls):
-        cls.file_name = 'test_extremes_empty.xls'
+        cls.file_name = 'test_extremes_empty.xlsx'
         cls.model_file = 'test-models/tests/variable_ranges/test_variable_ranges.mdl'
         cls.model = pysd.read_vensim('test-models/tests/variable_ranges/test_variable_ranges.mdl')
         pysd.testing.create_extreme_conditions_test_matrix(cls.model, cls.file_name)
diff --git a/tests/unit_test_utils.py b/tests/unit_test_utils.py
index 2c4ce3b7..bdff5fe7 100644
--- a/tests/unit_test_utils.py
+++ b/tests/unit_test_utils.py
@@ -249,6 +249,49 @@ def test_compute_shape_reshape(self):
                     with self.assertRaises(ValueError):
                         compute_shape(c, i+1)
 
+    def test_rearrange(self):
+        import pysd
+
+        rearrange = pysd.utils.rearrange
+        # simple cases are tested, complex cases are tested with test-models
+        _subscript_dict = {
+            'd1': ['a', 'b', 'c'],
+            'd2': ['b', 'c'],
+            'd3': ['b', 'c']
+        }
+
+        xr_input_subdim = xr.DataArray([1, 4, 2],
+            {'d1': ['a', 'b', 'c']}, ['d1'])
+        xr_input_updim = xr.DataArray([1, 4],
+            {'d2': ['b', 'c']}, ['d2'])
+        xr_input_switch = xr.DataArray([[1, 4],[8, 5]],
+            {'d2': ['b', 'c'], 'd3': ['b', 'c']}, ['d2', 'd3'])
+        xr_input_float = 3.
+
+        xr_out_subdim = xr.DataArray([4, 2],
+            {'d2': ['b', 'c']}, ['d2'])
+        xr_out_updim = xr.DataArray([[1, 1], [4, 4]],
+            {'d2': ['b', 'c'], 'd3': ['b', 'c']}, ['d2', 'd3'])
+        xr_out_switch = xr.DataArray([[1, 4],[8, 5]],
+            {'d2': ['b', 'c'], 'd3': ['b', 'c']}, ['d3', 'd2'])
+        xr_out_float = xr.DataArray(3.,
+            {'d2': ['b', 'c']}, ['d2'])
+
+        self.assertTrue(xr_out_subdim.equals(
+            rearrange(xr_input_subdim, ['d2'], _subscript_dict)))
+
+        self.assertTrue(xr_out_updim.equals(
+            rearrange(xr_input_updim, ['d2', 'd3'], _subscript_dict)))
+
+        self.assertTrue(xr_out_switch.equals(
+            rearrange(xr_input_switch, ['d3', 'd2'], _subscript_dict)))
+
+        self.assertTrue(xr_out_float.equals(
+            rearrange(xr_input_float, ['d2'], _subscript_dict)))
+
+        self.assertEqual(None,
+            rearrange(None, ['d2'], _subscript_dict))
+
     def test_round_(self):
         import pysd
         coords = {'d1': [9, 1], 'd2': [2, 4]}
diff --git a/tests/unit_test_vensim2py.py b/tests/unit_test_vensim2py.py
index c72aab88..eb105f72 100644
--- a/tests/unit_test_vensim2py.py
+++ b/tests/unit_test_vensim2py.py
@@ -328,45 +328,67 @@ def test_subscript_3d_depth(self):
         self.assertEqual(a.loc[{'Dim1': 'A', 'Dim2': 'D'}], 1)
         self.assertEqual(a.loc[{'Dim1': 'B', 'Dim2': 'E'}], 4)
 
-    @unittest.skip('in branch')
     def test_subscript_reference(self):
         from pysd.py_backend.vensim.vensim2py import parse_general_expression
         res = parse_general_expression({'expr': 'Var A[Dim1, Dim2]'},
                                      {'Var A': 'var_a'},
                                      {'Dim1': ['A', 'B'],
-                                      'Dim2': ['C', 'D', 'E']})
+                                      'Dim2': ['C', 'D', 'E']},
+                                     None,
+                                     {'var_a': ['Dim1', 'Dim2']})
 
         self.assertEqual(res[0]['py_expr'], 'var_a()')
 
         res = parse_general_expression({'expr': 'Var B[Dim1, C]'},
                                      {'Var B': 'var_b'},
                                      {'Dim1': ['A', 'B'],
-                                      'Dim2': ['C', 'D', 'E']})
-        self.assertEqual(res[0]['py_expr'], "var_b().loc[{'Dim2': ['C']}]")
+                                      'Dim2': ['C', 'D', 'E']},
+                                     None,
+                                     {'var_b': ['Dim1', 'Dim2']})
+
+        self.assertEqual(res[0]['py_expr'],
+            "var_b().loc[{'Dim2': ['C']}].squeeze()"
+            + ".reset_coords(['Dim2'], drop=True)")
 
         res = parse_general_expression({'expr': 'Var C[Dim1, C, H]'},
                                      {'Var C': 'var_c'},
                                      {'Dim1': ['A', 'B'],
                                       'Dim2': ['C', 'D', 'E'],
-                                      'Dim3': ['F', 'G', 'H', 'I']})
-        self.assertEqual(res[0]['py_expr'], "var_c().loc[{'Dim2': ['C'], 'Dim3': ['H']}]")
+                                      'Dim3': ['F', 'G', 'H', 'I']},
+                                     None,
+                                     {'var_c': ['Dim1', 'Dim2', 'Dim3']})
+
+        self.assertEqual(res[0]['py_expr'],
+            "var_c().loc[{'Dim2': ['C'], 'Dim3': ['H']}].squeeze()"
+            + ".reset_coords(['Dim2', 'Dim3'], drop=True)")
 
-    @unittest.skip('in branch')
     def test_subscript_ranges(self):
         from pysd.py_backend.vensim.vensim2py import parse_general_expression
         res = parse_general_expression({'expr': 'Var D[Range1]'},
                                      {'Var D': 'var_c'},
                                      {'Dim1': ['A', 'B', 'C', 'D', 'E', 'F'],
-                                      'Range1': ['C', 'D', 'E']})
-        self.assertEqual(res[0]['py_expr'], "var_c().loc[{'Dim1': ['C', 'D', 'E']}]")
+                                      'Range1': ['C', 'D', 'E']},
+                                     None,
+                                     {'var_c': ['Dim1']})
+
+        self.assertEqual(res[0]['py_expr'], "rearrange(var_c(),['Range1'],_subscript_dict)")
 
-    @unittest.skip('need to write this properly')
     def test_incomplete_expression(self):
         from pysd.py_backend.vensim.vensim2py import parse_general_expression
-        res = parse_general_expression({'expr': 'A FUNCTION OF(Unspecified Eqn,Var A,Var B)'},
-                                       {'Unspecified Eqn': 'unspecified_eqn',
-                                        'Var A': 'var_a',
-                                        'Var B': 'var_b'})
+        from warnings import catch_warnings
+
+        with catch_warnings(record=True) as w:
+            res = parse_general_expression({
+                'expr': 'A FUNCTION OF(Unspecified Eqn,Var A,Var B)',
+                'real_name': 'Incomplete Func'
+                },
+                {'Unspecified Eqn': 'unspecified_eqn',
+                 'Var A': 'var_a',
+                 'Var B': 'var_b'})
+            self.assertEqual(len(w), 1)
+            self.assertTrue('Incomplete Func has no equation specified'
+                            in str(w[-1].message))
+
         self.assertEqual(res[0]['py_expr'],
                          "incomplete(unspecified_eqn(), var_a(), var_b())"
                          )