
    Yii31                        d Z ddlZddlmZ ddlmZ ddlmZmZ ddl	Z
ddlZddlmZ ddlmZ ddlZddlZddlmZmZmZ ddlmZ ej                            ej                            e          dd	          Z ej        ed
            G d de          Z G d dej                  Z  G d d          Z!e"dk    rddlZddl#Z#e#j        $                    dej                            ej        %                    e                               ddl&m'Z'  e'            Z(ej                            ej                            e          ddd          Z)ej        *                    e)          r e
j+        e)          Z,ne(-                    ddg          Z, e!            Z.e./                    e,d           i dddddd d!dd"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d#d1d+d2d3d4d5d6dd7d8d9d:iZ0 e1d;           e.2                    e0          Z3 e1d<e3d=                      e1d>e3d?         d@dA            e1dBe3dC         d@dA            e1dDe3dE         d@dA            e1dFe3dG         d@dA           dS dS )HzS
BET.CUTTALO.COM - NEURAL NETWORK
Rete neurale per predizione risultati calcistici
    N)Dataset
DataLoader)StandardScaler)train_test_split)TupleListDict)datetimez..modelsT)exist_okc                   B    e Zd ZdZdej        dej        fdZd Zd ZdS )MatchDatasetz"Dataset PyTorch per partite calciofeatureslabelsc                 j    t          j        |          | _        t          j        |          | _        d S N)torchFloatTensorr   
LongTensorr   )selfr   r   s      2/var/www/html/bet.cuttalo.com/ml/neural_network.py__init__zMatchDataset.__init__   s*    )(33&v..    c                 *    t          | j                  S r   )lenr   )r   s    r   __len__zMatchDataset.__len__   s    4;r   c                 6    | j         |         | j        |         fS r   )r   r   )r   idxs     r   __getitem__zMatchDataset.__getitem__!   s    }S!4;s#333r   N)	__name__
__module____qualname____doc__npndarrayr   r   r    r   r   r   r      s^        ,,/ /RZ / / / /     4 4 4 4 4r   r   c            	       R     e Zd ZdZg dddfdedee         dedef fd	Zd
 Z xZ	S )BettingNeuralNetworkz|
    Rete neurale deep per predizione risultati
    Architettura: Multi-layer con Batch Norm, Dropout, Skip connections
    )      r)   @      g333333?
input_sizehidden_sizesnum_classesdropoutc           	         t          t          |                                            || _        || _        t          j        t          j        ||d                   t          j        |d                   t          j	                    t          j
        |                    | _        t          j                    | _        t          t          |          dz
            D ]}t          j        t          j        ||         ||dz                      t          j        ||dz                      t          j	                    t          j
        |                    }| j                            |           t          j        t          j        |d         |          t          j        d                    | _        t          j        |d         |d                   | _        d S )Nr      )dim)superr(   r   r-   r/   nn
SequentialLinearBatchNorm1dReLUDropoutinput_layer
ModuleListhidden_layersranger   appendSoftmaxoutput_layerskip_connection)r   r-   r.   r/   r0   ilayer	__class__s          r   r   zBettingNeuralNetwork.__init__+   s   "D))22444$& =Ij,q/22N<?++GIIJw	
 
  ]__s<((1,-- 	- 	-AM	,q/<A+>??|AE233		
7##	 E %%e,,,, MIl2&44J1
 
  "ya,r:JKKr   c                     |                      |          }|                     |          }| j        D ]} ||          }||z   }|                     |          S r   )r<   rC   r>   rB   )r   xskiprE   s       r   forwardzBettingNeuralNetwork.forwardN   sl    Q##A&& ' 	 	EaAA H   ###r   )
r    r!   r"   r#   intr   floatr   rJ   __classcell__)rF   s   @r   r(   r(   %   s         
 CVBUBU$%!L !L3 !Ld3i !L!!L05!L !L !L !L !L !LF$ $ $ $ $ $ $r   r(   c                       e Zd ZdZg dZddefdZdej        de	e
j        e
j        f         fdZ	 	 ddej        dedededef
dZdedefdZdee         dee         fdZd Zd ZdefdZdS )BettingPredictorz4
    Classe principale per training e inferenza
    )home_positionhome_pointshome_won	home_draw	home_losthome_goals_forhome_goals_againsthome_goal_diffaway_positionaway_pointsaway_won	away_draw	away_lostaway_goals_foraway_goals_againstaway_goal_diffposition_diffpoints_diffbetting_model
model_namec                     || _         d | _        t                      | _        t	          j        t          j                                        rdnd          | _        g | _        d S )Ncudacpu)	rc   modelr   scalerr   devicere   is_availabletraining_history)r   rc   s     r   r   zBettingPredictor.__init__k   sS    $
$&&lUZ-D-D-F-F#Q66ERR "r   dfreturnc                 |    || j                  j        }|d         j        }| j                            |          }||fS )zPrepara dati per trainingresult)FEATURE_COLUMNSvaluesrh   fit_transform)r   rl   Xys       r   prepare_datazBettingPredictor.prepare_datar   s@     t#$+xL K%%a((!tr   d       MbP?皙?epochs
batch_sizelearning_ratevalidation_splitc                 	   t          dt          |           d           |                     |          \  }}t          |||d|          \  }}	}
}t	          ||
          }t	          |	|          }t          ||d          }t          ||          }|j        d         }t          |                              | j	                  | _
        t          j                    }t          j        | j
                                        |d	
          }t          j                            |dd          }d}g | _        t          d| j	         d           t          dt          |           dt          |	                      t          d           t'          |          D ]}| j
                                         d}d}d}|D ]\  }}|                    | j	                  |                    | j	                  }}|                                 | 
                    |          } |||          }|                                 |                                 ||                                z  }t3          j        |j        d          \  }}||                    d          z  }|||k                                                                    z  }d|z  |z  }|t          |          z  }| j
                                         d} d}!d}"t3          j                    5  |D ]\  }}|                    | j	                  |                    | j	                  }}| 
                    |          } |||          }| |                                z  } t3          j        |j        d          \  }}|"|                    d          z  }"|!||k                                                                    z  }!	 ddd           n# 1 swxY w Y   d|!z  |"z  }#| t          |          z  } |                    |            | j                             |dz   ||| |#d           |dz   dz  dk    r)t          d|dz    d| d|dd|dd| dd|#dd           |#|k    r|#}| !                                 t          d           t          d|dd           | j        S ) z*
        Addestra la rete neurale
        zPreparando dati (z samples)...*   )	test_sizerandom_statestratifyT)r{   shuffle)r{   r2   gh㈵>)lrweight_decay
   g      ?)patiencefactorr   z
Training su z...zTrain: z, Validation: z2--------------------------------------------------rv   N)epoch
train_loss	train_accval_lossval_acczEpoch /z | Train Loss: z.4fz Acc: z.2fz% | Val Loss: %z/Training completato! Best validation accuracy: )"printr   ru   r   r   r   shaper(   tori   rg   r6   CrossEntropyLossoptimAdam
parameterslr_schedulerReduceLROnPlateaurk   r?   train	zero_gradbackwardstepitemr   maxdatasizesumevalno_gradr@   
save_model)$r   rl   rz   r{   r|   r}   rs   rt   X_trainX_valy_trainy_valtrain_datasetval_datasettrain_loader
val_loaderr-   	criterion	optimizer	schedulerbest_val_accr   r   train_correcttrain_totalr   r   outputsloss_	predictedr   r   val_correct	val_totalr   s$                                       r   r   zBettingPredictor.train}   s   
 	7#b''777888  $$1 *:q,2*
 *
 *
&
 %Wg66"5%00!-JPTUUU
CCC
 WQZ
)*5588EE
 '))	Jtz4466=W[\\\	&88RX[8\\	  "/t{///000@G@@CJJ@@AAAh6]] A	" A	"EJJMK$0 D D &#+;;t{#;#;VYYt{=S=S&##%%%**X.. y&11   diikk)
$yq999v{{1~~-)v"5!:!:!<!<!A!A!C!CCm+k9I#l+++J JOOHKI 	F 	F(2 F F$Hf'/{{4;'?'?4;AWAWfH"jj22G$9Wf55D		+H#(9W\1#=#=LAyQ/II$7#<#<#>#>#C#C#E#EEKKF	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F K')3GJ'H NN8$$$ !(((&$"* *    	R1$$ FuQw F F F F%/NF F;DNF F#+EF F7>EF F F G G G
 %%&!!!hSSSSSTTT$$s   !CPP		P		
match_datac                    | j         |                                  | j                                          fd| j        D             }t	          j        |                              dd          }| j                            |          }t          j
        |                              | j                  }t          j                    5  |                      |                                                                          d         }ddd           n# 1 swxY w Y   t!          |          }|dz
  dz  dz  }t#          |d	                   dz  t#          |d                   dz  t#          |d                   dz  g d
t	          j        |                   t#          t!          dt'          d|                              |                                dS )z`
        Predici risultato singola partita
        Ritorna probabilita per ogni outcome
        Nc                 <    g | ]}                     |d           S )r   )get).0colr   s     r   
<listcomp>z,BettingPredictor.predict.<locals>.<listcomp>   s'    KKKsJNN3**KKKr   r2   r3   r   gQ?gq=
ףp?rv      )zAway WinDrawzHome Win)home_win_prob	draw_probaway_win_prob
prediction
confidence	raw_probs)rg   
load_modelr   rp   r$   arrayreshaperh   	transformr   r   r   ri   r   rf   numpyr   rL   argmaxmintolist)r   r   r   probsmax_probr   s    `    r   predictzBettingPredictor.predict   s   
 :OO
 LKKKd6JKKK8H%%--a44;((22$X..11$+>> ]__ 	: 	:JJx((,,..4466q9E	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: u::o-3
 #58__s2uQx3."58__s2:::29U;K;KLAs3
';'; < <==
 
 	
s   
A DDDmatchesc                 r    g }|D ]1}|                      |          }||d<   |                    |           2|S )zPredici batch di partitematch)r   r@   )r   r   predictionsr   preds        r   predict_batchzBettingPredictor.predict_batch
  sM     	% 	%E<<&&D!DMt$$$$r   c                 Z   t           j                            t          | j         d          }t           j                            t          | j         d          }t           j                            t          | j         d          }t          j        | j                                        | j        j	        t          j                                                    d|           t          j        | j        |           t          j        | j        |           t#          d|            dS )zSalva modello e scaler.pth_scaler.pkl_history.pkl)model_state_dictr-   	timestampzModello salvato in N)ospathjoin
MODELS_DIRrc   r   saverg   
state_dictr-   r
   now	isoformatjoblibdumprh   rk   r   )r   
model_pathscaler_pathhistory_paths       r   r   zBettingPredictor.save_model  s    W\\*.F.F.FGG
gll:$//N/N/NOOw||J4?0P0P0PQQ
 $
 5 5 7 7*/!1133
 
 		 	 	 	DK---D)<8880J0011111r   c                    t           j                            t          | j         d          }t           j                            t          | j         d          }t           j                            |          st          d|           t          j        || j	                  }t          |d                                       | j	                  | _        | j                            |d                    | j                                         t          j        |          | _        t#          d|                    dd	           d
           dS )zCarica modello e scalerr   r   zModello non trovato: )map_locationr-   r   zModello caricato (trained: r   unknown)N)r   r   r   r   rc   existsFileNotFoundErrorr   loadri   r(   r   rg   load_state_dictr   r   rh   r   r   )r   r   r   
checkpoints       r   r   zBettingPredictor.load_model$  s   W\\*.F.F.FGG
gll:$//N/N/NOOw~~j)) 	J#$HJ$H$HIIIZ
EEE
)*\*BCCFFt{SS

"":.@#ABBB
k+..UJNN;	,R,RUUUVVVVVr   c                 `   t           j                            t          | j         d          }t           j                            |          r_t          j        |          }|rI|d         }t          d |D                       }t          |          |d         |d         ||d         |dS dd	iS )
zRitorna statistiche modellor   r3   c              3   &   K   | ]}|d          V  dS )r   Nr&   )r   hs     r   	<genexpr>z3BettingPredictor.get_model_stats.<locals>.<genexpr>=  s&      ==q|======r   r   r   r   )epochs_trainedfinal_train_accfinal_val_accr   last_train_losshistorystatusno_training_data)
r   r   r   r   rc   r   r   r   r   r   )r   r   r   lastbest_accs        r   get_model_statsz BettingPredictor.get_model_stats5  s    w||J4?0P0P0PQQ7>>,'' 	k,//G 
r{==W=====&)'ll'+K'8%))_$,'+L'9&   ,--r   N)rb   )rv   rw   rx   ry   )r    r!   r"   r#   rp   strr   pd	DataFramer   r$   r%   ru   rK   rL   r   r	   r   r   r   r   r   r  r&   r   r   rO   rO   ^   s_          O# #3 # # # #	r| 	bj"*6L0M 	 	 	 	 LNFIj% j% j%c j%S j%"j%>Cj% j% j% j%X
$ 
4 
 
 
 
BT$Z DJ    2 2 2"W W W". . . . . . .r   rO   __main__)FootballDataCollectorr   zhistorical_matches.csvi  i  )seasonsrv   )rz   rP   r,   rQ   -   rR      rS   rT      rU   r   rV      rW      rX      rY   rw   rZ   	   r[   r\   r]      r^      r_   r`   ra      z
Test predizione:zPredizione: r   zConfidence: r   z.1fr   z
Home Win: r   zDraw: r   z
Away Win: r   )4r#   r   torch.nnr6   torch.optimr   torch.utils.datar   r   pandasr  r   r$   sklearn.preprocessingr   sklearn.model_selectionr   r   r   typingr   r   r	   r
   r   r   dirname__file__r   makedirsr   Moduler(   rO   r    sysinsertabspathdata_collectorr  	collector	data_pathr   read_csvrl   collect_historical_data	predictorr   
test_matchr   r   r   r&   r   r   <module>r)     s`   
              0 0 0 0 0 0 0 0         0 0 0 0 0 0 4 4 4 4 4 4  				 $ $ $ $ $ $ $ $ $ $      W\\"'//(33T8DD
 J & & & &4 4 4 4 47 4 4 46$ 6$ 6$ 6$ 6$29 6$ 6$ 6$ri. i. i. i. i. i. i. i.X zIIIJJJHOOArwrwx'@'@AABBB444444 &%''IRW__X66fF^__I	w~~i   ER[##..d|.DD ! ""IOOBsO###r 	B 	Q	
 	Q 	" 	b 	" 	 	r 	A 	Q 	Q 	" 	b  	!!" 	#$ 	r% J* 
E
Z((D	E
-l+
-
-...	E
2l+
2
2
2
2333	E
3tO,
3
3
3
3444	E
+4$
+
+
+
+,,,	E
3tO,
3
3
3
344444c r   