yeref 0.24.47__py3-none-any.whl → 0.24.49__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
yeref/yeref.py CHANGED
@@ -16065,21 +16065,16 @@ async def return_activity_metrics(bot, PROJECT_USERNAME, EXTRA_D, BASE_P):
16065
16065
 
16066
16066
  for it in USER_TXS:
16067
16067
  dt_start = it.get("DT_START", "")
16068
- amount = int(it.get("AMOUNT", "0"))
16069
16068
  dt_tx = datetime.strptime(dt_start, "%d-%m-%Y_%H-%M-%S")
16070
16069
  month_key = dt_tx.strftime("%Y-%m")
16071
16070
  metrics_by_month[month_key]["tx"] += 1
16072
16071
 
16073
16072
  for it in USER_PAYMENTS:
16074
16073
  dt_start = it.get("DT_START", "")
16075
- amount = int(it.get("AMOUNT", "0"))
16076
16074
  dt_tx = datetime.strptime(dt_start, "%d-%m-%Y_%H-%M-%S")
16077
16075
  month_key = dt_tx.strftime("%Y-%m")
16078
16076
  metrics_by_month[month_key]["pay"] += 1
16079
16077
 
16080
- # metrics_by_month[month_key]["tx"] += len(USER_TXS)
16081
- # metrics_by_month[month_key]["pay"] += len(USER_PAYMENTS)
16082
-
16083
16078
  if USER_DT:
16084
16079
  dt_obj = datetime.strptime(USER_DT, "%d-%m-%Y_%H-%M-%S")
16085
16080
  month_key = dt_obj.strftime("%Y-%m")
@@ -16143,31 +16138,105 @@ async def return_unit_metrics(bot, PROJECT_USERNAME, EXTRA_D, BASE_P):
16143
16138
  # набор пользователей, чтобы не дважды считать N в одном месяце
16144
16139
  seen_new = set()
16145
16140
 
16141
+ months = ["2025-06", "2025-07", "2025-08", "2025-09"]
16142
+ data_users = []
16143
+ for _ in range(3):
16144
+ # дата входа
16145
+ entry_month = random.choice(months)
16146
+ entry_day = random.randint(1, 28)
16147
+ entry_date = f"{entry_month}-{entry_day:02}"
16148
+ entry_dt_obj = datetime.strptime(entry_date, '%Y-%m-%d')
16149
+ entry_dt = f"{entry_dt_obj.strftime('%d-%m-%Y')}_{datetime.now().strftime('%H-%M-%S')}"
16150
+ utm = random.choice(["/start", "/startapp"])
16151
+
16152
+ # месяцы от входа и дальше
16153
+ valid_months = [m for m in months if datetime.strptime(m + "-01", "%Y-%m-%d") >= entry_dt_obj.replace(day=1)]
16154
+ if not valid_months:
16155
+ valid_months = [entry_month]
16156
+
16157
+ user_mau = sorted(random.sample(valid_months, k=random.randint(1, len(valid_months))))
16158
+ user_dau_dates = set()
16159
+ txs, payments = [], []
16160
+
16161
+ # транзакция
16162
+ if user_mau and random.random() < 0.5:
16163
+ tx_month = random.choice(user_mau)
16164
+ tx_day = random.randint(1, 28)
16165
+ tx_date = f"{tx_month}-{tx_day:02}"
16166
+ dt_tx = datetime.strptime(tx_date, "%Y-%m-%d")
16167
+ if dt_tx >= entry_dt_obj:
16168
+ txs = [{
16169
+ "TYPE": random.choice(["don", "sub", "pst"]),
16170
+ "AMOUNT": str(random.randint(1, 10)),
16171
+ "ADDRESS": f"address{random.randint(1, 999)}",
16172
+ "DT_START": f"{dt_tx.strftime('%d-%m-%Y')}_12-00-00",
16173
+ }]
16174
+ user_dau_dates.add(tx_date)
16175
+
16176
+ # платеж
16177
+ if user_mau and random.random() < 0.5:
16178
+ pay_month = random.choice(user_mau)
16179
+ pay_day = random.randint(1, 28)
16180
+ pay_date = f"{pay_month}-{pay_day:02}"
16181
+ dt_pay = datetime.strptime(pay_date, "%Y-%m-%d")
16182
+ if dt_pay >= entry_dt_obj:
16183
+ payments = [{
16184
+ "TYPE": random.choice(["don", "sub", "pst"]),
16185
+ "DT_START": f"{dt_pay.strftime('%d-%m-%Y')}_14-00-00",
16186
+ "DT_END": "0",
16187
+ "AMOUNT": str(random.randint(1, 10))
16188
+ }]
16189
+ user_dau_dates.add(pay_date)
16190
+
16191
+ # вход в приложение
16192
+ user_dau_dates.add(entry_date)
16193
+
16194
+ # остальные посещения
16195
+ for m in user_mau:
16196
+ day = random.randint(1, 28)
16197
+ visit = f"{m}-{day:02}"
16198
+ dt_visit = datetime.strptime(visit, "%Y-%m-%d")
16199
+ if dt_visit >= entry_dt_obj and random.random() < 0.7:
16200
+ user_dau_dates.add(visit)
16201
+
16202
+ user_dau = sorted(user_dau_dates)
16203
+ wallet = f"wallet{random.randint(1, 100)}" if txs else random.choice([f"wallet{random.randint(1, 100)}", ""])
16204
+
16205
+ data_users.append((
16206
+ random.randint(100000, 999999),
16207
+ json.dumps({"USER_WALLET": wallet, "USER_UTM": utm, "USER_DT": entry_dt}),
16208
+ json.dumps({"USER_DAU": user_dau, "USER_MAU": user_mau, "USER_TXS": txs, "USER_PAYMENTS": payments})
16209
+ ))
16210
+ print(f"gen {data_users=}")
16211
+
16146
16212
  for USER_TID, USER_VARS, USER_LSTS in data_users:
16147
- vars_ = json.loads(USER_VARS or "{}")
16148
- lsts = json.loads(USER_LSTS or "{}")
16149
- dt_str = vars_.get("USER_DT", "")
16213
+ USER_VARS = json.loads(USER_VARS or USER_VARS_)
16214
+ USER_LSTS = json.loads(USER_LSTS or USER_LSTS_)
16215
+ USER_DT = USER_VARS.get("USER_DT", "")
16216
+ USER_PAYMENTS = USER_LSTS.get("USER_PAYMENTS", [])
16217
+ USER_STATUSES = USER_LSTS.get("USER_STATUSES", [])
16150
16218
  # месяц регистрации
16151
- if dt_str:
16152
- dt_obj = datetime.strptime(dt_str, "%d-%m-%Y_%H-%M-%S")
16219
+
16220
+ if USER_DT:
16221
+ dt_obj = datetime.strptime(USER_DT, "%d-%m-%Y_%H-%M-%S")
16153
16222
  mo = dt_obj.strftime("%Y-%m")
16154
16223
  if (USER_TID, mo) not in seen_new:
16155
16224
  seen_new.add((USER_TID, mo))
16156
16225
  metrics[mo]["N"] += 1
16157
16226
 
16158
16227
  # платежи этого пользователя
16159
- for pay in lsts.get("USER_PAYMENTS", []):
16228
+ for pay in USER_PAYMENTS:
16160
16229
  start = pay.get("DT_START", "")
16161
16230
  amt = pay.get("AMOUNT", 0)
16162
- if start and amt:
16163
- dt_p = datetime.strptime(start, "%d-%m-%Y_%H-%M-%S")
16164
- mo_p = dt_p.strftime("%Y-%m")
16165
- val = float(amt) * 0.013
16166
- metrics[mo_p]["sum_amount"] += val
16167
- metrics[mo_p]["payments_count"] += 1
16231
+
16232
+ dt_p = datetime.strptime(start, "%d-%m-%Y_%H-%M-%S")
16233
+ mo_p = dt_p.strftime("%Y-%m")
16234
+ val = float(amt) * 0.013
16235
+ metrics[mo_p]["sum_amount"] += val
16236
+ metrics[mo_p]["payments_count"] += 1
16168
16237
 
16169
16238
  # статусы (отток)
16170
- for status in lsts.get("USER_STATUSES", []):
16239
+ for status in USER_STATUSES:
16171
16240
  key, ts = next(iter(status.items()))
16172
16241
  if key in ("left", "kicked"):
16173
16242
  dt_s = datetime.strptime(ts, "%d-%m-%Y_%H-%M-%S")
@@ -16175,16 +16244,14 @@ async def return_unit_metrics(bot, PROJECT_USERNAME, EXTRA_D, BASE_P):
16175
16244
  metrics[mo_s]["churn_count"] += 1
16176
16245
  break
16177
16246
 
16178
- # список месяцев в порядке
16179
16247
  all_months = sorted(metrics.keys())
16180
- # посчитать доп. метрики
16181
16248
  results = []
16182
16249
  first_mrr = None
16183
16250
  for idx, mo in enumerate(all_months):
16184
16251
  data = metrics[mo]
16185
16252
  N = data["N"]
16186
16253
  MRR = data["sum_amount"]
16187
- # округлить до 2х знаков без лишних нулей
16254
+
16188
16255
  def fmt(x):
16189
16256
  return (f"{x:.2f}".rstrip("0").rstrip(".")) if x is not None else ""
16190
16257
  mrr_fmt = fmt(MRR)
@@ -16208,7 +16275,7 @@ async def return_unit_metrics(bot, PROJECT_USERNAME, EXTRA_D, BASE_P):
16208
16275
  if idx == 0:
16209
16276
  first_mrr = MRR
16210
16277
  else:
16211
- CMGR = ( (MRR / first_mrr) ** (1 / idx) ) - 1
16278
+ CMGR = ((MRR / first_mrr) ** (1 / idx) ) - 1
16212
16279
 
16213
16280
  results.append({
16214
16281
  "MO": mo,
@@ -16218,20 +16285,18 @@ async def return_unit_metrics(bot, PROJECT_USERNAME, EXTRA_D, BASE_P):
16218
16285
  "ARR": fmt(ARR),
16219
16286
  "ChurnR": fmt(ChurnR),
16220
16287
  "LTV1": fmt(LTV1),
16221
- "LTV2": fmt(LTV2),
16222
16288
  "CMGR": fmt(CMGR),
16223
16289
  "CAC": ""
16224
16290
  })
16225
16291
 
16226
- # записать CSV
16227
16292
  path = os.path.join(EXTRA_D, "2_unit_metrics.csv")
16228
16293
  with open(path, "w", newline="", encoding="utf-8") as f:
16229
16294
  writer = csv.writer(f)
16230
- writer.writerow(["MO", "N", "MRR", "ARPU", "ARR", "ChurnR", "LTV1", "LTV2", "CMGR", "CAC"])
16295
+ writer.writerow(["MO", "N", "MRR", "ARPU", "ARR", "ChurnR", "LTV1", "CMGR", "CAC"])
16231
16296
  for row in results:
16232
16297
  writer.writerow([
16233
16298
  row["MO"], row["N"], row["MRR"], row["ARPU"], row["ARR"],
16234
- row["ChurnR"], row["LTV1"], row["LTV2"], row["CMGR"], row["CAC"]
16299
+ row["ChurnR"], row["LTV1"], row["CMGR"], row["CAC"]
16235
16300
  ])
16236
16301
 
16237
16302
  # отправить файл
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: yeref
3
- Version: 0.24.47
3
+ Version: 0.24.49
4
4
  Summary: desc-f
5
5
  Author: john smith
6
6
  Dynamic: author
@@ -0,0 +1,8 @@
1
+ yeref/__init__.py,sha256=Qpv3o6Xa78VdLcsSRmctGtpnYE9btpAkCekgGhgJyXM,49
2
+ yeref/l_.py,sha256=LMX_olmJwq-tgoALJCnhV_fGrL_i_43yBLkLIcEVqGo,1176743
3
+ yeref/tonweb.js,sha256=Jf6aFOQ1OIY4q7fINYz-m5LsI3seMus124M5SYYZmtE,443659
4
+ yeref/yeref.py,sha256=jxbSld3qkAba-VW_E6Z0kGWaUGt07cU1Yl8IjCcQ8GU,1043818
5
+ yeref-0.24.49.dist-info/METADATA,sha256=wWh9sIANS569aeidXm4Go-_o0LiTOyA4CLl5WF8e47M,119
6
+ yeref-0.24.49.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
7
+ yeref-0.24.49.dist-info/top_level.txt,sha256=yCQKchWHbfV-3OuQPYRdi2loypD-nmbDJbtt3OuKKkY,6
8
+ yeref-0.24.49.dist-info/RECORD,,
@@ -1,8 +0,0 @@
1
- yeref/__init__.py,sha256=Qpv3o6Xa78VdLcsSRmctGtpnYE9btpAkCekgGhgJyXM,49
2
- yeref/l_.py,sha256=LMX_olmJwq-tgoALJCnhV_fGrL_i_43yBLkLIcEVqGo,1176743
3
- yeref/tonweb.js,sha256=Jf6aFOQ1OIY4q7fINYz-m5LsI3seMus124M5SYYZmtE,443659
4
- yeref/yeref.py,sha256=Yf6eODA8nBmwtjCaNKjYT9NDeOgdBOavfrBbp7Kn-3I,1040962
5
- yeref-0.24.47.dist-info/METADATA,sha256=okbZiO7_-MNM4Ccx9dyac1ofOgCFgr8s-cXVBfi-dQE,119
6
- yeref-0.24.47.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
7
- yeref-0.24.47.dist-info/top_level.txt,sha256=yCQKchWHbfV-3OuQPYRdi2loypD-nmbDJbtt3OuKKkY,6
8
- yeref-0.24.47.dist-info/RECORD,,