yeref 0.24.47__tar.gz → 0.24.48__tar.gz
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-0.24.47 → yeref-0.24.48}/PKG-INFO +1 -1
- {yeref-0.24.47 → yeref-0.24.48}/setup.py +1 -1
- {yeref-0.24.47 → yeref-0.24.48}/yeref/yeref.py +90 -25
- {yeref-0.24.47 → yeref-0.24.48}/yeref.egg-info/PKG-INFO +1 -1
- {yeref-0.24.47 → yeref-0.24.48}/pyproject.toml +0 -0
- {yeref-0.24.47 → yeref-0.24.48}/setup.cfg +0 -0
- {yeref-0.24.47 → yeref-0.24.48}/yeref/__init__.py +0 -0
- {yeref-0.24.47 → yeref-0.24.48}/yeref/l_.py +0 -0
- {yeref-0.24.47 → yeref-0.24.48}/yeref/tonweb.js +0 -0
- {yeref-0.24.47 → yeref-0.24.48}/yeref.egg-info/SOURCES.txt +0 -0
- {yeref-0.24.47 → yeref-0.24.48}/yeref.egg-info/dependency_links.txt +0 -0
- {yeref-0.24.47 → yeref-0.24.48}/yeref.egg-info/top_level.txt +0 -0
@@ -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,104 @@ 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
|
+
|
16146
16211
|
for USER_TID, USER_VARS, USER_LSTS in data_users:
|
16147
|
-
|
16148
|
-
|
16149
|
-
|
16212
|
+
USER_VARS = json.loads(USER_VARS or USER_VARS_)
|
16213
|
+
USER_LSTS = json.loads(USER_LSTS or USER_LSTS_)
|
16214
|
+
USER_DT = USER_VARS.get("USER_DT", "")
|
16215
|
+
USER_PAYMENTS = USER_LSTS.get("USER_PAYMENTS", [])
|
16216
|
+
USER_STATUSES = USER_LSTS.get("USER_STATUSES", [])
|
16150
16217
|
# месяц регистрации
|
16151
|
-
|
16152
|
-
|
16218
|
+
|
16219
|
+
if USER_DT:
|
16220
|
+
dt_obj = datetime.strptime(USER_DT, "%d-%m-%Y_%H-%M-%S")
|
16153
16221
|
mo = dt_obj.strftime("%Y-%m")
|
16154
16222
|
if (USER_TID, mo) not in seen_new:
|
16155
16223
|
seen_new.add((USER_TID, mo))
|
16156
16224
|
metrics[mo]["N"] += 1
|
16157
16225
|
|
16158
16226
|
# платежи этого пользователя
|
16159
|
-
for pay in
|
16227
|
+
for pay in USER_PAYMENTS:
|
16160
16228
|
start = pay.get("DT_START", "")
|
16161
16229
|
amt = pay.get("AMOUNT", 0)
|
16162
|
-
|
16163
|
-
|
16164
|
-
|
16165
|
-
|
16166
|
-
|
16167
|
-
|
16230
|
+
|
16231
|
+
dt_p = datetime.strptime(start, "%d-%m-%Y_%H-%M-%S")
|
16232
|
+
mo_p = dt_p.strftime("%Y-%m")
|
16233
|
+
val = float(amt) * 0.013
|
16234
|
+
metrics[mo_p]["sum_amount"] += val
|
16235
|
+
metrics[mo_p]["payments_count"] += 1
|
16168
16236
|
|
16169
16237
|
# статусы (отток)
|
16170
|
-
for status in
|
16238
|
+
for status in USER_STATUSES:
|
16171
16239
|
key, ts = next(iter(status.items()))
|
16172
16240
|
if key in ("left", "kicked"):
|
16173
16241
|
dt_s = datetime.strptime(ts, "%d-%m-%Y_%H-%M-%S")
|
@@ -16177,14 +16245,13 @@ async def return_unit_metrics(bot, PROJECT_USERNAME, EXTRA_D, BASE_P):
|
|
16177
16245
|
|
16178
16246
|
# список месяцев в порядке
|
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
|
-
|
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 = (
|
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", "
|
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["
|
16299
|
+
row["ChurnR"], row["LTV1"], row["CMGR"], row["CAC"]
|
16235
16300
|
])
|
16236
16301
|
|
16237
16302
|
# отправить файл
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|