yeref 0.25.5__py3-none-any.whl → 0.25.6__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
@@ -16097,7 +16097,7 @@ async def calc_metrics(bot, PROJECT_USERNAME, dataroom_folder_id, EXTRA_D, BASE_
|
|
16097
16097
|
offset += len(tbl['rows'])
|
16098
16098
|
|
16099
16099
|
# 5.3) Оставляем минимум 2 пустые строки перед следующей таблицей
|
16100
|
-
offset +=
|
16100
|
+
offset += 3
|
16101
16101
|
|
16102
16102
|
# 6) Выполняем единый batchUpdate для всех data_requests
|
16103
16103
|
write_body = {
|
@@ -16342,7 +16342,7 @@ async def return_unit_metrics(bot, data_users, EXTRA_D):
|
|
16342
16342
|
factors = [1 + v for v in cmgr_vals]
|
16343
16343
|
avg = math.prod(factors) ** (1 / len(factors))
|
16344
16344
|
writer.writerow([])
|
16345
|
-
writer.writerow([f"Rev ~ ×{round(avg, 2)} monthly"])
|
16345
|
+
writer.writerow([f"Rev ~ ×{round(avg, 2)} monthly".replace('.', ',')])
|
16346
16346
|
|
16347
16347
|
result = f_name
|
16348
16348
|
thumb = types.FSInputFile(os.path.join(EXTRA_D, "parse.jpg"))
|
@@ -16437,7 +16437,7 @@ async def return_cohort_metrics(bot, data_users, EXTRA_D):
|
|
16437
16437
|
for r in table:
|
16438
16438
|
writer.writerow(r)
|
16439
16439
|
writer.writerow([])
|
16440
|
-
writer.writerow([f"Churn ~ ×{avg_churn:.2f} monthly"])
|
16440
|
+
writer.writerow([f"Churn ~ ×{avg_churn:.2f} monthly".replace('.', ',')])
|
16441
16441
|
|
16442
16442
|
result = f_name
|
16443
16443
|
thumb = types.FSInputFile(os.path.join(EXTRA_D, "parse.jpg"))
|
@@ -16511,12 +16511,12 @@ async def return_retention_metrics(bot, data_users, EXTRA_D):
|
|
16511
16511
|
else:
|
16512
16512
|
rev = rev_by_cohort[c].get(offset, 0.0)
|
16513
16513
|
if rev > 0:
|
16514
|
-
cell = f"{rev:.1f}"
|
16514
|
+
cell = f"{rev:.1f}".replace('.', ',')
|
16515
16515
|
row.append(cell)
|
16516
16516
|
row_sum += rev
|
16517
16517
|
else:
|
16518
|
-
row.append("0
|
16519
|
-
row.append(f"{row_sum:.1f}")
|
16518
|
+
row.append("0,0")
|
16519
|
+
row.append(f"{row_sum:.1f}".replace('.', ','))
|
16520
16520
|
writer.writerow(row)
|
16521
16521
|
|
16522
16522
|
factors = []
|
@@ -16529,7 +16529,7 @@ async def return_retention_metrics(bot, data_users, EXTRA_D):
|
|
16529
16529
|
avg_multiplier = math.prod(factors) ** (1 / len(factors)) if factors else 1.0
|
16530
16530
|
|
16531
16531
|
writer.writerow([])
|
16532
|
-
writer.writerow([f"NRR ~ ×{avg_multiplier:.2f} monthly"])
|
16532
|
+
writer.writerow([f"NRR ~ ×{avg_multiplier:.2f} monthly".replace('.', ',')])
|
16533
16533
|
|
16534
16534
|
result = f_name
|
16535
16535
|
thumb = types.FSInputFile(os.path.join(EXTRA_D, "parse.jpg"))
|
@@ -16546,6 +16546,7 @@ async def return_profit_and_loss_metrics(bot, data_users, EXTRA_D):
|
|
16546
16546
|
try:
|
16547
16547
|
metrics = defaultdict(lambda: {"sum_amount": 0.0})
|
16548
16548
|
|
16549
|
+
# Собираем данные по месяцам
|
16549
16550
|
for USER_TID, USER_VARS, USER_LSTS in data_users:
|
16550
16551
|
USER_LSTS = json.loads(USER_LSTS or "{}")
|
16551
16552
|
USER_PAYMENTS = USER_LSTS.get("USER_PAYMENTS", [])
|
@@ -16556,12 +16557,14 @@ async def return_profit_and_loss_metrics(bot, data_users, EXTRA_D):
|
|
16556
16557
|
amt = float(pay.get("AMOUNT", 0)) * 0.013
|
16557
16558
|
metrics[mo_p]["sum_amount"] += amt
|
16558
16559
|
|
16560
|
+
# Функция форматирования с запятой
|
16559
16561
|
def fmt(x):
|
16560
|
-
return f"{x:.2f}".rstrip("0").rstrip(".") if x is not None else ""
|
16562
|
+
return f"{x:.2f}".rstrip("0").rstrip(".").replace(".", ",") if x is not None else ""
|
16561
16563
|
|
16562
16564
|
# Сортируем месяцы
|
16563
16565
|
months_sorted = sorted(metrics.keys())
|
16564
16566
|
results = []
|
16567
|
+
np_values = []
|
16565
16568
|
|
16566
16569
|
for mo in months_sorted:
|
16567
16570
|
MRR = metrics[mo]["sum_amount"]
|
@@ -16570,12 +16573,12 @@ async def return_profit_and_loss_metrics(bot, data_users, EXTRA_D):
|
|
16570
16573
|
OPEX = 4.5
|
16571
16574
|
OP = GP - OPEX
|
16572
16575
|
|
16573
|
-
#
|
16574
|
-
after_comm = OP * 0.70
|
16575
|
-
after_fiat = after_comm * 0.99
|
16576
|
-
COMM = OP - after_comm
|
16577
|
-
EXCH = after_comm - after_fiat
|
16578
|
-
NP = after_fiat
|
16576
|
+
# комиссия 30% и обмен 1%
|
16577
|
+
after_comm = OP * 0.70
|
16578
|
+
after_fiat = after_comm * 0.99
|
16579
|
+
COMM = OP - after_comm
|
16580
|
+
EXCH = after_comm - after_fiat
|
16581
|
+
NP = after_fiat
|
16579
16582
|
|
16580
16583
|
results.append([
|
16581
16584
|
mo,
|
@@ -16588,16 +16591,27 @@ async def return_profit_and_loss_metrics(bot, data_users, EXTRA_D):
|
|
16588
16591
|
fmt(EXCH),
|
16589
16592
|
fmt(NP)
|
16590
16593
|
])
|
16594
|
+
np_values.append(NP)
|
16595
|
+
|
16596
|
+
# Вычисляем средний NP (если есть хотя бы одно значение)
|
16597
|
+
avg_np = sum(np_values) / len(np_values) if np_values else 0.0
|
16598
|
+
avg_np_str = fmt(avg_np)
|
16591
16599
|
|
16592
16600
|
f_name = os.path.join(EXTRA_D, "5_profit_and_loss_metrics.csv")
|
16593
16601
|
with open(f_name, "w", newline="", encoding="utf-8") as f:
|
16594
16602
|
writer = csv.writer(f)
|
16603
|
+
# Заголовок
|
16595
16604
|
writer.writerow([
|
16596
16605
|
"Mo", "MRR", "COGS", "Gross Profit",
|
16597
16606
|
"OPEX", "Operating Profit", "Comission (30%)", "Fiat (1%)", "Net Profit"
|
16598
16607
|
])
|
16608
|
+
# Строки по месяцам
|
16599
16609
|
for row in results:
|
16600
16610
|
writer.writerow(row)
|
16611
|
+
# Пустая строка перед средним
|
16612
|
+
writer.writerow([])
|
16613
|
+
# Строка со средним Net Profit
|
16614
|
+
writer.writerow([f"Average Net Profit: {avg_np_str}"])
|
16601
16615
|
|
16602
16616
|
result = f_name
|
16603
16617
|
thumb = types.FSInputFile(os.path.join(EXTRA_D, "parse.jpg"))
|
@@ -16607,6 +16621,7 @@ async def return_profit_and_loss_metrics(bot, data_users, EXTRA_D):
|
|
16607
16621
|
await asyncio.sleep(round(random.uniform(0, 1), 2))
|
16608
16622
|
finally:
|
16609
16623
|
return result
|
16624
|
+
|
16610
16625
|
# endregion
|
16611
16626
|
|
16612
16627
|
|
@@ -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=8Ow6asK12jj3noAAUVtCKwq-txpj_ks_w-L-IQKqaZA,1056443
|
5
|
+
yeref-0.25.6.dist-info/METADATA,sha256=bsrMXHVBgRzsBy8TBIwOSrV1PA13MYOgpYrFdb4BfPY,118
|
6
|
+
yeref-0.25.6.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
7
|
+
yeref-0.25.6.dist-info/top_level.txt,sha256=yCQKchWHbfV-3OuQPYRdi2loypD-nmbDJbtt3OuKKkY,6
|
8
|
+
yeref-0.25.6.dist-info/RECORD,,
|
yeref-0.25.5.dist-info/RECORD
DELETED
@@ -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=ljsCvG1omKMY2PpVKfFunM1eTcMNd7w_aW_GFX3b8Ps,1055985
|
5
|
-
yeref-0.25.5.dist-info/METADATA,sha256=L3eS_VIOpEfv271siW57nYb5571PNCcE-XqbHoAID-k,118
|
6
|
-
yeref-0.25.5.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
7
|
-
yeref-0.25.5.dist-info/top_level.txt,sha256=yCQKchWHbfV-3OuQPYRdi2loypD-nmbDJbtt3OuKKkY,6
|
8
|
-
yeref-0.25.5.dist-info/RECORD,,
|
File without changes
|
File without changes
|