apsimNGpy


NameapsimNGpy JSON
Version 0.0.26 PyPI version JSON
download
home_pagehttps://github.com/MAGALA-RICHARD/apsimNGpy.git
Summaryapsimx next generation package interface
upload_time2024-03-01 16:16:56
maintainer
docs_urlNone
authorRichard Magala
requires_python
licenseMIT
keywords python apsim next generation pythonnet crop modeling
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            apsimNGpy: The Next Generation Agroecosytem Simulation Library
====================================================================

Our cutting-edge open-source framework, apsimNGpy, empowers advanced agroecosystem modeling through the utilization
of object-oriented principles. It features fast batch file simulation, model prediction, evaluation,
apsimx file editing, seamless weather data retrieval, and efficient soil profile development

Requirements
***********************************************************************************
1. Dotnet, install from https://learn.microsoft.com/en-us/dotnet/core/install/
2. Python3
3. APSIM: Add the directory containing the models executable to the system's PATH or python path (to locate the required .dll files). This can be achieved in either of the following ways:
4. Utilize the APSIM installer provided for this purpose.
5. Build APSIM from its source code. This is comming soon
6. Minimum; 8GM RAM, CPU Core i7

.. _Installation:

Installation
********************************************************************************

All versions are currently in development, phase and they can be installed as follows:

- Method 1. install from PyPI

.. code:: bash

    pip install apsimNGpy

- Method 1. clone the current development repositry    

.. code:: bash

    git clone https://github.com/MAGALA-RICHARD/apsimNGpy.git@dev
    cd apsimNGpy
    pip install .

- Method 2. Use pip straight away and install from github

.. code:: bash

     pip install git+https://github.com/MAGALA-RICHARD/apsimNGpy.git@dev


Debugging import error due to improper SYSTEM APSIM path configuration
*********************************************************************************

If you have apsim installed and the program refuses to load run the following code at the top of your python script
before importing any apsimNGpy class, especially class from ApsimNGpy.core modules The classes are  CamelCased.

.. code:: python

    # search for the program binary installation path and add to os.environ as follows
    import os
    os.environ['APSIM'] =r'path/toyourapsimbinaryfolder/bin
    # try importing SoilModel class
    from apsimNGpy.core.apsim import ApsimModel
    # alternatively, you can add the path to the system environmental variables

.. _Usage:

The above code is also applicable for running different versions of APSIM models. Please note that if your APSIM installation hasn't been added to the system path, this script line should always be placed at the beginning of your simulation script.

Required Dependencies:
*****************************

- numpy
- pandas
- pythonnet
- xmltodict
- tqdm
- requests

Please note that apsimNGpy is tested on Python 3. We are not aware of its performance in Python 2 because it utilizes some of the new libraries like pathlib and f-strings.

Usage
*********************************************************************************
.. code:: python

    import apsimNGpy
    from apsimNGpy.core.base_data import LoadExampleFiles
    from apsimNGpy.core.apsim  import ApsimModel as SoilModel
    from pathlib import Path
    import os
    from apsimNGpy.validation.visual import plot_data
    cwd = Path.cwd().home() # sending this to your home folder
    wd = cwd.joinpath("apsimNGpy_demo")
    if not wd.exists():
      os.mkdir(wd)
    # change directory
    os.chdir(wd)
    # Create the data
    data = LoadExampleFiles(wd)
    # Get maize model
    maize = data.get_maize

    # Initialize the simulation methods
    apsim = SoilModel(maize, copy=True)

    # Run the file
    apsim.run() # use run to print time taken to excute or run the model 
    # print the results
    print(apsim.results) # prints all data frames in the storage domain subset usign report names
    # check the manager modules in the apsim simulation file
    # first get the simualtion names
    sim_name = apsim.extract_simulation_name
    apsim.examine_management_info(simulations=sim_name)
    # show current simulation in apsim GUI
    # plot the data
    res = apsim.results['MaizeR']
    plot_data(res.Year, res.Yield, xlabel='Years', ylabel=" Maize Yield (kg/ha)")
    
A graph should be able to appear like the ones below. Note that plot_data function just wraps matplotlib plot function
for quick visualisation

Congratulations you have successfuly used apsimNGpy package
*********************************************************************************
.. image:: ./apsimNGpy/examples/Figure_1.png
   :alt: /examples/Figure_1.png

Change APSIM simulation dates 
*********************************************************************************
.. code:: python

    import apsimNGpy
    from apsimNGpy.core.base_data import LoadExampleFiles
    from apsimNGpy.core.apsim  import ApsimModel as SoilModel
    from pathlib import Path
    import os
    from apsimNGpy.validation.visual import plot_data
    cwd = Path.cwd().home() # sending this to your home folder
    wd = cwd.joinpath("apsimNGpy_demo")
    if not wd.exists():
      os.mkdir(wd)
    # change directory
    os.chdir(wd)
    # Create the data
    data = LoadExampleFiles(wd)

    # Get maize model
    maize = data.get_maize

    # Initialize the simulation methods
    apsim = SoilModel(maize, copy=True)
    apsim.change_simulation_dates(start_date='01/01/1998', end_date='12/31/2010')

Change  APSIM model management decisions
*********************************************************************************
.. code:: python

    # First, examine the manager scripts in the simulation node
    apsim.examine_management_info()
    # now create dictionary holding the parameters. the key to this is that the name of the script manage must be
    passed in the dictionary.

    # in this node we have a script named the Simple Rotation,we want to change the rotation to maybe Maize, Wheat or
    something else
    rotation  = {'Name': "Simple Rotation", "Crops": 'Maize, Wheat, Soybean' # the crops must be seperated my commas
    apsim.update_multiple_management_decisions([rotation], simulations=apsim.extract_simulation_name, reload=True)
    # now you cans see we passed rotation as a list. That means you can add other scripts as much as you all  to be
    changed at the same time

Populating the APSIM model with new weather data
*********************************************************************************
.. code:: python

    from apsimNGpy.core.weather import daymet_bylocation_nocsv
    lonlat = -93.08, 42.014
    start_year, end_year = 2000, 2002
    wf = daymet_bylocation_nocsv(lonlat, startyear, endyear, filename="mymet.met")
    # you may need to first see what file currently exists in the model
    mis = apsim.show_met_file_in_simulation()
    print(mis)
    # change
    apsim.replace_met_file(wf)
    # check again if you want to
    mis = apsim.show_met_file_in_simulation()
    print(mis)

Evaluate Predicted Variables
*********************************************************************************
The apsimNGpy Python package provides a convenient way to validate model simulations against measured data. Below 
is a step-by-step guide on how to use the validation.evaluator module from apsimNGpy.

.. code:: python

    # Start by importing the required libraries
    from apsimNGpy.validation.evaluator import validate
    import pandas as pd

    # Load the data if external. Replace with your own data
    df = pd.read_csv('evaluation.csv')
    apsim_results = apsim.results  # Assuming 'apsim' is a predefined object from aopsimNGpy.core.core.APSIMN class and contains your simualted results

    # Preparing Data for Validation
    # Extract the relevant columns from your DataFrame for comparison. In this example, we use
    # 'Measured' for observed values and compare them with different model outputs:
    measured = df['Measured']
    predicted = apsim_results['MaizeR'].Yield

    # Now we need to pass both the measured and the observed in the validate class
    val = validate(measured, predicted)

    # Both variables should be the same length, and here we are assuming that they are sorted in the corresponding order

    # There are two options:
    # 1. Evaluate all
    metrics = val.evaluate_all(verbose=True)
    # Setting verbose=True prints all the results on the go; otherwise, a dictionary is returned with the value for each metric

    # 2. Select or pass your desired metric
    RMSE = val.evaluate("RMSE")
    print(RMSE)

    # If you want to see the available metrics, use the code below
    available_metrics = metrics.keys()
    print(available_metrics)
    # Then select your choice from the list





            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/MAGALA-RICHARD/apsimNGpy.git",
    "name": "apsimNGpy",
    "maintainer": "",
    "docs_url": null,
    "requires_python": "",
    "maintainer_email": "",
    "keywords": "python,APSIM Next Generation,pythonnet,crop modeling",
    "author": "Richard Magala",
    "author_email": "magalarich20@gmail.com",
    "download_url": "https://files.pythonhosted.org/packages/47/75/def5b8ff8f75efb6d0ec2320b771dc5d570678b2548e38dbcc803fbea808/apsimNGpy-0.0.26.tar.gz",
    "platform": null,
    "description": "apsimNGpy: The Next Generation Agroecosytem Simulation Library\r\n====================================================================\r\n\r\nOur cutting-edge open-source framework, apsimNGpy, empowers advanced agroecosystem modeling through the utilization\r\nof object-oriented principles. It features fast batch file simulation, model prediction, evaluation,\r\napsimx file editing, seamless weather data retrieval, and efficient soil profile development\r\n\r\nRequirements\r\n***********************************************************************************\r\n1. Dotnet, install from https://learn.microsoft.com/en-us/dotnet/core/install/\r\n2. Python3\r\n3. APSIM: Add the directory containing the models executable to the system's PATH or python path (to locate the required .dll files). This can be achieved in either of the following ways:\r\n4. Utilize the APSIM installer provided for this purpose.\r\n5. Build APSIM from its source code. This is comming soon\r\n6. Minimum; 8GM RAM, CPU Core i7\r\n\r\n.. _Installation:\r\n\r\nInstallation\r\n********************************************************************************\r\n\r\nAll versions are currently in development, phase and they can be installed as follows:\r\n\r\n- Method 1. install from PyPI\r\n\r\n.. code:: bash\r\n\r\n    pip install apsimNGpy\r\n\r\n- Method 1. clone the current development repositry    \r\n\r\n.. code:: bash\r\n\r\n    git clone https://github.com/MAGALA-RICHARD/apsimNGpy.git@dev\r\n    cd apsimNGpy\r\n    pip install .\r\n\r\n- Method 2. Use pip straight away and install from github\r\n\r\n.. code:: bash\r\n\r\n     pip install git+https://github.com/MAGALA-RICHARD/apsimNGpy.git@dev\r\n\r\n\r\nDebugging import error due to improper SYSTEM APSIM path configuration\r\n*********************************************************************************\r\n\r\nIf you have apsim installed and the program refuses to load run the following code at the top of your python script\r\nbefore importing any apsimNGpy class, especially class from ApsimNGpy.core modules The classes are  CamelCased.\r\n\r\n.. code:: python\r\n\r\n    # search for the program binary installation path and add to os.environ as follows\r\n    import os\r\n    os.environ['APSIM'] =r'path/toyourapsimbinaryfolder/bin\r\n    # try importing SoilModel class\r\n    from apsimNGpy.core.apsim import ApsimModel\r\n    # alternatively, you can add the path to the system environmental variables\r\n\r\n.. _Usage:\r\n\r\nThe above code is also applicable for running different versions of APSIM models. Please note that if your APSIM installation hasn't been added to the system path, this script line should always be placed at the beginning of your simulation script.\r\n\r\nRequired Dependencies:\r\n*****************************\r\n\r\n- numpy\r\n- pandas\r\n- pythonnet\r\n- xmltodict\r\n- tqdm\r\n- requests\r\n\r\nPlease note that apsimNGpy is tested on Python 3. We are not aware of its performance in Python 2 because it utilizes some of the new libraries like pathlib and f-strings.\r\n\r\nUsage\r\n*********************************************************************************\r\n.. code:: python\r\n\r\n    import apsimNGpy\r\n    from apsimNGpy.core.base_data import LoadExampleFiles\r\n    from apsimNGpy.core.apsim  import ApsimModel as SoilModel\r\n    from pathlib import Path\r\n    import os\r\n    from apsimNGpy.validation.visual import plot_data\r\n    cwd = Path.cwd().home() # sending this to your home folder\r\n    wd = cwd.joinpath(\"apsimNGpy_demo\")\r\n    if not wd.exists():\r\n      os.mkdir(wd)\r\n    # change directory\r\n    os.chdir(wd)\r\n    # Create the data\r\n    data = LoadExampleFiles(wd)\r\n    # Get maize model\r\n    maize = data.get_maize\r\n\r\n    # Initialize the simulation methods\r\n    apsim = SoilModel(maize, copy=True)\r\n\r\n    # Run the file\r\n    apsim.run() # use run to print time taken to excute or run the model \r\n    # print the results\r\n    print(apsim.results) # prints all data frames in the storage domain subset usign report names\r\n    # check the manager modules in the apsim simulation file\r\n    # first get the simualtion names\r\n    sim_name = apsim.extract_simulation_name\r\n    apsim.examine_management_info(simulations=sim_name)\r\n    # show current simulation in apsim GUI\r\n    # plot the data\r\n    res = apsim.results['MaizeR']\r\n    plot_data(res.Year, res.Yield, xlabel='Years', ylabel=\" Maize Yield (kg/ha)\")\r\n    \r\nA graph should be able to appear like the ones below. Note that plot_data function just wraps matplotlib plot function\r\nfor quick visualisation\r\n\r\nCongratulations you have successfuly used apsimNGpy package\r\n*********************************************************************************\r\n.. image:: ./apsimNGpy/examples/Figure_1.png\r\n   :alt: /examples/Figure_1.png\r\n\r\nChange APSIM simulation dates \r\n*********************************************************************************\r\n.. code:: python\r\n\r\n    import apsimNGpy\r\n    from apsimNGpy.core.base_data import LoadExampleFiles\r\n    from apsimNGpy.core.apsim  import ApsimModel as SoilModel\r\n    from pathlib import Path\r\n    import os\r\n    from apsimNGpy.validation.visual import plot_data\r\n    cwd = Path.cwd().home() # sending this to your home folder\r\n    wd = cwd.joinpath(\"apsimNGpy_demo\")\r\n    if not wd.exists():\r\n      os.mkdir(wd)\r\n    # change directory\r\n    os.chdir(wd)\r\n    # Create the data\r\n    data = LoadExampleFiles(wd)\r\n\r\n    # Get maize model\r\n    maize = data.get_maize\r\n\r\n    # Initialize the simulation methods\r\n    apsim = SoilModel(maize, copy=True)\r\n    apsim.change_simulation_dates(start_date='01/01/1998', end_date='12/31/2010')\r\n\r\nChange  APSIM model management decisions\r\n*********************************************************************************\r\n.. code:: python\r\n\r\n    # First, examine the manager scripts in the simulation node\r\n    apsim.examine_management_info()\r\n    # now create dictionary holding the parameters. the key to this is that the name of the script manage must be\r\n    passed in the dictionary.\r\n\r\n    # in this node we have a script named the Simple Rotation,we want to change the rotation to maybe Maize, Wheat or\r\n    something else\r\n    rotation  = {'Name': \"Simple Rotation\", \"Crops\": 'Maize, Wheat, Soybean' # the crops must be seperated my commas\r\n    apsim.update_multiple_management_decisions([rotation], simulations=apsim.extract_simulation_name, reload=True)\r\n    # now you cans see we passed rotation as a list. That means you can add other scripts as much as you all  to be\r\n    changed at the same time\r\n\r\nPopulating the APSIM model with new weather data\r\n*********************************************************************************\r\n.. code:: python\r\n\r\n    from apsimNGpy.core.weather import daymet_bylocation_nocsv\r\n    lonlat = -93.08, 42.014\r\n    start_year, end_year = 2000, 2002\r\n    wf = daymet_bylocation_nocsv(lonlat, startyear, endyear, filename=\"mymet.met\")\r\n    # you may need to first see what file currently exists in the model\r\n    mis = apsim.show_met_file_in_simulation()\r\n    print(mis)\r\n    # change\r\n    apsim.replace_met_file(wf)\r\n    # check again if you want to\r\n    mis = apsim.show_met_file_in_simulation()\r\n    print(mis)\r\n\r\nEvaluate Predicted Variables\r\n*********************************************************************************\r\nThe apsimNGpy Python package provides a convenient way to validate model simulations against measured data. Below \r\nis a step-by-step guide on how to use the validation.evaluator module from apsimNGpy.\r\n\r\n.. code:: python\r\n\r\n    # Start by importing the required libraries\r\n    from apsimNGpy.validation.evaluator import validate\r\n    import pandas as pd\r\n\r\n    # Load the data if external. Replace with your own data\r\n    df = pd.read_csv('evaluation.csv')\r\n    apsim_results = apsim.results  # Assuming 'apsim' is a predefined object from aopsimNGpy.core.core.APSIMN class and contains your simualted results\r\n\r\n    # Preparing Data for Validation\r\n    # Extract the relevant columns from your DataFrame for comparison. In this example, we use\r\n    # 'Measured' for observed values and compare them with different model outputs:\r\n    measured = df['Measured']\r\n    predicted = apsim_results['MaizeR'].Yield\r\n\r\n    # Now we need to pass both the measured and the observed in the validate class\r\n    val = validate(measured, predicted)\r\n\r\n    # Both variables should be the same length, and here we are assuming that they are sorted in the corresponding order\r\n\r\n    # There are two options:\r\n    # 1. Evaluate all\r\n    metrics = val.evaluate_all(verbose=True)\r\n    # Setting verbose=True prints all the results on the go; otherwise, a dictionary is returned with the value for each metric\r\n\r\n    # 2. Select or pass your desired metric\r\n    RMSE = val.evaluate(\"RMSE\")\r\n    print(RMSE)\r\n\r\n    # If you want to see the available metrics, use the code below\r\n    available_metrics = metrics.keys()\r\n    print(available_metrics)\r\n    # Then select your choice from the list\r\n\r\n\r\n\r\n\r\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "apsimx next generation package interface",
    "version": "0.0.26",
    "project_urls": {
        "Homepage": "https://github.com/MAGALA-RICHARD/apsimNGpy.git"
    },
    "split_keywords": [
        "python",
        "apsim next generation",
        "pythonnet",
        "crop modeling"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "4775def5b8ff8f75efb6d0ec2320b771dc5d570678b2548e38dbcc803fbea808",
                "md5": "f81b9af8b7f59c558999a16ccd19cec9",
                "sha256": "d5624afcde70ab2c824a31e608c2420a8c666a2286fd1db57709cbb0e0e06cc0"
            },
            "downloads": -1,
            "filename": "apsimNGpy-0.0.26.tar.gz",
            "has_sig": false,
            "md5_digest": "f81b9af8b7f59c558999a16ccd19cec9",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": null,
            "size": 1206102,
            "upload_time": "2024-03-01T16:16:56",
            "upload_time_iso_8601": "2024-03-01T16:16:56.549660Z",
            "url": "https://files.pythonhosted.org/packages/47/75/def5b8ff8f75efb6d0ec2320b771dc5d570678b2548e38dbcc803fbea808/apsimNGpy-0.0.26.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-03-01 16:16:56",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "MAGALA-RICHARD",
    "github_project": "apsimNGpy",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "lcname": "apsimngpy"
}
        
Elapsed time: 0.21194s