readtools.py 6.44 KB
Newer Older
1 2
import numpy as np
import pandas as pd
3
from .timeseries import *
4
import re
5

6

7
def read_timeseries_Modelica(filename, timeseries_names=None, is_regex=False):
8
    from modelicares import SimRes
9
    sim = SimRes(filename)
10 11 12 13 14 15 16 17 18 19 20 21 22
    if timeseries_names is None and is_regex is False:
        # No trajectory names or regex specified, thus read in all
        timeseries = []
        for name in sim.names():
            timeseries.append(TimeSeries(name, sim(name).times(), sim(name).values()))
    elif is_regex is True:
        # Read in variables which match with regex
        timeseries = []
        p = re.compile(timeseries_names)
        timeseries_names = [name for name in sim.names() if p.search(name)]
        timeseries_names.sort()
        for name in timeseries_names:
            timeseries.append(TimeSeries(name, sim(name).times(), sim(name).values()))
23 24
    else:
        # Read in specified time series
25 26 27
        if not isinstance(timeseries_names, list):
            timeseries = TimeSeries(timeseries_names, sim(timeseries_names).times(), sim(timeseries_names).values())
        else:
Markus Mirz's avatar
Markus Mirz committed
28
            timeseries = []
29 30 31
            for name in timeseries_names:
                timeseries.append(TimeSeries(name, sim(name).times(), sim(name).values()))
    return timeseries
32

33

34 35 36 37 38 39 40 41 42 43 44 45 46 47
def read_timeseries_PLECS(filename, timeseries_names=None):
    pd_df = pd.read_csv(filename)
    timeseries_list = []
    if timeseries_names is None:
        # No trajectory names specified, thus read in all
        timeseries_names = list(pd_df.columns.values)
        timeseries_names.remove('Time')
        for name in timeseries_names:
            timeseries_list.append(TimeSeries(name, pd_df['Time'].values, pd_df[name].values))
    else:
        # Read in specified time series
        for name in timeseries_names:
            timeseries_list.append(TimeSeries(name, pd_df['Time'].values, pd_df[name].values))
    return timeseries_list
48

49 50 51 52 53 54 55 56
def read_timeseries_dpsim_real(filename, header=None, timeseries_names=None):
    """Reads real time series data from DPsim log file which may have a header.
    Timeseries names are assigned according to the header names if available.
    :param filename: name of the csv file that has the data
    :param header: specifies if the log file has a header
    :param timeseries_names: column names which should be read
    :return: list of Timeseries objects
    """
57 58
    timeseries_list = []

59 60 61 62 63
    if header is True:
        pd_df = pd.read_csv(filename)
    else:
        pd_df = pd.read_csv(filename, header=None)

64
    if timeseries_names is None:
65
        # No trajectory names specified, thus read in all
66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
        column_names = list(pd_df.columns.values)
        # Remove timestamps column name and store separately
        column_names.remove(0)
        timestamps = pd_df.iloc[:,0]

        if header is True:
            for name in column_names:
                timeseries_list.append(TimeSeries(name, timestamps, pd_df[name].values))
        else:
            node_number = int(len(column_names))
            node_index = 1
            for column in column_names:
                ts_name = 'node ' + str(node_index)
                timeseries_list.append(TimeSeries(ts_name, timestamps, pd_df.iloc[:, column]))
                node_index = node_index + 1
81 82
    else:
        # Read in specified time series
83 84 85 86 87 88 89
        print('no column names specified yet')

    print('DPsim results file length:')
    print(len(timeseries_list))
    for result in timeseries_list:
        print(result.name)
    return timeseries_list
90

91 92 93 94 95 96 97
def read_timeseries_dpsim_cmpl(filename, timeseries_names=None):
    """Reads complex time series data from DPsim log file. Real and
    imaginary part are stored in one complex variable.
    :param filename: name of the csv file that has the data
    :param timeseries_names: column name which should be read
    :return: list of Timeseries objects
    """
98
    pd_df = pd.read_csv(filename, header=None)
99
    timeseries_list = []
100

101
    if timeseries_names is None:
102 103
        # No trajectory names specified, thus read in all
        column_names = list(pd_df.columns.values)
104
        # Remove timestamps column name and store separately
105
        column_names.remove(0)
106 107 108
        timestamps = pd_df.iloc[:,0]
        # Calculate number of network nodes since array is [real, imag]
        node_number = int(len(column_names) / 2)
109
        node_index = 1
110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
        for column in column_names:
            if node_index <= node_number:
                ts_name = 'node '+ str(node_index)
                timeseries_list.append(TimeSeries(ts_name, timestamps, np.vectorize(complex)(pd_df.iloc[:,column],pd_df.iloc[:,column + node_number])))
            else:
                break
            node_index = node_index + 1
    else:
        # Read in specified time series
        print('cannot read specified columns yet')

    print('DPsim results file length:')
    print(len(timeseries_list))
    for result in timeseries_list:
        print(result.name)
    return timeseries_list

def read_timeseries_dpsim_cmpl_separate(filename, timeseries_names=None):
    """Deprecated - Reads complex time series data from DPsim log file. Real and
    imaginary part are stored separately.
    :param filename: name of the csv file that has the data
    :param timeseries_names: column name which should be read
    :return: list of Timeseries objects
    """
    pd_df = pd.read_csv(filename, header=None)
    timeseries_list = []

    if timeseries_names is None:
        # No trajectory names specified, thus read in all
        column_names = list(pd_df.columns.values)
        # Remove timestamps column name and store separately
        column_names.remove(0)
        timestamps = pd_df.iloc[:, 0]
        # Calculate number of network nodes since array is [real, imag]
144
        node_number = int(len(column_names) / 2)
145
        node_index = 1
146 147
        for column in column_names:
            if node_index <= node_number:
148 149
                node_name = 'node '+ str(node_index) +' Re'
                timeseries_list.append(TimeSeries(node_name, timestamps, pd_df.iloc[:,column]))
150
            else:
151 152
                node_name = 'node '+ str(node_index - node_number) +' Im'
                timeseries_list.append(TimeSeries(node_name, timestamps, pd_df.iloc[:,column]))
153 154 155 156 157

            node_index = node_index + 1
    else:
        # Read in specified time series
        print('no column names specified yet')
158 159 160 161 162 163

    print('DPsim results file length:')
    print(len(timeseries_list))
    for result in timeseries_list:
        print(result.name)
    return timeseries_list