سؤال
أقوم بكتابة برنامج لمحاكاة بيانات الاستطلاع الفعلية التي تنشرها شركات مثل Gallup أو Rasmussen يوميًا:www.gallup.com و www.rassmussenreports.com
أنا أستخدم طريقة القوة الغاشمة، حيث يقوم الكمبيوتر بإنشاء بعض بيانات الاقتراع العشوائية اليومية ثم يقوم بحساب متوسطات ثلاثة أيام لمعرفة ما إذا كان متوسط البيانات العشوائية يتطابق مع أرقام منظمي الاستطلاع.(أرقام استطلاعات معظم الشركات هي متوسطات ثلاثة أيام)
حاليًا، يعمل بشكل جيد لتكرار واحد، لكن هدفي هو جعله ينتج المحاكاة الأكثر شيوعًا التي تتطابق مع متوسط بيانات الاقتراع.يمكنني بعد ذلك تغيير الكود في أي مكان من 1 إلى 1000 تكرار.
وهذه هي مشكلتي.في نهاية الاختبار لدي مصفوفة في متغير واحد يبدو كالتالي:
[40.1, 39.4, 56.7, 60.0, 20.0 ..... 19.0]
وينتج البرنامج حاليًا مصفوفة واحدة لكل محاكاة صحيحة. يمكنني تخزين كل مصفوفة في متغير واحد، لكن يجب أن يكون لدي برنامج يمكنه إنشاء من 1 إلى 1000 متغير اعتمادًا على عدد التكرارات التي طلبتها!؟
كيف أتجنب هذا؟أعلم أن هناك طريقة ذكية للقيام بذلك لا تتطلب من البرنامج إنشاء متغيرات لتخزين المصفوفات اعتمادًا على عدد عمليات المحاكاة التي أريدها.
اختبار الكود لماكين:
test = []
while x < 5:
test = round(100*random.random())
mctest.append(test)
x = x +1
mctestavg = (mctest[0] + mctest[1] + mctest[2])/3
#mcavg is real data
if mctestavg == mcavg[2]:
mcwork = mctest
كيف أكرر دون إنشاء عدة mcwork vars؟
المحلول
هل سيعمل شيء مثل هذا؟
from random import randint
mcworks = []
for n in xrange(NUM_ITERATIONS):
mctest = [randint(0, 100) for i in xrange(5)]
if sum(mctest[:3])/3 == mcavg[2]:
mcworks.append(mctest) # mcavg is real data
في النهاية، تبقى لك قائمة صالحة mctest
القوائم.
ما قمت بتغييره:
- استخدمت قائمة الفهم لبناء البيانات بدلاً من حلقة for
- مستخدم
random.randint
للحصول على أعداد صحيحة عشوائية - مستخدم شرائح و
sum
لحساب متوسط العناصر الثلاثة الأولى - (للإجابة على سؤالك الفعلي :-)) ) ضع النتائج في قائمة
mcworks
, ، بدلاً من إنشاء متغير جديد لكل تكرار
نصائح أخرى
هل تتحدث عن فعل هذا؟
>>> a = [ ['a', 'b'], ['c', 'd'] ]
>>> a[1]
['c', 'd']
>>> a[1][1]
'd'
يمكن أن تحتوي القوائم في لغة بايثون على أي نوع من الكائنات - إذا فهمت السؤال بشكل صحيح، فهل سيتمكن أ list
ل list
هل تقوم بهذه المهمة؟شيء من هذا القبيل (على افتراض أن لديك وظيفة generate_poll_data()
الذي ينشئ بياناتك:
data = []
for in xrange(num_iterations):
data.append(generate_poll_data())
ثم، data[n]
ستكون قائمة البيانات من (n-1)
المدى العاشر.
منذ أن كنت تفكر في المتغيرات, ، قد تفضل القاموس على قائمة القوائم:
data = {}
data['a'] = [generate_poll_data()]
data['b'] = [generate_poll_data()]
إلخ.
سأفكر بشدة في استخدام NumPy لفعل هذا.يمكنك الحصول على صفائف N-الأبعاد فعالة يمكنك معالجتها بسرعة وسهولة.
إحدى الطرق الرائعة للقيام بذلك هي استخدام قائمة من القوائم مع Pandas.ثم يمكنك إنشاء متوسط متجدد لمدة 3 أيام.وهذا يجعل من السهل البحث في النتائج عن طريق إضافة النتائج الحقيقية كعمود آخر، واستخدام وظيفة loc للعثور على النتائج المطابقة.
rand_vals = [randint(0, 100) for i in range(5))]
df = pd.DataFrame(data=rand_vals, columns=['generated data'])
df['3 day avg'] = df['generated data'].rolling(3).mean()
df['mcavg'] = mcavg # the list of real data
# Extract the resulting list of values
res = df.loc[df['3 day avg'] == df['mcavg']]['3 day avg'].values
يعد هذا أيضًا أمرًا رائعًا إذا كنت تنوي استخدام نفس القيم العشوائية لاستطلاعات/أشخاص مختلفين، فما عليك سوى إضافة عمود آخر بقيمهم الحقيقية وإجراء نفس البحث عنهم.