Last active 4 days ago

Revision a5e56af2402a9d87bd2f52279f9d3a686a715e28

SpringAnalyze.py Raw
1import pandas as pd
2
3
4# ---------------------------------------------------------
5# STEP 1 - Get user inputs
6# ---------------------------------------------------------
7
8spring_name = input(
9 "Enter spring number (example: 1040_02): "
10).strip()
11
12threshold = float(
13 input(
14 "Enter peak detection threshold (mm): "
15 )
16)
17
18
19# ---------------------------------------------------------
20# STEP 2 - Open cleaned file
21# ---------------------------------------------------------
22
23input_file = f"Spring_{spring_name}_Cleaned.csv"
24
25print(f"\nLoading {input_file}...")
26
27df = pd.read_csv(input_file)
28
29
30# ---------------------------------------------------------
31# STEP 3 - Define important column names
32# ---------------------------------------------------------
33
34extension_column = "Extension from Preload (mm)"
35
36
37# ---------------------------------------------------------
38# STEP 4 - Create Above Threshold flag
39#
40# 1 = Extension is above threshold
41# 0 = Extension is below threshold
42# ---------------------------------------------------------
43print("Creating Above Threshold...")
44df["Above Threshold"] = (
45 df[extension_column] >= threshold
46).astype(int)
47
48
49# ---------------------------------------------------------
50# STEP 5 - Create Previous Above Threshold column
51#
52# Shift the Above Threshold column down by one row
53# ---------------------------------------------------------
54print("Creating Previous Above Threshold...")
55df["Previous Above Threshold"] = (
56 df["Above Threshold"]
57 .shift(1)
58 .fillna(0)
59 .astype(int)
60)
61
62
63# ---------------------------------------------------------
64# STEP 6 - Create Rising Edge column
65#
66# Rising Edge occurs when:
67#
68# Previous = 0
69# Current = 1
70# ---------------------------------------------------------
71print("Creating Rising Edge...")
72df["Rising Edge"] = (
73 (df["Above Threshold"] == 1)
74 &
75 (df["Previous Above Threshold"] == 0)
76).astype(int)
77
78
79# ---------------------------------------------------------
80# STEP 7 - Create Falling Edge column
81#
82# Falling Edge occurs when:
83#
84# Previous = 1
85# Current = 0
86# ---------------------------------------------------------
87print("Creating Falling Edge...")
88df["Falling Edge"] = (
89 (df["Above Threshold"] == 0)
90 &
91 (df["Previous Above Threshold"] == 1)
92).astype(int)
93
94
95# ---------------------------------------------------------
96# STEP 8 - Create Cycle Number
97#
98# Every Rising Edge starts a new cycle.
99#
100# Example:
101#
102# Rising Edge:
103# 0 0 1 0 0 1 0
104#
105# Cycle Number:
106# 0 0 1 1 1 2 2
107# ---------------------------------------------------------
108print("Creating Cycle Number...")
109df["Cycle Number"] = (
110 df["Rising Edge"]
111 .cumsum()
112)
113
114
115# ---------------------------------------------------------
116# STEP 9 - Save analyzed file
117# ---------------------------------------------------------
118print("Saving Analyzed File...")
119output_file = f"Spring_{spring_name}_Analyzed.csv"
120
121df.to_csv(output_file, index=False)
122
123
124# ---------------------------------------------------------
125# STEP 11 - Create Peak Summary
126# ---------------------------------------------------------
127
128peak_summary = []
129
130print("Creating Cycle Numbers...")
131# Get all valid cycle numbers
132cycle_numbers = sorted(
133 df[df["Cycle Number"] > 0]["Cycle Number"].unique()
134)
135
136for cycle in cycle_numbers:
137
138 # Get only rows for this cycle that are above threshold
139 cycle_data = df[
140 (df["Cycle Number"] == cycle)
141 &
142 (df["Above Threshold"] == 1)
143 ]
144
145 # Skip empty cycles just in case
146 if len(cycle_data) == 0:
147 continue
148
149 # Find row with maximum load
150 peak_index = cycle_data["Load (N)"].idxmax()
151
152 peak_row = df.loc[peak_index]
153
154 peak_summary.append({
155 "Cycle Number": cycle,
156 "Test": peak_row["Test"],
157 "Peak Load (N)": peak_row["Load (N)"],
158 "Peak Extension (mm)": peak_row["Extension from Preload (mm)"],
159 "Peak Time (s)": peak_row["Continuous Time (s)"],
160 "Peak Row": peak_index
161 })
162
163# ---------------------------------------------------------
164# STEP 12 - Create dataframe
165# ---------------------------------------------------------
166
167peak_df = pd.DataFrame(peak_summary)
168
169# ---------------------------------------------------------
170# STEP 13 - Save peak summary
171# ---------------------------------------------------------
172print("Saving peak summary...")
173peak_output_file = (
174 f"Spring_{spring_name}_Peaks.csv"
175)
176
177peak_df.to_csv(
178 peak_output_file,
179 index=False
180)
181
182# ---------------------------------------------------------
183# STEP 14 - Report results
184# ---------------------------------------------------------
185
186total_cycles = int(
187 df["Cycle Number"].max()
188)
189
190print("\nAnalysis Complete")
191print(
192 f"Total Cycles Found: "
193 f"{total_cycles}"
194)
195
196print(
197 f"Analyzed File: "
198 f"{output_file}"
199)
200
201print(
202 f"Peak Summary File: "
203 f"{peak_output_file}"
204)
SpringClean.py Raw
1import pandas as pd
2import glob
3import os
4
5
6# ---------------------------------------------------------
7# STEP 1 - Ask user which spring to process
8# ---------------------------------------------------------
9spring_name = input("Enter spring number (example: 1040_01): ").strip()
10
11
12# ---------------------------------------------------------
13# STEP 2 - Find all matching test files
14# ---------------------------------------------------------
15file_pattern = f"Spring_{spring_name}_Test_*.csv"
16
17file_list = glob.glob(file_pattern)
18
19# Make sure files are processed in order
20file_list.sort()
21
22if len(file_list) == 0:
23 print(f"No files found matching: {file_pattern}")
24 exit()
25
26
27# ---------------------------------------------------------
28# STEP 3 - Variables used while combining files
29# ---------------------------------------------------------
30combined_data = []
31
32time_offset = 0
33
34
35# ---------------------------------------------------------
36# STEP 4 - Process each test file
37# ---------------------------------------------------------
38for test_number, file in enumerate(file_list, start=1):
39
40 print(f"Processing: {file}")
41
42 # Read CSV
43 df = pd.read_csv(file)
44
45 # Remove rows containing empty data
46 df = df.dropna()
47
48 # Time column name
49 time_column = "Time (s)"
50
51 # Create Test column
52 df["Test"] = test_number
53
54 # Create continuous time column
55 df["Continuous Time (s)"] = df[time_column] + time_offset
56
57 # Determine ending time for next test
58 last_time = df[time_column].iloc[-1]
59
60 time_offset += last_time
61
62 # Store cleaned data
63 combined_data.append(df)
64
65
66# ---------------------------------------------------------
67# STEP 5 - Combine all tests into one dataframe
68# ---------------------------------------------------------
69final_df = pd.concat(combined_data, ignore_index=True)
70
71
72# ---------------------------------------------------------
73# STEP 6 - Create output filename
74# ---------------------------------------------------------
75output_file = f"Spring_{spring_name}_Cleaned.csv"
76
77
78# ---------------------------------------------------------
79# STEP 7 - Save cleaned data
80# ---------------------------------------------------------
81final_df.to_csv(output_file, index=False)
82
83print()
84print(f"Finished!")
85print(f"Output saved as: {output_file}")
This file can't be rendered. View the full file.
SpringCleanAndAnalyze.py Raw
1import pandas as pd
2import glob
3import os
4
5
6# ---------------------------------------------------------
7# STEP 1 - Ask user which spring to process
8# ---------------------------------------------------------
9spring_name = input("Enter spring number (example: 1040_01): ").strip()
10
11threshold = float(
12 input(
13 "Enter peak detection threshold (mm): "
14 )
15)
16
17
18# ---------------------------------------------------------
19# STEP 2 - Find all matching test files
20# ---------------------------------------------------------
21file_pattern = f"Spring_{spring_name}_Test_*.csv"
22
23file_list = glob.glob(file_pattern)
24
25# Make sure files are processed in order
26file_list.sort()
27
28if len(file_list) == 0:
29 print(f"No files found matching: {file_pattern}")
30 exit()
31
32
33# ---------------------------------------------------------
34# STEP 3 - Variables used while combining files
35# ---------------------------------------------------------
36combined_data = []
37
38time_offset = 0
39
40
41# ---------------------------------------------------------
42# STEP 4 - Process each test file
43# ---------------------------------------------------------
44for test_number, file in enumerate(file_list, start=1):
45
46 print(f"Processing: {file}")
47
48 # Read CSV
49 df = pd.read_csv(file)
50
51 # Remove rows containing empty data
52 df = df.dropna()
53
54 # Time column name
55 time_column = "Time (s)"
56
57 # Create Test column
58 df["Test"] = test_number
59
60 # Create continuous time column
61 df["Continuous Time (s)"] = df[time_column] + time_offset
62
63 # Determine ending time for next test
64 last_time = df[time_column].iloc[-1]
65
66 time_offset += last_time
67
68 # Store cleaned data
69 combined_data.append(df)
70
71
72# ---------------------------------------------------------
73# STEP 5 - Combine all tests into one dataframe
74# ---------------------------------------------------------
75final_df = pd.concat(combined_data, ignore_index=True)
76
77
78# ---------------------------------------------------------
79# STEP 6 - Create output filename
80# ---------------------------------------------------------
81output_file = f"Spring_{spring_name}_Cleaned.csv"
82
83
84# ---------------------------------------------------------
85# STEP 7 - Save cleaned data
86# ---------------------------------------------------------
87final_df.to_csv(output_file, index=False)
88
89print()
90print(f"Finished Cleaning!")
91print(f"Output saved as: {output_file}")
92
93
94# ---------------------------------------------------------------------
95# ANALYZING SECTION
96# ---------------------------------------------------------------------
97
98
99# ---------------------------------------------------------
100# STEP 2 - Open cleaned file
101# ---------------------------------------------------------
102
103input_file = f"Spring_{spring_name}_Cleaned.csv"
104
105print(f"\nLoading {input_file}...")
106
107df = pd.read_csv(input_file)
108
109
110# ---------------------------------------------------------
111# STEP 3 - Define important column names
112# ---------------------------------------------------------
113
114extension_column = "Extension (mm)"
115
116
117# ---------------------------------------------------------
118# STEP 4 - Create Above Threshold flag
119#
120# 1 = Extension is above threshold
121# 0 = Extension is below threshold
122# ---------------------------------------------------------
123print("Creating Above Threshold...")
124df["Above Threshold"] = (
125 df[extension_column] >= threshold
126).astype(int)
127
128
129# ---------------------------------------------------------
130# STEP 5 - Create Previous Above Threshold column
131#
132# Shift the Above Threshold column down by one row
133# ---------------------------------------------------------
134print("Creating Previous Above Threshold...")
135df["Previous Above Threshold"] = (
136 df["Above Threshold"]
137 .shift(1)
138 .fillna(0)
139 .astype(int)
140)
141
142
143# ---------------------------------------------------------
144# STEP 6 - Create Rising Edge column
145#
146# Rising Edge occurs when:
147#
148# Previous = 0
149# Current = 1
150# ---------------------------------------------------------
151print("Creating Rising Edge...")
152df["Rising Edge"] = (
153 (df["Above Threshold"] == 1)
154 &
155 (df["Previous Above Threshold"] == 0)
156).astype(int)
157
158
159# ---------------------------------------------------------
160# STEP 7 - Create Falling Edge column
161#
162# Falling Edge occurs when:
163#
164# Previous = 1
165# Current = 0
166# ---------------------------------------------------------
167print("Creating Falling Edge...")
168df["Falling Edge"] = (
169 (df["Above Threshold"] == 0)
170 &
171 (df["Previous Above Threshold"] == 1)
172).astype(int)
173
174
175# ---------------------------------------------------------
176# STEP 8 - Create Cycle Number
177#
178# Every Rising Edge starts a new cycle.
179#
180# Example:
181#
182# Rising Edge:
183# 0 0 1 0 0 1 0
184#
185# Cycle Number:
186# 0 0 1 1 1 2 2
187# ---------------------------------------------------------
188print("Creating Cycle Number...")
189df["Cycle Number"] = (
190 df["Rising Edge"]
191 .cumsum()
192)
193
194
195# ---------------------------------------------------------
196# STEP 9 - Save analyzed file
197# ---------------------------------------------------------
198print("Saving Analyzed File...")
199output_file = f"Spring_{spring_name}_Analyzed.csv"
200
201df.to_csv(output_file, index=False)
202
203
204# ---------------------------------------------------------
205# STEP 11 - Create Peak Summary
206# ---------------------------------------------------------
207
208peak_summary = []
209
210print("Creating Cycle Numbers...")
211# Get all valid cycle numbers
212cycle_numbers = sorted(
213 df[df["Cycle Number"] > 0]["Cycle Number"].unique()
214)
215
216for cycle in cycle_numbers:
217
218 # Get only rows for this cycle that are above threshold
219 cycle_data = df[
220 (df["Cycle Number"] == cycle)
221 &
222 (df["Above Threshold"] == 1)
223 ]
224
225 # Skip empty cycles just in case
226 if len(cycle_data) == 0:
227 continue
228
229 # Find row with maximum load
230 peak_index = cycle_data["Load (N)"].idxmax()
231
232 peak_row = df.loc[peak_index]
233
234 peak_summary.append({
235 "Cycle Number": cycle,
236 "Test": peak_row["Test"],
237 "Peak Load (N)": peak_row["Load (N)"],
238 "Peak Extension (mm)": peak_row[extension_column],
239 "Peak Time (s)": peak_row["Continuous Time (s)"],
240 "Peak Row": peak_index
241 })
242
243# ---------------------------------------------------------
244# STEP 12 - Create dataframe
245# ---------------------------------------------------------
246
247peak_df = pd.DataFrame(peak_summary)
248
249# ---------------------------------------------------------
250# STEP 13 - Save peak summary
251# ---------------------------------------------------------
252print("Saving peak summary...")
253peak_output_file = (
254 f"Spring_{spring_name}_Peaks.csv"
255)
256
257peak_df.to_csv(
258 peak_output_file,
259 index=False
260)
261
262# Cycles per test count
263cycles_per_test = (
264 peak_df.groupby("Test").size()
265)
266
267print("Cycles Per Test:")
268
269for test, count in cycles_per_test.items():
270 print(f"Test {int(test)}: {count}")
271
272# ---------------------------------------------------------
273# STEP 14 - Report results
274# ---------------------------------------------------------
275
276total_cycles = int(
277 df["Cycle Number"].max()
278)
279
280print("\nAnalysis Complete")
281print(
282 f"Total Cycles Found: "
283 f"{total_cycles}"
284)
285
286print(
287 f"Total Peaks Found: "
288 f"{len(peak_summary)}"
289)
290
291print(
292 f"Analyzed File: "
293 f"{output_file}"
294)
295
296print(
297 f"Peak Summary File: "
298 f"{peak_output_file}"
299)
300
301input("\nPress Enter to exit")