اذهب إلى المحتوى

السؤال

نشر

السلام عليكم

ده الكود

class ConditionalProbability:

    def __int__(self,col1,col2):
        self.column_name1 = col1
        self.column_name2 = col2
        
    def average(self): 
        condition = data_train[self.col1] > data_train[self.col1].mean()
        subset = data_train[condition][self.column_name2]
        self.mu,self.sigma = np.mean(subset),np.std(subset)
        return self.mu,self.sigma
    
    def distribution_values(self):
        x = np.linspace(self.mu - 4*self.sigma, self.mu + 4 *self.sigma,100)
        pdf = scipy.stats.norm.pdf(x,self.mu,self.sigma)
        p_conditional = 1 - scipy.stats.norm.cdf
        return x,pdf,p_conditional
    
    def plot(self):
        x,pdf,p_conditional = self.distribution_values()
        plt.figure(figsize=(8,5))
        plt.plot(x, pdf, label=f'Distribution of {self.col2} (given {self.col1} > mean)')
        plt.fill_between(x, pdf, where=(x > 0), color='orange', alpha=0.4,
                 label=f'Area where returns > 0\nP = {p_conditional:.3f}')
        plt.axvline(0, color='red', linestyle='--', label='return = 0')
        plt.title('Conditional Probability Visualization')
        plt.xlabel('Forward Returns')
        plt.ylabel('Density')
        plt.legend()
        plt.show()    

وده الخطاء 

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
/tmp/ipykernel_36/4033021502.py in <cell line: 0>()
      1 v1 = ConditionalProbability('V1','forward_returns')
----> 2 v1.plot()

/tmp/ipykernel_36/3439074975.py in plot(self)
     20 
     21     def plot(self):
---> 22         x,pdf,p_conditional = self.distribution_values()
     23         plt.figure(figsize=(8,5))
     24         plt.plot(x, pdf, label=f'Distribution of {self.col2} (given {self.col1} > mean)')

/tmp/ipykernel_36/3439074975.py in distribution_values(self)
     13 
     14     def distribution_values(self):
---> 15         x = np.linspace(self.mu - 4*self.sigma, self.mu + 4 *self.sigma,100)
     16         pdf = scipy.stats.norm.pdf(x,self.mu,self.sigma)
     17         p_conditional = 1 - scipy.stats.norm.cdf(0,self.mu,self.sigma)

AttributeError: 'ConditionalProbability' object has no attribute 'mu'

 

Recommended Posts

  • 0
نشر

لديك خطأ في كتابة __init__ حيث كتبت __int__ بدلا من __init__، وهذا يعني أن الـ constructor لم يتم تنفيذه أبداً، و أيضا لم تستدع الدالة average() التي تحسب قيم mu و sigma، لذلك هذه الـ attributes غير موجودة عند استدعاء distribution_values().

و أيضا استخدمت self.col1 و self.col2 في بعض الأماكن بينما عرفت self.column_name1 و self.column_name2. لذا أرجوا تصحيح هذه الأخطاء و التجربة مرة أخرى.

  • 0
نشر

 في دالة distribution_values تستخدم المتغير self.mu لكن لم يتم إنشاؤه أو تعيين قيمة له بعد في الكائن v1، فعند تنفيذ v1.plot() يتم استدعاء دالة self.distribution_values() كأول خطوة.

ثم دالة distribution_values تعمل على تنفيذ x = np.linspace(self.mu - 4*self.sigma   وهي هنا تحتاج إلى قيمة للمتغيرين self.mu و self.sigma.

والمكان الوحيد الذي يتم فيه إنشاء هذين المتغيرين هو داخل دالة average()، لكن لم تقم باستدعاء دالة average() قبل استدعاء دالة plot()، يجب استدعائها.

كذلك يوجد خطأ إملائي في الدالة البانية __init__ حيث كتبت __int__ وبالتالي لن تعمل ولن يتم تعيين self.column_name1 و self.column_name2.

وفي دالة average استخدمت self.col1 بينما في الدالة البانية استخدمت self.column_name1، فيجب توحيد الاسم.

وحساب الاحتمال الشرطي غير مكتمل، فهنا p_conditional = 1 - scipy.stats.norm.cdf غير صحيح، فلم تقم باستدعاء الدالة cdf مع معاملاتها، يجب أن تكون p_conditional = 1 - scipy.stats.norm.cdf(0, self.mu, self.sigma

ويوجد عدم تطابق أسماء المتغيرات في دالة plot حيث تستخدم self.col1 و self.col2 بينما يجب أن تكون self.column_name1 و self.column_name2.

import numpy as np
import scipy.stats
import matplotlib.pyplot as plt
import pandas as pd

data_train = pd.DataFrame({
    'V1': np.random.randn(1000),
    'forward_returns': np.random.randn(1000) * 0.02
})


class ConditionalProbability:

    def __init__(self, col1, col2):
        self.column_name1 = col1
        self.column_name2 = col2
        
    def average(self): 
        condition = data_train[self.column_name1] > data_train[self.column_name1].mean()
        subset = data_train[condition][self.column_name2]
        self.mu, self.sigma = np.mean(subset), np.std(subset)
        return self.mu, self.sigma
    
    def distribution_values(self):
        x = np.linspace(self.mu - 4 * self.sigma, self.mu + 4 * self.sigma, 100)
        pdf = scipy.stats.norm.pdf(x, self.mu, self.sigma)
        p_conditional = 1 - scipy.stats.norm.cdf(0, self.mu, self.sigma)
        return x, pdf, p_conditional
    
    def plot(self):
        self.average()
        
        x, pdf, p_conditional = self.distribution_values()
        
        plt.figure(figsize=(8, 5))
        
        plt.plot(x, pdf, label=f'Distribution of {self.column_name2} (given {self.column_name1} > mean)')
        plt.fill_between(x, pdf, where=(x > 0), color='orange', alpha=0.4,
                         label=f'Area where returns > 0\nP = {p_conditional:.3f}')
        plt.axvline(0, color='red', linestyle='--', label='return = 0')
        plt.title('Conditional Probability Visualization')
        plt.xlabel('Forward Returns')
        plt.ylabel('Density')
        plt.legend()
        plt.show()

 

  • 0
نشر

المتغيرين self.mu و self.sigma غير موجودين داخل الكائن وقت استدعاء plot()، في الكود الدالة distribution_values() تعتمد على:

self.mu, self.sigma لكن هذان المتغيران لا يتم إنشاؤهما إلا داخل الدالة average()، أي أنّك لم تستدع average() قبل أن تستدعي plot()، ولهذا السبب لم يتم تعريف self.mu و self.sigma.

و أيضا في الـ constructor عندك خطأ مطبعي:

def __int__(self, col1, col2):

يجب أن تكون:

def __init__(self, col1, col2):

لأنّ __int__ تستخدم للتحويل إلى عدد صحيح، بينما __init__ هي دالة التهيئة.

و أيضا في بعض الأماكن كتبت self.col1، وفي أخرى self.column_name1.
يجب أن توحدها.

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...