
    dqi?,                       U d Z ddlmZ ddlZddlmZmZ ddlmZ ddlZ	ddl
mZmZ  ee                                          j        j        Z ee                                          j        dz  Zedz  d	z  d
z  Zedz  dz  dz  dz  Zedz  dz  dz  dz  ZdddddZde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'd(d%dd&d)d*ddd+Zd,d-d.d/d0d.d1d2d.d3Zej        j        d4ej        j        d5ej        j        d6iZdXd9ZdXd:ZdXd;Z dYd?Z!dZdBZ"d[dEZ#d\dHZ$d]dLZ%d^dOZ&	 	 	 d_d`dTZ'dadVZ(e)dWk    r e(             dS dS )bzAGenerate JSON data for the sell-side SPX + complacency dashboard.    )annotationsN)datetimetimezone)Path)Positiondaily_position_snapshotszcomplacency_data.jsondatacachezSPX.parquetoutputspxsellzcomplacency_score.csvztrade_actions.csv)Nu   日线)zW-FRIu   周线)Mu   月线)Yu   年线)dailyweeklymonthlyyearlyz!dict[str, tuple[str | None, str]]PERIODSwarnu   预z#facc15   )laneshortcolorpriorityu   废z#9ca3af50z#fb923cu   清z#ef4444   u   重z#f97316   buyu   买z#22c55eu   回z#38bdf8)u   🟡 预警u   ⚪ 预警作废u   🟠 清仓50%u   🔴 清仓u   🔴 清仓100%u   🟠 清仓重置u   🟢 买入u   🔵 回场aboveBarcircle)positionshapeinBarsquarebelowBararrowUpr   r   r   g        g      I@      Y@returnpd.DataFramec                     t          j        t                    } t          j        | d                   | d<   |                     d                              d          } | S NdateTdrop)pdread_parquetSPX_PATHto_datetimesort_valuesreset_index)r   s    T/home/raptorx-1/project/yardeni/sentiment_indicator/web/generate_complacency_data.py	_load_spxr7   /   sO    
/(
#
#C.V--CK
//&
!
!
-
-4
-
8
8CJ    c                     t          j        t                    } t          j        | d                   | d<   |                     d                              d          } | S r,   )r0   read_csv
SCORE_PATHr3   r4   r5   )scores    r6   _load_scorer=   6   sQ    K
##EN5=11E&Mf%%11t1<<ELr8   c                    t          j        t                    } | | d                                         | d                                         z                                           } t          t          |                     | d<   t          j        | d                   | d<   |                     ddg          	                    d          } | S )Nr-   u   动作_orderTr.   )
r0   r:   ACTIONS_PATHnotnacopyrangelenr3   r4   r5   )actionss    r6   _load_actionsrF   =   s    k,''Ggfo++--0A0G0G0I0IIJOOQQGc'll++GHnWV_55GFO!!68"455AAtALLGNr8   series	pd.Seriesfloat | pd.NAc                    |                                  }|j        rt          j        S t	          |j        d                   S )N)dropnaemptyr0   NAfloatiloc)rG   nonnulls     r6   _last_validrR   F   s5    mmooG} ub!"""r8   framedict[str, object]c                   g }g }g }|                      dd           D ]\  }}}}}}	}
t          t          j        |                                                    }t          j        |                              d          }|                    ||t          t          |          d          t          t          |          d          t          t          |          d          t          t          |          d          d           ||d}t          j	        |	          r t          t          |	          d          |d<   |                    |           ||d}t          j	        |
          r t          t          |
          d          |d<   |                    |           | 
                    d	g
          }|||t          j        | d         j        d                                       d          t          j        | d         j        d                                       d          t          |          t          |d	         	                                                                          ddS )NF)indexname%Y-%m-%dr   )timer-   openhighlowclose)rY   r-   valuer      自满得分subsetr-   r   rK   )
start_dateend_datenum_price_barsnum_score_points)ohlccomplacencyr!   meta)
itertuplesintr0   	Timestamp	timestampstrftimeappendroundrO   rA   rL   rP   rD   sum)rS   rf   rg   r!   r-   open_r[   r\   r]   score_valueposition_valuetsdate_strpointposition_pointscore_nonnulls                   r6   _series_from_framery   M   sN   DKHFKFVFV]bimFVFnFn ( (BeT3{Nd##--//00<%%..z::%,,**%++q))sQ''5<<++
 
 	 	 	 -/#A#A8K   	:"5#5#5q99E'N5!!!57,J,J8N## 	F&+E.,A,A1&E&EN7#''''LL(8L99M",uV}'9!'<==FFzRRU6]%7%;<<EEjQQ!$ii #M.$A$G$G$I$I$M$M$O$O P P	
 
	
 
 
r8   freq
str | Nonec           
     F   ||                                  S |                                  }|d         j                            |          |d<   |                    dd                              ddddd	d
t
          fdt
          f                              d          }|S )Nr-   bucketTsort)r-   last)rZ   first)r[   max)r\   min)r]   r   r_   r!   )r-   rZ   r[   r\   r]   r_   r!   r.   )rB   dt	to_periodgroupbyaggrR   r5   )rS   rz   tmp
aggregateds       r6   _aggregate_periodr   u   s    |zz||
**,,CKN,,T22CMH4((	!" #(+6 +. 
 

 

 
$		  r8   alignedrE   c                d   t          |          }|j        rt          j        d| j                  S |                    |d                             t                              }| dg                             |dd          }|d         	                                
                    d          S )Nr(   rV   r!   )r!   r-   left)onhow)r   rM   r0   SeriesrV   assignmapPOSITION_MAPmergeffillfillna)r   rE   	snapshotsmergeds       r6   _build_position_seriesr      s     )11I 5ygm4444  )J*?*C*CL*Q*Q RRIfX$$Y6v$FFF*##%%,,U333r8   rt   pd.Timestampstrc                    t          j        |           }||                    d          S t          |                    |                    S )NrX   )r0   rk   rm   r   r   )rt   rz   r   s      r6   _bucket_keyr      sB    	b		B|{{:&&&r||D!!"""r8   period_frame7tuple[list[dict[str, object]], list[dict[str, object]]]c           
        | j         s|j         rg g fS |dg                                         }|d                             fd          |d<   d |                    d          D             }|                                 }|d                             fd          |d<   ||d                             |                                                   }|j         rg g fS g }g }|                    dd	          D ]\  }}	||         \  }
}g }|	                    d          D ]\}t          |j                  }t          j	        |j
                                      d
          }|                    | d|            ]|                    |
|d                    |          d           dD ]?}g }|	                    d          D ]S}t                              t          |j                            }|r#|d         |k    r|                    ||f           T|sr|                    d d           g }|D ]3\  }}t          |d                   }||vr|                    |           4d                    |d d                   }t#          |          dk    r|dz  }|d         d         }t$          |         }|                    |
|d         |d         |d         |d           A||fS )Nr-   c                $    t          |           S Nr   drz   s    r6   <lambda>z'_build_action_payload.<locals>.<lambda>   s    At@T@T r8   r}   c                    i | ]l}|j         t          t          j        |j                                                            t          j        |j                                      d           fmS )rX   )r}   rj   r0   rk   r-   rl   rm   ).0rows     r6   
<dictcomp>z)_build_action_payload.<locals>.<dictcomp>   sq       
 	 	
SX&&002233L""++J77
  r8   Fr   c                $    t          |           S r   r   r   s    r6   r   z'_build_action_payload.<locals>.<lambda>   s    At0D0D r8   Tr~   rX    z | )rY   r-   textr'   r   c                    | d         d         S )Nr   r    )items    r6   r   z'_build_action_payload.<locals>.<lambda>   s    DGJ,? r8   )keyreverser   /r   +r   r   r!   r"   r   )rY   r!   r"   r   r   )rM   rB   applyri   isinr   r      动作r0   rk   r-   rm   rn   joinACTION_CONFIGgetr   rD   
LANE_STYLE)rE   r   rz   period_metabucket_to_targetr   markers	summariesr}   grptarget_timetarget_datedetail_partsr   actionaction_dater   	lane_rowscfgshort_tokens_tokenr   top_cfgstyles     `                      r6   _build_action_payloadr      su   
 } * 2vx(--//K'/556T6T6T6TUUK 
 )))66   ,,..CK%%&D&D&D&DEECM
c(m  !122
3
8
8
:
:C
y 2v')G)+I{{8${77 ) )#3F#; [>>>.. 	; 	;C__F,sx0099*EEK; 9 9 9 9::::JJ|,,
 
 	 	 	 , 	 	DI~~E~22 1 1#''CJ88 13v;$..$$c3Z000 NN??NNNNL# / /3CL)),, ''...88L!,--D<  1$$l1oGt$ENN#!*-w )     +	: Ir8   spx_dfpd.DataFrame | Nonescore_df
actions_dfc                   | t                      n|                                 }|t                      n|                                }|t                      n|                                }t	          j        |d                   |d<   t	          j        |d                   |d<   d|j        vrt          t          |                    |d<   t	          j        |d                   |d<   |	                    ddg          
                    d          }|                    |ddg         ddd          }|g d	                                         }t          ||          |d
<   |                    dg          }|j        d         }	i }
t                                          D ]`\  }\  }}t#          ||          }t%          |          }t'          |||          \  }}||d<   ||d<   ||d         d<   ||d         d<   ||
|<   a|
ddddt	          j        |d         j        d                                       d          t	          j        |d         j        d                                       d          t	          j        |d         j        d                                       d          t	          j        |	d                                       d          t	          j        |	d                                       d          t-          t/          |	d                   d          t-          t/          |	d                   d          t-          t/          |d
         j        d                   d          t1          |d                                                                                   ddt7          j        t:          j                                      d          ddS ) Nr-   r?   Tr.   r_   r   
one_to_one)r   r   validate)r-   rZ   r[   r\   r]   r_   r!   r`   rK   r   action_summariesrh   labelr   g      @g       @)elevatedextremez!SPX - Complacency Score Dashboardr   rX   r   r]   r   r   period_last_validz%Y-%m-%d %H:%M UTC)titlespx_start_datespx_end_datescore_start_datescore_end_datelatest_datelatest_scorelatest_closelatest_positionre   default_periodscore_period_rule
updated_at)periods
thresholdsrh   )r7   rB   r=   rF   r0   r3   columnsrC   rD   r4   r5   r   r   rL   rP   r   itemsr   ry   r   rk   rm   ro   rO   rj   rA   rp   r   nowr   utc)r   r   r   r   r<   rE   r   r   rx   latestr   r   rz   r   r   period_payloadr   r   s                     r6   build_payloadr      s   
  )+++V[[]]C%-KMMM8==??E!+!3mooo9J9JG.V--CKN5=11E&Mw&&!#g,,//nWV_55GFO!!68"455AAtALLGYYv~&'	   F MMMNSSUUG0'BBGJMM.)9M::M#F!#G%mmoo & &]dE($77+L9927L$OO$+y!-6)**/vw'(+vu%% #&3778 l6&>+>q+ABBKKJWWL)<R)@AAJJ:VV "]6-B-G-J K K T TU_ ` ` l6&>::CCJOO<v77@@LL!%~(>"?"?CC!%w"8"8!<<$U7:+>+CB+G%H%H!LL #M.$A$G$G$I$I$M$M$O$O P P%!4",x|44==>RSS
 
  r8   Nonec                    t                      } t                              t          j        | d                     | d         }| d         d         d         }t          d|d          d|d	          d
|d          d|d         d           d S )NF)ensure_asciirh   r   r   u!   ✅ complacency_data.json saved: rd   z daily price bars, re   z score points, latest=r   z score=r   z.2f)r   OUTPUT
write_textjsondumpsprint)payloadrh   
daily_metas      r6   mainr   #  s    ooG
dju===>>>6?D#G,V4J		I&'	I 	I"#	I 	I }%	I 	I /3>.BH	I 	I    r8   __main__)r)   r*   )rG   rH   r)   rI   )rS   r*   r)   rT   )rS   r*   rz   r{   r)   r*   )r   r*   rE   r*   r)   rH   )rt   r   rz   r{   r)   r   )rE   r*   r   r*   rz   r{   r)   r   )NNN)r   r   r   r   r   r   r)   rT   )r)   r   )*__doc__
__future__r   r   r   r   pathlibr   pandasr0   !sentiment_indicator.core.positionr   r   __file__resolveparentROOTr   r2   r;   r@   r   __annotations__r   r   EMPTYr^   HALFFULLr   r7   r=   rF   rR   ry   r   r   r   r   r   r   __name__r   r8   r6   <module>r
     s&   G G G " " " " " "  ' ' ' ' ' ' ' '           P P P P P P P P tH~~&-	h			!	!	(+B	B&=7"]2H_u$v-0GG
h&/2EE!	. .     #UYTUVV!'%)YZ[[%yVWXX"UYTUVV &XYZZ"(59Z[\\!EISTUU!EISTUU	 	 $h77 844"Y77 
 N#MM         # # # #% % % %P   ,
4 
4 
4 
4# # # #F F F FT #'$(&*8 8 8 8 8v
 
 
 
 zDFFFFF r8   