Question

Je dois porter certaines fonctions de C # vers Python, mais je ne peux pas implémenter le code suivant à droite:

[SqlFunction(IsDeterministic = true, DataAccess = DataAccessKind.None)]
public static SqlDouble LogNormDist(double probability, double mean, double stddev)
{
    LognormalDistribution lnd = new LognormalDistribution(mean,stddev);
    return (SqlDouble)lnd.CDF(probability);
}

Ce code utilise la bibliothèque CenterSpace Nmath.

Tout le monde peut m'aider à écrire une fonction correcte en python, qui ressemblera à ce code?

Désolé pour mon anglais.

UPD En fait, je ne comprends pas quels attributs scipy.stats.lognorm.cdf sont identiques à la probabilité C #, moyenne, stddev

Si vous copiez simplement l'ordre existant sur python, comme dans la réponse ci-dessous, j'obtiens un mauvais numéro.

Était-ce utile?

La solution

Scipy a un tas de distributions définies dans le paquet scipy.stats

import scipy.stats

def LogNormDist(prob, mean=0, stddev=1):
    return scipy.stats.lognorm.cdf(prob,stddev,mean)

Mettre à jour

D'accord, il semblerait que les définitions de statistiques de Scipy soient un peu non standard. Voici la fin de la docstring pour scipy.stats.lognormal

  

Distribution log-normale

     

lognorm.pdf (x, s) = 1 / (s x sqrt (2 * pi)) * exp (-1 / 2 * (log (x) / s) ** 2 )      pour x > 0, s > 0.

     

Si log x est normalement distribué avec mu moyen et variance sigma ** 2,      alors x est log-normalement distribué avec le paramètre de forme sigma et l'échelle      paramètre exp (mu).

Alors peut-être essayer

return scipy.stats.lognorm.cdf(prob,stddev,scipy.exp(mean))

Si cela ne fonctionne toujours pas, essayez quelques exemples de points et je verrai si je peux trouver une relation de travail.

Udpate 2

Oups, je n'avais pas réalisé que le paramètre scale était un mot clé. Celui-ci devrait maintenant fonctionner:

import scipy.stats

def LogNormDist(prob, mean=0, stddev=1):
    return scipy.stats.lognorm.cdf(prob,stddev,scale=scipy.exp(mean))

Salut et bonne chance dans votre projet!

Autres conseils

Les documents Python décrivent une méthode random.lognormvariate (mu, sigma):

http://docs.python.org/library/random.html

Peut-être que c'est ce que vous voulez.

Peut-être pouvez-vous utiliser Python.NET (ceci est PAS IronPython), cela permet d'accéder aux composants et services .NET:

http://pythonnet.sourceforge.net/

Ivan,

Nous n'avons aucun intérêt à garder les gens bloqués dans NMath. Voici ce que nous faisons à NMath.

  double t = ( Math.Log( x ) - mu_ ) / sigmaRoot2_;
  return ( 0.5 + 0.5 * Erf( t ) );

private static double Erf( double x )
{
  return ( x < 0.0 ? -StatsFunctions.IncompleteGamma( 0.5, x * x ) : StatsFunctions.IncompleteGamma( 0.5, x * x ) );
}

Cela devrait aider ...

  • Trevor
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top