def anglevalue(phi,theta): x = np.cos(phi)*np.sin(theta) y = np.sin(phi)*np.sin(theta) z = np.cos(theta) xangle = np.arccos(x) rv = cosine() return rv.pdf(xangle*2 - np.pi)
def test_cosine(self): from scipy.stats import cosine import matplotlib.pyplot as plt fig, ax = plt.subplots(1, 1) mean, var, skew, kurt = cosine.stats(moments='mvsk') x = np.linspace(cosine.ppf(0.01), cosine.ppf(0.99), 100) ax.plot(x, cosine.pdf(x), 'r-', lw=5, alpha=0.6, label='cosine pdf') rv = cosine() ax.plot(x, rv.pdf(x), 'k-', lw=2, label='frozen pdf') vals = cosine.ppf([0.001, 0.5, 0.999]) np.allclose([0.001, 0.5, 0.999], cosine.cdf(vals)) r = cosine.rvs(size=1000) ax.hist(r, density=True, histtype='stepfilled', alpha=0.2) ax.legend(loc='best', frameon=False) self.assertEqual(str(ax), "AxesSubplot(0.125,0.11;0.775x0.77)")
ax.xaxis.set_major_formatter(plt.NullFormatter()) # trick to show multiple legends leg1 = ax.legend([l1], [l1.get_label()], loc=1) leg2 = ax.legend([l2, l3], (l2.get_label(), l3.get_label()), loc=2) ax.add_artist(leg1) ax.set_title('Skew $\Sigma$ and Kurtosis $K$') # next show distributions with different kurtosis ax = fig.add_subplot(212) x = np.linspace(-5, 5, 1000) l1, = ax.plot(x, stats.laplace(0, 1).pdf(x), '--k', label=r'${\rm Laplace,}\ K=+3$') l2, = ax.plot(x, stats.norm(0, 1).pdf(x), '-k', label=r'${\rm Gaussian,}\ K=0$') l3, = ax.plot(x, stats.cosine(0, 1).pdf(x), '-.k', label=r'${\rm Cosine,}\ K=-0.59$') l4, = ax.plot(x, stats.uniform(-2, 4).pdf(x), ':k', label=r'${\rm Uniform,}\ K=-1.2$') ax.set_xlim(-5, 5) ax.set_ylim(0, 0.55) ax.set_xlabel('$x$') ax.set_ylabel('$p(x)$') # trick to show multiple legends leg1 = ax.legend((l1, l2), (l1.get_label(), l2.get_label()), loc=2) leg2 = ax.legend((l3, l4), (l3.get_label(), l4.get_label()), loc=1) ax.add_artist(leg1) plt.show()
ax.set_xlim(-5, 5) ax.set_ylim(0, 0.7001) ax.set_ylabel("$p(x)$", fontsize=16) ax.xaxis.set_major_formatter(plt.NullFormatter()) # trick to show multiple legends leg1 = ax.legend([l1], [l1.get_label()], loc=1) leg2 = ax.legend([l2, l3], (l2.get_label(), l3.get_label()), loc=2) ax.add_artist(leg1) ax.set_title("Skew $\Sigma$ and Kurtosis $K$") # next show distributions with different kurtosis ax = fig.add_subplot(212) x = np.linspace(-5, 5, 1000) l1, = ax.plot(x, stats.laplace(0, 1).pdf(x), "--k", label=r"${\rm Laplace,}\ K=+3$") l2, = ax.plot(x, stats.norm(0, 1).pdf(x), "-k", label=r"${\rm Gaussian,}\ K=0$") l3, = ax.plot(x, stats.cosine(0, 1).pdf(x), "-.k", label=r"${\rm Cosine,}\ K=-0.59$") l4, = ax.plot(x, stats.uniform(-2, 4).pdf(x), ":k", label=r"${\rm Uniform,}\ K=-1.2$") ax.set_xlim(-5, 5) ax.set_ylim(0, 0.6001) ax.set_xlabel("$x$", fontsize=16) ax.set_ylabel("$p(x)$", fontsize=16) # trick to show multiple legends leg1 = ax.legend((l1, l2), (l1.get_label(), l2.get_label()), loc=2) leg2 = ax.legend((l3, l4), (l3.get_label(), l4.get_label()), loc=1) ax.add_artist(leg1) plt.show()
try: latrange = datarange.ParseArg(resargs['latrange']) longrange = datarange.ParseArg(resargs['longrange']) if latrange.lower < -90.0 or latrange.upper > 90.0: raise datarange.DataRangeError("Invalid latitude range") if longrange.lower < 0.0 or longrange.upper > 360.0: raise datarange.DataRangeError("Invalid longitude range") except datarange.DataRangeError as e: print "Error in lat/long range", e.args[0] sys.exit(13) longs = nr.uniform(longrange.lower, longrange.upper, size=number) sizes = np.sqrt(nr.uniform(mindeg**2, maxdeg**2, size=number)) if resargs['cosdist']: cosrv = cosine(scale = 90.0 / np.pi) while 1: lats = cosrv.rvs(size = number * 4) lats = lats[(lats >= latrange.lower) & (lats <= latrange.upper)] if len(lats) >= number: break lats = lats[0:number] else: lats = nr.uniform(latrange.lower, latrange.upper, size=number) prop = np.zeros_like(longs) + 1.99 gsize = np.zeros_like(longs) + 10.0 repos = longs.argsort() longs = longs[repos] lats = lats[repos]
mean, var, skew, kurt = cosine.stats(moments='mvsk') # Display the probability density function (``pdf``): x = np.linspace(cosine.ppf(0.01), cosine.ppf(0.99), 100) ax.plot(x, cosine.pdf(x), 'r-', lw=5, alpha=0.6, label='cosine pdf') # Alternatively, the distribution object can be called (as a function) # to fix the shape, location and scale parameters. This returns a "frozen" # RV object holding the given parameters fixed. # Freeze the distribution and display the frozen ``pdf``: rv = cosine() ax.plot(x, rv.pdf(x), 'k-', lw=2, label='frozen pdf') # Check accuracy of ``cdf`` and ``ppf``: vals = cosine.ppf([0.001, 0.5, 0.999]) np.allclose([0.001, 0.5, 0.999], cosine.cdf(vals)) # True # Generate random numbers: r = cosine.rvs(size=1000) # And compare the histogram: ax.hist(r, normed=True, histtype='stepfilled', alpha=0.2)
ax.add_artist(leg1) ax.set_title('Skew $\Sigma$ and Kurtosis $K$') # next show distributions with different kurtosis ax = fig.add_subplot(212) x = np.linspace(-5, 5, 1000) l1, = ax.plot(x, stats.laplace(0, 1).pdf(x), '--k', label=r'${\rm Laplace,}\ K=+3$') l2, = ax.plot(x, stats.norm(0, 1).pdf(x), '-k', label=r'${\rm Gaussian,}\ K=0$') l3, = ax.plot(x, stats.cosine(0, 1).pdf(x), '-.k', label=r'${\rm Cosine,}\ K=-0.59$') l4, = ax.plot(x, stats.uniform(-2, 4).pdf(x), ':k', label=r'${\rm Uniform,}\ K=-1.2$') ax.set_xlim(-5, 5) ax.set_ylim(0, 0.6001) ax.set_xlabel('$x$', fontsize=16) ax.set_ylabel('$p(x)$', fontsize=16) # trick to show multiple legends leg1 = ax.legend((l1, l2), (l1.get_label(), l2.get_label()), loc=2) leg2 = ax.legend((l3, l4), (l3.get_label(), l4.get_label()), loc=1)
def all_dists(): # dists param were taken from scipy.stats official # documentaion examples # Total - 89 return { "alpha": stats.alpha(a=3.57, loc=0.0, scale=1.0), "anglit": stats.anglit(loc=0.0, scale=1.0), "arcsine": stats.arcsine(loc=0.0, scale=1.0), "beta": stats.beta(a=2.31, b=0.627, loc=0.0, scale=1.0), "betaprime": stats.betaprime(a=5, b=6, loc=0.0, scale=1.0), "bradford": stats.bradford(c=0.299, loc=0.0, scale=1.0), "burr": stats.burr(c=10.5, d=4.3, loc=0.0, scale=1.0), "cauchy": stats.cauchy(loc=0.0, scale=1.0), "chi": stats.chi(df=78, loc=0.0, scale=1.0), "chi2": stats.chi2(df=55, loc=0.0, scale=1.0), "cosine": stats.cosine(loc=0.0, scale=1.0), "dgamma": stats.dgamma(a=1.1, loc=0.0, scale=1.0), "dweibull": stats.dweibull(c=2.07, loc=0.0, scale=1.0), "erlang": stats.erlang(a=2, loc=0.0, scale=1.0), "expon": stats.expon(loc=0.0, scale=1.0), "exponnorm": stats.exponnorm(K=1.5, loc=0.0, scale=1.0), "exponweib": stats.exponweib(a=2.89, c=1.95, loc=0.0, scale=1.0), "exponpow": stats.exponpow(b=2.7, loc=0.0, scale=1.0), "f": stats.f(dfn=29, dfd=18, loc=0.0, scale=1.0), "fatiguelife": stats.fatiguelife(c=29, loc=0.0, scale=1.0), "fisk": stats.fisk(c=3.09, loc=0.0, scale=1.0), "foldcauchy": stats.foldcauchy(c=4.72, loc=0.0, scale=1.0), "foldnorm": stats.foldnorm(c=1.95, loc=0.0, scale=1.0), # "frechet_r": stats.frechet_r(c=1.89, loc=0.0, scale=1.0), # "frechet_l": stats.frechet_l(c=3.63, loc=0.0, scale=1.0), "genlogistic": stats.genlogistic(c=0.412, loc=0.0, scale=1.0), "genpareto": stats.genpareto(c=0.1, loc=0.0, scale=1.0), "gennorm": stats.gennorm(beta=1.3, loc=0.0, scale=1.0), "genexpon": stats.genexpon(a=9.13, b=16.2, c=3.28, loc=0.0, scale=1.0), "genextreme": stats.genextreme(c=-0.1, loc=0.0, scale=1.0), "gausshyper": stats.gausshyper(a=13.8, b=3.12, c=2.51, z=5.18, loc=0.0, scale=1.0), "gamma": stats.gamma(a=1.99, loc=0.0, scale=1.0), "gengamma": stats.gengamma(a=4.42, c=-3.12, loc=0.0, scale=1.0), "genhalflogistic": stats.genhalflogistic(c=0.773, loc=0.0, scale=1.0), "gilbrat": stats.gilbrat(loc=0.0, scale=1.0), "gompertz": stats.gompertz(c=0.947, loc=0.0, scale=1.0), "gumbel_r": stats.gumbel_r(loc=0.0, scale=1.0), "gumbel_l": stats.gumbel_l(loc=0.0, scale=1.0), "halfcauchy": stats.halfcauchy(loc=0.0, scale=1.0), "halflogistic": stats.halflogistic(loc=0.0, scale=1.0), "halfnorm": stats.halfnorm(loc=0.0, scale=1.0), "halfgennorm": stats.halfgennorm(beta=0.675, loc=0.0, scale=1.0), "hypsecant": stats.hypsecant(loc=0.0, scale=1.0), "invgamma": stats.invgamma(a=4.07, loc=0.0, scale=1.0), "invgauss": stats.invgauss(mu=0.145, loc=0.0, scale=1.0), "invweibull": stats.invweibull(c=10.6, loc=0.0, scale=1.0), "johnsonsb": stats.johnsonsb(a=4.32, b=3.18, loc=0.0, scale=1.0), "johnsonsu": stats.johnsonsu(a=2.55, b=2.25, loc=0.0, scale=1.0), "ksone": stats.ksone(n=1e03, loc=0.0, scale=1.0), "kstwobign": stats.kstwobign(loc=0.0, scale=1.0), "laplace": stats.laplace(loc=0.0, scale=1.0), "levy": stats.levy(loc=0.0, scale=1.0), "levy_l": stats.levy_l(loc=0.0, scale=1.0), "levy_stable": stats.levy_stable(alpha=0.357, beta=-0.675, loc=0.0, scale=1.0), "logistic": stats.logistic(loc=0.0, scale=1.0), "loggamma": stats.loggamma(c=0.414, loc=0.0, scale=1.0), "loglaplace": stats.loglaplace(c=3.25, loc=0.0, scale=1.0), "lognorm": stats.lognorm(s=0.954, loc=0.0, scale=1.0), "lomax": stats.lomax(c=1.88, loc=0.0, scale=1.0), "maxwell": stats.maxwell(loc=0.0, scale=1.0), "mielke": stats.mielke(k=10.4, s=3.6, loc=0.0, scale=1.0), "nakagami": stats.nakagami(nu=4.97, loc=0.0, scale=1.0), "ncx2": stats.ncx2(df=21, nc=1.06, loc=0.0, scale=1.0), "ncf": stats.ncf(dfn=27, dfd=27, nc=0.416, loc=0.0, scale=1.0), "nct": stats.nct(df=14, nc=0.24, loc=0.0, scale=1.0), "norm": stats.norm(loc=0.0, scale=1.0), "pareto": stats.pareto(b=2.62, loc=0.0, scale=1.0), "pearson3": stats.pearson3(skew=0.1, loc=0.0, scale=1.0), "powerlaw": stats.powerlaw(a=1.66, loc=0.0, scale=1.0), "powerlognorm": stats.powerlognorm(c=2.14, s=0.446, loc=0.0, scale=1.0), "powernorm": stats.powernorm(c=4.45, loc=0.0, scale=1.0), "rdist": stats.rdist(c=0.9, loc=0.0, scale=1.0), "reciprocal": stats.reciprocal(a=0.00623, b=1.01, loc=0.0, scale=1.0), "rayleigh": stats.rayleigh(loc=0.0, scale=1.0), "rice": stats.rice(b=0.775, loc=0.0, scale=1.0), "recipinvgauss": stats.recipinvgauss(mu=0.63, loc=0.0, scale=1.0), "semicircular": stats.semicircular(loc=0.0, scale=1.0), "t": stats.t(df=2.74, loc=0.0, scale=1.0), "triang": stats.triang(c=0.158, loc=0.0, scale=1.0), "truncexpon": stats.truncexpon(b=4.69, loc=0.0, scale=1.0), "truncnorm": stats.truncnorm(a=0.1, b=2, loc=0.0, scale=1.0), "tukeylambda": stats.tukeylambda(lam=3.13, loc=0.0, scale=1.0), "uniform": stats.uniform(loc=0.0, scale=1.0), "vonmises": stats.vonmises(kappa=3.99, loc=0.0, scale=1.0), "vonmises_line": stats.vonmises_line(kappa=3.99, loc=0.0, scale=1.0), "wald": stats.wald(loc=0.0, scale=1.0), "weibull_min": stats.weibull_min(c=1.79, loc=0.0, scale=1.0), "weibull_max": stats.weibull_max(c=2.87, loc=0.0, scale=1.0), "wrapcauchy": stats.wrapcauchy(c=0.0311, loc=0.0, scale=1.0), }
def __init__(self, hours_total=24, day_fraction=0.5, channels=None, **kwargs): """ Initialize an irradiance source in the model domain Args: hours_total (int, float, PhysicalField): Number of hours in a diel period day_fraction (float): Fraction (between 0 and 1) of diel period which is illuminated (default: 0.5) channels: See :meth:`.create_channel` **kwargs: passed to superclass """ self.logger = kwargs.get('logger') or logging.getLogger(__name__) self.logger.debug('Init in {}'.format(self.__class__.__name__)) kwargs['logger'] = self.logger super(Irradiance, self).__init__(**kwargs) #: the channels in the irradiance entity self.channels = {} #: the number of hours in a diel period self.hours_total = PhysicalField(hours_total, 'h') if not (1 <= self.hours_total.value <= 48): raise ValueError('Hours total {} should be between (1, 48)'.format( self.hours_total)) # TODO: remove (1, 48) hour constraint on hours_total day_fraction = float(day_fraction) if not (0 < day_fraction < 1): raise ValueError("Day fraction should be between 0 and 1") #: fraction of diel period that is illuminated self.day_fraction = day_fraction #: numer of hours in the illuminated fraction self.hours_day = day_fraction * self.hours_total #: the time within the diel period which is the zenith of radiation self.zenith_time = self.hours_day #: the intensity level at the zenith time self.zenith_level = 100.0 C = 1.0 / numerix.sqrt(2 * numerix.pi) # to scale the cosine distribution from 0 to 1 (at zenith) self._profile = cosine(loc=self.zenith_time, scale=C**2 * self.hours_day) # This profile with loc=zenith means that the day starts at "midnight" and zenith occurs # in the center of the daylength #: a :class:`Variable` for the momentary radiance level at the surface self.surface_irrad = Variable(name='irrad_surface', value=0.0, unit=None) if channels: for chinfo in channels: self.create_channel(**chinfo) self.logger.debug('Created Irradiance: {}'.format(self))