import pandas as pd
import itertools
from ..tbl.table import Table
[docs]class Index(Table):
"""Create nested index Table.
This class can be used for the initial step of simulations.
Args:
reqs[] (None): Input Data is not required.
param["index_counts"] (list of int): Total counts of each column.
param["split_depth"] (int): File split depth number.
param["index_value"] (int, optional): Set a single value to the first
index column if you want to fix it.
param["type"] (str, optional): Parameter initiation type. If you do
not use ``type``, you must set ``calc_cols`` as a list of column
names.
* "image" : Add ``img_no`` index.
* "trajectory" : Add ``img_no`` and ``trj_no`` index.
* "movie" : Add ``img_no`` and ``frm_no`` index.
param["param"] (list of list, optional): Additional parameters.
The list should be [[name, value, unit, description],...].
Returns:
Table: Index Table of iterated numbers
Examples:
Create a nested trajectory index list.
.. code-block:: python
D = sf.data.tbl.create.Index()
D.run([],{"type":"trajectory", "index_counts":[2,3],
"split_depth":0})
print(D.data[0])
# img_no trj_no
# 0 1 1
# 1 1 2
# 2 1 3
# 3 2 1
# 4 2 2
# 5 2 3
"""
[docs] def set_info(self, param):
"""Set columns and params.
"""
if ("type", "trajectory") in param.items():
self.info.add_column(
1, "img_no", "int32", "num", "Image number")
self.info.add_column(
2, "trj_no", "int32", "num", "Trajectory number")
self.info.add_param(
"calc_cols", ["img_no", "trj_no"], "list of str",
"Index calc column names")
elif ("type", "image") in param.items():
self.info.add_column(
1, "img_no", "int32", "num", "Image number")
self.info.add_param(
"calc_cols", ["img_no"], "list of str",
"Index calc column names")
elif ("type", "movie") in param.items():
self.info.add_column(
1, "img_no", "int32", "num", "Image number")
self.info.add_column(
2, "frm_no", "int32", "num", "Trajectory number")
self.info.add_param(
"calc_cols", ["img_no", "frm_no"], "list of str",
"Index calc column names")
else:
for col_name in param["calc_cols"]:
self.info.add_column(
None, col_name, "int32", "num", col_name + " index")
self.info.add_param(
"calc_cols", param["calc_cols"], "list of str",
"Index calc column names")
if "index_value" in param:
self.info.add_param(
"index_value", param["index_value"], "num",
"Specific index value")
self.info.add_param(
"index_counts", param["index_counts"], "num",
"Total counts of each column")
if "param" in param:
for pp in param["param"]:
self.info.add_param(*pp)
self.info.set_split_depth(param["split_depth"])
[docs] @staticmethod
def process(reqs, param):
"""Create nested index table.
Args:
reqs (None): Empty list.
param["calc_cols"] (list of str): List of column names.
param["index_counts"] (list of int): Total counts of each column.
param["index_value"] (int, optional): An explicit value of the top
level column.
Returns:
pandas.DataFrame: Index table of iterated numbers
"""
iters = []
for i in param["index_counts"]:
iters.append(tuple(range(1, i + 1)))
df = pd.DataFrame(list(itertools.product(*iters)))
df.columns = param["calc_cols"]
if "index_value" in param:
df[param["calc_cols"][0]] = param["index_value"]
return df