Я использую ipywidgets в классе для очистки набора данных. Используя вкладку вывода ipywidgets, я могу распечатать очищенный фрейм данных, но не могу получить доступ к возвращенной переменной фрейма данных (df_clean) в следующих ячейках кода. Я не уверен, чего здесь не хватает, провел день, исследуя...
from ipywidgets import Button
from IPython.display import display,clear_output
import pandas as pd
train = pd.read_csv('https://raw.githubusercontent.com/taknev83/datasets/master/credit_risk_train.csv')
class Clean_data():
def __init__(self, df):
self.df = df
def missing_value(self):
import pandas as pd
df_clean = self.df.copy(deep=True)
mis_val = widgets.Dropdown(
options = [('Yes', '1'), ('No', '2')],
value = '1',
description = 'Impute Missing Value',
style = {'description_width': 'initial'},
disabled=False)
display(mis_val)
button = widgets.Button(description = 'Run Impute')
out = widgets.Output()
def on_button_clicked(_):
with out:
clear_output()
if mis_val.value == '1':
categorical_cols = df_clean.select_dtypes('object').columns.to_list()
for col in categorical_cols:
df_clean[col].fillna(df_clean[col].mode()[0], inplace=True)
numeric_cols = df_clean.select_dtypes(['float64', 'int64']).columns.to_list()
for col in numeric_cols:
df_clean[col].fillna(df_clean[col].mean(), inplace=True)
# print(self.df) print is working
print('Completed imputation')
return df_clean # where to access this return dataframe?
if mis_val.value == '2':
return df_clean
button.on_click(on_button_clicked)
a = widgets.VBox([button, out])
display(a)
Я хотел бы получить доступ к df_clean в следующих ячейках кода для дальнейшего использования...
Спасибо, основная причина возврата df_clean
из метода on_button_clicked
заключается в том, чтобы получить df_clean после выбора варианта вменения и нажатия кнопки «Выполнить вменение». Если я верну df_clean
из функции missing_value
, она не будет ждать выбора пользователем выбора вменения и нажатия кнопки «Выполнить вменение», таким образом, как только метод missing_value
вызывается в ячейках ниже, он отображает df_clean
вместе с виджетами.
Ну вот,
Далее вы можете добавить свой utils.py или как вы хотите назвать этот модуль.
from ipywidgets import Button
import ipywidgets as widgets
from IPython.display import display,clear_output
import pandas as pd
train = pd.read_csv('https://raw.githubusercontent.com/taknev83/datasets/master/credit_risk_train.csv')
train.iloc[0, :] = pd.NA
train.isna().sum().sum()
class Clean_data():
def __init__(self, df):
self.df = df
def missing_value(self):
import pandas as pd
self.df = self.df.copy(deep=True)
mis_val = widgets.Dropdown(
options = [('Yes', '1'), ('No', '2')],
value = '1',
description = 'Impute Missing Value',
style = {'description_width': 'initial'},
disabled=False)
display(mis_val)
button = widgets.Button(description = 'Run Impute')
out = widgets.Output()
def on_button_clicked(_):
with out:
clear_output()
if mis_val.value == '1':
categorical_cols = self.df.select_dtypes('object').columns.to_list()
for col in categorical_cols:
self.df[col].fillna(self.df[col].mode()[0], inplace=True)
numeric_cols = self.df.select_dtypes(['float64', 'int64']).columns.to_list()
for col in numeric_cols:
self.df[col].fillna(self.df[col].mean(), inplace=True)
# print(self.df) print is working
print('Completed imputation')
return self.df # where to access this return dataframe?
if mis_val.value == '2':
return self.df
button.on_click(on_button_clicked)
a = widgets.VBox([button, out])
display(a)
В блокноте, куда вы хотите импортировать, вы можете сделать следующее:
from utils import *
# include some NAs just for testing the functionality
train.iloc[0, :] = pd.NA
print(train.isna().sum().sum()) # should print 21
# call the cleaning functionality
c = Clean_data(train)
c.missing_value()
# another check
print(c.df.isna().sum().sum()) # should be 0
Надеюсь, это решит вашу проблему.
Большое спасибо, это отлично работает в том же блокноте. Но когда я импортирую этот файл .py и этот класс Clean_data в другую записную книжку, я не могу получить доступ к определенной глобальной переменной df_clean в новой среде записной книжки... любые предложения...
Я согласен с комментарием @WBM. Использование глобальной переменной не является хорошей практикой программирования. Скорее верните его из функции.
Спасибо, основной причиной возврата df_clean из метода on_button_clicked является получение df_clean после выбора варианта вменения и нажатия кнопки Run Impute. Если я верну df_clean из функцииmissing_value, он не будет ждать выбора пользователем выбора вменения и нажатия кнопки Run вменения, таким образом, как только в ячейках ниже вызывается методmissing_value, он отображает df_clean вместе с виджетами, любые предложения...
На самом деле вам вообще не нужны никакие глобальные переменные. Вы можете инкапсулировать все в самом классе. Я изменил свой ответ.
затем
return df_clean
из функцииmissing_value
или установите ее в переменную классаself.df_clean = df_clean
(рекомендуется первое)