|
|
@@ -57,7 +57,7 @@ def row(entity_type, channel, entity_id, dt, roi, uv=600, age=10, cost=200.0):
|
|
|
"T0裂变数": uv * 0.2,
|
|
|
"成本": cost,
|
|
|
"效率收入": roi * cost,
|
|
|
- "多层裂变收入": 0,
|
|
|
+ "裂变效率收入": 0,
|
|
|
}
|
|
|
if entity_type == ENTITY_SELF:
|
|
|
common.update(
|
|
|
@@ -99,6 +99,32 @@ class RoiRulesTest(unittest.TestCase):
|
|
|
self.assertIn(QIWEI_REFERENCE_RUN_SUFFIX, formal_id)
|
|
|
self.assertIn(QIWEI_REFERENCE_VERSION, formal_key)
|
|
|
|
|
|
+ def test_run_identity_isolates_corrected_source_revision(self):
|
|
|
+ default_id, default_key = _run_identity("20260729", FISSION_PARAMETERS)
|
|
|
+ revised_id, revised_key = _run_identity(
|
|
|
+ "20260729",
|
|
|
+ FISSION_PARAMETERS,
|
|
|
+ "datafix_20260730_1",
|
|
|
+ )
|
|
|
+
|
|
|
+ self.assertEqual(f"{default_id}_datafix_20260730_1", revised_id)
|
|
|
+ self.assertNotEqual(default_key, revised_key)
|
|
|
+ self.assertNotIn("datafix_20260730_1", revised_key)
|
|
|
+ self.assertLessEqual(len(revised_id), 64)
|
|
|
+ self.assertLessEqual(len(revised_key), 128)
|
|
|
+ self.assertEqual(
|
|
|
+ (revised_id, revised_key),
|
|
|
+ _run_identity(
|
|
|
+ "20260729",
|
|
|
+ FISSION_PARAMETERS,
|
|
|
+ "datafix_20260730_1",
|
|
|
+ ),
|
|
|
+ )
|
|
|
+ with self.assertRaisesRegex(ValueError, "source_revision"):
|
|
|
+ _run_identity("20260729", FISSION_PARAMETERS, "Invalid Revision")
|
|
|
+ with self.assertRaisesRegex(ValueError, "run_id"):
|
|
|
+ _run_identity("20260729", FISSION_PARAMETERS, "a" * 40)
|
|
|
+
|
|
|
def build_daily(self):
|
|
|
rows = []
|
|
|
# 每日形成稳定分布,低值实体连续低于后20%,高值实体连续高于前20%。
|
|
|
@@ -150,14 +176,14 @@ class RoiRulesTest(unittest.TestCase):
|
|
|
with self.assertRaisesRegex(ValueError, "连续三日数据"):
|
|
|
evaluate_rules(incomplete, DATES)
|
|
|
|
|
|
- def test_t0_income_is_scaled_once_without_duplicate_addition(self):
|
|
|
+ def test_daily_fission_income_is_scaled_once_without_duplicate_addition(self):
|
|
|
daily = self.build_daily()
|
|
|
mask = (
|
|
|
daily["entity_type"].eq(ENTITY_GZH)
|
|
|
& daily["公众号名"].eq("高ROI公众号")
|
|
|
)
|
|
|
daily.loc[mask, "效率收入"] = 100
|
|
|
- daily.loc[mask, "多层裂变收入"] = 200
|
|
|
+ daily.loc[mask, "裂变效率收入"] = 200
|
|
|
daily.loc[mask, "成本"] = 100
|
|
|
|
|
|
_, _, summary = evaluate_rules(daily, DATES)
|
|
|
@@ -168,6 +194,8 @@ class RoiRulesTest(unittest.TestCase):
|
|
|
expected = (
|
|
|
100 + 200 * FISSION_PARAMETERS.gzh_channel
|
|
|
) / 100
|
|
|
+ self.assertEqual(target["裂变效率收入"], 600)
|
|
|
+ self.assertEqual(target["T0实际裂变收入"], 600)
|
|
|
self.assertAlmostEqual(target["ROI"], expected)
|
|
|
self.assertAlmostEqual(target["实际ROI"], 3.0)
|
|
|
|
|
|
@@ -294,6 +322,11 @@ class RoiRulesTest(unittest.TestCase):
|
|
|
self.assertIn(FINAL_ROI_COLUMN, visible_columns)
|
|
|
self.assertIn(T0_FISSION_MULTIPLIER_COLUMN, visible_columns)
|
|
|
self.assertIn(TOTAL_FISSION_TO_FIRST_UV_COLUMN, visible_columns)
|
|
|
+ self.assertIn("T0裂变效率收入", visible_columns)
|
|
|
+ self.assertIn("总预估效率收入", visible_columns)
|
|
|
+ self.assertNotIn("LTV预测效率收入", visible_columns)
|
|
|
+ self.assertIn("裂变效率收入", frame.columns)
|
|
|
+ self.assertNotIn("裂变效率收入", visible_columns)
|
|
|
self.assertTrue(
|
|
|
frame[FINAL_ROI_COLUMN].equals(frame["ROI"])
|
|
|
)
|