Source code for reda.exporters.bert

"""Exporter for BERT and pyGimli to unified data format. See:

https://gitlab.com/resistivity-net/bert#the-unified-data-format
"""
# import numpy as np
import logging

import pandas as pd

from reda.utils import has_multiple_timesteps, split_timesteps

logger = logging.getLogger(__name__)


[docs] def export_bert(data, electrodes, filename): """Export to unified data format used in pyGIMLi & BERT. Multiple timesteps are exported to multiple filenames. Parameters ---------- data : :py:class:`pandas.DataFrame` DataFrame with at least a, b, m, n and r. electrodes : :py:class:`pandas.DataFrame` DataFrame with electrode positions. filename : str String of the output filename. """ assert isinstance(electrodes, pd.DataFrame), \ 'This file format requires electrodes! Cannot proceed without them.' # Check for multiple timesteps if has_multiple_timesteps(data): for i, timestep in enumerate(split_timesteps(data)): export_bert( timestep, electrodes, filename.replace(".", "_%.3d." % i)) # TODO: Make ABMN consistent # index_full = ert.data.groupby(list("abmn")).groups.keys() # g = ert.data.groupby('timestep') # q = ert.data.pivot_table( # values='r', index=list("abmn"), columns="timestep", dropna=True) # ert.data.reset_index(list("abmn")) f = open(filename, 'w') f.write("%d\n" % len(electrodes)) f.write("# ") # Make temporary copies for renaming electrodes = electrodes.copy() data = data.copy() electrodes.columns = electrodes.columns.str.lower() data.columns = data.columns.str.lower() # Remove unnecessary columns and rename according to bert conventions # https://gitlab.com/resistivity-net/bert#the-unified-data-format cols_to_export = ["a", "b", "m", "n", "u", "i", "r", "rho_a", "error"] data.drop(data.columns.difference(cols_to_export), axis=1, inplace=True) data.rename(columns={"rho_a": "rhoa", "error": "err"}, inplace=True) for key in electrodes.keys(): f.write("%s " % key) f.write("\n") for row in electrodes.itertuples(index=False): for val in row: f.write("%5.3f " % val) f.write("\n") f.write("%d\n" % len(data)) f.write("# ") # Make sure that a, b, m, n are the first 4 columns columns = data.columns.tolist() for c in "abmn": columns.remove(c) columns = list("abmn") + columns data = data[columns] for key in data.keys(): f.write("%s " % key) f.write("\n") for row in data.itertuples(index=False): for i, val in enumerate(row): if i < 4: f.write("%d " % val) else: f.write("%E " % val) f.write("\n") f.close()