0

I have data from a measurement and I want to process the data so that only the values remain, that are constant. The measured signal consists of parts where the value stays constant for some time then I do a change on the system that causes the value to increase. It takes time for the system to reach the constant value after the adjustment I do.
I wrote a programm that compares every value with the 10 previous values. If it is equal to them within a tolerance it gets saved.

The code works but i feel like this can be done cleaner and more efficient so that it is sutable to process larger amouts of data. But I dont know how to make the code in for-loop more efficient. Do you have any suggestions?

Thank you in advance.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

df = pd.read_csv('radiale Steifigkeit_22_04_2022_raw.csv', 
                 sep= ";",
                 decimal = ',',
                 skipinitialspace=True,
                 comment = '\t')

#df = df.drop(df.columns[[0,4]], axis=1)
#print(df.head())
#print(df.dtypes)

#df.plot(x = 'Time_SYS 01-cDAQ:1_A-In-All_Rec_rel', y = 'Kraft')
#df.plot(x = 'Time_SYS 01-cDAQ:1_A-In-All_Rec_rel', y = 'Weg')
#plt.show()

s = pd.Series(df['Weg'],  name = 'Weg')
f = pd.Series(df['Kraft'], name= 'Kraft')
t = pd.Series(df['Time_SYS 01-cDAQ:1_A-In-All_Rec_rel'], name= 'Zeit')
#s_const = pd.Series()
s_const = []
f_const = []
t_const = []
s = np.abs(s)

#plt.plot(s)
#plt.show()

c = 0
#this for-loop compares the value s[i] with the previous 10 measurements. 
#If it is equal within a tolerance it is saved into s_const.
for i in range(len(s)):
#for i in range(0,2000):
    if i > 10:
        si  = round(s[i],3)
        s1i = round(s[i-1],3)
        s2i = round(s[i-2],3)
        s3i = round(s[i-3],3)
        s4i = round(s[i-4],3)
        s5i = round(s[i-5],3)
        s6i = round(s[i-6],3)
        s7i = round(s[i-7],3)
        s8i = round(s[i-8],3)
        s9i = round(s[i-9],3)
        s10i = round(s[i-10],3)
        if si == s1i == s2i == s3i == s4i == s5i== s6i == s7i== s8i == s9i == s10i:
            c = c+1
            s_const.append(s[i])
            f_const.append(f[i])

1 Answers1

0

Here is a very performant implementation using itertools (based on Check if all elements in a list are identical):

from itertools import groupby

def all_equal(iterable):
    g = groupby(iterable)
    return next(g, True) and not next(g, False)


data = [1, 2, 2, 2, 2, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5]
window = 3

stable = [i for i in range(len(data) - window + 1) if all_equal(data[i:i+window])]
print(stable)  # -> [1, 2, 7, 8, 9, 10, 13]

The algorithm produces a list of indices in your data where a stable period of length window starts.

Nechoj
  • 1,512
  • 1
  • 8
  • 18