У меня есть родительский класс с декорированными функциями.
import pandas as pd
import ctypes
import sec1_data_preparation as data_prep
import sec2_prepped_data_import as prepped_data_import
# Main class
######################################################################
class Analysis_ProjectX(data_prep.DataPreparation_ProjectX):
def __init__(self):
super()
# Working/processed df; can overwrite
self.df_dad_processed = None
self.df_pc_processed = None
self.df_nacrs_processed = None
self.df_pin_processed = None
self.df_reg_processed = None
# Subject group holder
self.df_master_filtered = None
# Display parameters
self.numerical_value_counts_n = 5
self.categorical_value_counts_n = 5
# Decorator function
def result_decor(func):
def print_result(self, df_key, df, var_name):
print ('/////////////////////////////////////////')
print ('/////////////////////////////////////////')
func(self, df_key, df, var_name)
print ('/////////////////////////////////////////')
print ('/////////////////////////////////////////'+'\n')
return print_result
@result_decor
def descriptive_num_var_results(self, df_key, df, var_name):
print ('Dataset name: {}'.format(df_key))
print ('{}, mean: {}'.format(var_name, df[var_name].mean()))
print ('{}, std: {}'.format(var_name, df[var_name].std()))
print ('{}, min: {}'.format(var_name, df[var_name].min()))
print ('{}, max: {}'.format(var_name, df[var_name].max()))
print ('{}, percentiles:\n{}'.format(var_name, str(df[var_name].quantile([.25, .5, .75]))))
print ('{}, value counts:\n{}'.format(var_name, str(df[var_name].value_counts().head(self.numerical_value_counts_n))))
@result_decor
def descriptive_cat_var_results(self, df_key, df, var_name):
print ('Dataset name: {}'.format(df_key))
print ('{}, value counts (n):\n{}'.format(
var_name,
str(df[var_name].value_counts().sort_index().head(self.categorical_value_counts_n)),
))
print ('{}, value counts (%):\n{}'.format(
var_name,
str(df[var_name].value_counts().sort_index().head(self.categorical_value_counts_n)*100/len(df)),
))
Вот унаследованный класс
import pandas as pd
import ctypes
import sec1_data_preparation as data_prep
import sec2_prepped_data_import as prepped_data_import
import sec4_analysis as analysis
# Main class
######################################################################
class Analysis_ProjectX_Demographic(analysis.Analysis_ProjectX):
def __init__(self):
super()
def demographic_analytic_steps(self):
self.import_parent_ref_data()
self.import_master_data()
self.recategorize_var()
self.show_result()
def recategorize_var(self):
self.df_master_filtered = self.recat_binary(self.df_master_filtered, 'INDEX_RURAL', 'INDEX_RURAL_CAT', 0, 'URBAN', 1, 'RURAL')
self.df_master_filtered = self.recat_age(self.df_master_filtered, 'INDEX_AGE', 'INDEX_AGE_CAT')
def show_result(self):
df_dict = {
'TxGroup':self.df_master_filtered,
}
for df_key, df in df_dict.items():
print ('Dataset name: {}'.format(df_key))
print ('Unique patients, n: {}'.format(df['PHN_ENC'].nunique()))
self.descriptive_num_var_results(df_key, df, 'INDEX_AGE')
self.descriptive_cat_var_results(df_key, df, 'INDEX_AGE_CAT')
self.descriptive_cat_var_results(df_key, df, 'INDEX_RURAL_CAT')
self.descriptive_cat_var_results(df_key, df, 'INDEX_SEX')
# Helper functions
def recat_binary(self, df, old_var, new_var, old_val1, new_val1, old_val2, new_val2):
df.loc[df[old_var] == old_val1, new_var] = new_val1
df.loc[df[old_var] == old_val2, new_var] = new_val2
return df
def recat_age(self, df, old_var, new_var):
df.loc[(df[old_var]>=19.00)&(df[old_var]<25.00), new_var] = '19-24'
df.loc[(df[old_var]>=25.00)&(df[old_var]<30.00), new_var] = '25-29'
df.loc[(df[old_var]>=30.00)&(df[old_var]<35.00), new_var] = '30-34'
df.loc[(df[old_var]>=35.00)&(df[old_var]<40.00), new_var] = '35-39'
df.loc[(df[old_var]>=40.00)&(df[old_var]<45.00), new_var] = '40-44'
df.loc[(df[old_var]>=45.00)&(df[old_var]<50.00), new_var] = '45-49'
df.loc[(df[old_var]>=50.00)&(df[old_var]<55.00), new_var] = '50-54'
df.loc[(df[old_var]>=55.00)&(df[old_var]<60.00), new_var] = '55-59'
df.loc[(df[old_var]>=60.00)&(df[old_var]<65.00), new_var] = '60-64'
df.loc[(df[old_var]>=65.00)&(df[old_var]<300.00), new_var] = '65/above'
return df
x = Analysis_ProjectX_Demographic()
x.demographic_analytic_steps()
print(len(x.df_master_filtered))
print(x.df_master_filtered.head())
Ошибка в функции self.show_result()
следующая
descriptive_num_var_results
print ('{}, value counts:\n{}'.format(var_name, str(df[var_name].value_counts().head(self.numerical_value_counts_n))))
AttributeError: 'Analysis_Jahip_Demographic' object has no attribute 'numerical_value_counts_n'
Если я объявлю self.numerical_value_counts_n
и self.numerical_value_counts_n
в дочернем классе, это нормально. И если я удалю эти атрибуты из родительского класса в глобальные переменные, это тоже нормально.
Как я могу сделать их атрибутами родительского класса и использовать его в текущем намерении дочернего класса?