+
    Z$jw                        R t ^ RIt^ RIt^ RIt^ RIt^ RIHtHt RRRRRRR	RR
RRRR^RRR. RIO/	tRRRRRRRRRRRRRRRR R!R"R#R$/
tRR%RR&RR'RR(RR&RR'RR&RR(R!R)R#R*/
t	R+ R, lt
R- R. ltR/ R0 ltR1 R2 ltR3 R4 ltR5 R6 ltR7 R8 ltR9 R: ltR; R< ltR= R> ltR? R@ ltRA RB ltRC RD ltRJRE RF lltRG t]RH8X  d
   ]! 4        R# R# )Ku  
nba_engine.py — 名店DB Next Best Action エンジン v1.1.0
仕様書: meiten-business/12_next-action-engine.md §5
実行: python nba_engine.py [--dry-run] [--output PATH] [--as-of YYYY-MM-DD] [--store-id MTN-XXX]
      python nba_engine.py [--params PATH]  ← パラメータファイルを明示指定

変更点 v1.1.0（2026-06-06）:
  - パラメータを nba_params.json から読み込む（無ければ既定値で自動生成・冪等）
  - calc_s_strategic がサブ因子 {worldview,tegata,hotel,symbol,funnel} を返す
  - ev_breakdown にサブ因子を追加
  - nba_factors.json を別途出力（フロント重みスライダー用）

GR19準拠: 係数は初期値・要キャリブレーション。捏造禁止。
N)datetime	timedeltaW_WORLD333333?W_TEGATA皙?W_HOTEL333333?W_SYMBOLW_FUNNELHOURLY_RATEi  L6_ACTIVE_THRESHOLDL4_COUNT_AS_REVENUEFSYMBOL_KEYWORDSA01u   年契更新・継続確認A02u   アップセル提案A03u   取材オファーA04u   名店リスト勧誘A05u   ブランド枠初回提案A06u   大型枠・記事広告提案A07u   途絶復活打診A08u   手形/ホテル連携提案A09u   担当アサインA10u   休眠・見送り      ?g       @g      @      ?      ?        c                0    V ^8  d   QhR\         R\        /# )   params_pathreturn)strdict)formats   "]C:\Users\daito\company\projects\kototoi-sanpo-editorial\meiten-business\scripts\nba_engine.py__annotate__r&   B   s     ! !S !T !    c                   \         P                  P                  V 4      '       g   RRRRRRRR\        P                  ! 4       P                  R	4      //pVP                  \        4       \         P                  ! \         P                  P                  V 4      R
R7       \        V RRR7      ;_uu_ 4       p\        P                  ! WR^R7       RRR4       \        RV  24       \        V RR7      ;_uu_ 4       p\        P                  ! V4      pRRR4       / p\        P                  4        F  w  rVXP!                  WV4      WE&   K  	  V#   + '       g   i     L; i  + '       g   i     LW; i)u   
nba_params.json を読み込んでパラメータ辞書を返す。
ファイルが無ければ DEFAULT_PARAMS で自動生成（冪等）。
未定義キーはデフォルト値でフォールバック。
_metatitleu&   NBA エンジン 調整パラメータschema_versionz1.0.0descriptionu   nba_engine.py が読み込む外部パラメータ。このファイルを変更して POST /api/meiten/nba-params を呼ぶか、nba_engine.py を直接実行すると全202店が再スコアされる。updated%Y-%m-%dTexist_okwutf-8encodingFensure_asciiindentNu:   [NBA Engine] nba_params.json を新規生成しました: )ospathexistsr   nowstrftimeupdateDEFAULT_PARAMSmakedirsdirnameopenjsondumpprintloaditemsget)r    objfrawpkvs   &      r%   load_paramsrN   B   s    77>>+&& A 'a 8<<>22:>	
 	

>"
BGGOOK04@+sW55IIc5; 6J;-XY	kG	,	,iil 
- 	A$$&wwq} 'H 65 
-	,s   4E9EE	E/	c                0    V ^8  d   QhR\         R\        /# )r   rK   r!   )r#   list)r$   s   "r%   r&   r&   f   s      t  r'   c           	       a  . p. ROpV F?  pS P                  V^ 4      pRTu;8:  d
   R8:  d   K&  M VP                  V RV R24       KA  	  \        V 3R lV 4       4      p\        VR,
          4      R8  d+   VP                  RVR R	\        VR,
          4      R R
24       S P                  R^ 4      ^ 8:  d   VP                  RS R,           R24       V# )uX   
パラメータバリデーション。
returns: list of warning strings（空 = OK）
r   r   =u    は 0〜1 の範囲外c              3   H   <"   T F  pSP                  V^ 4      x  K  	  R# 5i)    NrG   ).0rL   rK   s   & r%   	<genexpr>"validate_params.<locals>.<genexpr>q   s     1[a[s   "r   u   重み合計=z.3fu   （1.0 からの乖離=uL    が 0.20 超）──合計1.0でなくても動作しますが確認推奨r   zHOURLY_RATE=u    は正の値が必要)r   r   r   r
   r   )rG   appendsumabs)rK   warningsweight_keysrL   rM   w_sums   f     r%   validate_paramsr_   f   s    
 HLKEE!QKqCOOqc1#%<=>  1[11E
53;$E#;&=c%)nS=Q RK K	
 	uu]A!#,q'7&88NOPOr'   c                0    V ^8  d   QhR\         R\        /# r   storer!   r#   float)r$   s   "r%   r&   r&      s     2 2$ 25 2r'   c                   V P                  RR4      pRRRRRRR	RR
RRRRRRRRR/	pVP                  VR4      pV P                  R4      ;'       g    / pVP                  R4      R8X  d   \        VR,          R4      pV P                  R4      RJ d
   VR,          p\        V P                  R4      ;'       g    . 4      pV^8  d   \        VR,          R4      pMV^8  d   \        VR,          R4      pRRRRR R/pV P                  R!4      ;'       g    RpW6P                  VR4      ,          p\        \	        R"\        RV4      4      ^4      # )#uK   獲得確率 P_convert ∈ [0.02, 0.90]（要キャリブレーション）labelL6L1ag?L1bg333333?L1c皙?L1dL2g      ?L3r   L4gffffff?L5r	   g?vol15status   受注gffffff?lapsedT皙?issuesPlacedg333333?g?ABr   CpotentialTierg{Gz?)rG   minlenroundmax)rb   rf   
base_p_mapbase_pv15n_issues	tier_multtiers   &       r%   calc_p_convertr      sI   IIgt$EtUD%udtTD$tdD4J ^^E4(F ))G

"
"C
wwxH$Vd]D) yyd"$ 599^,223H1}Vd]D)	QVd]D) dCsD1I99_%,,DmmD$//FT3tV,-q11r'   c                0    V ^8  d   QhR\         R\        /# ra   )r#   int)r$   s   "r%   r&   r&      s     ? ?4 ?C ?r'   c                R   V P                  R4      ;'       g    / pVP                  R4      '       d)   VP                  R4      R9   d   \        VR,          4      # V P                  R4      ;'       g    ^ pV^ 8  d   \        V4      # V P                  RR4      pV P                  RR4      ;'       g    Rp/ RR	bRR
bRRbRRbRRbRRbRRbRRbRRbRRbRRbRRbRR
bRRbR RbR!RbR"RbR#RR$RR%RR&RR'R
R(RR)RR*RR+RR,R/
CpW43pVR3pVP                  WeP                  VR4      4      # )-u"   想定受注額（1号あたり）rq   amountrr   	lastSpendrf   rg   rz   rx   i @ 順 i`  i  i  iP  i0u  )rs   	   商談中)rh   rw   )rh   rx   )rh   ry   )ri   rw   )ri   rx   )ri   ry   )rj   rw   )rj   rx   )rj   ry   )rl   rw   )rl   rx   )rl   ry   )rm   rw   )rm   rx   )rm   ry   )rn   rw   )rn   rx   )rn   ry   )ro   rw   )ro   rx   )ro   ry   )rp   rw   )rp   rx   )rp   ry   )rg   rw   )rg   rx   )rg   ry   )rG   r   )rb   r   lastrf   r   defaultskeyfallback_keys   &       r%   calc_v_expectedr      s    ))G

"
"C
wwxSWWX.2II3x=!! 99[!&&QDax4y IIgt$EIIos+22sD
f
*F
4@&
u
*U
5AE
 	
 +d
 6BT
 	u	
 +U	
 6BE	

 	f

 +F

 6BE
 	u
 +U
 6BTulU\TflF\EulU\T
H -C3<L<<\\,=>>r'   c                <    V ^8  d   QhR\         R\         R\        /# r   rb   rK   r!   )r#   tuple)r$   s   "r%   r&   r&      s&     J. J. J.$ J.5 J.r'   c                  a VP                  R\        R,          4      p\        V P                  R4      ;'       g    R4      pRV9   g   RV9   d   RV9  d   RpMRV9   d   R	pMR
pV P                  R4      ;'       g    / p\        V\        4      '       d   VP                  RR4      ;'       g    RpM\        V4      pRRRR	RR
/pVP                  VR
4      p\        V P                  R4      ;'       g    R4      p	RV	9   d   Rp
MRV	9   d   R	p
MR
p
\        V P                  R4      ;'       g    R4      \        V P                  R4      ;'       g    R4      ,           o\        R\        V3R lV 4       4      4      pV P                  RR4      pV P                  R4      ;'       g    / p \        V\        4      '       d&   \        VP                  R^ 4      ;'       g    ^ 4      MR
pVR8X  d   RpMFVR%9   d   VR8  d   RpM5VR&9   d-   \        V P                  R4      ;'       g    . 4      ^8  d   RpMR
pVP                  R\        R,          4      pVP                  R\        R,          4      pVP                  R\        R,          4      pVP                  R\        R,          4      pVP                  R\        R,          4      pVV,          VV,          ,           VV
,          ,           VV,          ,           VV,          ,           pR	VR,          ,           pR \        V^4      R!\        V^4      R"\        V
^4      R#\        V^4      R$\        V^4      /p\        V^4      V3#   \        \        3 d    R
p ELi ; i)'u   
戦略係数 S_strategic ∈ [0.5, 2.0] と
正規化サブ因子 dict{worldview,tegata,hotel,symbol,funnel} を返す。
各サブ因子は重み適用前の 0〜1 スコア。
r   worldviewFit    最高   高   低r      中r   r   	tegataFitlevelhotelEastFit
bizDevNote
nextActionc              3   8   <"   T F  qS9   g   K  R x  K  	  R# 5i)r   N )rV   kwbiz_texts   & r%   rW   0calc_s_strategic_with_factors.<locals>.<genexpr>   s     L/B8^CC/s   
rf   ratingscorern   rk   g      @ru   rv   r   r   r   r   r
   r   r   	worldviewtegatahotelsymbolfunnel)rg   rm   rh   ri   )rG   r>   r"   
isinstancer#   r{   rZ   rd   
ValueError	TypeErrorr|   r}   )rb   rK   r   wf_textw_worldtftf_level
tegata_mapw_tegatahf_textw_hotelw_symbolrf   r   rating_scorew_funnelr   r   r   r
   r   	raw_scores_strategicsub_factorsr   s   &&                      @r%   calc_s_strategic_with_factorsr      s*    ee-~>O/PQO %))N+11r2G7u/E4H	'	 
;		%	%2B"d66'5)22Ur7eS%5J~~h,H %))N+11r2G	'	 599\*00b1C		,8O8U8USU4VVH3L/LLMH IIgr"EYYx &&BF=GPT=U=UuVZZ388q9[^ }	,	<3#6	.	 S>)B)H)Hb%IQ%N uuY	!:;GuuZ
!;<HuuY	!:;GuuZ
!;<HuuZ
!;<H7"X%887W;LLh&')1H)<=I	C'K 	U7A&U8Q'U7A&U8Q'U8Q'K a +--= 	" s   .3M) "	M) )N ?N c                <    V ^8  d   QhR\         R\         R\        /# r   rc   )r$   s   "r%   r&   r&     s!      D T e r'   c                     \        W4      w  r#V# )u6   戦略係数のみ返す（後方互換ラッパー）)r   )rb   rK   s_s   &&  r%   calc_s_strategicr     s    (2DAHr'   c                <    V ^8  d   QhR\         R\        R\        /# )r   action_typerK   r!   )r"   r#   r   )r$   s   "r%   r&   r&     s&     L Ls Lt L Lr'   c                    \         P                  V R4      p\        W!P                  R\        R,          4      ,          4      # )u.   営業コスト = 工数(h) × 人件費単価r   r   )ACTION_HOURSrG   r   r>   )r   rK   hourss   && r%   calc_c_actionr     s2    [#.Euuu]N=,IJJKKr'   c                H    V ^8  d   QhR\         R\        R\         R\        /# )r   rb   r   rK   r!   )r#   r"   rd   )r$   s   "r%   r&   r&     s(      4 c d u r'   c                    \        V 4      p\        V 4      p\        W4      p\        W4      pW4,          V,          V,
          # )u6   EV = P_convert × V_expected × S_strategic - C_action)r   r   r   r   )rb   r   rK   pcrM   r   cs   &&&    r%   calc_evr     s;    		B		A	%	#A	{	&AFQJ!r'   c          
      T    V ^8  d   QhR\         R\        R\         R\         R\        /# )r   evr   ev_minev_maxr!   )rd   r"   r   )r$   s   "r%   r&   r&   "  s0     3 3E 3 3U 3E 3VY 3r'   c           
         VR8X  d   ^ # W28X  d   ^2# W,
          W2,
          ,          p\        ^ \        ^d\        V^d,          4      4      4      # )uA   優先度スコア = EV を 0-100 に正規化（A10は0固定）r   )r~   r{   r   )r   r   r   r   
normalizeds   &&&& r%   calc_priority_scorer   "  sB    e+&/2Jq#c3zC/0122r'   c                <    V ^8  d   QhR\         R\        R\         /# )r   rb   r   r!   r#   r"   )r$   s   "r%   r&   r&   ,  s!      $ S T r'   c                   \        V 4      p\        V 4      p\        P                  VR4      p\	        ^\        ^
\        VR,          4      ^,           4      4      p\	        ^\        ^
\        V^
,          4      4      4      p\	        ^\        ^
^
\        V^,          4      ,
          4      4      pRVRVRVR\        WV,           V,           ^,          ^4      /# )u3   ICEスコア（補助指標・営業現場向け）r   i@  Iry   EICE)r   r   r   rG   r~   r{   r   r}   )rb   r   rM   p_convr   impact
confidenceeases   &&      r%   calc_ice_scorer   ,  s    AE"F[#.EQBAI 234FQBFRK 012JQBS^ 345DVS*c4uf)D0A5q9 r'   c                0    V ^8  d   QhR\         R\         /# )r   current_labelr!   )r"   )r$   s   "r%   r&   r&   >  s     - -3 -3 -r'   c                 :    R RRRRRRR/pVP                  V R4      # )	rj   u   ブランド枠¥60krl   u   1P¥100kri   u   記事広告¥600krh   u   年契化/面積拡大u	   上位枠rU   )r   ms   & r%   _next_tier_textr   >  s3    %z#'		A 55,,r'   c                <    V ^8  d   QhR\         R\         R\         /# r   )r#   )r$   s   "r%   r&   r&   L  s&     n n n$ n4 nr'   c                *   V P                  RR4      pV P                  R4      ;'       g    / pVP                  RR4      ;'       g    Rp\        V 4      pV P                  RR4      ;'       g    RpVP                  R\        R,          4      pVR	8X  d   VR
8  d   RMRpRVRRR^RRVR R2/# VRN9   d   VR8X  d   V P                  R4      ;'       g    / p	\        V	\        4      '       d   V	P                  RR4      M
\        V	4      ;'       g    Rp
\        V P                  R4      ;'       g    R4      pV
R8X  d   RV9   g   RV9   d   RRRRR^<RR/# VRO9   d"   VRP9   d   RR RR!R^RR"V R#\        V4       R$2/# RR%RRR^ZRR&/# VRQ9   d   RMR!pVRQ9   d   ^M^pRR%RVRVRR'V R(2/# VR)8X  dY   V P                  R*4      ;'       g    ^ pVR+8  g   VR+8  d   RR,RRR^RR-VR R.2/# V P                  R/R04      pRR,RR!R^RR1V R22/# VR38X  d`   \        V P                  R44      ;'       g    R4      pR5V9   ;'       g    RV9   ;'       d    RV9  pV'       d   RRRR!R^RR6/# RR7RRR^-RR8/# VR98X  d   RR%RR:R^ZRR;/# VR<8X  d#   VR8X  d   VR8w  d   RRRR!R^RR=/# RR>RR:RR?RR@/# VR8X  Ed>   V P                  RA4      p\        V P                  R44      ;'       g    R4      pR5V9   ;'       g    RV9   ;'       d    RV9  pV P                  R4      ;'       g    / p	\        V	\        4      '       d   V	P                  RR4      MR;'       g    Rp
 Ve   \        V4      MRBpVR8X  g   VV8:  d   RRCRR!R^RRDV REV RF2/# V'       d   V
RR9   d   RR7RRR^-RRG/# VRH8X  g   V'       g   V
R8X  d   RR>RR:RR?RRI/# \        V P                  RJ4      4      pV'       d   R7MRKpRVRRR^<RRL/# RRKRR:R^ZRRM/#   \        \        3 d    RBp Li ; i)Su*   次アクションを一意に決定するrf   rg   rq   rr   r   rz   rx   r   r   r   r   r   r   priorityP0deadline_daysreasonu5   Vol.15商談中・今号クローズ必須。想定¥,u   。即フォロー。rs   r   r   r   r   r   r   r   P2u[   Vol.15受注済み。手形/ホテル連携クロスセルで関係深化。次号まで。rw   r   P1u6   名店リスト/記事下の継続中。potentialTier=u   →u   へのアップセル余地。r   uD   継続受注済み。次号継続確認（90日以内）を実施。u   継続広告主(u1   )だがVol.15未受注。即更新確認必須。rm   r   r   r   u   大型途絶（最終¥uE   ）。まず離脱理由ヒアリング→復活提案。最優先。	lastIssueu   不明u$   途絶（lapsed=True）。最終号:u*   。関係が残るうちに復活打診。rn   r   r   uy   L3埋蔵金（取材済・未広告）。世界観適合高。取材連動でブランド枠¥35k〜¥100k初収益化。r   uN   L3埋蔵金。名店リスト¥3kで関係再構築→翌号アップセル。ro   P3uu   グループ内。社内調整で継続確認。外部収益カウントの是非はCEO判断（P4=参考扱い）。rp   uZ   域外大手potentialTier=A。大型枠提案の余地。法人広報へアプローチ。r   i  ul   域外大手（L5）・世界観適合低・B/C tier。今期は見送り。リソースをL3/L2に集中。best100Ranki'  r   u   L6高潜在（tier=z	/best100=u9   ）。取材オファーでファネル入口を作る。uV   L6（世界観適合高×手形適性あり）。名店リスト¥3kで関係開始。ry   uM   L6低潜在（C tier・世界観低・手形適性低）。今期見送り。	salesRepsr   u9   L6 B tier。担当アサイン→名店リスト打診。u3   ラベル不明・担当アサインから開始。)rh   ri   rj   rl   )rj   rl   )rw   rx   r   )r   r   )rG   r   r>   r   r#   r"   r   r   r   r   bool)rb   rK   rf   r   
v15_status
v_expectedr   r   actionr   r   r   r   deadline
last_spend
last_issuer   worldview_highbest100b100_valhas_reps   &&                   r%   determine_nbar   L  s   IIgt$E
))G

"
"C2&,,"J 'J99_c*11cD%% 5~F[7\] [ $.E6QMjYZ^[pq	
 	
 ,,!;'--2B2<R2F2Fw.CPRG]]X]H%))N399r:G5 ew&6%7:J!5#R{	  .(TZ-?!5#RPQUPVoe455SU  "5#Rd	   %6tDH"n4r"HuH,UG3de	  }YY{+00q
:#7uD3Jq>  BG  H	  ;9JuD@Lvw	  }eii/5526"g-\\%72B2[2[uT[G[uD  V	  uDj	  }5R  N	
 	
 }3;:1uDv	  uD  I	  }))M*eii/5526"g-\\%72B2[2[uT[G[YY{#))r.8T.B.BBFF7E*WWRW	'.':s7|H 3;(&99uD/vYwi  HA  B	  N :uDr	  S[H4EuDi	  599[12G%U5FvDU	  	uDG	 G I& 	H	s   O< <PPc                0    V ^8  d   QhR\         R\        /# ra   r   )r$   s   "r%   r&   r&     s     ) )d )s )r'   c                   V P                  R4      ;'       g    / pVP                  R4      '       d   \        VR,          4      # V P                  R4      ;'       g    . pV'       d*    \        VR RR7      p\        V^ ,          R,          4      # V P                  RR	4      pV P                  R
R4      ;'       g    RpV P                  R4      ;'       g    / P                  RR4      ;'       g    RpVR9   g   VR8X  d   \	        V 4      R8  d   R# RV9   d   RV9   g   RV9   d   R# RV9   g   RV9   d   R# R#   \         d&    \        T^ ,          P                  RR4      4      u # i ; i)u\   担当者を決定する（優先順位: vol15.rep > 最新salesReps > カテゴリ推定）rq   repr   c                 L    \        V P                  R 4      ;'       g    ^ .4      # )issues)r~   rG   )rs   &r%   <lambda>assign_rep.<locals>.<lambda>  s    c!%%/"8"8aS9r'   T)r   reverseu   未割当（A09要対応）rf   rg   categoryr   areawardrm   r   u   大田（社長）u   飲食u   根岸u   台東u   浅川u	   不動産u   金融u   石井)rh   )rG   r"   sorted	Exceptionr   )rb   r   repssorted_repsrf   r
  r  s   &      r%   
assign_repr    sI   
))G

"
"C
wwu~~3u:99[!''RD	J 9K
 {1~e,-- IIgt$EyyR(..BHIIf##((4::DETMoe.D.N#8T!1X5Eh(h"6(  	JtAw{{5*GHII	Js   )'D= =-E-,E-c                l    V ^8  d   QhR\         R\         R\         R\        R\        R\         R\        /# )r   master_pathoutput_pathr    as_ofdry_runstore_id_filterr!   )r"   r   r   r#   )r$   s   "r%   r&   r&   $  sW     n nnn n 	n
 n n 
nr'   c                  a, Vf   \         P                  ! 4       p\        V4      p\        V4      pV'       d   V F  p\	        RV 24       K  	  \        V RR7      ;_uu_ 4       p	\        P                  ! V	4      p
RRR4       X
R,          pV'       dC   V Uu. uF  qP                  R4      V8X  g   K  VNK  	  ppV'       g   \	        RV R24       / # MTp. p. pV F  p\        VV4      pVR	,          p\        VV4      w  pp\        V4      \        V4      ,          V,          \        VV4      ,
          pVP                  V4       VP                  R
VRVRVRVRV/4       K  	  \        V4      p\!        V4      p. p. pV EF  pVR
,          pVR,          pVR	,          pVR,          pVR,          pVR,          p\#        VVVV4      p\%        VV4      p\'        V4      pV\)        VR,          R7      ,           P+                  R4      p\        V4      p\        V4      p \        VV4      p!RVR\,        P                  VR4      RVR,          RVR\/        V4      RRVRV RVRV!RV/RVRVRVR,          RVRVR,          R R!R"VP1                  4       /p"VP                  RVR,          R#VR#,          R$VR$,          R%VP                  R%4      R&V"/4       TP                  RVR,          R#VR#,          R$VR$,          R%VP                  R%4      RVR,          RTRTR\,        P                  VR4      R\/        V4      RRVRV RVRV!/RTR'VP                  R(4      ;'       g    / P                  R)R4      /4       EK  	  R*^ R+^R,^R-^/o,VP3                  V,3R. lR/7       VP3                  V,3R0 lR/7       R*^ R+^ R,^ R-^ /p#V F/  pVR&,          R,          p$V#P                  V$^ 4      ^,           V#V$&   K1  	  R1R2R3R4VP1                  4       R5R6R7\5        V4      R8T#R9\6         U%u/ uF  p%V%VV%,          bK  	  up%R:VR;R</RV/p&V'       d   \	        R=4       \	        \        P8                  ! R>\5        V4      R8T#R:TR?VR@,           Uu. uFn  pRVR,          R#VR#,          RVR&,          R,          RAVR&,          R,          RBVR&,          R,          RVR&,          R,          RVR&,          R,          R,          /NKp  	  up/RC^RD7      4       V&# \        VRERR7      ;_uu_ 4       p	\        P:                  ! V&V	RC^RD7       RRR4       \<        P>                  PA                  \<        P>                  PC                  V4      RF4      p'R1R2RGR4VP1                  4       R5R6R7\5        V4      RHRIVRI,          RJVRJ,          RKVRK,          RLVRL,          RMVRM,          /R;RN/RV/p(\        V'RERR7      ;_uu_ 4       p	\        P:                  ! V(V	RC^RD7       RRR4       \<        P>                  PC                  \<        P>                  PE                  \F        4      4      PI                  RORP4      p)\<        PJ                  ! V)RQRR7       \<        P>                  PA                  V)RS4      p*RTVP1                  4       R)RUR>\5        V4      R*V#R*,          R+V#R+,          R,V#R,,          R-V#R-,          RVVRWV'R5R6R:V/p+\        V*RXRR7      ;_uu_ 4       p	V	PM                  \        P8                  ! V+RCRY7      RZ,           4       RRR4       \	        R[\5        V4       R\V#R*,           R]V#R+,           R^V#R,,           R_V#R-,           2
4       \	        R`V 24       \	        RaV' 24       V&#   + '       g   i     EL; iu upi u up%i u upi   + '       g   i     EL}; i  + '       g   i     EL; i  + '       g   i     L; i)bux   
全202店にNBAスコアを計算して書き出す（冪等）。
nba_factors.json を output_path の隣に出力。
Nz[NBA Engine] WARNING: r2   r3   storesstoreIdz[NBA Engine] storeId=u    が見つかりません。r   rb   nba_rawr   r   r   r   )daysr.   
actionType
actionNamer   r   priorityScoreev_breakdown	p_convertr   c_actionicerepRecommendeddeadlineDaysdeadlineDater   r   u@   推計（初期モデルv1.1・要キャリブレーション）generatedAtnamerf   rz   nba
vol_statusrq   rr   r   r   r   r   c                 f   < SP                  V R ,          R,          ^	4      V R ,          R,          ) 3# )r)  r   r  rU   xpriority_orders   &r%   r   run_nba_engine.<locals>.<lambda>  s0    qx
3Q7uXo&&
r'   )r   c                 J   < SP                  V R ,          ^	4      V R,          ) 3# )r   r  rU   r,  s   &r%   r  r/    s'    q}a0
r'   r)   r*   u&   名店DB Next Best Action レポートgenerated_atmodel_versionz1.1.0total_storessummary
parametersparam_warningsnoteu   係数は初期値・要キャリブレーション。P_convert/V_expectedは実績でアップデートすること（GR19）。uA   [NBA Engine --dry-run] ファイル書き込みをスキップ。totaltop5:N   Nr   r   Fr5   r1   znba_factors.jsonuF   NBA サブ因子レポート（フロント重みスライダー用）current_weightsr   r   r   r
   r   u   sub_factors は重み適用前の正規化スコア（0〜1）。フロントで重みを変えると s_strategic = 0.5 + raw*1.5 （raw = Σ weight×factor）で即再計算可能。scriptslogsTr/   znba_engine.jsonltssuccessr  factors_patha)r6   
z[NBA Engine] u   店処理完了。 P0=z P1=z P2=z P3=u   出力: u   因子: )'r   r;   rN   r_   rD   rA   rB   rE   rG   r   r   r   r   r   rY   r{   r~   r   r   r  r   r<   ACTION_NAMESr   	isoformatsortr|   r>   dumpsrC   r8   r9   joinr@   abspath__file__replacer?   write)-r  r  r    r  r  r  rK   r6  r1   rI   masterr  r   stores_to_processresultsev_listrb   r  r   s_valr   r   r   r   output_storesfactors_storesr  priority_scorer#  r  deadline_dater   v_expc_act	nba_blockp_countsprrL   outputr@  factors_objlog_dirlog_path
log_recordr.  s-   &&&&&&                                      @r%   run_nba_enginer_  $  s    } 	K A$Q'NA*1#./   
kG	,	,1 
-HF (.V1%%	2Bo2UQQV )/)::VWXI ! # GG"q)m,:5!D{U#oe&<<uDVacdHeerUw"5;
 	 # \F\F MN'
I,m,tW- &,RffMUK00H!IISST^_& '{A. +,**;;
+^#b'VeuE{ 3cGO4Mgh'\5??,)
	. 	uY'E&MU7^UYY79
 	 	uY'E&MU7^UYY7
+^+,**;;#b'VeuE	 ;599W-33882F#
 	a J AtQaq9N
   
   aq$43HuXj!||B*Q. 
 	=EOO-WC.xN;Nq1ad7N;n^
 	-F" QRdjjS'xn 'r* +A q|VQvY% 4gqx?Xah|4dAeHTN!1U8N#;M#J	 +	
 a) 	*  
k3	1	1Q		&!%: 
2 77<< <>PQL]EOO-WC/AiLAjMAiLAjMAjM  H
$ 	.'K* 
lC'	2	2a		+quQ? 
3 ggoobggooh78@@FSGKK$'ww||G%78Heoo)]#htndHTNhtndHTN{.
J 
hg	.	.!	

:E:TAB 
/ 

M*+ ,~d8D>"2
x~d8D>"2	4
 
H[M
"#	H\N
#$Mq 
-	,	, W~ <  
2	1	14 
3	2	2$ 
/	.sI   %^^5^^<A4^!^&#^://_^	&^7	:_	_	c            	         \         P                  P                  \         P                  P                  \         P                  P                  \        4      4      4      p \
        P                  ! R R7      pVP                  R\         P                  P                  V RR4      RR7       VP                  R\         P                  P                  V RR4      R	R7       VP                  R
\         P                  P                  V RR4      RR7       VP                  RRRR7       VP                  RRRR7       VP                  RRRR7       VP                  4       pRpVP                  '       d"   \        P                  ! VP                  R4      p\        VP                  VP                  VP                   VVP"                  VP$                  R7       R# )u-   名店DB Next Best Action エンジン v1.1.0)r,   z--masterdatazmeiten-master.jsonu   入力JSONパス)defaulthelpz--outputznba_output.jsonu   出力JSONパスz--paramsznba_params.jsonuC   パラメータJSONパス（無ければ既定値で自動生成）z--as-ofNu*   基準日 YYYY-MM-DD（省略時=今日）z	--dry-run
store_trueu<   ファイル書き込みなし・コンソール出力のみ)r   rc  z
--store-idu   単店デバッグ: MTN-XXXr.   )r  r  r    r  r  r  )r8   r9   r@   rH  rI  argparseArgumentParseradd_argumentrG  
parse_argsr  r   strptimer_  rL  rZ  paramsr  store_id)BASE_DIRparserargsr  s       r%   mainro    sf   wwrwwrwwx/HIJH$$1`aF

RWW\\(FL`-a/  1

RWW\\(FL]-^/  1

RWW\\(FL]-^b  d
	D7cd
L?}~
d9VWDEzzz!!$**j9KKKKKKr'   __main__)u   象徴u   老舗u   誌名u   言問団子u   朝顔u   300年u   明治u   大正u   元禄u	   約100年u   10周年u   入谷)NFN)__doc__rB   re  r8   sysr   r   r>   rC  r   rN   r_   r   r   r   r   r   r   r   r   r   r   r  r_  ro  __name__r   r'   r%   <module>rt     s6     	 
 ( 425 " 
(	"		"	(	+		)		 
3sE3s	3sE3s	3s!H42B?>J.ZL3$-nj)Fnj8 zF r'   