readtools.py 6.39 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
            for name in timeseries_names:
                timeseries.append(TimeSeries(name, sim(name).times(), sim(name).values()))
31 32 33 34

    print('Modelica results column names: ' + str(timeseries_names))
    print('Modelica results number: ' + str(len(timeseries_list)))

35
    return timeseries
36

37

38 39 40 41 42 43 44 45 46 47 48 49 50
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))
51 52 53 54

    print('PLECS results column names: ' + str(timeseries_names))
    print('PLECS results number: ' + str(len(timeseries_list)))

55
    return timeseries_list
56

57
def read_timeseries_dpsim_real(filename, timeseries_names=None):
58 59 60 61 62 63
    """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 timeseries_names: column names which should be read
    :return: list of Timeseries objects
    """
64
    timeseries_list = []
65
    pd_df = pd.read_csv(filename)
66

67
    if timeseries_names is None:
68 69
        # No column names specified, thus read in all and strip spaces
        pd_df.rename(columns=lambda x: x.strip(), inplace=True)
70
        column_names = list(pd_df.columns.values)
71

72
        # Remove timestamps column name and store separately
73
        column_names.remove('time')
74 75 76 77 78
        timestamps = pd_df.iloc[:,0]

        if header is True:
            for name in column_names:
                timeseries_list.append(TimeSeries(name, timestamps, pd_df[name].values))
79 80
    else:
        # Read in specified time series
81 82
        print('no column names specified yet')

83 84 85
    print('DPsim results column names: ' + str(column_names))
    print('DPsim results number: ' + str(len(timeseries_list)))

86
    return timeseries_list
87

88 89 90 91 92 93 94
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
    """
Markus Mirz's avatar
Markus Mirz committed
95
    pd_df = pd.read_csv(filename)
96
    timeseries_list = []
97

98
    if timeseries_names is None:
99
        # No column names specified, thus read in all and strip off spaces
Markus Mirz's avatar
Markus Mirz committed
100
        pd_df.rename(columns=lambda x: x.strip(), inplace=True)
101
        column_names = list(pd_df.columns.values)
102

103
        # Remove timestamps column name and store separately
Markus Mirz's avatar
Markus Mirz committed
104
        column_names.remove('time')
105 106 107
        timestamps = pd_df.iloc[:,0]
        # Calculate number of network nodes since array is [real, imag]
        node_number = int(len(column_names) / 2)
108
        node_index = 1
109 110
        for column in column_names:
            if node_index <= node_number:
111 112 113
                ts_name = 'n'+ str(node_index)
                timeseries_list.append(
                TimeSeries(ts_name, timestamps, np.vectorize(complex)(pd_df.iloc[:,node_index],pd_df.iloc[:,node_index + node_number])))
114 115 116 117 118 119 120
            else:
                break
            node_index = node_index + 1
    else:
        # Read in specified time series
        print('cannot read specified columns yet')

121 122 123
    print('DPsim results column names: ' + str(column_names))
    print('DPsim results number: ' + str(len(timeseries_list)))

124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142
    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]
143
        node_number = int(len(column_names) / 2)
144
        node_index = 1
145 146
        for column in column_names:
            if node_index <= node_number:
147 148
                node_name = 'node '+ str(node_index) +' Re'
                timeseries_list.append(TimeSeries(node_name, timestamps, pd_df.iloc[:,column]))
149
            else:
150 151
                node_name = 'node '+ str(node_index - node_number) +' Im'
                timeseries_list.append(TimeSeries(node_name, timestamps, pd_df.iloc[:,column]))
152 153 154 155 156

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

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