from datetime import timedelta import pandas as pd from users import User def first_class(user) -> bool: # connect & import if user.max_connection() > 0 and user.count_event("Import Form Submission") > 0: return True # connect & no import & import 页面停留时间 > x if ( user.max_connection() > 0 and user.event_duration_sum("Data Import Page View").total_seconds() > 60 ): return True # connect & no import & Web Shell 页面停留时间 > x if ( user.first_connect() is not None and user.event_duration_sum("Open SQL Shell Button Clicked").total_seconds() > 60 ): return True if user.max_activeqps() > 10: return True if user.max_connection() > 10: return True def contact_event(event): if event["event"] == "PoC Form Submission": return True if event["event"] == "Submit Contact Us Form" and event["contactType"] == "Apply for PoC": return True if event["event"] == "Submit Contact Us Form" and event["contactType"] == "Schedule a demo": return True if ( event["event"] == "Submit Contact Us Form" and event["contactType"] == "Request free trial credits" ): return True return False if user.count_event_with(contact_event) > 0: return True if user.has_bind_card() and user.third_party_account_provider() is None: return True return False def second_class(user) -> bool: if user.max_activeqps() > 1: return True event_types = user.event_types() if event_types < 20: return False connect_duration = user.event_duration_sum( "Open SQL Shell Button Clicked" ) + user.event_duration_sum("Connect Button Clicked") if connect_duration.total_seconds() > 60: return True if user.event_duration_sum("Data Import Page View").total_seconds() > 60: return True return False def third_class(user) -> bool: event_types = user.event_types() if user.has_create_cluster() and event_types > 12: return True return False def others(user) -> bool: return True class Lamp: def __init__(self): self.names = [] self.testers = [] def add(self, name, tester): self.names.append(name) self.testers.append(tester) def classify(self, user) -> str: for idx, tester in enumerate(self.testers): if tester(user): return self.names[idx] raise None def classify(user): l = Lamp() l.add("first class", first_class) l.add("second class", second_class) l.add("third class", third_class) l.add("others", others) return l.classify(user) def flow(users, begin, end, step=1): t = begin rs = [] while t < end: x = users[0] xs = [User(u.id(), begin, t) for u in users if u.signup_time() < t] r = {} for u in xs: c = classify(u) if c not in r: r[c] = 0 r[c] += 1 r["time"] = t rs.append(r) t += timedelta(days=step) df = pd.DataFrame.from_records(rs) df = df.fillna(0) for cls in ["first class", "second class", "third class", "others"]: if cls in df: df[cls] = df[cls] - df.shift()[cls] df = df.fillna(0).set_index("time") return df