We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
[BUG] TrainTestFeatureDrift doesn't display anything for dataframe data
**Describe the bug**
When running the check on naïve iris dataframe, we get no display at all, rather than a display showing the exact same distribution which will happen if constructing a Dataset from the dataframe prior.

**To Reproduce**

```
import pandas as pd
from deepchecks.tabular.dataset import Dataset
from deepchecks.tabular.checks import TrainTestFeatureDrift

iris = pd.read_csv('https://raw.githubusercontent.com/mwaskom/seaborn-data/master/iris.csv')
TrainTestFeatureDrift().run(iris, iris)

ds = Dataset(iris)
TrainTestFeatureDrift().run(ds , ds )

```

**Expected behavior**
Exact same behavior for the two cases. 

**Screenshots**
![image](https://user-images.githubusercontent.com/17730502/160836976-ca1b04df-6627-4c58-b634-9ddcc0575690.png)


--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `deepchecks/tabular/checks/distribution/whole_dataset_drift.py`
Content:
```
1 # ----------------------------------------------------------------------------
2 # Copyright (C) 2021-2022 Deepchecks (https://www.deepchecks.com)
3 #
4 # This file is part of Deepchecks.
5 # Deepchecks is distributed under the terms of the GNU Affero General
6 # Public License (version 3 or later).
7 # You should have received a copy of the GNU Affero General Public License
8 # along with Deepchecks.  If not, see <http://www.gnu.org/licenses/>.
9 # ----------------------------------------------------------------------------
10 #
11 """Module contains the domain classifier drift check."""
12 from deepchecks.core import CheckResult, ConditionResult, ConditionCategory
13 from deepchecks.tabular import Context, TrainTestCheck
14 from deepchecks.core.check_utils.whole_dataset_drift_utils import run_whole_dataset_drift
15 from deepchecks.utils.strings import format_number
16 
17 __all__ = ['WholeDatasetDrift']
18 
19 
20 class WholeDatasetDrift(TrainTestCheck):
21     """
22     Calculate drift between the entire train and test datasets using a model trained to distinguish between them.
23 
24     Check fits a new model to distinguish between train and test datasets, called a Domain Classifier.
25     Once the Domain Classifier is fitted the check calculates the feature importance for the domain classifier
26     model. The result of the check is based on the AUC of the domain classifier model, and the check displays
27     the change in distribution between train and test for the top features according to the
28     calculated feature importance.
29 
30     Parameters
31     ----------
32     n_top_columns : int , default: 3
33         Amount of columns to show ordered by domain classifier feature importance. This limit is used together
34         (AND) with min_feature_importance, so less than n_top_columns features can be displayed.
35     min_feature_importance : float , default: 0.05
36         Minimum feature importance to show in the check display. Feature importance
37         sums to 1, so for example the default value of 0.05 means that all features with importance contributing
38         less than 5% to the predictive power of the Domain Classifier won't be displayed. This limit is used
39         together (AND) with n_top_columns, so features more important than min_feature_importance can be
40         hidden.
41     max_num_categories : int , default: 10
42         Only for categorical columns. Max number of categories to display in distributio plots. If there are
43         more, they are binned into an "Other" category in the display. If max_num_categories=None, there is
44         no limit.
45     sample_size : int , default: 10_000
46         Max number of rows to use from each dataset for the training and evaluation of the domain classifier.
47     random_state : int , default: 42
48         Random seed for the check.
49     test_size : float , default: 0.3
50         Fraction of the combined datasets to use for the evaluation of the domain classifier.
51     min_meaningful_drift_score : float , default 0.05
52         Minimum drift score for displaying drift in check. Under that score, check will display "nothing found".
53     """
54 
55     def __init__(
56             self,
57             n_top_columns: int = 3,
58             min_feature_importance: float = 0.05,
59             max_num_categories: int = 10,
60             sample_size: int = 10_000,
61             random_state: int = 42,
62             test_size: float = 0.3,
63             min_meaningful_drift_score: float = 0.05,
64             **kwargs
65     ):
66         super().__init__(**kwargs)
67 
68         self.n_top_columns = n_top_columns
69         self.min_feature_importance = min_feature_importance
70         self.max_num_categories = max_num_categories
71         self.sample_size = sample_size
72         self.random_state = random_state
73         self.test_size = test_size
74         self.min_meaningful_drift_score = min_meaningful_drift_score
75 
76     def run_logic(self, context: Context) -> CheckResult:
77         """Run check.
78 
79         Returns
80         -------
81         CheckResult
82             value: dictionary containing the domain classifier auc and a dict of column name to its feature
83             importance as calculated for the domain classifier model.
84             display: distribution graph for each column for the columns most explaining the dataset difference,
85             comparing the train and test distributions.
86 
87         Raises
88         ------
89         DeepchecksValueError
90             If the object is not a Dataset or DataFrame instance
91         """
92         train_dataset = context.train
93         test_dataset = context.test
94         features = train_dataset.features
95         cat_features = train_dataset.cat_features
96         numerical_features = train_dataset.numerical_features
97 
98         sample_size = min(self.sample_size, train_dataset.n_samples, test_dataset.n_samples)
99 
100         headnote = """
101         <span>
102         The shown features are the features that are most important for the domain classifier - the
103         domain_classifier trained to distinguish between the train and test datasets.<br>
104         </span>
105         """
106 
107         values_dict, displays = run_whole_dataset_drift(train_dataframe=train_dataset.data[features],
108                                                         test_dataframe=test_dataset.data[features],
109                                                         numerical_features=numerical_features,
110                                                         cat_features=cat_features,
111                                                         sample_size=sample_size, random_state=self.random_state,
112                                                         test_size=self.test_size, n_top_columns=self.n_top_columns,
113                                                         min_feature_importance=self.min_feature_importance,
114                                                         max_num_categories=self.max_num_categories,
115                                                         min_meaningful_drift_score=self.min_meaningful_drift_score)
116 
117         if displays:
118             displays.insert(0, headnote)
119 
120         return CheckResult(value=values_dict, display=displays, header='Whole Dataset Drift')
121 
122     def add_condition_overall_drift_value_not_greater_than(self, max_drift_value: float = 0.25):
123         """Add condition.
124 
125         Overall drift score, calculated as (2 * AUC - 1) for the AUC of the dataset discriminator model, is not greater
126         than the specified value. This value is used as it scales the AUC value to the range [0, 1], where 0 indicates
127         a random model (and no drift) and 1 indicates a perfect model (and completely distinguishable datasets).
128 
129         Parameters
130         ----------
131         max_drift_value : float , default: 0.25
132             Maximal drift value allowed (value 0 and above)
133         """
134 
135         def condition(result: dict):
136             drift_score = result['domain_classifier_drift_score']
137             if drift_score > max_drift_value:
138                 message = f'Found drift value of: {format_number(drift_score)}, corresponding to a domain classifier ' \
139                           f'AUC of: {format_number(result["domain_classifier_auc"])}'
140                 return ConditionResult(ConditionCategory.FAIL, message)
141             else:
142                 return ConditionResult(ConditionCategory.PASS)
143 
144         return self.add_condition(f'Drift value is not greater than {format_number(max_drift_value)}',
145                                   condition)
146
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/deepchecks/tabular/checks/distribution/whole_dataset_drift.py b/deepchecks/tabular/checks/distribution/whole_dataset_drift.py
--- a/deepchecks/tabular/checks/distribution/whole_dataset_drift.py
+++ b/deepchecks/tabular/checks/distribution/whole_dataset_drift.py
@@ -91,7 +91,6 @@
         """
         train_dataset = context.train
         test_dataset = context.test
-        features = train_dataset.features
         cat_features = train_dataset.cat_features
         numerical_features = train_dataset.numerical_features
 
@@ -104,8 +103,8 @@
         </span>
         """
 
-        values_dict, displays = run_whole_dataset_drift(train_dataframe=train_dataset.data[features],
-                                                        test_dataframe=test_dataset.data[features],
+        values_dict, displays = run_whole_dataset_drift(train_dataframe=train_dataset.features_columns,
+                                                        test_dataframe=test_dataset.features_columns,
                                                         numerical_features=numerical_features,
                                                         cat_features=cat_features,
                                                         sample_size=sample_size, random_state=self.random_state,

{"golden_diff": "diff --git a/deepchecks/tabular/checks/distribution/whole_dataset_drift.py b/deepchecks/tabular/checks/distribution/whole_dataset_drift.py\n--- a/deepchecks/tabular/checks/distribution/whole_dataset_drift.py\n+++ b/deepchecks/tabular/checks/distribution/whole_dataset_drift.py\n@@ -91,7 +91,6 @@\n         \"\"\"\n         train_dataset = context.train\n         test_dataset = context.test\n-        features = train_dataset.features\n         cat_features = train_dataset.cat_features\n         numerical_features = train_dataset.numerical_features\n \n@@ -104,8 +103,8 @@\n         </span>\n         \"\"\"\n \n-        values_dict, displays = run_whole_dataset_drift(train_dataframe=train_dataset.data[features],\n-                                                        test_dataframe=test_dataset.data[features],\n+        values_dict, displays = run_whole_dataset_drift(train_dataframe=train_dataset.features_columns,\n+                                                        test_dataframe=test_dataset.features_columns,\n                                                         numerical_features=numerical_features,\n                                                         cat_features=cat_features,\n                                                         sample_size=sample_size, random_state=self.random_state,\n", "issue": "[BUG] TrainTestFeatureDrift doesn't display anything for dataframe data\n**Describe the bug**\r\nWhen running the check on na\u00efve iris dataframe, we get no display at all, rather than a display showing the exact same distribution which will happen if constructing a Dataset from the dataframe prior.\r\n\r\n**To Reproduce**\r\n\r\n```\r\nimport pandas as pd\r\nfrom deepchecks.tabular.dataset import Dataset\r\nfrom deepchecks.tabular.checks import TrainTestFeatureDrift\r\n\r\niris = pd.read_csv('https://raw.githubusercontent.com/mwaskom/seaborn-data/master/iris.csv')\r\nTrainTestFeatureDrift().run(iris, iris)\r\n\r\nds = Dataset(iris)\r\nTrainTestFeatureDrift().run(ds , ds )\r\n\r\n```\r\n\r\n**Expected behavior**\r\nExact same behavior for the two cases. \r\n\r\n**Screenshots**\r\n![image](https://user-images.githubusercontent.com/17730502/160836976-ca1b04df-6627-4c58-b634-9ddcc0575690.png)\r\n\n", "before_files": [{"content": "# ----------------------------------------------------------------------------\n# Copyright (C) 2021-2022 Deepchecks (https://www.deepchecks.com)\n#\n# This file is part of Deepchecks.\n# Deepchecks is distributed under the terms of the GNU Affero General\n# Public License (version 3 or later).\n# You should have received a copy of the GNU Affero General Public License\n# along with Deepchecks.  If not, see <http://www.gnu.org/licenses/>.\n# ----------------------------------------------------------------------------\n#\n\"\"\"Module contains the domain classifier drift check.\"\"\"\nfrom deepchecks.core import CheckResult, ConditionResult, ConditionCategory\nfrom deepchecks.tabular import Context, TrainTestCheck\nfrom deepchecks.core.check_utils.whole_dataset_drift_utils import run_whole_dataset_drift\nfrom deepchecks.utils.strings import format_number\n\n__all__ = ['WholeDatasetDrift']\n\n\nclass WholeDatasetDrift(TrainTestCheck):\n    \"\"\"\n    Calculate drift between the entire train and test datasets using a model trained to distinguish between them.\n\n    Check fits a new model to distinguish between train and test datasets, called a Domain Classifier.\n    Once the Domain Classifier is fitted the check calculates the feature importance for the domain classifier\n    model. The result of the check is based on the AUC of the domain classifier model, and the check displays\n    the change in distribution between train and test for the top features according to the\n    calculated feature importance.\n\n    Parameters\n    ----------\n    n_top_columns : int , default: 3\n        Amount of columns to show ordered by domain classifier feature importance. This limit is used together\n        (AND) with min_feature_importance, so less than n_top_columns features can be displayed.\n    min_feature_importance : float , default: 0.05\n        Minimum feature importance to show in the check display. Feature importance\n        sums to 1, so for example the default value of 0.05 means that all features with importance contributing\n        less than 5% to the predictive power of the Domain Classifier won't be displayed. This limit is used\n        together (AND) with n_top_columns, so features more important than min_feature_importance can be\n        hidden.\n    max_num_categories : int , default: 10\n        Only for categorical columns. Max number of categories to display in distributio plots. If there are\n        more, they are binned into an \"Other\" category in the display. If max_num_categories=None, there is\n        no limit.\n    sample_size : int , default: 10_000\n        Max number of rows to use from each dataset for the training and evaluation of the domain classifier.\n    random_state : int , default: 42\n        Random seed for the check.\n    test_size : float , default: 0.3\n        Fraction of the combined datasets to use for the evaluation of the domain classifier.\n    min_meaningful_drift_score : float , default 0.05\n        Minimum drift score for displaying drift in check. Under that score, check will display \"nothing found\".\n    \"\"\"\n\n    def __init__(\n            self,\n            n_top_columns: int = 3,\n            min_feature_importance: float = 0.05,\n            max_num_categories: int = 10,\n            sample_size: int = 10_000,\n            random_state: int = 42,\n            test_size: float = 0.3,\n            min_meaningful_drift_score: float = 0.05,\n            **kwargs\n    ):\n        super().__init__(**kwargs)\n\n        self.n_top_columns = n_top_columns\n        self.min_feature_importance = min_feature_importance\n        self.max_num_categories = max_num_categories\n        self.sample_size = sample_size\n        self.random_state = random_state\n        self.test_size = test_size\n        self.min_meaningful_drift_score = min_meaningful_drift_score\n\n    def run_logic(self, context: Context) -> CheckResult:\n        \"\"\"Run check.\n\n        Returns\n        -------\n        CheckResult\n            value: dictionary containing the domain classifier auc and a dict of column name to its feature\n            importance as calculated for the domain classifier model.\n            display: distribution graph for each column for the columns most explaining the dataset difference,\n            comparing the train and test distributions.\n\n        Raises\n        ------\n        DeepchecksValueError\n            If the object is not a Dataset or DataFrame instance\n        \"\"\"\n        train_dataset = context.train\n        test_dataset = context.test\n        features = train_dataset.features\n        cat_features = train_dataset.cat_features\n        numerical_features = train_dataset.numerical_features\n\n        sample_size = min(self.sample_size, train_dataset.n_samples, test_dataset.n_samples)\n\n        headnote = \"\"\"\n        <span>\n        The shown features are the features that are most important for the domain classifier - the\n        domain_classifier trained to distinguish between the train and test datasets.<br>\n        </span>\n        \"\"\"\n\n        values_dict, displays = run_whole_dataset_drift(train_dataframe=train_dataset.data[features],\n                                                        test_dataframe=test_dataset.data[features],\n                                                        numerical_features=numerical_features,\n                                                        cat_features=cat_features,\n                                                        sample_size=sample_size, random_state=self.random_state,\n                                                        test_size=self.test_size, n_top_columns=self.n_top_columns,\n                                                        min_feature_importance=self.min_feature_importance,\n                                                        max_num_categories=self.max_num_categories,\n                                                        min_meaningful_drift_score=self.min_meaningful_drift_score)\n\n        if displays:\n            displays.insert(0, headnote)\n\n        return CheckResult(value=values_dict, display=displays, header='Whole Dataset Drift')\n\n    def add_condition_overall_drift_value_not_greater_than(self, max_drift_value: float = 0.25):\n        \"\"\"Add condition.\n\n        Overall drift score, calculated as (2 * AUC - 1) for the AUC of the dataset discriminator model, is not greater\n        than the specified value. This value is used as it scales the AUC value to the range [0, 1], where 0 indicates\n        a random model (and no drift) and 1 indicates a perfect model (and completely distinguishable datasets).\n\n        Parameters\n        ----------\n        max_drift_value : float , default: 0.25\n            Maximal drift value allowed (value 0 and above)\n        \"\"\"\n\n        def condition(result: dict):\n            drift_score = result['domain_classifier_drift_score']\n            if drift_score > max_drift_value:\n                message = f'Found drift value of: {format_number(drift_score)}, corresponding to a domain classifier ' \\\n                          f'AUC of: {format_number(result[\"domain_classifier_auc\"])}'\n                return ConditionResult(ConditionCategory.FAIL, message)\n            else:\n                return ConditionResult(ConditionCategory.PASS)\n\n        return self.add_condition(f'Drift value is not greater than {format_number(max_drift_value)}',\n                                  condition)\n", "path": "deepchecks/tabular/checks/distribution/whole_dataset_drift.py"}], "after_files": [{"content": "# ----------------------------------------------------------------------------\n# Copyright (C) 2021-2022 Deepchecks (https://www.deepchecks.com)\n#\n# This file is part of Deepchecks.\n# Deepchecks is distributed under the terms of the GNU Affero General\n# Public License (version 3 or later).\n# You should have received a copy of the GNU Affero General Public License\n# along with Deepchecks.  If not, see <http://www.gnu.org/licenses/>.\n# ----------------------------------------------------------------------------\n#\n\"\"\"Module contains the domain classifier drift check.\"\"\"\nfrom deepchecks.core import CheckResult, ConditionResult, ConditionCategory\nfrom deepchecks.tabular import Context, TrainTestCheck\nfrom deepchecks.core.check_utils.whole_dataset_drift_utils import run_whole_dataset_drift\nfrom deepchecks.utils.strings import format_number\n\n__all__ = ['WholeDatasetDrift']\n\n\nclass WholeDatasetDrift(TrainTestCheck):\n    \"\"\"\n    Calculate drift between the entire train and test datasets using a model trained to distinguish between them.\n\n    Check fits a new model to distinguish between train and test datasets, called a Domain Classifier.\n    Once the Domain Classifier is fitted the check calculates the feature importance for the domain classifier\n    model. The result of the check is based on the AUC of the domain classifier model, and the check displays\n    the change in distribution between train and test for the top features according to the\n    calculated feature importance.\n\n    Parameters\n    ----------\n    n_top_columns : int , default: 3\n        Amount of columns to show ordered by domain classifier feature importance. This limit is used together\n        (AND) with min_feature_importance, so less than n_top_columns features can be displayed.\n    min_feature_importance : float , default: 0.05\n        Minimum feature importance to show in the check display. Feature importance\n        sums to 1, so for example the default value of 0.05 means that all features with importance contributing\n        less than 5% to the predictive power of the Domain Classifier won't be displayed. This limit is used\n        together (AND) with n_top_columns, so features more important than min_feature_importance can be\n        hidden.\n    max_num_categories : int , default: 10\n        Only for categorical columns. Max number of categories to display in distributio plots. If there are\n        more, they are binned into an \"Other\" category in the display. If max_num_categories=None, there is\n        no limit.\n    sample_size : int , default: 10_000\n        Max number of rows to use from each dataset for the training and evaluation of the domain classifier.\n    random_state : int , default: 42\n        Random seed for the check.\n    test_size : float , default: 0.3\n        Fraction of the combined datasets to use for the evaluation of the domain classifier.\n    min_meaningful_drift_score : float , default 0.05\n        Minimum drift score for displaying drift in check. Under that score, check will display \"nothing found\".\n    \"\"\"\n\n    def __init__(\n            self,\n            n_top_columns: int = 3,\n            min_feature_importance: float = 0.05,\n            max_num_categories: int = 10,\n            sample_size: int = 10_000,\n            random_state: int = 42,\n            test_size: float = 0.3,\n            min_meaningful_drift_score: float = 0.05,\n            **kwargs\n    ):\n        super().__init__(**kwargs)\n\n        self.n_top_columns = n_top_columns\n        self.min_feature_importance = min_feature_importance\n        self.max_num_categories = max_num_categories\n        self.sample_size = sample_size\n        self.random_state = random_state\n        self.test_size = test_size\n        self.min_meaningful_drift_score = min_meaningful_drift_score\n\n    def run_logic(self, context: Context) -> CheckResult:\n        \"\"\"Run check.\n\n        Returns\n        -------\n        CheckResult\n            value: dictionary containing the domain classifier auc and a dict of column name to its feature\n            importance as calculated for the domain classifier model.\n            display: distribution graph for each column for the columns most explaining the dataset difference,\n            comparing the train and test distributions.\n\n        Raises\n        ------\n        DeepchecksValueError\n            If the object is not a Dataset or DataFrame instance\n        \"\"\"\n        train_dataset = context.train\n        test_dataset = context.test\n        cat_features = train_dataset.cat_features\n        numerical_features = train_dataset.numerical_features\n\n        sample_size = min(self.sample_size, train_dataset.n_samples, test_dataset.n_samples)\n\n        headnote = \"\"\"\n        <span>\n        The shown features are the features that are most important for the domain classifier - the\n        domain_classifier trained to distinguish between the train and test datasets.<br>\n        </span>\n        \"\"\"\n\n        values_dict, displays = run_whole_dataset_drift(train_dataframe=train_dataset.features_columns,\n                                                        test_dataframe=test_dataset.features_columns,\n                                                        numerical_features=numerical_features,\n                                                        cat_features=cat_features,\n                                                        sample_size=sample_size, random_state=self.random_state,\n                                                        test_size=self.test_size, n_top_columns=self.n_top_columns,\n                                                        min_feature_importance=self.min_feature_importance,\n                                                        max_num_categories=self.max_num_categories,\n                                                        min_meaningful_drift_score=self.min_meaningful_drift_score)\n\n        if displays:\n            displays.insert(0, headnote)\n\n        return CheckResult(value=values_dict, display=displays, header='Whole Dataset Drift')\n\n    def add_condition_overall_drift_value_not_greater_than(self, max_drift_value: float = 0.25):\n        \"\"\"Add condition.\n\n        Overall drift score, calculated as (2 * AUC - 1) for the AUC of the dataset discriminator model, is not greater\n        than the specified value. This value is used as it scales the AUC value to the range [0, 1], where 0 indicates\n        a random model (and no drift) and 1 indicates a perfect model (and completely distinguishable datasets).\n\n        Parameters\n        ----------\n        max_drift_value : float , default: 0.25\n            Maximal drift value allowed (value 0 and above)\n        \"\"\"\n\n        def condition(result: dict):\n            drift_score = result['domain_classifier_drift_score']\n            if drift_score > max_drift_value:\n                message = f'Found drift value of: {format_number(drift_score)}, corresponding to a domain classifier ' \\\n                          f'AUC of: {format_number(result[\"domain_classifier_auc\"])}'\n                return ConditionResult(ConditionCategory.FAIL, message)\n            else:\n                return ConditionResult(ConditionCategory.PASS)\n\n        return self.add_condition(f'Drift value is not greater than {format_number(max_drift_value)}',\n                                  condition)\n", "path": "deepchecks/tabular/checks/distribution/whole_dataset_drift.py"}]}