Skip to content

Commit 537b78e

Browse files
committed
Pushing the docs to dev/ for branch: main, commit a744c476511e8d87952be7910143a764d7152ef4
1 parent f63c2ce commit 537b78e

File tree

1,536 files changed

+6090
-6071
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

1,536 files changed

+6090
-6071
lines changed
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

dev/_downloads/b7e32fe54d613dce0d3c376377af061d/plot_outlier_detection_bench.py

+15-15
Original file line numberDiff line numberDiff line change
@@ -88,12 +88,12 @@ def fit_predict(estimator, X):
8888
tic = perf_counter()
8989
if estimator[-1].__class__.__name__ == "LocalOutlierFactor":
9090
estimator.fit(X)
91-
y_pred = estimator[-1].negative_outlier_factor_
91+
y_score = estimator[-1].negative_outlier_factor_
9292
else: # "IsolationForest"
93-
y_pred = estimator.fit(X).decision_function(X)
93+
y_score = estimator.fit(X).decision_function(X)
9494
toc = perf_counter()
9595
print(f"Duration for {model_name}: {toc - tic:.2f} s")
96-
return y_pred
96+
return y_score
9797

9898

9999
# %%
@@ -138,7 +138,7 @@ def fit_predict(estimator, X):
138138

139139
# %%
140140
y_true = {}
141-
y_pred = {"LOF": {}, "IForest": {}}
141+
y_score = {"LOF": {}, "IForest": {}}
142142
model_names = ["LOF", "IForest"]
143143
cat_columns = ["protocol_type", "service", "flag"]
144144

@@ -150,7 +150,7 @@ def fit_predict(estimator, X):
150150
lof_kw={"n_neighbors": int(n_samples * anomaly_frac)},
151151
iforest_kw={"random_state": 42},
152152
)
153-
y_pred[model_name]["KDDCup99 - SA"] = fit_predict(model, X)
153+
y_score[model_name]["KDDCup99 - SA"] = fit_predict(model, X)
154154

155155
# %%
156156
# Forest covertypes dataset
@@ -185,7 +185,7 @@ def fit_predict(estimator, X):
185185
lof_kw={"n_neighbors": int(n_samples * anomaly_frac)},
186186
iforest_kw={"random_state": 42},
187187
)
188-
y_pred[model_name]["forestcover"] = fit_predict(model, X)
188+
y_score[model_name]["forestcover"] = fit_predict(model, X)
189189

190190
# %%
191191
# Ames Housing dataset
@@ -242,7 +242,7 @@ def fit_predict(estimator, X):
242242
lof_kw={"n_neighbors": int(n_samples * anomaly_frac)},
243243
iforest_kw={"random_state": 42},
244244
)
245-
y_pred[model_name]["ames_housing"] = fit_predict(model, X)
245+
y_score[model_name]["ames_housing"] = fit_predict(model, X)
246246

247247
# %%
248248
# Cardiotocography dataset
@@ -271,7 +271,7 @@ def fit_predict(estimator, X):
271271
lof_kw={"n_neighbors": int(n_samples * anomaly_frac)},
272272
iforest_kw={"random_state": 42},
273273
)
274-
y_pred[model_name]["cardiotocography"] = fit_predict(model, X)
274+
y_score[model_name]["cardiotocography"] = fit_predict(model, X)
275275

276276
# %%
277277
# Plot and interpret results
@@ -299,7 +299,7 @@ def fit_predict(estimator, X):
299299
for model_idx, model_name in enumerate(model_names):
300300
display = RocCurveDisplay.from_predictions(
301301
y_true[dataset_name],
302-
y_pred[model_name][dataset_name],
302+
y_score[model_name][dataset_name],
303303
pos_label=pos_label,
304304
name=model_name,
305305
ax=ax,
@@ -346,10 +346,10 @@ def fit_predict(estimator, X):
346346
for model_idx, (linestyle, n_neighbors) in enumerate(zip(linestyles, n_neighbors_list)):
347347
model.set_params(localoutlierfactor__n_neighbors=n_neighbors)
348348
model.fit(X)
349-
y_pred = model[-1].negative_outlier_factor_
349+
y_score = model[-1].negative_outlier_factor_
350350
display = RocCurveDisplay.from_predictions(
351351
y,
352-
y_pred,
352+
y_score,
353353
pos_label=pos_label,
354354
name=f"n_neighbors = {n_neighbors}",
355355
ax=ax,
@@ -386,10 +386,10 @@ def fit_predict(estimator, X):
386386
):
387387
model = make_pipeline(preprocessor, lof)
388388
model.fit(X)
389-
y_pred = model[-1].negative_outlier_factor_
389+
y_score = model[-1].negative_outlier_factor_
390390
display = RocCurveDisplay.from_predictions(
391391
y,
392-
y_pred,
392+
y_score,
393393
pos_label=pos_label,
394394
name=str(preprocessor).split("(")[0],
395395
ax=ax,
@@ -438,10 +438,10 @@ def fit_predict(estimator, X):
438438
):
439439
model = make_pipeline(preprocessor, lof)
440440
model.fit(X)
441-
y_pred = model[-1].negative_outlier_factor_
441+
y_score = model[-1].negative_outlier_factor_
442442
display = RocCurveDisplay.from_predictions(
443443
y,
444-
y_pred,
444+
y_score,
445445
pos_label=pos_label,
446446
name=str(preprocessor).split("(")[0],
447447
ax=ax,
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

dev/_downloads/eacb6a63c887dafcff02b3cee64854ef/plot_outlier_detection_bench.ipynb

+9-9
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@
5151
},
5252
"outputs": [],
5353
"source": [
54-
"from time import perf_counter\n\n\ndef fit_predict(estimator, X):\n tic = perf_counter()\n if estimator[-1].__class__.__name__ == \"LocalOutlierFactor\":\n estimator.fit(X)\n y_pred = estimator[-1].negative_outlier_factor_\n else: # \"IsolationForest\"\n y_pred = estimator.fit(X).decision_function(X)\n toc = perf_counter()\n print(f\"Duration for {model_name}: {toc - tic:.2f} s\")\n return y_pred"
54+
"from time import perf_counter\n\n\ndef fit_predict(estimator, X):\n tic = perf_counter()\n if estimator[-1].__class__.__name__ == \"LocalOutlierFactor\":\n estimator.fit(X)\n y_score = estimator[-1].negative_outlier_factor_\n else: # \"IsolationForest\"\n y_score = estimator.fit(X).decision_function(X)\n toc = perf_counter()\n print(f\"Duration for {model_name}: {toc - tic:.2f} s\")\n return y_score"
5555
]
5656
},
5757
{
@@ -87,7 +87,7 @@
8787
},
8888
"outputs": [],
8989
"source": [
90-
"y_true = {}\ny_pred = {\"LOF\": {}, \"IForest\": {}}\nmodel_names = [\"LOF\", \"IForest\"]\ncat_columns = [\"protocol_type\", \"service\", \"flag\"]\n\ny_true[\"KDDCup99 - SA\"] = y\nfor model_name in model_names:\n model = make_estimator(\n name=model_name,\n categorical_columns=cat_columns,\n lof_kw={\"n_neighbors\": int(n_samples * anomaly_frac)},\n iforest_kw={\"random_state\": 42},\n )\n y_pred[model_name][\"KDDCup99 - SA\"] = fit_predict(model, X)"
90+
"y_true = {}\ny_score = {\"LOF\": {}, \"IForest\": {}}\nmodel_names = [\"LOF\", \"IForest\"]\ncat_columns = [\"protocol_type\", \"service\", \"flag\"]\n\ny_true[\"KDDCup99 - SA\"] = y\nfor model_name in model_names:\n model = make_estimator(\n name=model_name,\n categorical_columns=cat_columns,\n lof_kw={\"n_neighbors\": int(n_samples * anomaly_frac)},\n iforest_kw={\"random_state\": 42},\n )\n y_score[model_name][\"KDDCup99 - SA\"] = fit_predict(model, X)"
9191
]
9292
},
9393
{
@@ -116,7 +116,7 @@
116116
},
117117
"outputs": [],
118118
"source": [
119-
"y_true[\"forestcover\"] = y\nfor model_name in model_names:\n model = make_estimator(\n name=model_name,\n lof_kw={\"n_neighbors\": int(n_samples * anomaly_frac)},\n iforest_kw={\"random_state\": 42},\n )\n y_pred[model_name][\"forestcover\"] = fit_predict(model, X)"
119+
"y_true[\"forestcover\"] = y\nfor model_name in model_names:\n model = make_estimator(\n name=model_name,\n lof_kw={\"n_neighbors\": int(n_samples * anomaly_frac)},\n iforest_kw={\"random_state\": 42},\n )\n y_score[model_name][\"forestcover\"] = fit_predict(model, X)"
120120
]
121121
},
122122
{
@@ -163,7 +163,7 @@
163163
},
164164
"outputs": [],
165165
"source": [
166-
"from sklearn.compose import make_column_selector as selector\n\ncategorical_columns_selector = selector(dtype_include=\"category\")\ncat_columns = categorical_columns_selector(X)\n\ny_true[\"ames_housing\"] = y\nfor model_name in model_names:\n model = make_estimator(\n name=model_name,\n categorical_columns=cat_columns,\n lof_kw={\"n_neighbors\": int(n_samples * anomaly_frac)},\n iforest_kw={\"random_state\": 42},\n )\n y_pred[model_name][\"ames_housing\"] = fit_predict(model, X)"
166+
"from sklearn.compose import make_column_selector as selector\n\ncategorical_columns_selector = selector(dtype_include=\"category\")\ncat_columns = categorical_columns_selector(X)\n\ny_true[\"ames_housing\"] = y\nfor model_name in model_names:\n model = make_estimator(\n name=model_name,\n categorical_columns=cat_columns,\n lof_kw={\"n_neighbors\": int(n_samples * anomaly_frac)},\n iforest_kw={\"random_state\": 42},\n )\n y_score[model_name][\"ames_housing\"] = fit_predict(model, X)"
167167
]
168168
},
169169
{
@@ -192,7 +192,7 @@
192192
},
193193
"outputs": [],
194194
"source": [
195-
"y_true[\"cardiotocography\"] = y\nfor model_name in model_names:\n model = make_estimator(\n name=model_name,\n lof_kw={\"n_neighbors\": int(n_samples * anomaly_frac)},\n iforest_kw={\"random_state\": 42},\n )\n y_pred[model_name][\"cardiotocography\"] = fit_predict(model, X)"
195+
"y_true[\"cardiotocography\"] = y\nfor model_name in model_names:\n model = make_estimator(\n name=model_name,\n lof_kw={\"n_neighbors\": int(n_samples * anomaly_frac)},\n iforest_kw={\"random_state\": 42},\n )\n y_score[model_name][\"cardiotocography\"] = fit_predict(model, X)"
196196
]
197197
},
198198
{
@@ -210,7 +210,7 @@
210210
},
211211
"outputs": [],
212212
"source": [
213-
"import math\n\nfrom sklearn.metrics import RocCurveDisplay\n\ncols = 2\npos_label = 0 # mean 0 belongs to positive class\ndatasets_names = y_true.keys()\nrows = math.ceil(len(datasets_names) / cols)\n\nfig, axs = plt.subplots(nrows=rows, ncols=cols, squeeze=False, figsize=(10, rows * 4))\n\nfor ax, dataset_name in zip(axs.ravel(), datasets_names):\n for model_idx, model_name in enumerate(model_names):\n display = RocCurveDisplay.from_predictions(\n y_true[dataset_name],\n y_pred[model_name][dataset_name],\n pos_label=pos_label,\n name=model_name,\n ax=ax,\n plot_chance_level=(model_idx == len(model_names) - 1),\n chance_level_kw={\"linestyle\": \":\"},\n )\n ax.set_title(dataset_name)\n_ = plt.tight_layout(pad=2.0) # spacing between subplots"
213+
"import math\n\nfrom sklearn.metrics import RocCurveDisplay\n\ncols = 2\npos_label = 0 # mean 0 belongs to positive class\ndatasets_names = y_true.keys()\nrows = math.ceil(len(datasets_names) / cols)\n\nfig, axs = plt.subplots(nrows=rows, ncols=cols, squeeze=False, figsize=(10, rows * 4))\n\nfor ax, dataset_name in zip(axs.ravel(), datasets_names):\n for model_idx, model_name in enumerate(model_names):\n display = RocCurveDisplay.from_predictions(\n y_true[dataset_name],\n y_score[model_name][dataset_name],\n pos_label=pos_label,\n name=model_name,\n ax=ax,\n plot_chance_level=(model_idx == len(model_names) - 1),\n chance_level_kw={\"linestyle\": \":\"},\n )\n ax.set_title(dataset_name)\n_ = plt.tight_layout(pad=2.0) # spacing between subplots"
214214
]
215215
},
216216
{
@@ -228,7 +228,7 @@
228228
},
229229
"outputs": [],
230230
"source": [
231-
"X = X_forestcover\ny = y_true[\"forestcover\"]\n\nn_samples = X.shape[0]\nn_neighbors_list = (n_samples * np.array([0.2, 0.02, 0.01, 0.001])).astype(np.int32)\nmodel = make_pipeline(RobustScaler(), LocalOutlierFactor())\n\nlinestyles = [\"solid\", \"dashed\", \"dashdot\", \":\", (5, (10, 3))]\n\nfig, ax = plt.subplots()\nfor model_idx, (linestyle, n_neighbors) in enumerate(zip(linestyles, n_neighbors_list)):\n model.set_params(localoutlierfactor__n_neighbors=n_neighbors)\n model.fit(X)\n y_pred = model[-1].negative_outlier_factor_\n display = RocCurveDisplay.from_predictions(\n y,\n y_pred,\n pos_label=pos_label,\n name=f\"n_neighbors = {n_neighbors}\",\n ax=ax,\n plot_chance_level=(model_idx == len(n_neighbors_list) - 1),\n chance_level_kw={\"linestyle\": (0, (1, 10))},\n linestyle=linestyle,\n linewidth=2,\n )\n_ = ax.set_title(\"RobustScaler with varying n_neighbors\\non forestcover dataset\")"
231+
"X = X_forestcover\ny = y_true[\"forestcover\"]\n\nn_samples = X.shape[0]\nn_neighbors_list = (n_samples * np.array([0.2, 0.02, 0.01, 0.001])).astype(np.int32)\nmodel = make_pipeline(RobustScaler(), LocalOutlierFactor())\n\nlinestyles = [\"solid\", \"dashed\", \"dashdot\", \":\", (5, (10, 3))]\n\nfig, ax = plt.subplots()\nfor model_idx, (linestyle, n_neighbors) in enumerate(zip(linestyles, n_neighbors_list)):\n model.set_params(localoutlierfactor__n_neighbors=n_neighbors)\n model.fit(X)\n y_score = model[-1].negative_outlier_factor_\n display = RocCurveDisplay.from_predictions(\n y,\n y_score,\n pos_label=pos_label,\n name=f\"n_neighbors = {n_neighbors}\",\n ax=ax,\n plot_chance_level=(model_idx == len(n_neighbors_list) - 1),\n chance_level_kw={\"linestyle\": (0, (1, 10))},\n linestyle=linestyle,\n linewidth=2,\n )\n_ = ax.set_title(\"RobustScaler with varying n_neighbors\\non forestcover dataset\")"
232232
]
233233
},
234234
{
@@ -246,7 +246,7 @@
246246
},
247247
"outputs": [],
248248
"source": [
249-
"from sklearn.preprocessing import MinMaxScaler, SplineTransformer, StandardScaler\n\npreprocessor_list = [\n None,\n RobustScaler(),\n StandardScaler(),\n MinMaxScaler(),\n SplineTransformer(),\n]\nexpected_anomaly_fraction = 0.02\nlof = LocalOutlierFactor(n_neighbors=int(n_samples * expected_anomaly_fraction))\n\nfig, ax = plt.subplots()\nfor model_idx, (linestyle, preprocessor) in enumerate(\n zip(linestyles, preprocessor_list)\n):\n model = make_pipeline(preprocessor, lof)\n model.fit(X)\n y_pred = model[-1].negative_outlier_factor_\n display = RocCurveDisplay.from_predictions(\n y,\n y_pred,\n pos_label=pos_label,\n name=str(preprocessor).split(\"(\")[0],\n ax=ax,\n plot_chance_level=(model_idx == len(preprocessor_list) - 1),\n chance_level_kw={\"linestyle\": (0, (1, 10))},\n linestyle=linestyle,\n linewidth=2,\n )\n_ = ax.set_title(\"Fixed n_neighbors with varying preprocessing\\non forestcover dataset\")"
249+
"from sklearn.preprocessing import MinMaxScaler, SplineTransformer, StandardScaler\n\npreprocessor_list = [\n None,\n RobustScaler(),\n StandardScaler(),\n MinMaxScaler(),\n SplineTransformer(),\n]\nexpected_anomaly_fraction = 0.02\nlof = LocalOutlierFactor(n_neighbors=int(n_samples * expected_anomaly_fraction))\n\nfig, ax = plt.subplots()\nfor model_idx, (linestyle, preprocessor) in enumerate(\n zip(linestyles, preprocessor_list)\n):\n model = make_pipeline(preprocessor, lof)\n model.fit(X)\n y_score = model[-1].negative_outlier_factor_\n display = RocCurveDisplay.from_predictions(\n y,\n y_score,\n pos_label=pos_label,\n name=str(preprocessor).split(\"(\")[0],\n ax=ax,\n plot_chance_level=(model_idx == len(preprocessor_list) - 1),\n chance_level_kw={\"linestyle\": (0, (1, 10))},\n linestyle=linestyle,\n linewidth=2,\n )\n_ = ax.set_title(\"Fixed n_neighbors with varying preprocessing\\non forestcover dataset\")"
250250
]
251251
},
252252
{
@@ -264,7 +264,7 @@
264264
},
265265
"outputs": [],
266266
"source": [
267-
"X = X_cardiotocography\ny = y_true[\"cardiotocography\"]\n\nn_samples, expected_anomaly_fraction = X.shape[0], 0.025\nlof = LocalOutlierFactor(n_neighbors=int(n_samples * expected_anomaly_fraction))\n\nfig, ax = plt.subplots()\nfor model_idx, (linestyle, preprocessor) in enumerate(\n zip(linestyles, preprocessor_list)\n):\n model = make_pipeline(preprocessor, lof)\n model.fit(X)\n y_pred = model[-1].negative_outlier_factor_\n display = RocCurveDisplay.from_predictions(\n y,\n y_pred,\n pos_label=pos_label,\n name=str(preprocessor).split(\"(\")[0],\n ax=ax,\n plot_chance_level=(model_idx == len(preprocessor_list) - 1),\n chance_level_kw={\"linestyle\": (0, (1, 10))},\n linestyle=linestyle,\n linewidth=2,\n )\nax.set_title(\n \"Fixed n_neighbors with varying preprocessing\\non cardiotocography dataset\"\n)\nplt.show()"
267+
"X = X_cardiotocography\ny = y_true[\"cardiotocography\"]\n\nn_samples, expected_anomaly_fraction = X.shape[0], 0.025\nlof = LocalOutlierFactor(n_neighbors=int(n_samples * expected_anomaly_fraction))\n\nfig, ax = plt.subplots()\nfor model_idx, (linestyle, preprocessor) in enumerate(\n zip(linestyles, preprocessor_list)\n):\n model = make_pipeline(preprocessor, lof)\n model.fit(X)\n y_score = model[-1].negative_outlier_factor_\n display = RocCurveDisplay.from_predictions(\n y,\n y_score,\n pos_label=pos_label,\n name=str(preprocessor).split(\"(\")[0],\n ax=ax,\n plot_chance_level=(model_idx == len(preprocessor_list) - 1),\n chance_level_kw={\"linestyle\": (0, (1, 10))},\n linestyle=linestyle,\n linewidth=2,\n )\nax.set_title(\n \"Fixed n_neighbors with varying preprocessing\\non cardiotocography dataset\"\n)\nplt.show()"
268268
]
269269
}
270270
],
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

dev/_downloads/scikit-learn-docs.zip

-9.75 KB
Binary file not shown.
-10 Bytes
-70 Bytes
-66 Bytes

0 commit comments

Comments
 (0)