Attrs ===== .. cpp:class:: pandas::Attrs Utility class for pandas operations. Example ------- .. code-block:: cpp #include using namespace pandas; // Use Attrs Attrs obj; // ... operations ... Constructors ------------ .. list-table:: :widths: 55 25 20 :header-rows: 1 * - Signature - Location - Example * - ``Attrs() = default`` - pd_attrs.h:52 - * - ``Attrs(const Attrs&) = default`` - pd_attrs.h:57 - * - ``Attrs(Attrs&&) = default`` - pd_attrs.h:62 - Indexing / Selection -------------------- .. list-table:: :widths: 40 20 15 25 :header-rows: 1 * - Signature - Return Type - Location - Example * - ``T get(const std::string& key) const`` - T - pd_attrs.h:103 - :ref:`View ` * - ``T get(const std::string& key, T default_value) const`` - T - pd_attrs.h:119 - :ref:`View ` Combining --------- .. list-table:: :widths: 40 20 15 25 :header-rows: 1 * - Signature - Return Type - Location - Example * - ``void merge(const Attrs& other, bool overwrite = true)`` - void - pd_attrs.h:217 - :ref:`View ` Conversion ---------- .. list-table:: :widths: 40 20 15 25 :header-rows: 1 * - Signature - Return Type - Location - Example * - ``Attrs copy() const`` - Attrs - pd_attrs.h:229 - :ref:`View ` Iteration --------- .. list-table:: :widths: 40 20 15 25 :header-rows: 1 * - Signature - Return Type - Location - Example * - ``std::vector keys() const`` - std::vector - pd_attrs.h:188 - :ref:`View ` Other Methods ------------- .. list-table:: :widths: 40 20 15 25 :header-rows: 1 * - Signature - Return Type - Location - Example * - ``void clear()`` - void - pd_attrs.h:164 - :ref:`View ` * - ``bool contains(const std::string& key) const`` - bool - pd_attrs.h:79 - :ref:`View ` * - ``bool empty() const`` - bool - pd_attrs.h:180 - :ref:`View ` * - ``bool has_type(const std::string& key) const`` - bool - pd_attrs.h:204 - :ref:`View ` * - ``bool remove(const std::string& key)`` - bool - pd_attrs.h:157 - :ref:`View ` * - ``void set(const std::string& key, T&& value)`` - void - pd_attrs.h:90 - :ref:`View ` * - ``size_t size() const`` - size_t - pd_attrs.h:172 - :ref:`View ` * - ``bool try_get(const std::string& key, T& out_value) const`` - bool - pd_attrs.h:139 - Code Examples ------------- The following examples are extracted from the test suite. .. _example-attrs-get-0: .. dropdown:: get (pd_test_1_all.cpp:10290) :class-title: example-dropdown .. code-block:: cpp :linenos: :lineno-start: 10280 :emphasize-lines: 11 void pd_test_extension_index_get_loc_unique() { std::cout << "========= get_loc (unique) ========================="; pandas::CategoricalArray arr({"apple", "banana", "cherry"}); pandas::CategoricalIndex idx(arr); auto loc_apple = idx.get_loc("apple"); auto loc_banana = idx.get_loc("banana"); auto loc_cherry = idx.get_loc("cherry"); bool passed = (std::holds_alternative(loc_apple) && std::get(loc_apple) == 0 && std::get(loc_banana) == 1 && std::get(loc_cherry) == 2); if (!passed) { std::cout << " [FAIL] : in pd_test_extension_index_get_loc_unique() : get_loc check failed" << std::endl; throw std::runtime_error("pd_test_extension_index_get_loc_unique failed"); } std::cout << " -> tests passed" << std::endl; } .. _example-attrs-get-1: .. dropdown:: get (pd_test_1_all.cpp:10290) :class-title: example-dropdown .. code-block:: cpp :linenos: :lineno-start: 10280 :emphasize-lines: 11 void pd_test_extension_index_get_loc_unique() { std::cout << "========= get_loc (unique) ========================="; pandas::CategoricalArray arr({"apple", "banana", "cherry"}); pandas::CategoricalIndex idx(arr); auto loc_apple = idx.get_loc("apple"); auto loc_banana = idx.get_loc("banana"); auto loc_cherry = idx.get_loc("cherry"); bool passed = (std::holds_alternative(loc_apple) && std::get(loc_apple) == 0 && std::get(loc_banana) == 1 && std::get(loc_cherry) == 2); if (!passed) { std::cout << " [FAIL] : in pd_test_extension_index_get_loc_unique() : get_loc check failed" << std::endl; throw std::runtime_error("pd_test_extension_index_get_loc_unique failed"); } std::cout << " -> tests passed" << std::endl; } .. _example-attrs-merge-2: .. dropdown:: merge (pd_test_1_all.cpp:13639) :class-title: example-dropdown .. code-block:: cpp :linenos: :lineno-start: 13629 :emphasize-lines: 11 namespace dataframe_tests { namespace dataframe_tests_joining { // Helper to check approximate equality bool approx_equal(double a, double b, double tol = 1e-9) { if (std::isnan(a) && std::isnan(b)) return true; return std::abs(a - b) < tol; } // ===================================================================== // merge() Tests // ===================================================================== void pd_test_joining_merge_inner() { std::cout << "========= merge inner join ============================"; // Left DataFrame: id, value_left std::map> left_data = { {"id", {1.0, 2.0, 3.0, 4.0}}, {"value_left", {10.0, 20.0, 30.0, 40.0}} }; .. _example-attrs-copy-3: .. dropdown:: copy (pd_test_1_all.cpp:5798) :class-title: example-dropdown .. code-block:: cpp :linenos: :lineno-start: 5788 :emphasize-lines: 11 // ============================================================================ // Copy/Rename Tests // ============================================================================ void pd_test_categorical_index_copy() { std::cout << "========= copy ========================================"; pandas::CategoricalArray arr({"a", "b", "c"}); pandas::CategoricalIndex idx(arr, "original"); pandas::CategoricalIndex copied = idx.copy(); bool passed = (copied.size() == idx.size() && copied.name() == idx.name() && copied.categories() == idx.categories() && copied.ordered() == idx.ordered()); if (!passed) { std::cout << " [FAIL] : in pd_test_categorical_index_copy()" << std::endl; throw std::runtime_error("pd_test_categorical_index_copy failed"); } std::cout << " -> tests passed" << std::endl; } .. _example-attrs-keys-4: .. dropdown:: keys (pd_test_1_all.cpp:16319) :class-title: example-dropdown .. code-block:: cpp :linenos: :lineno-start: 16309 :emphasize-lines: 11 } // Test default value passed = attrs.get("missing", 99) == 99; if (!passed) { std::cout << " [FAIL] : in pd_test_ndframe_attrs() : default value" << std::endl; throw std::runtime_error("pd_test_ndframe_attrs failed: default value"); } // Test keys auto keys = attrs.keys(); passed = keys.size() == 3; if (!passed) { std::cout << " [FAIL] : in pd_test_ndframe_attrs() : keys()" << std::endl; throw std::runtime_error("pd_test_ndframe_attrs failed: keys()"); } // Test remove passed = attrs.remove("count") && !attrs.contains("count"); if (!passed) { std::cout << " [FAIL] : in pd_test_ndframe_attrs() : remove" << std::endl; .. _example-attrs-clear-5: .. dropdown:: clear (pd_test_1_all.cpp:16341) :class-title: example-dropdown .. code-block:: cpp :linenos: :lineno-start: 16331 :emphasize-lines: 11 } // Test has_type passed = attrs.has_type("author") && !attrs.has_type("author"); if (!passed) { std::cout << " [FAIL] : in pd_test_ndframe_attrs() : has_type" << std::endl; throw std::runtime_error("pd_test_ndframe_attrs failed: has_type"); } // Test clear attrs.clear(); passed = attrs.empty(); if (!passed) { std::cout << " [FAIL] : in pd_test_ndframe_attrs() : clear" << std::endl; throw std::runtime_error("pd_test_ndframe_attrs failed: clear"); } std::cout << " -> tests passed" << std::endl; } // ===================================================================== .. _example-attrs-contains-6: .. dropdown:: contains (pd_test_1_all.cpp:2200) :class-title: example-dropdown .. code-block:: cpp :linenos: :lineno-start: 2190 :emphasize-lines: 11 // Test: contains method // ============================================================================ void test_contains() { std::cout << "========= IntervalArray: contains ======================= "; std::vector breaks = {0.0, 1.0, 2.0, 3.0}; // Right-closed intervals: (0, 1], (1, 2], (2, 3] auto arr_right = pandas::IntervalArrayFloat64::from_breaks(breaks, pandas::IntervalClosed::Right); // Test contains(1.0) - should be in interval 0 but not 1 (since 1 is exclusive on left of interval 1) auto contains_1 = arr_right.contains(1.0); // (0, 1] contains 1: yes, (1, 2] contains 1: no (open on left), (2, 3] contains 1: no if (contains_1[0].value_or(false) != true || contains_1[1].value_or(true) != false || contains_1[2].value_or(true) != false) { std::cout << "[FAIL] : in test_contains() : right-closed contains 1.0" << std::endl; return; } // Left-closed intervals: [0, 1), [1, 2), [2, 3) .. _example-attrs-empty-7: .. dropdown:: empty (pd_test_1_all.cpp:941) :class-title: example-dropdown .. code-block:: cpp :linenos: :lineno-start: 931 :emphasize-lines: 11 #include "../pandas/pd_config.h" namespace dataframe_tests { namespace dataframe_tests_config { void pd_test_config_version() { std::cout << "========= df_config: version info ======================= "; const char* version = pandas::DataFrameInfo::version(); if (version == nullptr || std::string(version).empty()) { std::cout << "[FAIL] : in pd_test_config_version() : version is null or empty" << std::endl; throw std::runtime_error("pd_test_config_version failed: version is null or empty"); } std::cout << "-> tests passed" << std::endl; } void pd_test_config_na_repr() { std::cout << "========= df_config: NA representation ======================= "; const char* na_repr = pandas::DataFrameConfig::get_na_repr(); if (na_repr == nullptr) { .. _example-attrs-has_type-8: .. dropdown:: has_type (pd_test_1_all.cpp:16334) :class-title: example-dropdown .. code-block:: cpp :linenos: :lineno-start: 16324 :emphasize-lines: 11 } // Test remove passed = attrs.remove("count") && !attrs.contains("count"); if (!passed) { std::cout << " [FAIL] : in pd_test_ndframe_attrs() : remove" << std::endl; throw std::runtime_error("pd_test_ndframe_attrs failed: remove"); } // Test has_type passed = attrs.has_type("author") && !attrs.has_type("author"); if (!passed) { std::cout << " [FAIL] : in pd_test_ndframe_attrs() : has_type" << std::endl; throw std::runtime_error("pd_test_ndframe_attrs failed: has_type"); } // Test clear attrs.clear(); passed = attrs.empty(); if (!passed) { std::cout << " [FAIL] : in pd_test_ndframe_attrs() : clear" << std::endl; .. _example-attrs-remove-9: .. dropdown:: remove (pd_test_1_all.cpp:16327) :class-title: example-dropdown .. code-block:: cpp :linenos: :lineno-start: 16317 :emphasize-lines: 11 // Test keys auto keys = attrs.keys(); passed = keys.size() == 3; if (!passed) { std::cout << " [FAIL] : in pd_test_ndframe_attrs() : keys()" << std::endl; throw std::runtime_error("pd_test_ndframe_attrs failed: keys()"); } // Test remove passed = attrs.remove("count") && !attrs.contains("count"); if (!passed) { std::cout << " [FAIL] : in pd_test_ndframe_attrs() : remove" << std::endl; throw std::runtime_error("pd_test_ndframe_attrs failed: remove"); } // Test has_type passed = attrs.has_type("author") && !attrs.has_type("author"); if (!passed) { std::cout << " [FAIL] : in pd_test_ndframe_attrs() : has_type" << std::endl; throw std::runtime_error("pd_test_ndframe_attrs failed: has_type"); .. _example-attrs-set-10: .. dropdown:: set (pd_test_1_all.cpp:16281) :class-title: example-dropdown .. code-block:: cpp :linenos: :lineno-start: 16271 :emphasize-lines: 11 pandas::Attrs attrs; // Test empty bool passed = attrs.empty() && attrs.size() == 0; if (!passed) { std::cout << " [FAIL] : in pd_test_ndframe_attrs() : empty attrs" << std::endl; throw std::runtime_error("pd_test_ndframe_attrs failed: empty attrs"); } // Test set/get string attrs.set("author", std::string("John Doe")); passed = attrs.contains("author") && attrs.get("author") == "John Doe"; if (!passed) { std::cout << " [FAIL] : in pd_test_ndframe_attrs() : set/get string" << std::endl; throw std::runtime_error("pd_test_ndframe_attrs failed: set/get string"); } // Test set/get double attrs.set("version", 1.5); passed = std::abs(attrs.get("version") - 1.5) < 1e-10; if (!passed) { .. _example-attrs-size-11: .. dropdown:: size (pd_test_1_all.cpp:22) :class-title: example-dropdown .. code-block:: cpp :linenos: :lineno-start: 12 :emphasize-lines: 11 #include "../pandas/pd_boolean_array.h" namespace dataframe_tests { namespace dataframe_tests_boolean_array { void pd_test_boolean_array_constructors() { std::cout << "========= BooleanArray: constructors ======================= "; // Default constructor pandas::BooleanArray arr1; if (arr1.size() != 0) { std::cout << " [FAIL] : in pd_test_boolean_array_constructors() : default constructor size != 0" << std::endl; throw std::runtime_error("pd_test_boolean_array_constructors failed: default constructor size != 0"); } // Initializer list constructor pandas::BooleanArray arr2({ std::optional(true), std::optional(false), std::nullopt, std::optional(true)