Vector calculator
============================================================


.. note:: In this lesson we will see how to add new attributes to a vector layer
 based on a mathematical expression, using the vector calculator.

We already know how to use the raster calculator to create new raster layers using mathematical expressions.
A similar algorithm is available for vector layers, and generates a new layer with the same attributes of the input layer,
plus an additional one with the result of the expression entered.
The algorithm is called :guilabel:`Field calculator` and has the following parameters dialog.

.. figure:: img/vector_calculator/field_calculator.png

.. note:: In newer versions of Processing the interface has changed considerably, it's more powerful and easier to use.

Here are a few examples of using that algorithm.

First, let's calculate the population density of white people in each polygon, which represents a census.
We have two fields in the attributes table that we can use for that, namely ``WHITE`` and ``SHAPE_AREA``.
We just have to divide them and multiply by one million (to have density per square km),
so we can use the following formula in the corresponding field::

   ( "WHITE" / "SHAPE_AREA" ) * 1000000

The parameters dialog should be filled as shown below.

.. figure:: img/vector_calculator/density.png

This will generate a new field named ``WHITE_DENS``.

Now let's calculate the ratio between the ``MALES`` and ``FEMALES`` fields to create a new one
that indicates if male population is numerically predominant over female population.

Enter the following formula::

   "MALES" / "FEMALES"

This time the parameters window should look like this before pressing the :guilabel:`OK` button.

.. figure:: img/vector_calculator/ratio.png


In earlier version, since both fields are of type integer, the result would be truncated to an integer.
In this case the formula should be: ``1.0 *  "MALES"  /  "FEMALES"``, to indicate that we want floating point number a result.

We can use conditional functions to have a new field with ``male`` or ``female`` text strings
instead of those ratio value, using the following formula::

   CASE WHEN  "MALES" > "FEMALES"  THEN 'male' ELSE 'female' END

The parameters window should look like this.

.. figure:: img/vector_calculator/predominance.png

A python field calculator is available in the :guilabel:`Advanced Python field calculator`,
which will not be detailed here.

.. figure:: img/vector_calculator/advanced.png
