From 7873d7bed4b09b407571730654abfb39943d7ac7 Mon Sep 17 00:00:00 2001
From: dave <dave@dtu.dk>
Date: Sat, 23 Jul 2016 11:09:34 +0200
Subject: [PATCH] prepost.windIO.LoadResults: added method to calc stats+del in
 df format

---
 wetb/prepost/windIO.py | 77 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 77 insertions(+)

diff --git a/wetb/prepost/windIO.py b/wetb/prepost/windIO.py
index dec84605..323dbe44 100755
--- a/wetb/prepost/windIO.py
+++ b/wetb/prepost/windIO.py
@@ -817,6 +817,83 @@ class LoadResults(ReadHawc2):
         stats['int'] = integrate.trapz(sig[i0:i1, :], x=sig[i0:i1, 0], axis=0)
         return stats
 
+    def statsdel_df(self, i0=0, i1=None, statchans='all', delchans='all',
+                    m=[3, 4, 6, 8, 10, 12], neq=None, no_bins=46):
+        """Calculate statistics and equivalent loads for the current loaded
+        signal.
+
+        Parameters
+        ----------
+
+        i0 : int, default=0
+
+        i1 : int, default=None
+
+        channels : list, default='all'
+            all channels are selected if set to 'all', otherwise define a list
+            using the unique channel defintions.
+
+        neq : int, default=1
+
+        no_bins : int, default=46
+
+        Return
+        ------
+
+        statsdel : pd.DataFrame
+            Pandas DataFrame with the statistical parameters and the different
+            fatigue coefficients as columns, and channels as rows. As index the
+            unique channel name is used.
+
+        """
+
+        stats = ['max', 'min', 'mean', 'std', 'range', 'absmax', 'rms', 'int']
+        if statchans == 'all':
+            statchans = self.ch_df['unique_ch_name'].tolist()
+            statchis = self.ch_df['unique_ch_name'].index.values
+        else:
+            sel = self.ch_df['unique_ch_name']
+            statchis = self.ch_df[sel.isin(statchans)].index.values
+
+        if delchans == 'all':
+            delchans = self.ch_df['unique_ch_name'].tolist()
+            delchis = self.ch_df.index.values
+        else:
+            sel = self.ch_df['unique_ch_name']
+            delchis = self.ch_df[sel.isin(delchans)].index.values
+
+        # delchans has to be a subset of statchans!
+        if len(set(delchans) - set(statchans)) > 0:
+            raise ValueError('delchans has to be a subset of statchans')
+
+        tmp = np.ndarray((len(statchans), len(stats+m)))
+        tmp[:,:] = np.nan
+        m_cols = ['m=%i' % m_ for m_ in m]
+        statsdel = pd.DataFrame(tmp, columns=stats+m_cols)
+        statsdel.index = statchans
+
+        datasel = self.sig[i0:i1,statchis]
+        time = self.sig[i0:i1,0]
+        statsdel['max'] = datasel.max(axis=0)
+        statsdel['min'] = datasel.min(axis=0)
+        statsdel['mean'] = datasel.mean(axis=0)
+        statsdel['std'] = datasel.std(axis=0)
+        statsdel['range'] = statsdel['max'] - statsdel['min']
+        statsdel['absmax'] = np.abs(datasel).max(axis=0)
+        statsdel['rms'] = np.sqrt(np.mean(datasel*datasel, axis=0))
+        statsdel['int'] = integrate.trapz(datasel, x=time, axis=0)
+        statsdel['intabs'] = integrate.trapz(np.abs(datasel), x=time, axis=0)
+
+        if neq is None:
+            neq = self.sig[-1,0] - self.sig[0,0]
+
+        for chi, chan in zip(delchis, delchans):
+            signal = self.sig[i0:i1,chi]
+            eq = self.calc_fatigue(signal, no_bins=no_bins, neq=neq, m=m)
+            statsdel.loc[chan][m_cols] = eq
+
+        return statsdel
+
     # TODO: general signal method, this is not HAWC2 specific, move out
     def calc_fatigue(self, signal, no_bins=46, m=[3, 4, 6, 8, 10, 12], neq=1):
         """
-- 
GitLab