Spaces:
Running
Running
File size: 2,080 Bytes
f50f9f2 cb966df f50f9f2 cb966df f50f9f2 cb966df |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
import gradio as gr
import requests
import pandas as pd
import plotly.express as px
class DownloadsTracker:
def __init__(self):
self.all_packages = {}
def fetch_if_needed(self, packages):
errors = []
for pkg in packages:
if pkg not in self.all_packages:
try:
response = requests.get(f"https://pypistats.org/api/packages/{pkg}/overall")
if response.status_code != 200:
errors.append(f"Package not found: {pkg}")
continue
data = response.json()["data"]
df = pd.DataFrame([
{"date": d["date"], "downloads": d["downloads"]}
for d in data if d["category"] == "without_mirrors"
])
df["date"] = pd.to_datetime(df["date"])
df = df.sort_values("date")
df["cumulative_downloads"] = df["downloads"].cumsum()
self.all_packages[pkg] = df
except:
errors.append(f"Error fetching {pkg}")
if len(errors) > 0:
return "\n".join(errors)
return None
def plot(self, package_list):
package_list = [p.strip() for p in package_list.split(",") if p.strip()]
errors = self.fetch_if_needed(package_list)
fig = px.line(title="Cumulative Package Downloads")
for pkg in package_list:
if pkg in self.all_packages:
df = self.all_packages[pkg]
fig.add_scatter(x=df["date"], y=df["cumulative_downloads"], name=pkg)
return fig, errors
tracker = DownloadsTracker()
with gr.Blocks() as app:
packages = gr.Textbox("transformers", label="Package names (comma-separated)")
error_box = gr.Textbox(label="Errors:", interactive=False)
render_btn = gr.Button("Render")
plot = gr.Plot()
render_btn.click(tracker.plot, inputs=[packages], outputs=[plot, error_box])
app.launch() |