.. DO NOT EDIT. .. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. .. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: .. "auto_tutorials/1111_data_ops_quick_tour.py" .. LINE NUMBERS ARE GIVEN BELOW. .. only:: html .. note:: :class: sphx-glr-download-link-note :ref:`Go to the end ` to download the full example code or to run this example in your browser via JupyterLite or Binder. .. rst-class:: sphx-glr-example-title .. _sphx_glr_auto_tutorials_1111_data_ops_quick_tour.py: Quick overview of DataOps ========================= .. currentmodule:: skrub Here we give a bird's eye view of the DataOps workflow on a simple regression task that we saw in an :ref:`early example `: predicting the salaries of US Government employees. This dataset is so simple that it can be handled without the DataOps, using a scikit-learn :class:`~sklearn.pipeline.Pipeline`, but we will move on to more challenging datasets in later sections. .. GENERATED FROM PYTHON SOURCE LINES 17-19 Here is the dataset we will work with. The column to predict is ``current_annual_salary``. .. GENERATED FROM PYTHON SOURCE LINES 19-26 .. code-block:: Python import skrub train_dataset = skrub.datasets.fetch_employee_salaries(split="train") skrub.TableReport(train_dataset.employee_salaries) .. raw:: html

Please enable javascript

The skrub table reports need javascript to display correctly. If you are displaying a report in a Jupyter notebook and you see this message, you may need to re-execute the cell or to trust the notebook (button on the top right or "File > Trust notebook").



.. GENERATED FROM PYTHON SOURCE LINES 32-40 A first simple pipeline ----------------------- We start by defining our predictive pipeline. We will need to encode the features with a :class:`TableVectorizer` then predict with a :class:`~sklearn.ensemble.HistGradientBoostingRegressor`. Inputs to our pipeline are declared with :func:`var`: .. GENERATED FROM PYTHON SOURCE LINES 42-45 .. code-block:: Python employee_data = skrub.var("employee_data") employee_data .. raw:: html

.. GENERATED FROM PYTHON SOURCE LINES 46-49 Transformation steps are added by calling methods on the intermediate results. An important one is :meth:`DataOp.skb.apply`, which applies a scikit-learn estimator: .. GENERATED FROM PYTHON SOURCE LINES 51-60 .. code-block:: Python from sklearn.ensemble import HistGradientBoostingRegressor salary = skrub.var("salary") pred = employee_data.skb.apply(skrub.TableVectorizer()).skb.apply( HistGradientBoostingRegressor(), y=salary ) pred .. raw:: html

.. GENERATED FROM PYTHON SOURCE LINES 61-63 Note that the methods are accessed through the special attribute ``.skb``: for example ``.skb.apply``. We will explain why shortly. .. GENERATED FROM PYTHON SOURCE LINES 65-67 Once we have added all the steps, we create a *learner*: an object similar to a scikit-learn estimator with ``fit`` and ``predict`` methods. .. GENERATED FROM PYTHON SOURCE LINES 67-71 .. code-block:: Python learner = pred.skb.make_learner() learner.fit({"employee_data": train_dataset.X, "salary": train_dataset.y}) .. raw:: html
SkrubLearner(data_op=<Apply HistGradientBoostingRegressor>)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.


.. GENERATED FROM PYTHON SOURCE LINES 72-79 Regular scikit-learn estimators always take the same fixed inputs: X and y. Skrub learners can process arbitrary data, so the signature of methods like ``fit`` and ``predict`` is different: we pass a dictionary of inputs. The keys correspond to the names of the variables we used to define our learner, here ``"employee_data"`` and ``"salary"``. Finally, we can use our fitted learner to make a prediction: .. GENERATED FROM PYTHON SOURCE LINES 81-84 .. code-block:: Python test_dataset = skrub.datasets.fetch_employee_salaries(split="test") learner.predict({"employee_data": test_dataset.X, "salary": test_dataset.y}) .. rst-class:: sphx-glr-script-out .. code-block:: none array([119471.41270359, 45057.40117905, 47337.07645869, ..., 106872.37978641, 147682.69636242, 73919.50934215], shape=(1228,)) .. GENERATED FROM PYTHON SOURCE LINES 85-113 We can generate a complete report for the execution of our DataOp by calling: .. code:: python pred.skb.full_report({"employee_data": test_dataset.X, "salary": test_dataset.y}) As the output is usually quite large, it does not display inline in a notebook but is instead opened in a separate browser tab. However here we insert it in the page for convenience. By clicking a node in the graph you can see its result, how long it took, and the scikit-learn estimator that was fitted (if any). .. raw:: html You can also visit the report `here <../_static/employee_salaries_report/index.html>`_. It is also possible to create report about the execution of specific methods of the learner like "fit" and "predict" with :meth:`SkrubLearner.report`. .. GENERATED FROM PYTHON SOURCE LINES 115-123 Cross-validation ---------------- We now make a few refinements on the previous pipeline. DataOps can accept any type of input and perform all processing, so we will extend our pipeline so that it includes the data loading and the creation of our features ``employee_data`` and our target ``salary``. The input will be simply the path to a csv file: .. GENERATED FROM PYTHON SOURCE LINES 123-126 .. code-block:: Python train_dataset.path .. rst-class:: sphx-glr-script-out .. code-block:: none '/home/circleci/skrub_data/employee_salaries/employee_salaries/employee_salaries_train.csv' .. GENERATED FROM PYTHON SOURCE LINES 127-133 Therefore we declare a new variable, to represent the CSV path. We also introduce an important feature of DataOps: interactive preview results. If we pass a value to our variable when creating it, it is used as example data on which skrub runs our pipeline as we define it, so we can see what the result looks like every step of the way. .. GENERATED FROM PYTHON SOURCE LINES 135-138 .. code-block:: Python csv_path = skrub.var("csv_path", train_dataset.path) csv_path .. raw:: html
<Var 'csv_path'>
Show/Hide graph Var 'csv_path'

Result:
'/home/circleci/skrub_data/employee_salaries/employee_salaries/employee_salaries_train.csv'


.. GENERATED FROM PYTHON SOURCE LINES 139-144 Note the added "Result" section in the output, which shows what the current pipeline's output looks like. Similarly to ``.skb.apply`` (which applies an estimator), ``.skb.apply_func`` applies a function: .. GENERATED FROM PYTHON SOURCE LINES 146-151 .. code-block:: Python import pandas as pd full_data = csv_path.skb.apply_func(pd.read_csv) full_data .. raw:: html
<Call 'read_csv'>
Show/Hide graph Var 'csv_path' Call 'read_csv'

Result:

Please enable javascript

The skrub table reports need javascript to display correctly. If you are displaying a report in a Jupyter notebook and you see this message, you may need to re-execute the cell or to trust the notebook (button on the top right or "File > Trust notebook").



.. GENERATED FROM PYTHON SOURCE LINES 152-172 Next, from our full dataframe we extract the predictive features and the regression target. The following snippet of code shows 2 important aspects: - Any methods or operators we access on our DataOp ``full_data``, like ``drop`` or the ``[]`` operator below, are recorded in the pipeline and will be applied to the DataOp's result: ``full_data['current_annual_salary']`` is roughly equivalent to ``full_data.skb.apply_func(lambda df: df['curent_annual_salary'])``. This is why all the skrub functionality is behind the ``.skb`` prefix as mentioned earlier: all other attribute access will be replayed directly on the result that the DataOp produces. - Once we have defined the features and targets, we mark them with :meth:`DataOp.skb.mark_as_X()` and :meth:`DataOp.skb.mark_as_y()` respectively. This tells skrub that when performing cross-validation, those are the intermediate results that should be divided into training and testing sets. Therefore, X and y do not need to be constructed and split *outside* the pipeline. Instead, our pipeline can encompass the full processing, and we indicate where the train/test split should happen. .. GENERATED FROM PYTHON SOURCE LINES 172-181 .. code-block:: Python employee_data = full_data.drop( columns="current_annual_salary", errors="ignore" ).skb.mark_as_X() # (errors='ignore' because this column could be absent at the inference stage.) salary = full_data["current_annual_salary"].skb.mark_as_y() salary .. raw:: html
<GetItem 'current_annual_salary'>
Show/Hide graph Var 'csv_path' Call 'read_csv' y: GetItem 'current_annual_salary'

Result:

Please enable javascript

The skrub table reports need javascript to display correctly. If you are displaying a report in a Jupyter notebook and you see this message, you may need to re-execute the cell or to trust the notebook (button on the top right or "File > Trust notebook").



.. GENERATED FROM PYTHON SOURCE LINES 182-184 Finally, we apply the regressor. Note that the X and y nodes, on which train/test split is performed, are colored differently. .. GENERATED FROM PYTHON SOURCE LINES 184-190 .. code-block:: Python pred = employee_data.skb.apply(skrub.TableVectorizer()).skb.apply( HistGradientBoostingRegressor(), y=salary ) pred .. raw:: html
<Apply HistGradientBoostingRegressor>
Show/Hide graph Var 'csv_path' Call 'read_csv' X: CallMethod 'drop' y: GetItem 'current_annual_salary' Apply TableVectorizer Apply HistGradientBoostingRegressor

Result:

Please enable javascript

The skrub table reports need javascript to display correctly. If you are displaying a report in a Jupyter notebook and you see this message, you may need to re-execute the cell or to trust the notebook (button on the top right or "File > Trust notebook").



.. GENERATED FROM PYTHON SOURCE LINES 191-193 Once we have defined our pipeline, we can tell skrub to perform the cross-validation with :meth:`DataOp.skb.cross_validate`. .. GENERATED FROM PYTHON SOURCE LINES 193-196 .. code-block:: Python pred.skb.cross_validate(scoring="neg_mean_absolute_percentage_error") .. rst-class:: sphx-glr-script-out .. code-block:: none /home/circleci/project/.pixi/envs/doc/lib/python3.12/site-packages/sklearn/preprocessing/_encoders.py:262: UserWarning: Found unknown categories in columns [0] during transform. These unknown categories will be encoded as all zeros warnings.warn(msg, UserWarning) /home/circleci/project/.pixi/envs/doc/lib/python3.12/site-packages/sklearn/preprocessing/_encoders.py:262: UserWarning: Found unknown categories in columns [0] during transform. These unknown categories will be encoded as all zeros warnings.warn(msg, UserWarning) .. raw:: html

Please enable javascript

The skrub table reports need javascript to display correctly. If you are displaying a report in a Jupyter notebook and you see this message, you may need to re-execute the cell or to trust the notebook (button on the top right or "File > Trust notebook").



.. GENERATED FROM PYTHON SOURCE LINES 197-200 Note that the variables used in this pipeline are different than the previous one: we just have ``"csv_path"`` and not ``"employee_data"`` and ``"salary"`` like before. .. GENERATED FROM PYTHON SOURCE LINES 200-204 .. code-block:: Python learner = pred.skb.make_learner(fitted=True) learner.predict({"csv_path": test_dataset.path}) .. rst-class:: sphx-glr-script-out .. code-block:: none array([117656.318758 , 45185.65169354, 46138.80688344, ..., 97099.764518 , 145886.76864681, 70085.23723934], shape=(1228,)) .. GENERATED FROM PYTHON SOURCE LINES 205-211 Tuning arbitrary choices ------------------------ The last feature we present in this first tutorial is hyperparameter tuning. The start of the pipeline is the same as before: .. GENERATED FROM PYTHON SOURCE LINES 213-219 .. code-block:: Python full_data = skrub.var("csv_path", train_dataset.path).skb.apply_func(pd.read_csv) employee_data = full_data.drop( columns="current_annual_salary", errors="ignore" ).skb.mark_as_X() salary = full_data["current_annual_salary"].skb.mark_as_y() .. GENERATED FROM PYTHON SOURCE LINES 220-237 We use functions like :func:`choose_from` or :func:`choose_float` whenever we have a choice for which we want to try several options and keep the one that performs best on the validation data. We simply replace the value by the special "choice" object produced by skrub in our pipeline, and it becomes a tunable hyperparameter of our skrub learner. Here we want to tune: - the choice of encoder applied to high-cardinality categorical columns (:class:`StringEncoder` or :class:`~sklearn.preprocessing.TargetEncoder`) - for the StringEncoder, the number of components - the learning rate of the :class:`~sklearn.ensemble.HistGradientBoostingRegressor`. **Note:** choices are not restricted to estimators or their hyperparameters, we can tune any value used anywhere in a pipeline, or the choice between different pipelines; more details :ref:`here `. .. GENERATED FROM PYTHON SOURCE LINES 237-260 .. code-block:: Python from sklearn.preprocessing import TargetEncoder n_components = skrub.choose_int(10, 80, name="n_components") # choose int in [10, 80[ encoder = skrub.choose_from( # choosing between 2 different estimators { "lse": skrub.StringEncoder(n_components=n_components), # nesting choices "target": TargetEncoder(), }, name="encoder", ) pred = employee_data.skb.apply( skrub.TableVectorizer(high_cardinality=encoder), y=salary ).skb.apply( HistGradientBoostingRegressor( learning_rate=skrub.choose_float(0.01, 0.7, log=True, name="learning_rate") ), y=salary, ) print(pred.skb.describe_param_grid()) .. rst-class:: sphx-glr-script-out .. code-block:: none - learning_rate: choose_float(0.01, 0.7, log=True, name='learning_rate') encoder: 'lse' n_components: choose_int(10, 80, name='n_components') - learning_rate: choose_float(0.01, 0.7, log=True, name='learning_rate') encoder: 'target' .. GENERATED FROM PYTHON SOURCE LINES 261-267 To actually run the search for the best hyperparameters, we use :meth:`DataOp.skb.make_randomized_search` or :meth:`DataOp.skb.make_grid_search`. For the randomized search we can use the powerful Optuna library which provides features like state-of-the-art hyperparameter samplers, live interactive visualization of the search with ``optuna-dashboard``, stopping and resuming searches, etc. .. GENERATED FROM PYTHON SOURCE LINES 267-273 .. code-block:: Python search = pred.skb.make_randomized_search( backend="optuna", fitted=True, n_iter=16, random_state=0 ) search.results_ .. rst-class:: sphx-glr-script-out .. code-block:: none Running optuna search for study skrub_randomized_search_b92b27e5-447d-413c-a79b-8ae96fa549e9 in storage /tmp/tmpx6zxwy68_skrub_optuna_search_storage/optuna_storage /home/circleci/project/.pixi/envs/doc/lib/python3.12/site-packages/sklearn/preprocessing/_encoders.py:262: UserWarning: Found unknown categories in columns [0] during transform. These unknown categories will be encoded as all zeros warnings.warn(msg, UserWarning) /home/circleci/project/.pixi/envs/doc/lib/python3.12/site-packages/sklearn/preprocessing/_encoders.py:262: UserWarning: Found unknown categories in columns [0] during transform. These unknown categories will be encoded as all zeros warnings.warn(msg, UserWarning) /home/circleci/project/.pixi/envs/doc/lib/python3.12/site-packages/sklearn/preprocessing/_encoders.py:262: UserWarning: Found unknown categories in columns [0] during transform. These unknown categories will be encoded as all zeros warnings.warn(msg, UserWarning) /home/circleci/project/.pixi/envs/doc/lib/python3.12/site-packages/sklearn/preprocessing/_encoders.py:262: UserWarning: Found unknown categories in columns [0] during transform. These unknown categories will be encoded as all zeros warnings.warn(msg, UserWarning) /home/circleci/project/.pixi/envs/doc/lib/python3.12/site-packages/sklearn/preprocessing/_encoders.py:262: UserWarning: Found unknown categories in columns [0] during transform. These unknown categories will be encoded as all zeros warnings.warn(msg, UserWarning) /home/circleci/project/.pixi/envs/doc/lib/python3.12/site-packages/sklearn/preprocessing/_encoders.py:262: UserWarning: Found unknown categories in columns [0] during transform. These unknown categories will be encoded as all zeros warnings.warn(msg, UserWarning) /home/circleci/project/.pixi/envs/doc/lib/python3.12/site-packages/sklearn/preprocessing/_encoders.py:262: UserWarning: Found unknown categories in columns [0] during transform. These unknown categories will be encoded as all zeros warnings.warn(msg, UserWarning) /home/circleci/project/.pixi/envs/doc/lib/python3.12/site-packages/sklearn/preprocessing/_encoders.py:262: UserWarning: Found unknown categories in columns [0] during transform. These unknown categories will be encoded as all zeros warnings.warn(msg, UserWarning) /home/circleci/project/.pixi/envs/doc/lib/python3.12/site-packages/sklearn/preprocessing/_encoders.py:262: UserWarning: Found unknown categories in columns [0] during transform. These unknown categories will be encoded as all zeros warnings.warn(msg, UserWarning) /home/circleci/project/.pixi/envs/doc/lib/python3.12/site-packages/sklearn/preprocessing/_encoders.py:262: UserWarning: Found unknown categories in columns [0] during transform. These unknown categories will be encoded as all zeros warnings.warn(msg, UserWarning) /home/circleci/project/.pixi/envs/doc/lib/python3.12/site-packages/sklearn/preprocessing/_encoders.py:262: UserWarning: Found unknown categories in columns [0] during transform. These unknown categories will be encoded as all zeros warnings.warn(msg, UserWarning) /home/circleci/project/.pixi/envs/doc/lib/python3.12/site-packages/sklearn/preprocessing/_encoders.py:262: UserWarning: Found unknown categories in columns [0] during transform. These unknown categories will be encoded as all zeros warnings.warn(msg, UserWarning) /home/circleci/project/.pixi/envs/doc/lib/python3.12/site-packages/sklearn/preprocessing/_encoders.py:262: UserWarning: Found unknown categories in columns [0] during transform. These unknown categories will be encoded as all zeros warnings.warn(msg, UserWarning) /home/circleci/project/.pixi/envs/doc/lib/python3.12/site-packages/sklearn/preprocessing/_encoders.py:262: UserWarning: Found unknown categories in columns [0] during transform. These unknown categories will be encoded as all zeros warnings.warn(msg, UserWarning) /home/circleci/project/.pixi/envs/doc/lib/python3.12/site-packages/sklearn/preprocessing/_encoders.py:262: UserWarning: Found unknown categories in columns [0] during transform. These unknown categories will be encoded as all zeros warnings.warn(msg, UserWarning) /home/circleci/project/.pixi/envs/doc/lib/python3.12/site-packages/sklearn/preprocessing/_encoders.py:262: UserWarning: Found unknown categories in columns [0] during transform. These unknown categories will be encoded as all zeros warnings.warn(msg, UserWarning) /home/circleci/project/.pixi/envs/doc/lib/python3.12/site-packages/sklearn/preprocessing/_encoders.py:262: UserWarning: Found unknown categories in columns [0] during transform. These unknown categories will be encoded as all zeros warnings.warn(msg, UserWarning) /home/circleci/project/.pixi/envs/doc/lib/python3.12/site-packages/sklearn/preprocessing/_encoders.py:262: UserWarning: Found unknown categories in columns [0] during transform. These unknown categories will be encoded as all zeros warnings.warn(msg, UserWarning) /home/circleci/project/.pixi/envs/doc/lib/python3.12/site-packages/sklearn/preprocessing/_encoders.py:262: UserWarning: Found unknown categories in columns [0] during transform. These unknown categories will be encoded as all zeros warnings.warn(msg, UserWarning) /home/circleci/project/.pixi/envs/doc/lib/python3.12/site-packages/sklearn/preprocessing/_encoders.py:262: UserWarning: Found unknown categories in columns [0] during transform. These unknown categories will be encoded as all zeros warnings.warn(msg, UserWarning) /home/circleci/project/.pixi/envs/doc/lib/python3.12/site-packages/sklearn/preprocessing/_encoders.py:262: UserWarning: Found unknown categories in columns [0] during transform. These unknown categories will be encoded as all zeros warnings.warn(msg, UserWarning) /home/circleci/project/.pixi/envs/doc/lib/python3.12/site-packages/sklearn/preprocessing/_encoders.py:262: UserWarning: Found unknown categories in columns [0] during transform. These unknown categories will be encoded as all zeros warnings.warn(msg, UserWarning) /home/circleci/project/.pixi/envs/doc/lib/python3.12/site-packages/sklearn/preprocessing/_encoders.py:262: UserWarning: Found unknown categories in columns [0] during transform. These unknown categories will be encoded as all zeros warnings.warn(msg, UserWarning) /home/circleci/project/.pixi/envs/doc/lib/python3.12/site-packages/sklearn/preprocessing/_encoders.py:262: UserWarning: Found unknown categories in columns [0] during transform. These unknown categories will be encoded as all zeros warnings.warn(msg, UserWarning) /home/circleci/project/.pixi/envs/doc/lib/python3.12/site-packages/sklearn/preprocessing/_encoders.py:262: UserWarning: Found unknown categories in columns [0] during transform. These unknown categories will be encoded as all zeros warnings.warn(msg, UserWarning) /home/circleci/project/.pixi/envs/doc/lib/python3.12/site-packages/sklearn/preprocessing/_encoders.py:262: UserWarning: Found unknown categories in columns [0] during transform. These unknown categories will be encoded as all zeros warnings.warn(msg, UserWarning) /home/circleci/project/.pixi/envs/doc/lib/python3.12/site-packages/sklearn/preprocessing/_encoders.py:262: UserWarning: Found unknown categories in columns [0] during transform. These unknown categories will be encoded as all zeros warnings.warn(msg, UserWarning) /home/circleci/project/.pixi/envs/doc/lib/python3.12/site-packages/sklearn/preprocessing/_encoders.py:262: UserWarning: Found unknown categories in columns [0] during transform. These unknown categories will be encoded as all zeros warnings.warn(msg, UserWarning) /home/circleci/project/.pixi/envs/doc/lib/python3.12/site-packages/sklearn/preprocessing/_encoders.py:262: UserWarning: Found unknown categories in columns [0] during transform. These unknown categories will be encoded as all zeros warnings.warn(msg, UserWarning) /home/circleci/project/.pixi/envs/doc/lib/python3.12/site-packages/sklearn/preprocessing/_encoders.py:262: UserWarning: Found unknown categories in columns [0] during transform. These unknown categories will be encoded as all zeros warnings.warn(msg, UserWarning) /home/circleci/project/.pixi/envs/doc/lib/python3.12/site-packages/sklearn/preprocessing/_encoders.py:262: UserWarning: Found unknown categories in columns [0] during transform. These unknown categories will be encoded as all zeros warnings.warn(msg, UserWarning) /home/circleci/project/.pixi/envs/doc/lib/python3.12/site-packages/sklearn/preprocessing/_encoders.py:262: UserWarning: Found unknown categories in columns [0] during transform. These unknown categories will be encoded as all zeros warnings.warn(msg, UserWarning) .. raw:: html

Please enable javascript

The skrub table reports need javascript to display correctly. If you are displaying a report in a Jupyter notebook and you see this message, you may need to re-execute the cell or to trust the notebook (button on the top right or "File > Trust notebook").



.. GENERATED FROM PYTHON SOURCE LINES 274-276 .. code-block:: Python search.plot_results() .. raw:: html


.. GENERATED FROM PYTHON SOURCE LINES 277-280 The search can be used with the same interface as the :class:`SkrubLearner` we saw before. Alternatively, we can access its ``best_learner_`` attribute, which is a SkrubLearner. .. GENERATED FROM PYTHON SOURCE LINES 280-282 .. code-block:: Python search.predict({"csv_path": test_dataset.path}) .. rst-class:: sphx-glr-script-out .. code-block:: none array([117953.78973311, 45425.83792057, 50233.10821664, ..., 97320.14629547, 143659.49306584, 73890.48051489], shape=(1228,)) .. rst-class:: sphx-glr-timing **Total running time of the script:** (3 minutes 8.406 seconds) **Estimated memory usage:** 612 MB .. _sphx_glr_download_auto_tutorials_1111_data_ops_quick_tour.py: .. only:: html .. container:: sphx-glr-footer sphx-glr-footer-example .. container:: binder-badge .. image:: images/binder_badge_logo.svg :target: https://mybinder.org/v2/gh/skrub-data/skrub/0.10.0?urlpath=lab/tree/notebooks/auto_tutorials/1111_data_ops_quick_tour.ipynb :alt: Launch binder :width: 150 px .. container:: lite-badge .. image:: images/jupyterlite_badge_logo.svg :target: ../lite/lab/index.html?path=auto_tutorials/1111_data_ops_quick_tour.ipynb :alt: Launch JupyterLite :width: 150 px .. container:: sphx-glr-download sphx-glr-download-jupyter :download:`Download Jupyter notebook: 1111_data_ops_quick_tour.ipynb <1111_data_ops_quick_tour.ipynb>` .. container:: sphx-glr-download sphx-glr-download-python :download:`Download Python source code: 1111_data_ops_quick_tour.py <1111_data_ops_quick_tour.py>` .. container:: sphx-glr-download sphx-glr-download-zip :download:`Download zipped: 1111_data_ops_quick_tour.zip <1111_data_ops_quick_tour.zip>` .. only:: html .. rst-class:: sphx-glr-signature `Gallery generated by Sphinx-Gallery `_