Prathamesh1420 commited on
Commit
e19627e
·
verified ·
1 Parent(s): 385cdd3

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +360 -15
app.py CHANGED
@@ -7,6 +7,355 @@ import matplotlib.pyplot as plt
7
  import io
8
  import base64
9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10
  # Load and preprocess data
11
  def load_data():
12
  df = pd.read_csv("data (3).csv", skiprows=2, header=None)
@@ -54,13 +403,11 @@ def train_arima(series, order=(5,1,0)):
54
  forecast = model_fit.forecast(steps=10)
55
  return model_fit, forecast
56
 
57
- # Create plot
58
  # Create plot
59
  def create_plot(historical, forecast, freq='M'):
60
- plt.figure(figsize=(14, 7)) # bigger figure
61
  plt.plot(historical.index, historical, label='Historical', linewidth=2)
62
 
63
- # Generate forecast index
64
  forecast_index = pd.date_range(
65
  start=historical.index[-1] + pd.tseries.frequencies.to_offset(freq),
66
  periods=len(forecast),
@@ -74,7 +421,6 @@ def create_plot(historical, forecast, freq='M'):
74
  plt.ylabel('Value', fontsize=14)
75
  plt.grid(True, alpha=0.3)
76
 
77
- # Convert plot to base64 for Gradio
78
  buf = io.BytesIO()
79
  plt.savefig(buf, format='png', bbox_inches="tight")
80
  buf.seek(0)
@@ -82,45 +428,44 @@ def create_plot(historical, forecast, freq='M'):
82
  buf.close()
83
  plt.close()
84
 
85
- # Force full width in Gradio
86
  return f'<img src="data:image/png;base64,{img_str}" style="width:100%; height:auto;" />'
87
 
88
-
89
  # Main prediction function
90
  def predict(part_number, model_name):
91
  df = load_data()
92
  df_part = df[df['PN'] == part_number].copy()
93
 
94
- # Prepare time series data
95
  start_date = '2021-10-09'
96
  date_range = pd.date_range(start=start_date, periods=len(df_part), freq='W')
97
  df_part['Date'] = date_range
98
  df_part.set_index('Date', inplace=True)
99
  series = df_part['y'].astype(float)
100
 
101
- # Detect frequency automatically
102
  freq = pd.infer_freq(series.index) or 'M'
103
 
 
 
 
104
  if model_name == 'ARIMA':
105
- model, forecast = train_arima(series)
106
 
107
  plot_html = create_plot(series, forecast, freq=freq)
108
 
109
-
110
- # Calculate metrics
111
  train_size = int(len(series) * 0.8)
112
  train, test = series[:train_size], series[train_size:]
113
 
114
- model_eval = ARIMA(train, order=(5,1,0))
115
  model_fit_eval = model_eval.fit()
116
  predictions = model_fit_eval.forecast(steps=len(test))
117
 
118
  rmse = np.sqrt(mean_squared_error(test, predictions))
119
  mae = mean_absolute_error(test, predictions)
120
 
121
- plot_html = create_plot(series, forecast)
122
-
123
  metrics = f"""
 
 
124
  Model Performance Metrics:
125
  - RMSE: {rmse:.2f}
126
  - MAE: {mae:.2f}
@@ -159,4 +504,4 @@ def create_interface():
159
 
160
  if __name__ == "__main__":
161
  demo = create_interface()
162
- demo.launch()
 
7
  import io
8
  import base64
9
 
10
+ # ✅ Mapping of best ARIMA orders per part number
11
+ # (replace with your actual best parameters from the notebook)
12
+ BEST_ARIMA_PARAMS = {
13
+ "TE50011": (2, 0, 1),
14
+ "TE50012": (2, 1, 1),
15
+ "TE50013": (1, 1, 1),
16
+ "TE50014": (0, 0, 0),
17
+ "TE50015": (0, 1, 0),
18
+ "TE50016": (0, 1, 1),
19
+ "TE50017": (2, 1, 0),
20
+ "TE50018": (1, 1, 2),
21
+ "TE50019": (2, 1, 0),
22
+ "TE50020": (2, 1, 1),
23
+ "TE50021": (0, 0, 0),
24
+ "TE50022": (2, 1, 2),
25
+ "TE50023": (1, 0, 0),
26
+ "TE50024": (1, 1, 2),
27
+ "TE50025": (1, 1, 0),
28
+ "TE50026": (2, 0, 0),
29
+ "TE50027": (0, 0, 2),
30
+ "TE50028": (1, 0, 1),
31
+ "TE50029": (0, 1, 0),
32
+ "TE50030": (0, 1, 0),
33
+ "TE50031": (1, 1, 0),
34
+ "TE50032": (1, 1, 0),
35
+ "TE50033": (2, 1, 1),
36
+ "TE50034": (0, 0, 0),
37
+ "TE50035": (2, 1, 0),
38
+ "TE50036": (0, 1, 0),
39
+ "TE50037": (0, 0, 2),
40
+ "TE50038": (2, 1, 1),
41
+ "TE50039": (2, 0, 1),
42
+ "TE50040": (1, 1, 1),
43
+ "TE50041": (1, 1, 0),
44
+ "TE50042": (0, 1, 0),
45
+ "TE50043": (2, 1, 0),
46
+ "TE50044": (0, 1, 0),
47
+ "TE50045": (1, 0, 0),
48
+ "TE50046": (0, 1, 0),
49
+ "TE50047": (1, 1, 2),
50
+ "TE50048": (0, 1, 0),
51
+ "TE50049": (2, 1, 2),
52
+ "TE50050": (2, 0, 2),
53
+ "TE50051": (0, 1, 0),
54
+ "TE50052": (2, 0, 1),
55
+ "TE50053": (1, 0, 2),
56
+ "TE50054": (1, 1, 0),
57
+ "TE50055": (0, 0, 0),
58
+ "TE50056": (2, 0, 2),
59
+ "TE50057": (0, 1, 0),
60
+ "TE50058": (1, 1, 0),
61
+ "TE50059": (0, 1, 0),
62
+ "TE50060": (1, 1, 2),
63
+ "TE50061": (2, 1, 0),
64
+ "TE50062": (1, 1, 2),
65
+ "TE50063": (0, 0, 2),
66
+ "TE50064": (0, 1, 0),
67
+ "TE50065": (0, 1, 0),
68
+ "TE50066": (2, 1, 0),
69
+ "TE50067": (2, 1, 0),
70
+ "TE50068": (1, 1, 0),
71
+ "TE50069": (0, 1, 2),
72
+ "TE50070": (1, 1, 1),
73
+ "TE50071": (2, 1, 2),
74
+ "TE50072": (2, 0, 2),
75
+ "TE50073": (2, 0, 1),
76
+ "TE50074": (0, 1, 1),
77
+ "TE50075": (2, 1, 0),
78
+ "TE50076": (0, 1, 0),
79
+ "TE50077": (0, 1, 2),
80
+ "TE50078": (2, 1, 0),
81
+ "TE50079": (0, 1, 0),
82
+ "TE50080": (2, 1, 2),
83
+ "TE50081": (2, 1, 0),
84
+ "TE50082": (0, 1, 0),
85
+ "TE50083": (2, 1, 0),
86
+ "TE50084": (0, 1, 0),
87
+ "TE50085": (2, 1, 0),
88
+ "TE50086": (0, 1, 1),
89
+ "TE50087": (2, 0, 1),
90
+ "TE50088": (2, 1, 0),
91
+ "TE50089": (2, 0, 2),
92
+ "TE50090": (0, 1, 1),
93
+ "TE50091": (0, 1, 0),
94
+ "TE50092": (0, 1, 0),
95
+ "TE50093": (2, 0, 2),
96
+ "TE50094": (2, 0, 1),
97
+ "TE50095": (1, 0, 0),
98
+ "TE50096": (0, 1, 0),
99
+ "TE50097": (0, 1, 0),
100
+ "TE50098": (1, 1, 0),
101
+ "TE50099": (0, 1, 0),
102
+ "TE50100": (2, 0, 2),
103
+ "TE50101": (2, 0, 2),
104
+ "TE50102": (1, 1, 1),
105
+ "TE50103": (0, 0, 1),
106
+ "TE50104": (0, 1, 0),
107
+ "TE50105": (2, 0, 0),
108
+ "TE50106": (2, 0, 0),
109
+ "TE50107": (2, 0, 0),
110
+ "TE50108": (2, 1, 0),
111
+ "TE50109": (2, 1, 0),
112
+ "TE50110": (0, 1, 0),
113
+ "TE50111": (0, 1, 2),
114
+ "TE50112": (2, 1, 2),
115
+ "TE50113": (0, 1, 0),
116
+ "TE50114": (0, 1, 0),
117
+ "TE50115": (1, 1, 0),
118
+ "TE50116": (1, 0, 0),
119
+ "TE50117": (2, 1, 0),
120
+ "TE50118": (2, 1, 1),
121
+ "TE50119": (2, 1, 0),
122
+ "TE50120": (2, 1, 1),
123
+ "TE50121": (0, 1, 0),
124
+ "TE50122": (1, 1, 2),
125
+ "TE50123": (2, 1, 1),
126
+ "TE50124": (1, 0, 2),
127
+ "TE50125": (1, 0, 2),
128
+ "TE50126": (0, 0, 0),
129
+ "TE50127": (0, 1, 0),
130
+ "TE50128": (2, 1, 0),
131
+ "TE50129": (0, 1, 0),
132
+ "TE50130": (1, 1, 0),
133
+ "TE50131": (0, 1, 1),
134
+ "TE50132": (0, 1, 0),
135
+ "TE50133": (2, 0, 2),
136
+ "TE50134": (1, 1, 0),
137
+ "TE50135": (0, 1, 0),
138
+ "TE50136": (0, 1, 2),
139
+ "TE50137": (2, 0, 0),
140
+ "TE50138": (2, 1, 0),
141
+ "TE50139": (0, 1, 0),
142
+ "TE50140": (0, 1, 0),
143
+ "TE50141": (0, 1, 0),
144
+ "TE50142": (2, 1, 2),
145
+ "TE50143": (0, 1, 0),
146
+ "TE50144": (0, 1, 0),
147
+ "TE50145": (1, 0, 2),
148
+ "TE50146": (0, 0, 0),
149
+ "TE50147": (0, 0, 2),
150
+ "TE50148": (2, 0, 2),
151
+ "TE50149": (1, 0, 2),
152
+ "TE50150": (2, 1, 1),
153
+ "TE50151": (2, 0, 2),
154
+ "TE50152": (2, 0, 1),
155
+ "TE50153": (2, 0, 2),
156
+ "TE50154": (2, 0, 2),
157
+ "TE50155": (0, 0, 0),
158
+ "TE50156": (0, 0, 0),
159
+ "TE50157": (0, 1, 2),
160
+ "TE50158": (1, 0, 2),
161
+ "TE50159": (2, 1, 0),
162
+ "TE50160": (2, 1, 0),
163
+ "TE50161": (2, 0, 2),
164
+ "TE50162": (0, 1, 0),
165
+ "TE50163": (0, 1, 0),
166
+ "TE50164": (1, 0, 0),
167
+ "TE50165": (0, 1, 0),
168
+ "TE50166": (2, 0, 2),
169
+ "TE50167": (0, 1, 2),
170
+ "TE50168": (0, 1, 0),
171
+ "TE50169": (0, 1, 0),
172
+ "TE50170": (1, 1, 0),
173
+ "TE50171": (2, 1, 2),
174
+ "TE50172": (2, 1, 2),
175
+ "TE50173": (0, 1, 0),
176
+ "TE50174": (2, 1, 0),
177
+ "TE50175": (0, 1, 0),
178
+ "TE50176": (2, 0, 2),
179
+ "TE50177": (2, 0, 2),
180
+ "TE50178": (1, 1, 0),
181
+ "TE50179": (1, 0, 1),
182
+ "TE50180": (0, 1, 0),
183
+ "TE50181": (0, 1, 0),
184
+ "TE50182": (1, 1, 0),
185
+ "TE50183": (2, 1, 1),
186
+ "TE50184": (0, 1, 0),
187
+ "TE50185": (1, 1, 0),
188
+ "TE50186": (2, 0, 2),
189
+ "TE50187": (0, 1, 0),
190
+ "TE50188": (0, 1, 1),
191
+ "TE50189": (2, 0, 2),
192
+ "TE50190": (1, 1, 0),
193
+ "TE50191": (0, 1, 0),
194
+ "TE50192": (0, 0, 1),
195
+ "TE50193": (1, 1, 0),
196
+ "TE50194": (2, 1, 0),
197
+ "TE50195": (2, 0, 2),
198
+ "TE50196": (0, 1, 0),
199
+ "TE50197": (0, 0, 1),
200
+ "TE50198": (0, 1, 0),
201
+ "TE50199": (0, 1, 0),
202
+ "TE50200": (0, 1, 0),
203
+ "TE50201": (0, 1, 0),
204
+ "TE50202": (0, 1, 0),
205
+ "TE50203": (0, 1, 0),
206
+ "TE50204": (2, 1, 2),
207
+ "TE50205": (2, 0, 1),
208
+ "TE50206": (1, 1, 1),
209
+ "TE50207": (2, 0, 0),
210
+ "TE50208": (0, 1, 0),
211
+ "TE50209": (2, 0, 2),
212
+ "TE50210": (0, 1, 0),
213
+ "TE50211": (0, 1, 0),
214
+ "TE50212": (0, 1, 0),
215
+ "TE50213": (0, 1, 0),
216
+ "TE50214": (0, 1, 0),
217
+ "TE50215": (0, 1, 0),
218
+ "TE50216": (0, 1, 0),
219
+ "TE50217": (0, 1, 0),
220
+ "TE50218": (2, 0, 1),
221
+ "TE50219": (2, 1, 0),
222
+ "TE50220": (2, 1, 0),
223
+ "TE50221": (1, 1, 2),
224
+ "TE50222": (0, 1, 0),
225
+ "TE50223": (0, 1, 1),
226
+ "TE50224": (0, 1, 0),
227
+ "TE50225": (0, 1, 0),
228
+ "TE50226": (0, 1, 0),
229
+ "TE50227": (0, 1, 0),
230
+ "TE50228": (0, 1, 0),
231
+ "TE50229": (0, 1, 0),
232
+ "TE50230": (0, 1, 0),
233
+ "TE50231": (0, 1, 0),
234
+ "TE50232": (0, 1, 1),
235
+ "TE50233": (1, 1, 2),
236
+ "TE50234": (0, 1, 0),
237
+ "TE50235": (0, 1, 0),
238
+ "TE50236": (0, 1, 0),
239
+ "TE50237": (0, 1, 0),
240
+ "TE50238": (0, 0, 2),
241
+ "TE50239": (0, 1, 0),
242
+ "TE50240": (0, 1, 0),
243
+ "TE50241": (0, 1, 0),
244
+ "TE50242": (0, 1, 0),
245
+ "TE50243": (0, 1, 0),
246
+ "TE50244": (0, 1, 0),
247
+ "TE50245": (0, 1, 0),
248
+ "TE50246": (0, 1, 0),
249
+ "TE50247": (0, 1, 0),
250
+ "TE50248": (0, 1, 0),
251
+ "TE50249": (0, 1, 0),
252
+ "TE50250": (2, 0, 1),
253
+ "TE50251": (2, 0, 1),
254
+ "TE50252": (0, 1, 0),
255
+ "TE50253": (0, 1, 0),
256
+ "TE50254": (0, 1, 0),
257
+ "TE50255": (0, 1, 0),
258
+ "TE50256": (0, 1, 0),
259
+ "TE50257": (0, 1, 0),
260
+ "TE50258": (0, 1, 0),
261
+ "TE50259": (0, 1, 0),
262
+ "TE50260": (0, 1, 0),
263
+ "TE50261": (0, 1, 0),
264
+ "TE50262": (0, 1, 0),
265
+ "TE50263": (0, 1, 0),
266
+ "TE50264": (0, 1, 0),
267
+ "TE50265": (0, 1, 0),
268
+ "TE50266": (0, 1, 0),
269
+ "TE50267": (0, 1, 0),
270
+ "TE50268": (0, 1, 0),
271
+ "TE50269": (0, 1, 0),
272
+ "TE50270": (0, 1, 0),
273
+ "TE50271": (0, 1, 0),
274
+ "TE50272": (0, 1, 0),
275
+ "TE50273": (0, 1, 0),
276
+ "TE50274": (0, 1, 0),
277
+ "TE50275": (0, 1, 0),
278
+ "TE50276": (0, 1, 0),
279
+ "TE50277": (0, 1, 0),
280
+ "TE50278": (0, 1, 0),
281
+ "TE50279": (0, 1, 0),
282
+ "TE50280": (0, 1, 0),
283
+ "TE50281": (0, 1, 0),
284
+ "TE50282": (0, 1, 0),
285
+ "TE50283": (0, 1, 0),
286
+ "TE50284": (0, 1, 0),
287
+ "TE50285": (0, 1, 0),
288
+ "TE50286": (0, 1, 0),
289
+ "TE50287": (0, 1, 0),
290
+ "TE50288": (0, 1, 0),
291
+ "TE50289": (0, 1, 0),
292
+ "TE50290": (0, 1, 0),
293
+ "TE50291": (0, 1, 0),
294
+ "TE50292": (0, 1, 0),
295
+ "TE50293": (0, 1, 0),
296
+ "TE50294": (0, 1, 0),
297
+ "TE50295": (0, 1, 0),
298
+ "TE50296": (0, 1, 0),
299
+ "TE50297": (0, 1, 0),
300
+ "TE50298": (0, 1, 0),
301
+ "TE50299": (0, 1, 0),
302
+ "TE50300": (0, 1, 0),
303
+ "TE50301": (0, 1, 0),
304
+ "TE50302": (0, 1, 0),
305
+ "TE50303": (0, 1, 0),
306
+ "TE50304": (0, 1, 0),
307
+ "TE50305": (0, 1, 0),
308
+ "TE50306": (0, 1, 0),
309
+ "TE50307": (0, 1, 0),
310
+ "TE50308": (0, 1, 0),
311
+ "TE50309": (0, 1, 0),
312
+ "TE50310": (0, 1, 0),
313
+ "TE50311": (0, 1, 0),
314
+ "TE50312": (0, 1, 0),
315
+ "TE50313": (0, 1, 0),
316
+ "TE50314": (0, 1, 0),
317
+ "TE50315": (0, 1, 0),
318
+ "TE50316": (0, 1, 0),
319
+ "TE50317": (0, 1, 0),
320
+ "TE50318": (0, 1, 0),
321
+ "TE50319": (0, 1, 0),
322
+ "TE50320": (0, 1, 0),
323
+ "TE50321": (0, 1, 0),
324
+ "TE50322": (0, 1, 0),
325
+ "TE50323": (0, 1, 0),
326
+ "TE50324": (0, 1, 0),
327
+ "TE50325": (0, 1, 0),
328
+ "TE50326": (0, 1, 0),
329
+ "TE50327": (0, 1, 0),
330
+ "TE50328": (2, 0, 2),
331
+ "TE50329": (0, 1, 0),
332
+ "TE50330": (0, 1, 0),
333
+ "TE50331": (0, 1, 0),
334
+ "TE50332": (0, 1, 0),
335
+ "TE50333": (0, 1, 0),
336
+ "TE50334": (0, 1, 0),
337
+ "TE50335": (0, 1, 1),
338
+ "TE50336": (0, 1, 1),
339
+ "TE50337": (0, 1, 0),
340
+ "TE50338": (0, 1, 0),
341
+ "TE50339": (0, 1, 0),
342
+ "TE50340": (0, 1, 0),
343
+ "TE50341": (0, 1, 0),
344
+ "TE50342": (0, 1, 0),
345
+ "TE50343": (0, 1, 0),
346
+ "TE50344": (0, 1, 0),
347
+ "TE50345": (0, 1, 0),
348
+ "TE50346": (0, 1, 0),
349
+ "TE50346": (0, 1, 0),
350
+ "TE50347": (0, 1, 0),
351
+ "TE50348": (0, 1, 0),
352
+ "TE50349": (0, 1, 0),
353
+ "TE50350": (0, 1, 0),
354
+ "TE50351": (0, 1, 0),
355
+ "TE50352": (0, 1, 0),
356
+ "TE50353": (0, 1, 0)
357
+ }
358
+
359
  # Load and preprocess data
360
  def load_data():
361
  df = pd.read_csv("data (3).csv", skiprows=2, header=None)
 
403
  forecast = model_fit.forecast(steps=10)
404
  return model_fit, forecast
405
 
 
406
  # Create plot
407
  def create_plot(historical, forecast, freq='M'):
408
+ plt.figure(figsize=(14, 7))
409
  plt.plot(historical.index, historical, label='Historical', linewidth=2)
410
 
 
411
  forecast_index = pd.date_range(
412
  start=historical.index[-1] + pd.tseries.frequencies.to_offset(freq),
413
  periods=len(forecast),
 
421
  plt.ylabel('Value', fontsize=14)
422
  plt.grid(True, alpha=0.3)
423
 
 
424
  buf = io.BytesIO()
425
  plt.savefig(buf, format='png', bbox_inches="tight")
426
  buf.seek(0)
 
428
  buf.close()
429
  plt.close()
430
 
 
431
  return f'<img src="data:image/png;base64,{img_str}" style="width:100%; height:auto;" />'
432
 
 
433
  # Main prediction function
434
  def predict(part_number, model_name):
435
  df = load_data()
436
  df_part = df[df['PN'] == part_number].copy()
437
 
438
+ # Prepare time series
439
  start_date = '2021-10-09'
440
  date_range = pd.date_range(start=start_date, periods=len(df_part), freq='W')
441
  df_part['Date'] = date_range
442
  df_part.set_index('Date', inplace=True)
443
  series = df_part['y'].astype(float)
444
 
 
445
  freq = pd.infer_freq(series.index) or 'M'
446
 
447
+ # ✅ Choose ARIMA order from mapping (fallback = (5,1,0))
448
+ order = BEST_ARIMA_PARAMS.get(part_number, (5,1,0))
449
+
450
  if model_name == 'ARIMA':
451
+ model, forecast = train_arima(series, order=order)
452
 
453
  plot_html = create_plot(series, forecast, freq=freq)
454
 
455
+ # Evaluate
 
456
  train_size = int(len(series) * 0.8)
457
  train, test = series[:train_size], series[train_size:]
458
 
459
+ model_eval = ARIMA(train, order=order)
460
  model_fit_eval = model_eval.fit()
461
  predictions = model_fit_eval.forecast(steps=len(test))
462
 
463
  rmse = np.sqrt(mean_squared_error(test, predictions))
464
  mae = mean_absolute_error(test, predictions)
465
 
 
 
466
  metrics = f"""
467
+ Best ARIMA Order for {part_number}: {order}
468
+
469
  Model Performance Metrics:
470
  - RMSE: {rmse:.2f}
471
  - MAE: {mae:.2f}
 
504
 
505
  if __name__ == "__main__":
506
  demo = create_interface()
507
+ demo.launch()