calcolo frequenza



  • calcolo frequenza
    di ludagi data: 12/04/2013 14:44:05

    quesito :

    ho una serie di dati positivi e negativi vorrei calcolare la frequenza con cui si manifestono i valori ... cioè ogni quanti valori (mediamente) si invertono di segno ..

    grazie



  • di totygno71 data: 12/04/2013 17:45:47

    Interessante

    domanda?
    lo zero come lo consideri nullo?






  • di Vecchio Frac data: 12/04/2013 17:50:52

    Quesito interessante, quindi non vuoi una FREQUENZA dei dati ma una media delle uscite consecutive...
    Credo di aver capito, ma mi piacerebbe che postassi un esempio (con pochi dati) e il risultato atteso.






  • di totygno71 data: 12/04/2013 18:23:47

    una bozza su cui lavorarci... ed a cnhe tanto ^_^

    il range dei numeri va da C1 a C20
    ma ovviamente puo essere modificato_

    Sentiamo il parere di ludagi_ ^_^



  • di totygno71 data: 12/04/2013 18:29:03

    @ Ludagi
    ho allegato il file di esempio

    @ VF
    Aspetto la critica sul codice ma non accetto critiche sul mio pulsante_ ^_^



  • di Vecchio Frac data: 12/04/2013 18:55:10

    L'obiettivo mi sembra raggiunto... forse è il tuo solito stellone della fortuna che ti ha fatto imbroccare un codice funzionante ^_^
    LOL... anch'io avevo capito così, ma aspetto ludagi.





  • di Vecchio Frac data: 12/04/2013 19:52:55

    Stante la validità della premessa, questa è la mia proposta...
    adesso vedo di migliorarla ulteriormente!

     
    Option Explicit
    
    Sub frequenza_vfrac()
    Dim cell As Range
    Dim media_positivi As Single, media_negativi As Single
    Dim i As Integer, j As Integer
    Dim positivi As Collection, negativi As Collection
    Dim v As Variant, media_pos As Single, media_neg As Single
    
        Set positivi = New Collection
        Set negativi = New Collection
        
        For Each cell In [c1:c20]
            If Sgn(cell) > 0 Then
                i = i + 1
                j = 0
            Else
                j = j + 1
                i = 0
            End If
            
            If Sgn(cell.Offset(1)) <> Sgn(cell) Then
                If i > 0 Then positivi.Add i
                If j > 0 Then negativi.Add j
                i = 0
                j = 0
            End If
        
        Next
        
        For Each v In positivi
            media_pos = media_pos + v
        Next
        For Each v In negativi
            media_neg = media_neg + v
        Next
        media_pos = media_pos / positivi.Count
        media_neg = media_neg / negativi.Count
    
        MsgBox "Media frequenza dei consecutivi positivi = " & media_pos & vbCrLf & "Media frequenza dei consecutivi positivi = " & media_neg
    End Sub






  • di totygno71 data: 12/04/2013 19:58:16

    VF
    che succede col tuo codice se in una cella non c'è un numero ma una stringa? U_U



  • di Vecchio Frac data: 12/04/2013 20:07:02

    Sì, non ho fatto alcun case test.
    E sballa pure se nell'elenco non ci sono numeri positivi ma solo negativi o viceversa.
    Questo ultimo fatto si fixa facilmente:

    If positivi.Count > 0 Then media_pos = media_pos / positivi.Count
    If negativi.Count > 0 Then media_neg = media_neg / negativi.Count


    p.s. se vogliamo essere pignoli anche il tuo codice ha qualche problema, sia nel caso suindicato, che soprattutto nel calcolare correttamente la media (nel tuo esempio, la media dei negativi è 1,5 mentre il valore corretto è 1,6) ^_^

    Sembra che il tuo codice gestisca bene la presenza di stringhe nell'elenco ma solo perchè le tratta come valore positivo... non è corretto nemmeno questo :)






  • di totygno71 data: 12/04/2013 20:22:01

    shhhhhhhhhhhhhhhhhhh.............

    Non fare la spia!!!! ^_^



  • di Vecchio Frac data: 12/04/2013 21:08:22

    Ne propongo un'altra... di sicuro molto più elegante e anche un tantino più concisa.
    Notare la function Union personalizzata!
     
    Option Explicit
    
    Sub frequenza2_vfrac()
    Dim cell As Range, positivi As Range, negativi As Range
    Dim m As Single
    Dim media_pos As Single, media_neg As Single
    
        On Error Resume Next
        
        For Each cell In [C1:C20]
            If Sgn(cell) > 0 Then
                Set positivi = Union(positivi, cell)
            Else
                Set negativi = Union(negativi, cell)
            End If
        Next
        
        For Each cell In positivi.Areas
            m = m + cell.Count
        Next
        If m > 0 Then media_pos = m / positivi.Areas.Count
        
        m = 0
        For Each cell In negativi.Areas
            m = m + cell.Count
        Next
        If m > 0 Then media_neg = m / negativi.Areas.Count
        
        MsgBox "Media frequenza dei consecutivi positivi = " & media_pos & vbCrLf & "Media frequenza dei consecutivi negativi = " & media_neg
    
    End Sub
    
    Private Function Union(Rng1 As Range, Rng2 As Range) As Range
    'thx to Tushar Mehta
    'dailydoseofexcel.com/archives/2007/08/17/two-new-range-functions-union-and-subtract/
        If Rng1 Is Nothing Then
            Set Union = Rng2
        ElseIf Rng2 Is Nothing Then
            Set Union = Rng1
        Else
            Set Union = Application.Union(Rng1, Rng2)
        End If
    End Function
    





  • ludagi
    di ludagi data: 13/04/2013 08:57:34

    grazie delle risposte ma la soluzione che cerco non deve distinguere numeri positivi o negativi in quanto a me interessa sapere quale è mediamente il numero di persistenza prima di cambiare segno, cioè ogni quanti valori cambia segno .

    grazie siete veramente gentili




  • di Vecchio Frac data: 13/04/2013 10:16:37

    Credo che sia esattamente quello che abbiamo fatto, con le nostre proposte (quella di totygno è meno elegante della mia ^_^).
    Ma allora per fugare dubbi ti chiedo un esempio e il risultato atteso.





  • di totygno71 data: 13/04/2013 11:21:49

    Mi associo a VF in toto, a parte ovviamente sul suo parere (nettamente di parte) riguardo alla poca all'eleganza del mio codice....

    Quest'uomo qui non riesce proprio ad essere obiettivo nei pareri_ ^_^
     


  • ludagi
    di ludagi data: 13/04/2013 16:38:02

    forse sono io che non riesco ad interpretare ma dal risultato leggo media dei numeri positivi e media dei numeri negativi ...... invece io cerco un'unica media ... che sia comprensiva di tutti i numeri sia negativi che positivi .

    grazie .



  • di Textomb data: 13/04/2013 17:30:22

    in effetti non è molto chiaro quello che vuoi ottenere...
    Dovresti fare un esempio esplicativo con una sequenza di valori, per es. quella riportata nel range c1:c20 e esprimere il risultato atteso.
    In ogni caso ho voluto dare la mia opinione.
    Vedi un pò se così potrebbe funzionare.
     
    Sub freqSgnNumb()
    Dim cell As Range, SumEachFrq As Integer, EachFrq As Integer, i As Integer, frqColl As New Collection
    
    On Error Resume Next
    
    For Each cell In [c1:c20]
    If IsNumeric(cell) And cell <> "" Then
        If Sgn(cell) = Sgn(cell.Offset(1)) Then
        EachFrq = EachFrq + 1
        Else
        frqColl.Add (EachFrq + 1): EachFrq = 0
        End If
    End If
    Next
    
    Do
        i = i + 1
        SumEachFrq = SumEachFrq + frqColl(i)
    Loop Until i = frqColl.Count
    
    MsgBox "La persistenza media del segno numeri è: " & Round(SumEachFrq / frqColl.Count, 2)
    
    End Sub
    


  • ludagi
    di ludagi data: 13/04/2013 17:46:17

    perfetto grazie



  • di Vecchio Frac data: 13/04/2013 19:10:22

    Rileggete il quesito iniziale e ditemi se poteva o no essere frainteso... io avevo frainteso ^_^
    Comunque l'idea di contare le celle delle Areas era carina e soprattutto veloce, adattabile anche su questa interpretazione, che però non era facile dare, vista l'assenza di un esempio :)





  • di Textomb data: 13/04/2013 19:41:16

    mi spiace VF. Arrenditi



  • di Vecchio Frac data: 13/04/2013 19:47:11

    LOL