readtools.py 6.14 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
def read_timeseries_dpsim_real(filename, timeseries_names=None):
50
51
52
53
54
55
    """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
    """
56
    timeseries_list = []
57
    pd_df = pd.read_csv(filename)
58

59
    if timeseries_names is None:
60
61
        # No column names specified, thus read in all and strip spaces
        pd_df.rename(columns=lambda x: x.strip(), inplace=True)
62
        column_names = list(pd_df.columns.values)
63
64
65
66

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

67
        # Remove timestamps column name and store separately
68
        column_names.remove('time')
69
70
71
72
73
        timestamps = pd_df.iloc[:,0]

        if header is True:
            for name in column_names:
                timeseries_list.append(TimeSeries(name, timestamps, pd_df[name].values))
74
75
    else:
        # Read in specified time series
76
77
78
        print('no column names specified yet')

    return timeseries_list
79

80
81
82
83
84
85
86
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
87
    pd_df = pd.read_csv(filename)
88
    timeseries_list = []
89

90
    if timeseries_names is None:
91
        # No column names specified, thus read in all and strip off spaces
Markus Mirz's avatar
Markus Mirz committed
92
        pd_df.rename(columns=lambda x: x.strip(), inplace=True)
93
        column_names = list(pd_df.columns.values)
94
95
96
97

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

98
        # Remove timestamps column name and store separately
Markus Mirz's avatar
Markus Mirz committed
99
        column_names.remove('time')
100
101
102
        timestamps = pd_df.iloc[:,0]
        # Calculate number of network nodes since array is [real, imag]
        node_number = int(len(column_names) / 2)
103
        node_index = 1
104
105
        for column in column_names:
            if node_index <= node_number:
106
107
108
                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])))
109
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
            else:
                break
            node_index = node_index + 1
    else:
        # Read in specified time series
        print('cannot read specified columns yet')

    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]
135
        node_number = int(len(column_names) / 2)
136
        node_index = 1
137
138
        for column in column_names:
            if node_index <= node_number:
139
140
                node_name = 'node '+ str(node_index) +' Re'
                timeseries_list.append(TimeSeries(node_name, timestamps, pd_df.iloc[:,column]))
141
            else:
142
143
                node_name = 'node '+ str(node_index - node_number) +' Im'
                timeseries_list.append(TimeSeries(node_name, timestamps, pd_df.iloc[:,column]))
144
145
146
147
148

            node_index = node_index + 1
    else:
        # Read in specified time series
        print('no column names specified yet')
149
150
151
152
153
154

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