
     jj              	          d Z ddlZddlZddlZddlZddlZej        	                    dd           ddl
Zej        ZdddddZg dZd	d
dddZi dddddddddddddddddddddd d!dd"dd#dd$dd%d&i dddddd'dddd(dddddddddddd)d!dd"dd#dd$dd%d*i dddddd'dddd+dddddddddddd,d!dd"dd#dd$dd%d-i dddddd'dddd+dddddddddddd,d!dd"dd#dd$dd%d&dZd. Zd/ Zd0 Zd1 Zd2 Zd3d4d5ddd6d7d8d5d)dd6d9d)d d4dd6d9d:d4d dd6dZd;d<d=d>d?d@ZdA ZedBk    r e             dS dS )Cu   
每日TB信号扫描: 找四池中今天(tb日)满足突破条件且明天可买入的股票, 计算11特征组合强度
输出: 按强度排序的候选股票列表
    Nz/Users/xpresso/zt_app/codeg#@gfffff3@gfffff=@)maingemstarbj)	f1_t0_pctf2_t0_vol_ratiof3_ta_shrinkf4_ta_drawdown	f5_ta_gapf6_tb_strength	f7_tb_gapf8_chain_len	f9_tb_volf10_tb_ma5_slopef11_tb_ma_alignf12_crowd_poolf13_pool_ztf14_pool_avgretu	   沪深300u	   中证500u
   中证1000u
   中证2000hs300zz500zz1000zz2000vol_baseorma_n   
vol_shrink      ?
shrink_win   break_up   break_strength        
t0_vol_min
t0_vol_maxt0_open_max      ?t0_prev_limit	ta_dd_maxg333333?ta_low_floor	tb_t0_min	tb_t0_max
tb_vol_min
tb_vol_maxg      @g?   g?g      @   g?g      @c                 b    |                      d          rdS |                      d          rdS dS )N)6000r   )3068r   r   )
startswithcodes    +/Users/xpresso/zt_app/code/scan_daily_tb.py
board_typer<   %   s9    |$$ v|$$ u4    c                 :   | | d         |k    | d                              t                    t          |          k     z           }t          |          sdS t          d|                    d                                                                                    S )u   池日均信号数分母: 仅用 buy_date < bd 的历史行(2026-09-12)
    防「重跑自称重」漂移——旧式用全库(含当日行), 同一日重跑会得到不同 f12。poolbuy_dater   )astypestrlenmaxgroupbysizemean)bdfr?   bdhs       r;   crowd_denomrK   ,   s     	S[D S_%;%;C%@%@3r77%JKLAq66 ssAIIj))..005577888r=   c                    |                      d                              d          } t          |           }|dk     rdS | d                             t                    j        }| d                             t                    j        }| d                             t                    j        }| d         j        }t          t          |                   }	|d	         |d
         |d         }}}
t          |d                   t          |d                   t          |d                   }}}|	                    d|	                    dd                    }|	                    dd          }|	                    dd          }|	                    dd          }|	                    dd          }|	                    dd          }|	                    dd          }|	                    dd          }|	                    dd          }|	                    dd          }t          j        |                              d                                          j        }t          j        |                              d                                          j        }t          j        |                              d                                          j        }g }t          j        ||	dz
  k              d         D ]}|d z   |k    r||         }|dk    r|dk    r-|t!          d|dz
            |                                         n|d|                                         } |dk    r| dk    s	|| |z  k     r|dk    r| dk    r
|| |z  k    r||         }!|dk    r|!d!|z
  z  nd}"d}#d}$t#          |d!z   t%          ||z   d!z   |                    D ]}%d"}&|
d#v r||%         ||z  k     rd}&|
d$v rf|%|k    r-|t!          d|%|z
            |%                                         n|d|%                                         }'|'dk    r||%         |'|z  k     rd}&|&re||%         |!k     rY|"||%         |"k     r|dk    r,t&          |         dk    r||%         t&          |         |z  k     r|$||%         |$k     r
||%         }$|%}#|#t#          |#d!z   t%          ||z   d!z   |                    D ]}(||(         |!d!|z   z  k    rwd})|dk    r|dk    r||(         ||z  k     rd"})|)r|dk    r|dk    r||(         ||z  k    rd"})|)ru|dk    s|dk    ri|(|d!z   k    r||d!z   |(                                         n||(         }*|*dk    r1|dk    r||(         |*|z  k     rd"})|)r|dk    r||(         |*|z  k    rd"})nd"})|)s||(         |k    r|(d!z   |k     r||(d!z            nd}+|(dk    r-|t!          d|(dz
            |(                                         n|d|(                                         },|                    i d%|+d&|d't	          ||                   d(|dk    rn|t!          d|dz
            |                                         dk    r=t	          ||t!          d|dz
            |                                         z            nt          j        d)|dk    rt	          ||#         |z            nt          j        d*t	          ||#         |!z  d!z
            d+t	          |#|z
            d,t	          ||(         |!z  d!z
            d-t	          |(|z
            d.t	          |(d!z   |z
            d/|,dk    rt	          ||(         |,z            nt          j        d0|(d1k    r<||(d1z
           dk    r-t	          ||(         ||(d1z
           z
  ||(d1z
           z            nt          j        d2t	          ||(         ||(         cxk    r||(         k    rn nd!n%||(         ||(         cxk     r||(         k     rn nd3nd          d4t	          ||(                   d5||         d6||#                     n|S )7uF   找tb==target(今天)的信号链, 返回特征dict(含明天buy_date)
trade_dateTdrop   Npct_chg	hfq_closevolr   r   r$   r    r"   r   r'   zt_vol_filterr   r&   r%   r+   r(   r*   r,   r-   r.   r/   r0      
   r2   g?r      F)ztr   )maNr   r@   r:   r   r   r	   r
   r   r   r   r   r   r      r   tb_closet0_dateta_date)sort_valuesreset_indexrC   rA   floatvaluesLIMIT_UPr<   intgetpdSeriesrollingrG   npwhererD   rangeminopen_appendnan)-dr:   bptargetnpctcloserS   datesbtvbvsbsswbumnztvt0mintaddmax	t0openmaxt0prev
talowfloortbt0_mintbt0_maxtbmintbmaxma5ma10ma20rest0v0ma10zp0p0_floortata_min_closej	shrink_okmkokcbr@   m10s-                                                r;   find_tb_todayr   5   s]	   	l##//T/::AAA2vvt
I,

e
$
$
+CkN!!%((/E
E(//%
 
 
'ClO"E	*T""	#BJL!126F3GBBR%&&BzN(;(;SF__BB
&&rvvoq99
:
:CFF<%%Eff[#&&G}c**IVVOQ''F,,Jvvk3''Hvvk3''HFF<%%EFF<%%E
)E


"
"1
%
%
*
*
,
,
3C9U##B'',,..5D9U##B'',,..5D
Chsb4i'((+ I I6Q;;W7724((C27OOB&',,...CRC199zzR%%-//77qyyR53;..2Y)012W%%$rAvs27Q;2233 	 	AI\!!c!frBw&6&6 	]""45GGCAq2vq()..000RaRq55SVa"f__ $I U1X]]'E!Hx,?,?>>eBi!mma59zCY8Y8Y'58l+B+B#(8LB:rAvs27Q;2233 %	 %	AQx"B-''a<<BFFs1vX/E/EB (Q,,266c!frH}6L6LB #5199		12R!VR!VAX++---QBAvv 199Q"u*)<)<!&B '%!))Ae0C0C!&B" 8v%%/01uqyyuQU||dH:;r''#c!QVnnQ./44666s2A2w||~~CJJ  "H .4d #U3r7^^  *Y[_aYaYafijmnoqsvxqxjyjyz|j|f}  gC  gC  gE  gE  HI  gI  gI5c#ab//":L6M6R6R6T6T1T+U+U+U  OQ  OU  'rAvvc"gl(;(;(;26	 
 )%b	B0B*C*C  $U27^^  )%a20A*B*B  $U1r6]]  'a!ebj(9(9  $C!GGU3q6C<%8%8%8  +YZ^_Y_Y_dghilmhmdnqrdrdrE3q6CAJ3F#aRSe*2T,U,U,Uxzx~  *5s1vQ7Q7Q7Q7Q$q'7Q7Q7Q7Q7Q`cde`fimnoip`z`z`z`zswxysz`z`z`z`z`zY[Y[  BC  ,E  ,E  #E%(OO  6?b	  LUV[\^V_     I (J Jr=   c                 6    ddl }|                    | |          S )u0   members月份分期dict -> 当日成分股集合r   N)ideal_engineactive_members)membersdate_stries      r;   	ie_activer      s$    Wh///r=   c                    | | d         |d         k                                  d                              d          }t          |          dk    rdS | | d         |d         k             }t          |          dk    rdS t          |j        d         d                   dt
          j        z   z  }t          |j        d         d	                   dt
          j        z   z  }|dk    s|dk    rdS |}d}|                    d
|d         dk    rdn|d         dnd          }	|d         }
|                                D ]\  }}|d         }t          |d                   }|dz  }d}|	dk    rS||z  dz
  |d         k    rd}ngt          |d                   |d|
|
n|d         z
  z  k    rd}n:||d         k    rd}n*|	dk    rct          |d                   |d|d         z
  z  k    rd}nt          |d                   |d|
|
n|d         z
  z  k    rd}n||d         k    rd}n|	dk    rpt          |d                   |d|d         z
  z  k    rd}n|
"t          |d                   |d|
z
  z  k    rd}no||z  dz
  |d         k    rd}nZ||d         k    rd}nKt          |d                   |d|d         z
  z  k    rd}n#||z  dz
  |d         k    rd}n||d         k    rd}t          ||          }|rR||z  dz
  t
          j
        t
          j        z   dt
          j        z  z   z
  }t          |d                   }||||||dc S dS )u   模拟持仓t(未完成信号)在c参数下的卖出: 与ideal_engine逐行一致
    d: 个股dailies; t: {code,buy_date}; c: SELL_COMBO参数(含mode)
    返回None=未触发(继续持仓), 否则{sell_date,sell_price,reason,hold_days,ret_net}rM   r@   TrN   r   Nhfq_openrW   raw_openmodeddGz?AstopCmergerR   profithfq_lowholdtimeoutBtrailr   	raw_close)	sell_date
sell_pricereason	hold_daysret_net	buy_price)r_   r`   rC   ra   ilocgSLIPre   iterrowsrD   COST_BUY	COST_SELL)rp   tcsubrows0buy_pxfill_buy
high_sincehold_nr   r   _rdatecursellnet_retfills                     r;   simulate_sellr      s    AlOa
m+
,
8
8
F
F
R
RX\
R
]
]C
3xx1}}tao:./E
5zzQt5:a=,--QV<FUZ]:.//1qv:>H{{h!mmtJF55$4QvY=RccX_aaDV9D 'K 'K1AkN##!3;;V|a1X;..q|$$!t?OttUVW[U\2](^^^1V9$$ S[[Qy\""jA(O&DDDq|$$!t?OttUVW[U\2](^^^1V9$$ S[[Qy\""jA$K&@@@!eAiL&9&9Vq4x=P&P&Pv!Qx[001V9$$ Qy\""jA$K&@@@v!Qx[001V9$$ S))
 	KV|a'AJ,Dq16z,QRG;((D!%TTX^kr  BJ  K  K  K  K  K	K 4r=   r   g      ?r   )r   r   r   r   r   r   g?r   g333333?u   止盈u   回撤u   止损u   超时u   跟踪止盈)r   r   r   r   r   c                  #  LMNOPQRS dd l } t          | j                  dk    r| j        d         nd }t          j        t          t           d                    }dd l}t           dM|                    t          Md          	                                          
                                }|                    dd          }t           d}dLt          j                            |          r!	 t          j        t          |                    }n(# t          $ r}t!          d	| d
| d          d }~ww xY wt#          |                    dd                    }	|	                                |k    rt!          d| d|	 d| dM d	          |                    d          r4|d         |k    r(t!          d|                    d           d|           dLt'          d| d|d d          d|                    d                      nIt          j                            d          dk    rt!          d| d          t'          d| d            LMfd!}
|d"         R|d#         QRfd$t*          D             }d% RD             }|s|rCt!          d&t           d't          R           d(| d)| d*t          t*                     d+          Qfd,OQfd-}t-          j        t           d.          }t1          t3          |d/         |d0                             }t1          t3          |d/         |d1                             }i }g }t4                                          D ]t\  P}P|vrt9          j        P          |P<   |P         \  }}t=           t?                      j         d2 |!                                D                        }||d3         }ut           d4}t-          j"        |          }||d5         #                                         }t          |          rg }|$                                D ]\  }}t#          |d6                   P|P         d                             |d7                   }|DtK          ||d7         t#          |d8                   d9tL          P                   }||'                    |P|f           |rt'          d:t          |           d;           |D ]n\  }P}|                    |d7         d<          }|                    |d7         d<          } t'          d=tP          P          d>| d?|d7         d d@          dA|  dB|dC         dDdE|dF         dDdG|dH          dItR          |dJ                   dK|dL         dMz  dNdO|dP                     ||d7         |d7         k    |d8         *                    t"                    t#          |d8                   k    z           j+        }!t          |!          rP|dL         tY          t-          j-        |dP                             |dF         |dJ         |dH         g|j.        |!g dQf<   p|/                    |dR           t'          dS            |
|dTt          |           dU           t'          dVt          |           dW           n t'          dXt          |           dY           i }"i }#t4                                          D ]\  P}|P         \  }}ta          ||          |"P<   dx}$}%dZ}&|                                D ]u\  }'}(|(|(d[         |k             })t          |)          dk    r+tc          |)j2        d         d\                   }*tg          j4        |*          r`|%dz  }%|&|*z  }&|*d]k    r|$dz  }$v|$d^z  |%r|&|%z  ntf          j5        f|#P<   |                                D ]\  }+}|+|"P         vrt          |          d_k     r$t#          |d[         j2        d3                   |k     rItm          ||+||          },|,s^|#P         \  }-}.|,D ]X}/|/d8         d|/d`<   |'                    P|+|                    |+d<          |                    |+d<          da|/|-|.db           YŐ|st'          dc| dd           d S i }0|D ]*S|0                    Sd6         d          dz   |0Sd6         <   +|D ]hS|0Sd6                  to          |Sd6         Sd8                   z  Sde<   tq          ORSfdfRD                       }1|1Sdg<    |Sd6         |1          Sdh<   it'          di| dj           t'          dkt          |           dl           dmD ]Pt=          Pfdn|D             do p          }&|&s#t'          dqtP          P          d>t          |&           dr           |&D ]SSdh         dsk    rdtnSdh         duk    rdvndw}2S                    d`          rdxn
dySd8          }3t'          |2 dKSd0          d?Sd7         d d@          dASdz          d{Sdh         d|d}|3 d~Sd         dMz  dNdSd         dDdSd         d|d           d }4	 dd l}5dd l9}6g }7t=          |d p          D ]ISSd7         S                    d0          S                    dz          Sd6         tP          Sd6                  |S                    d8          tu          S                    d`                    tw          tc          Sdh                   d          tw          tc          Sdg                   d          d
}8t*          D ]d}9S                    |9          }:|:)ty          |:tb                    rtg          j4        |:          rd ntw          tc          |:          d@          |8|9<   e|7'                    |8           Kd||6j9        =                                >                    d          ||t          |7          tq          d |7D                       t          d |7D                       |7d	};t          t           dd          5 }<|5?                    |;|<dd           d d d            n# 1 swxY w Y   t'          dt           d|;d          d|;d          d|;d          d	           |;d         }4n># t          $ r1}t'          dt          |          jA         dK|            Y d }~nd }~ww xY wt           d4}t-          j"        |d8t"          i          }ddlBmC}= ddlDmE}> dmD ]P|P         \  }}t4          P         }t9          jF        ||          }?|?                                D ]Z\  }+}@|+|"P         vr|@D ]E\  }A}B|A|k    r|+d |D             v r||+         G                    d[          H                    d          } |=||+||A          \  }C}D}E|C` |>||C|D|Ed           N|#                    Ptf          j5        tf          j5        f          \  }-}.|-Nd<   |.Nd<   |0                    Pd          to          |P|A          z  Nde<   tq          NOPRfdRD                       }1|'                    P|+|                    |+d<          |                    |+d<           |P|1          |1dNd8|Ai           G\g }F|D ]SS                    d`          rSfdt*          D             }8|8I                    Sd6         Sd7         Sd8         tf          j5        dtf          j5        Sdg         Sdh         d           |F'                    |8           |Frt-          jJ        |t-          jK        |F          gd          }|L                    d7d8gd          }|/                    |dR            |
|dt          |           dU           t'          dt          |           d           	 dd l}dd l}Gt           d}Ht          j                            |H          rG|                    t          |Hd          	                                          
                                nd}Itq          d t          t           d4          D                       dz
  }Jt          j                            t           d          r=|G                    t          t           d                                        d          nd }Kt'          d|d d          d|Id d          d|Kpdd d          d| d|J d|4 dt          |           d||Ik                d S # t          $ r2}t'          dt          |          jA         dK|            Y d }~d S d }~ww xY w)Nr   rW   z/strength_model.jsonrbmodel_versionunversionedz/model_manifest.jsonFu"   ❌ 模型 manifest 无法解析: z (u   ) -> 拒绝扫描model_sha256 uL   ❌ 模型 sha256 与 manifest 不符, 拒绝扫描(fail-fast):
   manifest(z): u&   
   实际 model 文件:              uE   
   处置: 用研究侧下发的同一份 model **逐字节**覆盖 u:   , 或按流程更新 manifest; 不得就地重算模型。uA   ❌ model_version 与 manifest 不符, 拒绝扫描:
   manifest=u
    / 文件=Tu'   🔒 模型冻结校验通过: version=z sha256=   u   … effective_from=effective_fromZT_MODEL_MANIFEST_REQUIRED1u   ❌ 缺模型 manifest: u.   (ZT_MODEL_MANIFEST_REQUIRED=1) -> 拒绝扫描u   ⚠️ 模型未冻结: 缺 uL    —— 过渡期沿用 rebuild 路径(0919 落库后应由 manifest 接管)c                 j    rt          d| d           dS ddl}|                    |            dS )uc   裁定 §二.2: manifest 在则**不重建**(只读消费); 否则过渡期沿用唯一构建器。u(   (模型已冻结: 跳过 rebuild —— )Nr   )printbuild_strength_modelbuild_model)baseline_pathr   _bsmMODEL_FROZEN_model_paths      r;   _refresh_modelzmain.<locals>._refresh_model  sR     	FVFFFGGGF++++44444r=   weightspoolsc                     g | ]}|v|	S  r   ).0fcws     r;   
<listcomp>zmain.<locals>.<listcomp>  s    ///B2Q;;R;;;r=   c                 $    g | ]}|t           v|S r   )FCOLS)r   r   s     r;   r   zmain.<locals>.<listcomp>  s    000R%br=   u4   ❌ 模型/特征不一致, 拒绝扫描:
   模型 u   /strength_model.json 权重键 u
    个, 缺 u   , 多 z
   scan FCOLS u    个 —— 两者必须完全一致。
   处置: 用 build_strength_model.build_model() 按记录版权重重算分池表(只写模型、绝不写 baseline), 或按裁定改 FCOLS。c                     |          d         |         }|+|)t          |t                    rt          j        |          rdS t          t          j        ||          dz            S )Npercentilesr)   g      Y@)
isinstancera   ri   isnansearchsorted)r?   r   vqspools_ms       r;   rt   zmain.<locals>.pct"  s]    T]=)"-:z!U';';3R_R++e3444r=   c                     |          d         }t          t          j        ||          t          |          z  dz            S )u,   raw_score -> 该池基准池百分位(0-100)
raw_scoresd   )ra   ri   r   rC   )r?   rawrsr   s      r;   std_strengthzmain.<locals>.std_strength'  s;    T]<(R_R--B7#=>>>r=   z/stock_basic.pklts_codenameindustryc                 8    g | ]}t          |d                    S )rM   )set)r   rp   s     r;   r   zmain.<locals>.<listcomp>4  s$    $T$T$TaS<%9%9$T$T$Tr=   r[   z/strength_baseline.csvretr?   r:   r@   )r:   r@   u   📤 卖出信号(当日触发 u   笔, 交易完成):?u   【u   】(   u   )·u    买r   z.2fu   →卖r   u    持r   u   天 r    r   r   z+.1fu   % 卖出于r   )r   r   r   r   r   )indexu.   (已按卖出日完成交易, 纳入基准池)u   卖出完成后纳入基准池 u   笔u   (分池基准已更新: u   笔, 含完成的交易)u   📥 持仓检查: u#   笔持仓中, 今日无触发卖出r%   rM   rQ   g#@g      4@rP   buy_pending)r?   r:   r   ind)r   r   u   📭 四池今日(u2   )无满足TB突破条件的股票, 明日无信号r   c           
   3      K   | ]>}|          d          |                     |t          j                            z  V  ?dS )r?   Nre   ri   ro   )r   r   rt   r   xs     r;   	<genexpr>zmain.<locals>.<genexpr>  sN      LLB!B%##aiQUU2rv->->???LLLLLLr=   	raw_scorestrengthu(   📊 A股四池涨停突破信号扫描(r   u   共uA   只满足TB条件, 明日开盘可买入, 按强度排序(0-100):r   c                 ,    g | ]}|d          k    |S )r?   r   )r   r
  r?   s     r;   r   zmain.<locals>.<listcomp>  s'    ===11V9+<+<Q+<+<+<r=   c                     | d          S )Nr  r   )r
  s    r;   <lambda>zmain.<locals>.<lambda>  s    aPZm^ r=   )keyu   
【u   只:F   u   🟢强(   u   🟡中u   ⚪弱u   明日开盘买入(待确认)u	   买入日r  u    强度z.0fz | u    | tb涨r   u   % 缩量r	   u    链长r   u   天c                 $    | d          | d         fS )Nr  r:   r   )r   s    r;   r  zmain.<locals>.<lambda>  s    :&	/J r=         )
r:   r   r  r?   pool_cntbr@   r  r  r  scan_candidates_v1seconds)timespecc              3   2   K   | ]}|d          dk    dV  dS )r  U   rW   Nr   r   r   s     r;   r  zmain.<locals>.<genexpr>  s1      ,T,T1*QS@S@SQ@S@S@S@S,T,Tr=   c                     h | ]
}|d          S r9   r   r  s     r;   	<setcomp>zmain.<locals>.<setcomp>  s    %>%>%>Aai%>%>%>r=   )	schemarr   generated_atr   r   rs   n_ge85n_codes_unique
candidatesz/scan_today_candidates.jsonr   )ensure_asciiindentu   🗂 今日候选已固化: u   /scan_today_candidates.json（rs   u    条 / r$  u    唯一代码 / ≥85 共 r#  u   ）u<   ⚠️ 今日候选固化失败(不影响扫描/基准池): )dtype)chain_for_buy)featsc                     h | ]
}|d          S r9   r   )r   r
  s     r;   r   zmain.<locals>.<setcomp>  s    777!AfI777r=   rN   r   r   c           
   3      K   | ]8}|          |                     |t          j                            z  V  9d S )Nr	  )r   r   frt   r?   r   s     r;   r  zmain.<locals>.<genexpr>  sJ      OOr!B%##dBb"&0A0A"B"BBOOOOOOr=   )r?   r:   r   r  r  r  c                 R    i | ]#}|                     |t          j                  $S r   r	  )r   r   r
  s     r;   
<dictcomp>zmain.<locals>.<dictcomp>  s+    555r155RV$$555r=   signal)r?   r:   r@   r   r   r   r  r  )ignore_indexlast)subsetkeepu   滚动更新后 u   
(分池基准已滚动更新: u   笔)MISSINGc              3      K   | ]}d V  dS )rW   Nr   )r   r   s     r;   r  zmain.<locals>.<genexpr>  s"      FF1QFFFFFFr=   u   🧾 冻结态审计: load=z disk=z
 manifest=z	 version=z
 baseline=u   行 候选(固化JSON)=u    补记后清单=u   只 | model_unchanged=u9   ⚠️ 冻结态审计行失败(不影响扫描/落库): )MsysrC   argvjsonloadopenBASEhashlibsha256read	hexdigestre   ospathexists	Exception
SystemExitrB   lowerr   environr   rf   read_pickledictzipCOMBOitemsr   	load_poolsortedr   unionrb   read_csvisnar   r   
SELL_COMBOrn   PNSELL_CNrA   r  rd   
to_numericlocto_csvr   ra   r   ri   r   ro   r   rK   sumdatetimeboolroundr   now	isoformatdumptype__name__plot_ideal_top10r)  r   r*  	build_sigr_   r`   updateconcat	DataFramedrop_duplicates)T_sysrr   model_hashlibMODEL_SHA256MODEL_VERSION_manifest_path_mf_e_wantr   _miss_extrar   sbname_mapind_mapcacheall_sigrq   r   dailiesrv   baselinerH   open_pos	completedr   r   rp   r   r   r  idxactive_setspool_day_statpzpcpscode2d2rows2ppr:   hitsp_ztp_avgrJ   sig_by_poolr   tagwhen_cand_n_json_dtcandrowr   r   outfhr)  r*  sigrz   rI   t0dt0itaitbinew_rows_json2_mp_disk_brows_mfkr   r   r-  rt   r?   r   r   r
  sT                                                                               @@@@@@@@r;   r   r      s    ^^a//TYq\\TFIdd88899::E ///K??4T#:#:#?#?#A#ABBLLNNLIIo}==M
 222NL	w~~n%% K	k)D0011CC 	k 	k 	ki.iiTViiijjj	kCGGNB//00;;==L((_-_ _27_ _8D_ _ Xc_ _ _` ` `
 77?## 	TO(<(M(MS"ww77S SCPS ST T T  < < <|\_]_\_O` < < #(8 9 9< < 	= 	= 	= 	=	4	5	5	<	<rNrrrsss  J^  J  J  J  	K  	K  	K5 5 5 5 5 5 	iAGnG 0///%///E001000F a a`` `>A!ff` `PU` `]c` ` ZZ` ` `a a 	a
5 5 5 5 5
? ? ? ? ? 
4111	2	2BC9r&z2233H3r)}bn5566GEGKKMM  bu+d++E$K ;{suu{$T$T7>>CSCS$T$T$TUVV>2YF...H
+h

C3u:??$$%H
8}} \	%%'' 	1 	1DAqqy>>DdA""1V9--AyAfI3q}CUCU#V#VXbcgXhiiC  !T3000 	\WC	NNWWWXXX ) 	B 	B4||AfIs33kk!F)S11  hBtH  h  h  h  h&	"1"  h  h#  h  h3{K[  h  h  hgjkwgx  h  h  h  CF  GR  CS  h  h  Y`  ad  em  an  Yo  h  h  ru  v  r@  AD  rD  h  h  h  VY  Ze  Vf  h  h  i  i  i3v;!F)3J8N8Ns8S8SWZ[\]g[hWiWi8ijkqs88 B IBM#k:J,K,K(L(LcR^N_ademanpst  qA_BCGC!Z!Z!ZZ[JJxuJ---CDDDN8%Ts3xx%T%T%TUUUOSXXOOOPPPPZHZZZ[[[KMKKMM !U !Ub ;%gv66DR  
	 
	IE2r,'612E5zzQuz!}Y/00Bx|| !GB"HBSyya!DyR*C"r''RVDd}} 	U 	UGD!;t,,,1vv{{1\?'+,,v55 D"f55D '-KD% U UZ=('+Am$dHLLQUWZD[D[dkdodoptvydzdz  T  T"# T48U T  T  T U U U UU	U   ]6]]]^^^K C C!,6A!>!>!BAfI 5 5)!F)4{3&	STU_S`7a7aa
LLLLLL!LLLLL+$QvY44*	
>V
>
>
>???	
_G
_
_
_```6 N N=======C[C[\\\ 	0bh003r77000111 	N 	NA }22))a
mWYFYFY_gC67eeM6J6Jk22Pk\]^h\iPkPkDS  M  M1V9  M  Mqy!}  M  M5  M  M!J-  M  M  M`d  M  Mno  qA  oB  CF  oF  M  M  M  UV  We  Uf  M  M  M  st  uC  sD  M  M  M  M  N  N  N  N	N Gg--------%J%JKKK 	 	AV9aeeFmmAEE%LLZ[\bZc 6m6 uuZ00aeeMFZFZA[A[$U1Z=%9%91==ERWXYZeXfRgRgijLkLkm mC  n nEE"II"#)
1e0D0D)RS)$$[`afghaiaikl[m[mBKK-QTQ]QaQaQcQcQmQm  xAQm  RB  RB -|II,T,T,T,T,T)T)T!$%>%>%>%>%>!?!?tU U T666<< 	>JJsBU1J===	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	>  fT  f  fQTUXQY  f  fbefvbw  f  f  TW  X`  Ta  f  f  f  	g  	g  	gc( g g geTRTXXM^eeaceeffffffffg ...H
+hz3&7
8
8
8C /.....******6 m m ;4[k'2&&		 	m 	mHD";t,,, m m	S<<77w77777DM--l;;GGTGRR -ar2 > >S#;E!S#sD11+//rvrv6FGGe#'- ',#$&1oodA&>&>SRVXZA[A[&["#OOOOOOOQOOOOOdHLLQUWZD[D[dkdodoptvydzdz,8Ls,C,CRU l  lYZ l\fhj l  l m m m mm	m( H  55 	5555u555

AfIqya
m\^\b&RV!K.fghrfsu u 	v 	v 	v Aibl8445DIII!!&*)=F!KK

85
)))x!ACHH!A!A!ABBB?S???@@@
	d22222222+++GIw~~VYGZGZiS$ 4 4 6 677AACCC`iFF%D%D%D E EFFFFFJWYW^WeWeim  gD  gD  gD  XE  XE  Ov{{44 = = =>>??CCNSSS  KO gL",= g gU3B3Z g g\`\mdmorpror[s g g&g g28g gQXg gknovkwkwg g P\  `e  Peg g 	h 	h 	h 	h 	h d d db$r((J[bb^`bbcccccccccdsv   5!D 
D<!D77D<"G1t  r9-t  9r==t   r=>t   
t;
't66t;AE#AF) F)
AG%F3'AG G AG%__main__)__doc__pandasrf   numpyri   r9  r7  rA  rB  insertgrid_orr   r<  rc   r   rS  rK  r<   rK   r   r   r   rR  rT  r   r`  r   r=   r;   <module>r     s                        / 0 0 0    vd$??	= 	= 	= [LT`aaXj$ X X< XlB XPZ\^ X`pru XCX!-sX4A3XHWYZX3X .X 3X !,SX 3?X FRSVXXj$ X X< XlB XPZ\^ X`pru XCX!-sX4A3XHWYZX3X .X 3X !,SX 3?X FRSVXYz4 Y YL# Y|R YQ[]_ Yaqsv YSY".Y5BCYIXZ[YCY!/Y CY "-cY 4@Y GSTWYYz4 Y YL# Y|R YQ[]_ Yaqsv YSY".Y5BCYIXZ[YCY!/Y CY "-cY 4@Y GSTWY	 	&  9 9 9e e eN0 0 0
: : :| T4QSTTTtRPPd$bQQd$bQQ	 
 XxH_m
n
nCd Cd CdJ zDFFFFF r=   