كيف يمكنني إنشاء الرسم البياني لفترة معينة التوزيع الاحتمالي (على التجارب الفنية خادم)?

StackOverflow https://stackoverflow.com/questions/53786

سؤال

أنا أحاول أن أتمتة الاختبار الوظيفي من الخادم باستخدام واقعية تردد توزيع الطلبات.(نوع من اختبار الحمل نوع من المحاكاة)

لقد اختار Weibull توزيع "نوعا من" مباريات توزيع لقد لاحظت (سلالم بسرعة يسقط بسرعة ولكن ليس على الفور)

يمكنني استخدام هذا التوزيع إلى توليد عدد الطلبات التي يجب أن ترسل كل يوم بين بدء ونهاية التاريخ

لقد اخترق معا خوارزمية في بيثون هذا النوع من الأعمال لكنه يشعر kludgy:

how_many_days = (end_date - start_date).days
freqs = defaultdict(int)
for x in xrange(how_many_responses):
    freqs[int(how_many_days * weibullvariate(0.5, 2))] += 1
timeline = []
day = start_date
for i,freq in sorted(freqs.iteritems()):
    timeline.append((day, freq))
    day += timedelta(days=1)
return timeline

ما هي أفضل الطرق هناك أن تفعل هذا ؟

هل كانت مفيدة؟

المحلول

هذا هو سريع و ربما ليست دقيقة ، ولكن إذا كنت تحسب PDF نفسك, ثم على الأقل كنت تجعل من الأسهل وضع عدة أصغر/أكبر منها على جدول زمني واحد. dev هو الأمراض المنقولة جنسيا الانحراف في Guassian الضوضاء التي تسيطر على خشونة.لاحظ أن هذا هو لا "حق" وسيلة لتوليد ما تريد, ولكن من السهل.

import math
from datetime import datetime, timedelta, date
from random import gauss

how_many_responses = 1000
start_date = date(2008, 5, 1)
end_date = date(2008, 6, 1)
num_days = (end_date - start_date).days + 1
timeline = [start_date + timedelta(i) for i in xrange(num_days)]

def weibull(x, k, l):
    return (k / l) * (x / l)**(k-1) * math.e**(-(x/l)**k)

dev = 0.1
samples = [i * 1.25/(num_days-1) for i in range(num_days)]
probs = [weibull(i, 2, 0.5) for i in samples]
noise = [gauss(0, dev) for i in samples]
simdata = [max(0., e + n) for (e, n) in zip(probs, noise)]
events = [int(p * (how_many_responses / sum(probs))) for p in simdata]

histogram = zip(timeline, events)

print '\n'.join((d.strftime('%Y-%m-%d ') + "*" * c) for d,c in histogram)

نصائح أخرى

لماذا لا تحاول طاحونة 3 تحميل اختبار الملقم الخاص بك لأنه يأتي مع كل هذا و أكثر التي سبق إنشاؤها ، وأنها تدعم بايثون لغة برمجة

أطول قليلا ولكن ربما أكثر قابلية للقراءة إعادة صياغة آخر أربعة أسطر:

samples = [0 for i in xrange(how_many_days + 1)]
for s in xrange(how_many_responses):
    samples[min(int(how_many_days * weibullvariate(0.5, 2)), how_many_days)] += 1
histogram = zip(timeline, samples)
print '\n'.join((d.strftime('%Y-%m-%d ') + "*" * c) for d,c in histogram)

هذا دائما قطرات العينات داخل نطاق التاريخ, ولكن يمكنك الحصول على المقابلة عثرة في نهاية الجدول الزمني من جميع العينات التي هي فوق [0, 1] مجموعة.

بدلا من إعطاء عدد من طلبات قيمة ثابتة ، لماذا لا تستخدم عامل تحجيم بدلا من ذلك ؟ في هذه اللحظة كنت معالجة طلبات محدودة الكمية ، randomising أيام على تلك الطلبات الخريف.فإنه يبدو من المعقول أن تعامل طلبات يوميا مستقلة.

from datetime import *
from random import *

timeline = []
scaling = 10
start_date = date(2008, 5, 1)
end_date = date(2008, 6, 1)

num_days = (end_date - start_date).days + 1
days = [start_date + timedelta(i) for i in range(num_days)]
requests = [int(scaling * weibullvariate(0.5, 2)) for i in range(num_days)]
timeline = zip(days, requests)
timeline

لقد أعدت كتابة التعليمات البرمجية أعلاه إلى أن تكون أقصر (ولكن ربما فات غموض الآن؟)

timeline = (start_date + timedelta(days=days) for days in count(0))
how_many_days = (end_date - start_date).days
pick_a_day = lambda _:int(how_many_days * weibullvariate(0.5, 2))
days = sorted(imap(pick_a_day, xrange(how_many_responses)))
histogram = zip(timeline, (len(list(responses)) for day, responses in groupby(days)))
print '\n'.join((d.strftime('%Y-%m-%d ') + "*" * c) for d,c in histogram)

حل آخر هو استخدام Rpy, الذي يضع كل من قوة R (بما في ذلك الكثير من الأدوات التوزيعات) بسهولة في بيثون.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top