csmith715 commited on
Commit
c7e1bab
·
verified ·
1 Parent(s): b9ca158

Upload folder using huggingface_hub

Browse files
.github/workflows/update_space.yml ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ name: Run Python script
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - main
7
+
8
+ jobs:
9
+ build:
10
+ runs-on: ubuntu-latest
11
+
12
+ steps:
13
+ - name: Checkout
14
+ uses: actions/checkout@v2
15
+
16
+ - name: Set up Python
17
+ uses: actions/setup-python@v2
18
+ with:
19
+ python-version: '3.9'
20
+
21
+ - name: Install Gradio
22
+ run: python -m pip install gradio
23
+
24
+ - name: Log in to Hugging Face
25
+ run: python -c 'import huggingface_hub; huggingface_hub.login(token="${{ secrets.hf_token }}")'
26
+
27
+ - name: Deploy to Spaces
28
+ run: gradio deploy
CardPricePrediction_v2.py ADDED
@@ -0,0 +1,136 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import pandas as pd
3
+ from sklearn.preprocessing import PolynomialFeatures
4
+ from pymongo import MongoClient
5
+ import pickle
6
+ import joblib
7
+
8
+ # --- MongoDB Setup ---
9
+ uri = "mongodb+srv://csmith715:I3xSO3ImRKFyQ0hf@cluster0.hc5mw.mongodb.net/"
10
+ client = MongoClient(uri)
11
+ database = client.get_database("gemrate")
12
+ market_data = database.get_collection("alt_market_data")
13
+
14
+ # --- Load Model and Encoder ---
15
+ gradient_boosting_reg = joblib.load('gbm_card_model.joblib')
16
+ with open('card_encoder.pkl', 'rb') as file:
17
+ loaded_encoder = pickle.load(file)
18
+
19
+
20
+ # --- Helper Functions ---
21
+ def transform_data(dframe):
22
+ dframe = pd.get_dummies(dframe, columns=['grader'])
23
+ dframe['ds'] = pd.to_datetime(dframe['ds'])
24
+ dframe['year'] = dframe['ds'].dt.year
25
+ dframe['month'] = dframe['ds'].dt.month
26
+ dframe['day_of_week'] = dframe['ds'].dt.dayofweek
27
+ dframe = dframe.drop('ds', axis=1)
28
+ dframe['grade'] = pd.to_numeric(dframe['grade'], errors='coerce')
29
+ poly = PolynomialFeatures(degree=3, include_bias=False)
30
+ grade_poly = poly.fit_transform(dframe[['grade']])
31
+ grade_poly_df = pd.DataFrame(grade_poly, columns=['grade1', 'grade^2', 'grade^3'])
32
+ dframe = pd.concat([dframe, grade_poly_df], axis=1)
33
+ dframe = dframe.drop('grade1', axis=1)
34
+ return dframe
35
+
36
+
37
+ def calculate_moving_averages(dframe):
38
+ dframe['ds'] = pd.to_datetime(dframe['ds'])
39
+ dframe['y'] = dframe['y'].astype(float)
40
+ dframe = dframe.sort_values(by=['certnumber', 'grade', 'grader', 'ds'])
41
+ dframe.set_index('ds', inplace=True)
42
+
43
+ def compute_group_moving_averages(group):
44
+ group = group.sort_index()
45
+ group['ma_3d'] = group['y'].rolling('3D').mean()
46
+ group['ma_7d'] = group['y'].rolling('7D').mean()
47
+ group['ma_30d'] = group['y'].rolling('30D').mean()
48
+ return group
49
+
50
+ grouped = dframe.groupby(['certnumber', 'grade', 'grader'], group_keys=False)
51
+ dframe = grouped.apply(compute_group_moving_averages)
52
+ return dframe.reset_index()
53
+
54
+
55
+ def lookup_certnumber(certnumber):
56
+ results = market_data.find(
57
+ {'cert_number': certnumber},
58
+ {
59
+ '_id': 0,
60
+ 'market_transaction.date': 1,
61
+ 'market_transaction.price': 1,
62
+ 'market_transaction.attributes.gradeNumber': 1,
63
+ 'market_transaction.attributes.gradingCompany': 1
64
+ }
65
+ )
66
+ data = []
67
+ for r in results:
68
+ tx = r.get('market_transaction', {})
69
+ attributes = tx.get('attributes', {})
70
+ data.append({
71
+ 'ds': tx.get('date'),
72
+ 'y': tx.get('price'),
73
+ 'grade': attributes.get('gradeNumber'),
74
+ 'grader': attributes.get('gradingCompany')
75
+ })
76
+
77
+ df = pd.DataFrame(data)
78
+ df['certnumber'] = [certnumber] * df.shape[0]
79
+ return df
80
+
81
+
82
+ # --- Prediction Logic ---
83
+ def predict_price(certnumber, grader, grade):
84
+ cert_df = lookup_certnumber(certnumber)
85
+ if cert_df.empty:
86
+ return "No data found for this cert number.", pd.DataFrame()
87
+
88
+ cert_df = cert_df[(cert_df['grader'] == grader) & (cert_df['grade'] == grade)]
89
+ if cert_df.empty:
90
+ return "No matching data found for this grader and grade.", pd.DataFrame()
91
+
92
+ moving_average_df = calculate_moving_averages(cert_df)
93
+ moving_average_df['certnumber'] = moving_average_df['certnumber'].astype(str)
94
+
95
+ # Encode certnumber
96
+ moving_average_df['certnumber_encoded'] = loaded_encoder.fit_transform(
97
+ moving_average_df['certnumber'], moving_average_df['y'])
98
+
99
+ filtered_cert_df = moving_average_df.drop(['y', 'certnumber'], axis=1)
100
+ max_fdate = filtered_cert_df['ds'].max()
101
+ filtered_df = filtered_cert_df[filtered_cert_df['ds'] == max_fdate]
102
+
103
+ tdf = transform_data(filtered_df).fillna(0)
104
+ tdf = tdf[tdf.grade != 0]
105
+
106
+ model_columns = gradient_boosting_reg.feature_names_in_
107
+ for col in model_columns:
108
+ if col not in tdf.columns:
109
+ tdf[col] = [0]*tdf.shape[0]
110
+
111
+ tdf = tdf[model_columns]
112
+ predictions = gradient_boosting_reg.predict(tdf)
113
+
114
+ tdf['Predicted Price'] = predictions
115
+ return f"Predicted Price: ${predictions[0]:,.2f}", tdf
116
+
117
+
118
+ # --- Gradio UI ---
119
+ with gr.Blocks() as demo:
120
+ gr.Markdown("# Pokémon Card Price Predictor")
121
+
122
+ cert_input = gr.Number(label="Cert Number", precision=0)
123
+ grader_input = gr.Dropdown(choices=["PSA", "BGS", "CGC"], label="Grader")
124
+ grade_input = gr.Textbox(label="Grade (e.g., 10.0)")
125
+
126
+ submit_btn = gr.Button("Predict Price")
127
+ output_text = gr.Textbox(label="Prediction Result")
128
+ output_df = gr.Dataframe(label="Transformed Input Features")
129
+
130
+ submit_btn.click(
131
+ predict_price,
132
+ inputs=[cert_input, grader_input, grade_input],
133
+ outputs=[output_text, output_df]
134
+ )
135
+
136
+ demo.launch(auth=("pokecards", "exqeQbBHrKVL"))
README.md CHANGED
@@ -1,12 +1,6 @@
1
  ---
2
  title: CardExploration
3
- emoji: 😻
4
- colorFrom: indigo
5
- colorTo: red
6
  sdk: gradio
7
- sdk_version: 5.29.1
8
- app_file: app.py
9
- pinned: false
10
  ---
11
-
12
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
1
  ---
2
  title: CardExploration
3
+ app_file: CardPricePrediction_v2.py
 
 
4
  sdk: gradio
5
+ sdk_version: 5.29.0
 
 
6
  ---
 
 
card_encoder.pkl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:d82ca634301788e96754e3a0df22252d5d5dc40c1eb8237b3327f6ec00177233
3
+ size 712416
gbm_card_model.joblib ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:44a7edab0625e3c0644fa33a274f1e7b8de752f3e4fac9857faa72c665e3645d
3
+ size 139560