diff --git a/dataprocessing/plotdpsim.py b/dataprocessing/plotdpsim.py index a438b54450822198047daa85f2888b6013380525..759b55e375c815189fea98524200b425a7eadeeb 100644 --- a/dataprocessing/plotdpsim.py +++ b/dataprocessing/plotdpsim.py @@ -3,6 +3,7 @@ from .plottools import * from .calc import * import matplotlib import matplotlib.pyplot as plt +from scipy.interpolate import interp1d matplotlib.rcParams.update({'font.size': 8}) def plot_dpsim_abs_diff(filename1, label1, node1, filename2, label2, node2): @@ -143,8 +144,297 @@ def plot_dpsim_abs_single(filename, node): plt.grid(True) plt.show() -def main(): - plot_dpsim_single() -if __name__ == "__main__": - main() \ No newline at end of file +def plotNodeVoltageInterpDpRef(filenameRef, filenameDP, node): + node = node - 1 + dfRef = pd.read_csv(filenameRef, header=None) + dfDP = pd.read_csv(filenameDP, header=None) + + if (dfRef.shape[1] - 1) < node or node < 0: + print('Node not available') + exit() + + if (dfDP.shape[1] - 1) / 2 < node or node < 0: + print('Node not available') + exit() + + # Ref + timeRef = np.array(dfRef.ix[:, 0]) + voltageRef = np.array(dfRef.ix[:, node + 1]) + + # DP interpolated + timeDP = np.array(dfDP.ix[:, 0]) + voltageReDP = np.array(dfDP.ix[:, node + 1]) + voltageImDP = np.array(dfDP.ix[:, int((dfDP.shape[1] - 1) / 2 + node + 1)]) + + interpTime = np.arange(dfDP.ix[0, 0], dfDP.ix[dfDP.shape[0] - 1, 0], 0.00005) + fVoltageRe = interp1d(timeDP, voltageReDP) + fVoltageIm = interp1d(timeDP, voltageImDP) + interpVoltageRe = fVoltageRe(interpTime) + interpVoltageIm = fVoltageIm(interpTime) + + voltageShiftDPInterp = interpVoltageRe * np.cos(2 * np.pi * 50 * interpTime) - interpVoltageIm * np.sin( + 2 * np.pi * 50 * interpTime) + voltageAbsDP = np.sqrt(voltageReDP ** 2 + voltageImDP ** 2) + + fig, ax1 = plt.subplots() + ax1.plot(timeRef, voltageRef, 'm:', label='Ref') + ax1.plot(interpTime, voltageShiftDPInterp, 'b--', label='DP interp') + ax1.plot(timeDP, voltageAbsDP, 'r-', label='DP abs') + + # Now add the legend with some customizations. + legend = ax1.legend(loc='lower right', shadow=True) + + # The frame is matplotlib.patches.Rectangle instance surrounding the legend. + frame = legend.get_frame() + frame.set_facecolor('0.90') + + ax1.set_xlabel('time [s]') + ax1.set_ylabel('mag [V]') + ax1.grid(True) + plt.show() + + +def plotNodeVoltageDpEmtRef(filenameRef, filenameDP, filenameEMT, node): + node = node - 1 + dfRef = pd.read_csv(filenameRef, header=None) + dfEMT = pd.read_csv(filenameEMT, header=None) + dfDP = pd.read_csv(filenameDP, header=None) + + if (dfRef.shape[1] - 1) < node or node < 0: + print('Node not available') + exit() + + if (dfEMT.shape[1] - 1) < node or node < 0: + print('Node not available') + exit() + + if (dfDP.shape[1] - 1) / 2 < node or node < 0: + print('Node not available') + exit() + + # Ref + timeRef = np.array(dfRef.ix[:, 0]) + voltageRef = np.array(dfRef.ix[:, node + 1]) + + # EMT + timeEMT = np.array(dfEMT.ix[:, 0]) + voltageEMT = np.array(dfEMT.ix[:, node + 1]) + + # DP + timeDP = np.array(dfDP.ix[:, 0]) + voltageReDP = np.array(dfDP.ix[:, node + 1]) + voltageImDP = np.array(dfDP.ix[:, int((dfDP.shape[1] - 1) / 2 + node + 1)]) + voltageAbsDP = np.sqrt(voltageReDP ** 2 + voltageImDP ** 2) + voltageShiftDP = voltageReDP * np.cos(2 * np.pi * 50 * timeDP) - voltageImDP * np.sin(2 * np.pi * 50 * timeDP) + + fig, ax1 = plt.subplots() + ax1.plot(timeRef, voltageRef, 'm:', label='Ref') + ax1.plot(timeEMT, voltageEMT, 'g--', label='EMT') + ax1.plot(timeDP, voltageShiftDP, 'b--', label='DP shift') + ax1.plot(timeDP, voltageAbsDP, 'r-', label='DP abs') + + # Now add the legend with some customizations. + legend = ax1.legend(loc='lower right', shadow=True) + + # The frame is matplotlib.patches.Rectangle instance surrounding the legend. + frame = legend.get_frame() + frame.set_facecolor('0.90') + + ax1.set_xlabel('time [s]') + ax1.set_ylabel('mag [V]') + ax1.grid(True) + plt.show() + + +def plotNodeVoltageDpEmt(filenameDP, filenameEMT, node): + node = node - 1 + dfEMT = pd.read_csv(filenameEMT, header=None) + dfDP = pd.read_csv(filenameDP, header=None) + + if (dfEMT.shape[1] - 1) < node or node < 0: + print('Node not available') + exit() + + if (dfDP.shape[1] - 1) / 2 < node or node < 0: + print('Node not available') + exit() + + # EMT + timeEMT = np.array(dfEMT.ix[:, 0]) + voltageEMT = np.array(dfEMT.ix[:, node + 1]) + + # DP + timeDP = np.array(dfDP.ix[:, 0]) + voltageReDP = np.array(dfDP.ix[:, node + 1]) + voltageImDP = np.array(dfDP.ix[:, int((dfDP.shape[1] - 1) / 2 + node + 1)]) + voltageAbsDP = np.sqrt(voltageReDP ** 2 + voltageImDP ** 2) + voltageShiftDP = voltageReDP * np.cos(2 * np.pi * 50 * timeDP) - voltageImDP * np.sin(2 * np.pi * 50 * timeDP) + + fig, ax1 = plt.subplots() + ax1.plot(timeEMT, voltageEMT, 'g--', label='EMT') + ax1.plot(timeDP, voltageShiftDP, 'b--', label='DP shift') + ax1.plot(timeDP, voltageAbsDP, 'r-', label='DP abs') + + # Now add the legend with some customizations. + legend = ax1.legend(loc='lower right', shadow=True) + + # The frame is matplotlib.patches.Rectangle instance surrounding the legend. + frame = legend.get_frame() + frame.set_facecolor('0.90') + + ax1.set_xlabel('time [s]') + ax1.set_ylabel('mag [V]') + ax1.grid(True) + plt.show() + + +def plotEmtNodeResults(filename, node): + node = node - 1 + df = pd.read_csv(filename, header=None) + print(df.shape) + + if (df.shape[1] - 1) < node or node < 0: + print('Node not available') + exit() + + time = np.array(df.ix[:, 0]) + voltage = np.array(df.ix[:, node + 1]) + + fig, ax1 = plt.subplots() + ax1.plot(time, voltage, 'b-') + # plt.yticks(np.arange(-10, 10, 1.0)) + ax1.set_xlabel('time [s]') + ax1.set_ylabel('mag [V] or [A]') + ax1.grid(True) + plt.show() + + +def plotNodeResults(filename, node): + node = node - 1 + df = pd.read_csv(filename, header=None) + print(df.shape) + + if (df.shape[1] - 1) / 2 < node or node < 0: + print('Node not available') + exit() + + time = np.array(df.ix[:, 0]) + voltageRe = np.array(df.ix[:, node + 1]) + voltageIm = np.array(df.ix[:, int((df.shape[1] - 1) / 2 + node + 1)]) + + voltage = np.sqrt(voltageRe ** 2 + voltageIm ** 2) + voltageEmt = voltageRe * np.cos(2 * np.pi * 50 * time) - voltageIm * np.sin(2 * np.pi * 50 * time) + fig, ax1 = plt.subplots() + ax1.plot(time, voltageEmt, 'b-', time, voltage, 'r-') + # plt.yticks(np.arange(-10, 10, 1.0)) + ax1.set_xlabel('time [s]') + ax1.set_ylabel('mag [V] or [A]') + ax1.grid(True) + plt.show() + + +def plotInterpolatedNodeResults(filename, node): + node = node - 1 + df = pd.read_csv(filename, header=None) + print(df.shape) + + if (df.shape[1] - 1) / 2 < node or node < 0: + print('Node not available') + exit() + + time = np.array(df.ix[:, 0]) + voltageRe = np.array(df.ix[:, node + 1]) + voltageIm = np.array(df.ix[:, int((df.shape[1] - 1) / 2 + node + 1)]) + + interpTime = np.arange(df.ix[0, 0], df.ix[df.shape[0] - 1, 0], 0.00005) + fVoltageRe = interp1d(time, voltageRe) + fVoltageIm = interp1d(time, voltageIm) + + interpVoltageRe = fVoltageRe(interpTime) + interpVoltageIm = fVoltageIm(interpTime) + + voltageMeas = np.sqrt(voltageRe ** 2 + voltageIm ** 2) + voltage = np.sqrt(interpVoltageRe ** 2 + interpVoltageIm ** 2) + voltageEmt = interpVoltageRe * np.cos(2 * np.pi * 50 * interpTime) - interpVoltageIm * np.sin( + 2 * np.pi * 50 * interpTime) + fig, ax1 = plt.subplots() + ax1.plot(interpTime, voltageEmt, 'b-') + ax1.plot(time, voltageMeas, 'r-') + ax1.set_xlabel('time [s]') + ax1.set_ylabel('mag [V] or [A]') + ax1.grid(True) + plt.show() + + +def plotResultsInterfacedInductor(filename, node): + node = node - 1 + df = pd.read_csv(filename, header=None) + print(df.shape) + + if (df.shape[1] - 1) / 2 < node or node < 0: + print('Voltage not available') + exit() + + time = np.array(df.ix[:, 0]) + voltageRe = np.array(df.ix[:, node + 1]) + voltageIm = np.array(df.ix[:, int((df.shape[1] - 1) / 2 + node + 1)]) + + voltage = np.sqrt(voltageRe ** 2 + voltageIm ** 2) + voltageEmt = voltageRe * np.cos(2 * np.pi * 50 * time) - voltageIm * np.sin(2 * np.pi * 50 * time) + fig, ax1 = plt.subplots() + ax1.plot(time, voltageEmt, 'b-', time, voltage, 'r-') + plt.yticks(np.arange(-10, 10, 1.0)) + ax1.set_xlabel('time [s]') + ax1.set_ylabel('voltage [V]') + ax1.grid(True) + plt.show() + + +def plotResultsSynGenUnitTest(filename, node1, node2, node3): + node1 = node1 - 1 + node2 = node2 - 1 + node3 = node3 - 1 + df = pd.read_csv(filename, header=None) + print(df.shape) + + if (df.shape[1] - 1) / 2 < node1 or node1 < 0 or \ + (df.shape[1] - 1) / 2 < node2 or node2 < 0 or \ + (df.shape[1] - 1) / 2 < node3 or node3 < 0: + print('Voltage not available') + exit() + + time = np.array(df.ix[:, 0]) + mag1 = np.array(df.ix[:, node1 + 1]) + mag2 = np.array(df.ix[:, node2 + 1]) + mag3 = np.array(df.ix[:, node3 + 1]) + + fig, ax1 = plt.subplots() + ax1.plot(time, mag1, 'b-', time, mag2, 'r-', time, mag3, 'g-') + # ax1.plot(time, voltageEmt, 'b-', time, voltage, 'r-') + # plt.yticks(np.arange(-10, 10, 1.0)) + ax1.set_xlabel('time [s]') + ax1.set_ylabel('Magnitude') + ax1.grid(True) + plt.show() + + +def plotResultsSynGenUnitTestVar(filename, varNum): + df = pd.read_csv(filename, header=None) + print(df.shape) + + if (df.shape[1]) < varNum or varNum < 0: + print('Variable not available') + exit() + + time = np.array(df.ix[:, 0]) + mag = np.array(df.ix[:, varNum]) + + fig, ax1 = plt.subplots() + ax1.plot(time, mag, 'b-') + # plt.yticks(np.arange(-10, 10, 1.0)) + ax1.set_xlabel('time [s]') + ax1.set_ylabel('Magnitude') + ax1.grid(True) + plt.show() + diff --git a/dataprocessing/plotdpsim_deprecated.py b/dataprocessing/plotdpsim_deprecated.py deleted file mode 100644 index a022ed2a3e2c7d084a7de68d5fa33776eeb9cb56..0000000000000000000000000000000000000000 --- a/dataprocessing/plotdpsim_deprecated.py +++ /dev/null @@ -1,290 +0,0 @@ -import numpy as np -import matplotlib.pyplot as plt -import pandas as pd -from scipy.interpolate import interp1d - -def plotNodeVoltageInterpDpRef(filenameRef, filenameDP, node): - node = node - 1 - dfRef = pd.read_csv(filenameRef, header=None) - dfDP = pd.read_csv(filenameDP, header=None) - - if (dfRef.shape[1] - 1) < node or node < 0: - print('Node not available') - exit() - - if (dfDP.shape[1] - 1) / 2 < node or node < 0: - print('Node not available') - exit() - - # Ref - timeRef = np.array(dfRef.ix[:,0]) - voltageRef = np.array(dfRef.ix[:,node + 1]) - - #DP interpolated - timeDP = np.array(dfDP.ix[:,0]) - voltageReDP = np.array(dfDP.ix[:,node + 1]) - voltageImDP = np.array(dfDP.ix[:, int((dfDP.shape[1] - 1) / 2 + node + 1)]) - - interpTime = np.arange(dfDP.ix[0, 0], dfDP.ix[ dfDP.shape[0] - 1, 0], 0.00005) - fVoltageRe = interp1d(timeDP, voltageReDP) - fVoltageIm = interp1d(timeDP, voltageImDP) - interpVoltageRe = fVoltageRe(interpTime) - interpVoltageIm = fVoltageIm(interpTime) - - voltageShiftDPInterp = interpVoltageRe*np.cos(2*np.pi*50*interpTime) - interpVoltageIm*np.sin(2*np.pi*50*interpTime) - voltageAbsDP = np.sqrt(voltageReDP**2+voltageImDP**2) - - fig, ax1 = plt.subplots() - ax1.plot(timeRef, voltageRef, 'm:', label='Ref') - ax1.plot(interpTime, voltageShiftDPInterp, 'b--', label='DP interp') - ax1.plot(timeDP, voltageAbsDP, 'r-', label='DP abs') - - # Now add the legend with some customizations. - legend = ax1.legend(loc='lower right', shadow=True) - - # The frame is matplotlib.patches.Rectangle instance surrounding the legend. - frame = legend.get_frame() - frame.set_facecolor('0.90') - - ax1.set_xlabel('time [s]') - ax1.set_ylabel('mag [V]') - ax1.grid(True) - plt.show() - -def plotNodeVoltageDpEmtRef(filenameRef, filenameDP, filenameEMT, node): - node = node - 1 - dfRef = pd.read_csv(filenameRef, header=None) - dfEMT = pd.read_csv(filenameEMT, header=None) - dfDP = pd.read_csv(filenameDP, header=None) - - if (dfRef.shape[1] - 1) < node or node < 0: - print('Node not available') - exit() - - if (dfEMT.shape[1] - 1) < node or node < 0: - print('Node not available') - exit() - - if (dfDP.shape[1] - 1) / 2 < node or node < 0: - print('Node not available') - exit() - - # Ref - timeRef = np.array(dfRef.ix[:,0]) - voltageRef = np.array(dfRef.ix[:,node + 1]) - - # EMT - timeEMT = np.array(dfEMT.ix[:,0]) - voltageEMT = np.array(dfEMT.ix[:,node + 1]) - - #DP - timeDP = np.array(dfDP.ix[:,0]) - voltageReDP = np.array(dfDP.ix[:,node + 1]) - voltageImDP = np.array(dfDP.ix[:, int((dfDP.shape[1] - 1) / 2 + node + 1)]) - voltageAbsDP = np.sqrt(voltageReDP**2+voltageImDP**2) - voltageShiftDP = voltageReDP*np.cos(2*np.pi*50*timeDP) - voltageImDP*np.sin(2*np.pi*50*timeDP) - - fig, ax1 = plt.subplots() - ax1.plot(timeRef, voltageRef, 'm:', label='Ref') - ax1.plot(timeEMT, voltageEMT, 'g--', label='EMT') - ax1.plot(timeDP, voltageShiftDP, 'b--', label='DP shift') - ax1.plot(timeDP, voltageAbsDP, 'r-', label='DP abs') - - # Now add the legend with some customizations. - legend = ax1.legend(loc='lower right', shadow=True) - - # The frame is matplotlib.patches.Rectangle instance surrounding the legend. - frame = legend.get_frame() - frame.set_facecolor('0.90') - - ax1.set_xlabel('time [s]') - ax1.set_ylabel('mag [V]') - ax1.grid(True) - plt.show() - - -def plotNodeVoltageDpEmt(filenameDP, filenameEMT, node): - node = node - 1 - dfEMT = pd.read_csv(filenameEMT, header=None) - dfDP = pd.read_csv(filenameDP, header=None) - - if (dfEMT.shape[1] - 1) < node or node < 0: - print('Node not available') - exit() - - if (dfDP.shape[1] - 1) / 2 < node or node < 0: - print('Node not available') - exit() - - # EMT - timeEMT = np.array(dfEMT.ix[:,0]) - voltageEMT = np.array(dfEMT.ix[:,node + 1]) - - #DP - timeDP = np.array(dfDP.ix[:,0]) - voltageReDP = np.array(dfDP.ix[:,node + 1]) - voltageImDP = np.array(dfDP.ix[:, int((dfDP.shape[1] - 1) / 2 + node + 1)]) - voltageAbsDP = np.sqrt(voltageReDP**2+voltageImDP**2) - voltageShiftDP = voltageReDP*np.cos(2*np.pi*50*timeDP) - voltageImDP*np.sin(2*np.pi*50*timeDP) - - fig, ax1 = plt.subplots() - ax1.plot(timeEMT, voltageEMT, 'g--', label='EMT') - ax1.plot(timeDP, voltageShiftDP, 'b--', label='DP shift') - ax1.plot(timeDP, voltageAbsDP, 'r-', label='DP abs') - - # Now add the legend with some customizations. - legend = ax1.legend(loc='lower right', shadow=True) - - # The frame is matplotlib.patches.Rectangle instance surrounding the legend. - frame = legend.get_frame() - frame.set_facecolor('0.90') - - ax1.set_xlabel('time [s]') - ax1.set_ylabel('mag [V]') - ax1.grid(True) - plt.show() - -def plotEmtNodeResults(filename, node): - node = node - 1 - df = pd.read_csv(filename, header=None) - print(df.shape) - - if (df.shape[1] - 1) < node or node < 0: - print('Node not available') - exit() - - time = np.array(df.ix[:,0]) - voltage = np.array(df.ix[:,node + 1]) - - fig, ax1 = plt.subplots() - ax1.plot(time, voltage, 'b-') - #plt.yticks(np.arange(-10, 10, 1.0)) - ax1.set_xlabel('time [s]') - ax1.set_ylabel('mag [V] or [A]') - ax1.grid(True) - plt.show() - -def plotNodeResults(filename, node): - node = node - 1 - df = pd.read_csv(filename, header=None) - print(df.shape) - - if (df.shape[1] - 1) / 2 < node or node < 0: - print('Node not available') - exit() - - time = np.array(df.ix[:,0]) - voltageRe = np.array(df.ix[:,node + 1]) - voltageIm = np.array(df.ix[:, int((df.shape[1] - 1) / 2 + node + 1)]) - - voltage = np.sqrt(voltageRe**2+voltageIm**2) - voltageEmt = voltageRe*np.cos(2*np.pi*50*time) - voltageIm*np.sin(2*np.pi*50*time) - fig, ax1 = plt.subplots() - ax1.plot(time, voltageEmt, 'b-', time, voltage, 'r-') - #plt.yticks(np.arange(-10, 10, 1.0)) - ax1.set_xlabel('time [s]') - ax1.set_ylabel('mag [V] or [A]') - ax1.grid(True) - plt.show() - -def plotInterpolatedNodeResults(filename, node): - node = node - 1 - df = pd.read_csv(filename, header=None) - print(df.shape) - - if (df.shape[1] - 1) / 2 < node or node < 0: - print('Node not available') - exit() - - time = np.array(df.ix[:,0]) - voltageRe = np.array(df.ix[:,node + 1]) - voltageIm = np.array(df.ix[:, int((df.shape[1] - 1) / 2 + node + 1)]) - - interpTime = np.arange(df.ix[0, 0], df.ix[ df.shape[0] - 1, 0], 0.00005) - fVoltageRe = interp1d(time, voltageRe) - fVoltageIm = interp1d(time, voltageIm) - - - interpVoltageRe = fVoltageRe(interpTime) - interpVoltageIm = fVoltageIm(interpTime) - - voltageMeas = np.sqrt(voltageRe**2+voltageIm**2) - voltage = np.sqrt(interpVoltageRe**2+interpVoltageIm**2) - voltageEmt = interpVoltageRe*np.cos(2*np.pi*50*interpTime) - interpVoltageIm*np.sin(2*np.pi*50*interpTime) - fig, ax1 = plt.subplots() - ax1.plot(interpTime, voltageEmt, 'b-') - ax1.plot(time, voltageMeas, 'r-') - ax1.set_xlabel('time [s]') - ax1.set_ylabel('mag [V] or [A]') - ax1.grid(True) - plt.show() - -def plotResultsInterfacedInductor(filename, node): - node = node - 1 - df = pd.read_csv(filename, header=None) - print(df.shape) - - if (df.shape[1] - 1) / 2 < node or node < 0: - print('Voltage not available') - exit() - - time = np.array(df.ix[:,0]) - voltageRe = np.array(df.ix[:,node + 1]) - voltageIm = np.array(df.ix[:, int((df.shape[1] - 1) / 2 + node + 1)]) - - voltage = np.sqrt(voltageRe**2+voltageIm**2) - voltageEmt = voltageRe*np.cos(2*np.pi*50*time) - voltageIm*np.sin(2*np.pi*50*time) - fig, ax1 = plt.subplots() - ax1.plot(time, voltageEmt, 'b-', time, voltage, 'r-') - plt.yticks(np.arange(-10, 10, 1.0)) - ax1.set_xlabel('time [s]') - ax1.set_ylabel('voltage [V]') - ax1.grid(True) - plt.show() - -def plotResultsSynGenUnitTest(filename, node1, node2, node3): - node1 = node1 - 1 - node2 = node2 - 1 - node3 = node3 - 1 - df = pd.read_csv(filename, header=None) - print(df.shape) - - if (df.shape[1] - 1) / 2 < node1 or node1 < 0 or \ - (df.shape[1] - 1) / 2 < node2 or node2 < 0 or \ - (df.shape[1] - 1) / 2 < node3 or node3 < 0: - print('Voltage not available') - exit() - - time = np.array(df.ix[:,0]) - mag1 = np.array(df.ix[:,node1 + 1]) - mag2 = np.array(df.ix[:,node2 + 1]) - mag3 = np.array(df.ix[:,node3 + 1]) - - fig, ax1 = plt.subplots() - ax1.plot(time, mag1, 'b-', time, mag2, 'r-', time, mag3, 'g-') - #ax1.plot(time, voltageEmt, 'b-', time, voltage, 'r-') - #plt.yticks(np.arange(-10, 10, 1.0)) - ax1.set_xlabel('time [s]') - ax1.set_ylabel('Magnitude') - ax1.grid(True) - plt.show() - -def plotResultsSynGenUnitTestVar(filename, varNum): - - df = pd.read_csv(filename, header=None) - print(df.shape) - - if (df.shape[1]) < varNum or varNum < 0: - print('Variable not available') - exit() - - time = np.array(df.ix[:,0]) - mag = np.array(df.ix[:,varNum]) - - fig, ax1 = plt.subplots() - ax1.plot(time, mag, 'b-') - #plt.yticks(np.arange(-10, 10, 1.0)) - ax1.set_xlabel('time [s]') - ax1.set_ylabel('Magnitude') - ax1.grid(True) - plt.show() diff --git a/dataprocessing/plottools.py b/dataprocessing/plottools.py index cf23f28bab41eb2c0439bf8389aaf585c0e26ff7..78f083a6f09063a2c8b6397159050eabba4d8a64 100644 --- a/dataprocessing/plottools.py +++ b/dataprocessing/plottools.py @@ -20,3 +20,5 @@ def plot_timeseries(figure_id, timeseries, plt_linestyle='-'): def set_time_series_labels(timeseries_list, time_series_labels): for ts in timeseries_list: ts.label = time_series_labels[timeseries_list.index(ts)] + + diff --git a/dataprocessing/timeseries.py b/dataprocessing/timeseries.py index 358c4390b56cab05afc7770592bca64ba85f458f..7115f4ccfaa9bd7964f800cb35c4b3f7414e40a3 100644 --- a/dataprocessing/timeseries.py +++ b/dataprocessing/timeseries.py @@ -1,4 +1,5 @@ import numpy as np +import cmath class TimeSeries: """Stores data from different simulation sources. @@ -44,19 +45,23 @@ class TimeSeries: return ts_abs def abs(self, name): - """ Calculate absolute value of complex variable. - Assumes the same time steps for both timeseries. + """ Calculate absolute value of complex time series. """ - ts_abs = TimeSeries(name, self.time, self.values.abs()) + abs_values = [] + for value in self.values: + abs_values.append(np.abs(value)) + ts_abs = TimeSeries(name, self.time, abs_values) return ts_abs - def complex_phase(name, ts_real, ts_imag): - """ Calculate absolute value of complex variable. - Assumes the same time steps for both timeseries. + def phase(self, name): + """ Calculate absolute value of complex time series. """ - ts_complex = np.vectorize(complex)(ts_real.values, ts_imag.values) - ts_abs = TimeSeries(name, ts_real.time, ts_complex.phase()) - return ts_abs + phase_values = [] + for value in self.values: + phase_values.append(np.angle(value, deg=True)) + ts_abs = TimeSeries(name, self.time, phase_values) + ts_phase = TimeSeries(name, self.time, phase_values) + return ts_phase @staticmethod def dyn_phasor_shift_to_emt(name, real, imag, freq):