csmith715 commited on
Commit
e71a404
·
1 Parent(s): b2b15db

Change UX to display all grades and graders

Browse files
Files changed (1) hide show
  1. app.py +61 -33
app.py CHANGED
@@ -7,6 +7,7 @@ from statsmodels.stats.diagnostic import acorr_ljungbox
7
  import pickle
8
  import joblib
9
  import matplotlib.pyplot as plt
 
10
 
11
  # --- MongoDB Setup ---
12
  uri = "mongodb+srv://csmith715:I3xSO3ImRKFyQ0hf@cluster0.hc5mw.mongodb.net/"
@@ -87,6 +88,24 @@ def fetch_cert_data(certnumber):
87
  return df
88
 
89
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
90
  class PokemonCardPredictor:
91
  def __init__(self):
92
  self.confidence_features = [
@@ -95,6 +114,7 @@ class PokemonCardPredictor:
95
  'reliability', 'day_since'
96
  ]
97
  self.latest_prices_df = pd.DataFrame()
 
98
 
99
  def plot_time_series(self, range_option):
100
  if self.latest_prices_df.empty:
@@ -137,31 +157,29 @@ class PokemonCardPredictor:
137
  plt.tight_layout()
138
  return fig
139
 
140
-
141
- def transform_data(self, df):
142
- df['ds'] = pd.to_datetime(df['ds'])
143
- df['day_since'] = (pd.Timestamp.today().normalize() - df['ds']).dt.days
144
- df['year'] = df['ds'].dt.year
145
- df['month'] = df['ds'].dt.month
146
- df['day_of_week'] = df['ds'].dt.dayofweek
147
- df.drop('ds', axis=1, inplace=True)
148
-
149
- df = pd.get_dummies(df, columns=['grader'])
150
- df['grade'] = pd.to_numeric(df['grade'], errors='coerce')
151
-
152
- poly = PolynomialFeatures(degree=3, include_bias=False)
153
- poly_features = poly.fit_transform(df[['grade']])
154
- poly_df = pd.DataFrame(poly_features, columns=['grade1', 'grade^2', 'grade^3'])
155
- df = pd.concat([df, poly_df], axis=1).drop(columns=['grade1'])
156
- return df
157
-
158
- def predict(self, certnumber, grader, grade):
159
  raw_df = fetch_cert_data(certnumber)
160
  if raw_df.empty:
161
  self.latest_prices_df = pd.DataFrame() # Reset
162
  return "Card info not found.", pd.DataFrame()
 
 
 
 
 
 
 
 
 
 
163
 
164
- df = raw_df[(raw_df['grader'] == grader) & (raw_df['grade'] == grade)]
 
 
 
 
 
 
165
  if df.empty:
166
  self.latest_prices_df = pd.DataFrame()
167
  return "No transactions for this grader and grade.", pd.DataFrame()
@@ -180,7 +198,7 @@ class PokemonCardPredictor:
180
  return "No recent transaction to use.", pd.DataFrame()
181
 
182
  reliability = calculate_reliability(df)
183
- transformed_df = self.transform_data(latest_df).fillna(0)
184
  transformed_df = transformed_df[transformed_df['grade'] != 0]
185
 
186
  for col in gradient_boosting_model.feature_names_in_:
@@ -190,26 +208,36 @@ class PokemonCardPredictor:
190
  confidence_df = transformed_df.copy()
191
  confidence_df['reliability'] = reliability
192
  confidence_df['day_since'] = latest_df['day_since'].values
 
 
 
193
 
194
- risk_score = confidence_model.predict(confidence_df[self.confidence_features])
195
- prediction = gradient_boosting_model.predict(transformed_df[gradient_boosting_model.feature_names_in_])
 
 
196
 
197
  display_df = pd.DataFrame({
198
- 'Card Year': latest_df['card_year'].values,
 
 
199
  'Name': latest_df['name'].values,
200
  'Set Name': latest_df['set_name'].values,
201
- 'Details': latest_df['details'].values,
202
  'Predicted Price': prediction,
203
  'Risk': risk_score,
204
- 'ma_3d': latest_df['ma_3d'].values,
205
- 'ma_7d': latest_df['ma_7d'].values,
206
- 'ma_30d': latest_df['ma_30d'].values,
207
- 'count_3d': latest_df['count_3d'].values,
208
- 'count_7d': latest_df['count_7d'].values,
209
- 'count_30d': latest_df['count_30d'].values
 
 
210
  })
211
 
212
- return f"Predicted Price: ${prediction[0]:,.2f}", display_df.round(2)
 
213
 
214
 
215
  # --- Gradio UI ---
@@ -234,7 +262,7 @@ with gr.Blocks() as demo:
234
  output_plot = gr.Plot(label="Price Over Time")
235
 
236
  predict_btn.click(
237
- fn=predictor.predict,
238
  inputs=[cert_input, grader_input, grade_input],
239
  outputs=[output_text, output_table]
240
  ).then(
 
7
  import pickle
8
  import joblib
9
  import matplotlib.pyplot as plt
10
+ from itertools import product
11
 
12
  # --- MongoDB Setup ---
13
  uri = "mongodb+srv://csmith715:I3xSO3ImRKFyQ0hf@cluster0.hc5mw.mongodb.net/"
 
88
  return df
89
 
90
 
91
+ def transform_data(df):
92
+ df['ds'] = pd.to_datetime(df['ds'])
93
+ df['day_since'] = (pd.Timestamp.today().normalize() - df['ds']).dt.days
94
+ df['year'] = df['ds'].dt.year
95
+ df['month'] = df['ds'].dt.month
96
+ df['day_of_week'] = df['ds'].dt.dayofweek
97
+ df.drop('ds', axis=1, inplace=True)
98
+
99
+ df = pd.get_dummies(df, columns=['grader'])
100
+ df['grade'] = pd.to_numeric(df['grade'], errors='coerce')
101
+
102
+ poly = PolynomialFeatures(degree=3, include_bias=False)
103
+ poly_features = poly.fit_transform(df[['grade']])
104
+ poly_df = pd.DataFrame(poly_features, columns=['grade1', 'grade^2', 'grade^3'])
105
+ df = pd.concat([df, poly_df], axis=1).drop(columns=['grade1'])
106
+ return df
107
+
108
+
109
  class PokemonCardPredictor:
110
  def __init__(self):
111
  self.confidence_features = [
 
114
  'reliability', 'day_since'
115
  ]
116
  self.latest_prices_df = pd.DataFrame()
117
+ self.full_df = pd.DataFrame()
118
 
119
  def plot_time_series(self, range_option):
120
  if self.latest_prices_df.empty:
 
157
  plt.tight_layout()
158
  return fig
159
 
160
+ def predict_all(self, certnumber, grader, grade):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
161
  raw_df = fetch_cert_data(certnumber)
162
  if raw_df.empty:
163
  self.latest_prices_df = pd.DataFrame() # Reset
164
  return "Card info not found.", pd.DataFrame()
165
+ known_grades = raw_df['grade'].unique()
166
+ known_graders = raw_df['grader'].unique()
167
+
168
+ for k_grader, k_grade in product(known_graders, known_grades):
169
+ _, pred_df = self.predict(raw_df, k_grader, k_grade)
170
+ self.full_df = pd.concat([self.full_df, pred_df])
171
+ # Predict selected grade and grader for specific predictive purpose
172
+ pred, _ = self.predict(raw_df, grader, grade)
173
+
174
+ return f"Predicted Price: ${pred:,.2f}", self.full_df.round(2)
175
 
176
+ def predict(self, cert_df, grader, grade):
177
+ # raw_df = fetch_cert_data(certnumber)
178
+ # if raw_df.empty:
179
+ # self.latest_prices_df = pd.DataFrame() # Reset
180
+ # return "Card info not found.", pd.DataFrame()
181
+
182
+ df = cert_df[(cert_df['grader'] == grader) & (cert_df['grade'] == grade)]
183
  if df.empty:
184
  self.latest_prices_df = pd.DataFrame()
185
  return "No transactions for this grader and grade.", pd.DataFrame()
 
198
  return "No recent transaction to use.", pd.DataFrame()
199
 
200
  reliability = calculate_reliability(df)
201
+ transformed_df = transform_data(latest_df).fillna(0)
202
  transformed_df = transformed_df[transformed_df['grade'] != 0]
203
 
204
  for col in gradient_boosting_model.feature_names_in_:
 
208
  confidence_df = transformed_df.copy()
209
  confidence_df['reliability'] = reliability
210
  confidence_df['day_since'] = latest_df['day_since'].values
211
+ confidence_df = confidence_df[self.confidence_features].fillna(0)
212
+
213
+ risk_score = confidence_model.predict(confidence_df)
214
 
215
+ transformed_df = transformed_df[gradient_boosting_model.feature_names_in_]
216
+ if transformed_df.empty:
217
+ return 'no data', pd.DataFrame()
218
+ prediction = gradient_boosting_model.predict(transformed_df)
219
 
220
  display_df = pd.DataFrame({
221
+ 'Grader': latest_df['grader'].values,
222
+ 'Grade': latest_df['grade'].values,
223
+ # 'Card Year': latest_df['card_year'].values,
224
  'Name': latest_df['name'].values,
225
  'Set Name': latest_df['set_name'].values,
226
+ # 'Details': latest_df['details'].values,
227
  'Predicted Price': prediction,
228
  'Risk': risk_score,
229
+ 'Most Recent Price': latest_df['y'].values,
230
+ 'Days Since': latest_df['day_since'].values
231
+ # 'ma_3d': latest_df['ma_3d'].values,
232
+ # 'ma_7d': latest_df['ma_7d'].values,
233
+ # 'ma_30d': latest_df['ma_30d'].values,
234
+ # 'count_3d': latest_df['count_3d'].values,
235
+ # 'count_7d': latest_df['count_7d'].values,
236
+ # 'count_30d': latest_df['count_30d'].values
237
  })
238
 
239
+ # return f"Predicted Price: ${prediction[0]:,.2f}", display_df.round(2)
240
+ return prediction[0], display_df
241
 
242
 
243
  # --- Gradio UI ---
 
262
  output_plot = gr.Plot(label="Price Over Time")
263
 
264
  predict_btn.click(
265
+ fn=predictor.predict_all,
266
  inputs=[cert_input, grader_input, grade_input],
267
  outputs=[output_text, output_table]
268
  ).then(