TOPSInfosol commited on
Commit
e414fc2
·
verified ·
1 Parent(s): 8890db9

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +94 -62
app.py CHANGED
@@ -1,84 +1,61 @@
1
  from __future__ import annotations
 
2
  from typing import Iterable
3
  import gradio as gr
4
- from gradio.themes.base import Base
5
- from gradio.themes.utils import colors, fonts, sizes
6
- import time
7
-
8
  import pandas as pd
9
  import matplotlib.pyplot as plt
10
  import numpy as np
 
11
  import math
12
-
13
- import matplotlib.ticker as ticker
14
-
15
  import torch
16
  from chronos import ChronosPipeline
17
  import warnings
 
 
 
18
  warnings.filterwarnings("ignore")
19
 
20
- class Seafoam(Base):
21
- def __init__(
22
- self,
23
- *,
24
- primary_hue: colors.Color | str = colors.emerald,
25
- secondary_hue: colors.Color | str = colors.blue,
26
- neutral_hue: colors.Color | str = colors.blue,
27
- spacing_size: sizes.Size | str = sizes.spacing_md,
28
- radius_size: sizes.Size | str = sizes.radius_md,
29
- text_size: sizes.Size | str = sizes.text_lg,
30
- font: fonts.Font
31
- | str
32
- | Iterable[fonts.Font | str] = (
33
- fonts.GoogleFont("Quicksand"),
34
- "ui-sans-serif",
35
- "sans-serif",
36
- ),
37
- font_mono: fonts.Font
38
- | str
39
- | Iterable[fonts.Font | str] = (
40
- fonts.GoogleFont("IBM Plex Mono"),
41
- "ui-monospace",
42
- "monospace",
43
- ),
44
- ):
45
- super().__init__(
46
- primary_hue=primary_hue,
47
- secondary_hue=secondary_hue,
48
- neutral_hue=neutral_hue,
49
- spacing_size=spacing_size,
50
- radius_size=radius_size,
51
- text_size=text_size,
52
- font=font,
53
- font_mono=font_mono,
54
- )
55
- super().set(
56
- body_background_fill="repeating-linear-gradient(45deg, *primary_200, *primary_200 10px, *primary_50 10px, *primary_50 20px)",
57
- body_background_fill_dark="repeating-linear-gradient(45deg, *primary_800, *primary_800 10px, *primary_900 10px, *primary_900 20px)",
58
- button_primary_background_fill="linear-gradient(90deg, *primary_300, *secondary_400)",
59
- button_primary_background_fill_hover="linear-gradient(90deg, *primary_200, *secondary_300)",
60
- button_primary_text_color="white",
61
- button_primary_background_fill_dark="linear-gradient(90deg, *primary_600, *secondary_800)",
62
- slider_color="*secondary_300",
63
- slider_color_dark="*secondary_600",
64
- block_title_text_weight="600",
65
- block_border_width="3px",
66
- block_shadow="*shadow_drop_lg",
67
- button_primary_shadow="*shadow_drop_lg",
68
- button_large_padding="32px",
69
- )
70
 
71
- seafoam = Seafoam()
 
 
 
 
 
 
72
 
73
 
74
- def process_data(csv_file):
75
  try:
 
 
 
 
 
 
 
 
 
76
  # Read the CSV file
77
  df = pd.read_csv(csv_file.name)
78
 
79
- df['date'] = pd.to_datetime(df['date'])
 
 
 
 
 
80
  df['month'] = df['date'].dt.month
81
  df['year'] = df['date'].dt.year
 
82
 
83
  monthly_sales = df.groupby(['year', 'month'])['sold_qty'].sum().reset_index()
84
  monthly_sales = monthly_sales.rename(columns={'year': 'year', 'month': 'month', 'sold_qty': 'y'})
@@ -166,13 +143,45 @@ def process_data(csv_file):
166
  return None
167
 
168
  # Create Gradio interface
169
- with gr.Blocks(theme=seafoam) as demo:
170
  gr.Markdown("# Chronos Forecasting - Tops infosolutions Pvt Ltd")
171
  gr.Markdown("Upload a CSV file and click 'Forecast' to generate sales forecast for next 12 months .")
172
 
 
 
173
  with gr.Row():
174
  file_input = gr.File(label="Upload CSV File", file_types=[".csv"])
175
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
176
  with gr.Row():
177
  visualize_btn = gr.Button("Forecast", variant="primary")
178
 
@@ -182,12 +191,35 @@ with gr.Blocks(theme=seafoam) as demo:
182
  with gr.Row():
183
  pivot_plot_output = gr.Plot(label="Monthly Sales Pivot Table")
184
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
185
  visualize_btn.click(
186
  fn=process_data,
187
- inputs=[file_input],
188
  outputs=[plot_output, pivot_plot_output]
189
  )
190
 
 
 
 
 
191
  # Launch the app
192
  if __name__ == "__main__":
193
  demo.launch()
 
1
  from __future__ import annotations
2
+
3
  from typing import Iterable
4
  import gradio as gr
 
 
 
 
5
  import pandas as pd
6
  import matplotlib.pyplot as plt
7
  import numpy as np
8
+ import os
9
  import math
 
 
 
10
  import torch
11
  from chronos import ChronosPipeline
12
  import warnings
13
+
14
+ from seafoam import Seafoam
15
+
16
  warnings.filterwarnings("ignore")
17
 
18
+ import numpy as np
19
+ import matplotlib.ticker as ticker
20
+
21
+ os.makedirs("example_files", exist_ok=True)
22
+
23
+ def process_csv(file):
24
+ if file is None:
25
+ return None, gr.Dropdown(choices=[])
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
26
 
27
+ if not file.name.endswith('.csv'):
28
+ raise gr.Error("Please upload a CSV file only")
29
+ df = pd.read_csv(file.name)
30
+ columns = df.columns.tolist()
31
+ transformed_columns = list(map(lambda x: ' '.join([word.capitalize() for word in x.split('_')]), columns))
32
+ data_columns = gr.Dropdown(choices=transformed_columns, value=None)
33
+ return df, data_columns, data_columns
34
 
35
 
36
+ def process_data(csv_file, date_column_value, target_column_value):
37
  try:
38
+ if not csv_file:
39
+ return "Error: Upload Csv File"
40
+
41
+ if not date_column_value or not target_column_value:
42
+ return "Error: Both date and target columns must be selected"
43
+
44
+ date_column = date_column_value.lower().replace(" ", "_")
45
+ target_column = target_column_value.lower().replace(" ", "_")
46
+
47
  # Read the CSV file
48
  df = pd.read_csv(csv_file.name)
49
 
50
+ numeric_mask = df[date_column].apply(lambda x: isinstance(x, (int, float)))
51
+ if numeric_mask.any():
52
+ return "Error: Found numeric values in column '{date_column}'. Please provide dates in string format like 'YYYY-MM-DD'."
53
+
54
+ df['date'] = pd.to_datetime(df[date_column])
55
+
56
  df['month'] = df['date'].dt.month
57
  df['year'] = df['date'].dt.year
58
+ df['sold_qty'] = df[target_column]
59
 
60
  monthly_sales = df.groupby(['year', 'month'])['sold_qty'].sum().reset_index()
61
  monthly_sales = monthly_sales.rename(columns={'year': 'year', 'month': 'month', 'sold_qty': 'y'})
 
143
  return None
144
 
145
  # Create Gradio interface
146
+ with gr.Blocks(theme=Seafoam()) as demo:
147
  gr.Markdown("# Chronos Forecasting - Tops infosolutions Pvt Ltd")
148
  gr.Markdown("Upload a CSV file and click 'Forecast' to generate sales forecast for next 12 months .")
149
 
150
+ df_state = gr.State()
151
+
152
  with gr.Row():
153
  file_input = gr.File(label="Upload CSV File", file_types=[".csv"])
154
 
155
+
156
+ with gr.Row():
157
+ date_column = gr.Dropdown(
158
+ choices=[],
159
+ label="Select Date column",
160
+ multiselect=False,
161
+ value=None
162
+ )
163
+
164
+ target_column = gr.Dropdown(
165
+ choices=[],
166
+ label="Select Target column",
167
+ multiselect=False,
168
+ value=None
169
+ )
170
+
171
+ gr.Examples(
172
+ examples=[
173
+ ["example_files/13dec_product_id96airaco.csv"],
174
+ ["example_files/13dec_product_id346airaco.csv"],
175
+ ["example_files/13dec_product_id567airaco.csv"],
176
+ ["example_files/13dec_product_id856airaco.csv"],
177
+ ["example_files/airaco_product_id215.csv"]
178
+ ],
179
+ inputs=file_input,
180
+ outputs=[df_state, date_column, target_column],
181
+ fn=process_csv,
182
+ cache_examples=True
183
+ )
184
+
185
  with gr.Row():
186
  visualize_btn = gr.Button("Forecast", variant="primary")
187
 
 
191
  with gr.Row():
192
  pivot_plot_output = gr.Plot(label="Monthly Sales Pivot Table")
193
 
194
+ file_input.upload(
195
+ process_csv,
196
+ inputs=[file_input],
197
+ outputs=[df_state, date_column, target_column]
198
+ )
199
+
200
+ # Column selection handler
201
+ date_column.change(
202
+ lambda x: x if x else "",
203
+ inputs=[date_column],
204
+ outputs=[]
205
+ )
206
+
207
+ target_column.change(
208
+ lambda x: x if x else "",
209
+ inputs=[target_column],
210
+ outputs=[]
211
+ )
212
+
213
  visualize_btn.click(
214
  fn=process_data,
215
+ inputs=[file_input, date_column, target_column],
216
  outputs=[plot_output, pivot_plot_output]
217
  )
218
 
219
+
220
+
221
+
222
+
223
  # Launch the app
224
  if __name__ == "__main__":
225
  demo.launch()