feat(dashboard): 新增生肖转移概率表格
在控制台页面转移概率区域新增生肖(12生肖)转移概率矩阵,与现有 的区域转移和波色转移保持一致的展示风格。
This commit is contained in:
@@ -22,7 +22,7 @@ class History extends Backend
|
||||
* 无需额外权限检查的方法(但仍在 admin 模块内,需要 admin 登录)
|
||||
* @var array
|
||||
*/
|
||||
protected $noNeedRight = ['missingNum', 'trendData', 'hotColdNumbers', 'colorWaveAnalysis', 'zodiacAnalysis', 'oddEvenAnalysis', 'bigSmallAnalysis', 'specialTrend', 'consecutiveNumbers', 'tailNumbers', 'dashboard', 'specialHeatmap', 'specialHotColdAction', 'zoneTransition', 'colorWaveTransition', 'zoneToColorTransition'];
|
||||
protected $noNeedRight = ['missingNum', 'trendData', 'hotColdNumbers', 'colorWaveAnalysis', 'zodiacAnalysis', 'oddEvenAnalysis', 'bigSmallAnalysis', 'specialTrend', 'consecutiveNumbers', 'tailNumbers', 'dashboard', 'specialHeatmap', 'specialHotColdAction', 'zoneTransition', 'colorWaveTransition', 'zoneToColorTransition', 'zodiacTransition'];
|
||||
|
||||
public function _initialize()
|
||||
{
|
||||
@@ -343,5 +343,20 @@ class History extends Backend
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 生肖转移概率统计
|
||||
*/
|
||||
public function zodiacTransition()
|
||||
{
|
||||
if ($this->request->isAjax()) {
|
||||
$periods = $this->request->get('periods', 100, 'intval');
|
||||
if ($periods < 10 || $periods > 500) {
|
||||
$this->error('期数范围必须在 10-500 之间');
|
||||
}
|
||||
$result = $this->model->getZodiacTransition($periods);
|
||||
$this->success('查询成功', null, $result);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -467,7 +467,8 @@ class History extends Model
|
||||
'heatmap' => $this->getSpecialHeatmap($periods),
|
||||
'zonetransition' => $this->getZoneTransition($periods),
|
||||
'colorwavetransition' => $this->getColorWaveTransition($periods),
|
||||
'zonetocolortransition' => $this->getZoneToZoneColor($periods)
|
||||
'zonetocolortransition' => $this->getZoneToZoneColor($periods),
|
||||
'zodiactransition' => $this->getZodiacTransition($periods)
|
||||
];
|
||||
}
|
||||
|
||||
@@ -796,6 +797,70 @@ class History extends Model
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* 生肖转移概率统计
|
||||
* 统计特码从一种生肖转移到另一种生肖的概率(12生肖)
|
||||
* @param int $periods 查询最近多少期
|
||||
* @return array {animals: [], matrix: [], probabilities: [], row_totals: [], total_transitions: int}
|
||||
*/
|
||||
public function getZodiacTransition($periods = 100)
|
||||
{
|
||||
$history = $this
|
||||
->field('expect,num7,openTime')
|
||||
->order('openTime', 'desc')
|
||||
->limit($periods)
|
||||
->select();
|
||||
|
||||
if (empty($history) || count($history) < 2) {
|
||||
return ['animals' => ['鼠','牛','虎','兔','龙','蛇','马','羊','猴','鸡','狗','猪'], 'matrix' => [], 'probabilities' => [], 'row_totals' => [], 'total_transitions' => 0];
|
||||
}
|
||||
|
||||
$history = array_reverse($history);
|
||||
$num_model = new Num();
|
||||
$animalMap = $num_model->column('animal', 'num');
|
||||
|
||||
$animalLabels = ['鼠', '牛', '虎', '兔', '龙', '蛇', '马', '羊', '猴', '鸡', '狗', '猪'];
|
||||
$numAnimals = 12;
|
||||
$matrix = array_fill(0, $numAnimals, array_fill(0, $numAnimals, 0));
|
||||
$rowTotals = array_fill(0, $numAnimals, 0);
|
||||
|
||||
$getAnimalIdx = function ($num) use ($animalMap, $animalLabels) {
|
||||
$animal = $animalMap[$num] ?? '';
|
||||
$idx = array_search($animal, $animalLabels);
|
||||
return $idx === false ? -1 : $idx;
|
||||
};
|
||||
|
||||
$totalTransitions = 0;
|
||||
for ($i = 0; $i < count($history) - 1; $i++) {
|
||||
$currentNum = (int)$history[$i]['num7'];
|
||||
$nextNum = (int)$history[$i + 1]['num7'];
|
||||
$from = $getAnimalIdx($currentNum);
|
||||
$to = $getAnimalIdx($nextNum);
|
||||
if ($from < 0 || $to < 0) continue;
|
||||
|
||||
$matrix[$from][$to]++;
|
||||
$rowTotals[$from]++;
|
||||
$totalTransitions++;
|
||||
}
|
||||
|
||||
$probabilities = array_fill(0, $numAnimals, array_fill(0, $numAnimals, 0));
|
||||
for ($i = 0; $i < $numAnimals; $i++) {
|
||||
if ($rowTotals[$i] > 0) {
|
||||
for ($j = 0; $j < $numAnimals; $j++) {
|
||||
$probabilities[$i][$j] = round($matrix[$i][$j] / $rowTotals[$i] * 100, 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return [
|
||||
'animals' => $animalLabels,
|
||||
'matrix' => $matrix,
|
||||
'probabilities' => $probabilities,
|
||||
'row_totals' => $rowTotals,
|
||||
'total_transitions' => $totalTransitions
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* 区域→区域转移矩阵,单元格内显示波色概率
|
||||
* 统计上一期特码所在区域后,下一期特码在各区域的分布,以及每个区域内的波色占比
|
||||
|
||||
Reference in New Issue
Block a user