PeriodArray#
-
class pandas::PeriodArray#
Extension array type for specialized data storage.
Example#
#include <pandas/pandas.h>
using namespace pandas;
// Use PeriodArray
PeriodArray obj;
// ... operations ...
Constructors#
Signature |
Location |
Example |
|---|---|---|
|
pd_period_array.h:106 |
|
|
pd_period_array.h:122 |
|
|
pd_period_array.h:164 |
|
|
pd_period_array.h:184 |
Construction#
Signature |
Return Type |
Location |
Example |
|---|---|---|---|
|
static PeriodArray |
pd_period_array.h:1059 |
Indexing / Selection#
Data Manipulation#
Signature |
Return Type |
Location |
Example |
|---|---|---|---|
|
PeriodArray |
pd_period_array.h:396 |
Missing Data#
Signature |
Return Type |
Location |
Example |
|---|---|---|---|
|
PeriodArray |
pd_period_array.h:382 |
|
|
numpy::NDArray<numpy::bool_> |
pd_period_array.h:332 |
|
|
numpy::NDArray<numpy::bool_> |
pd_period_array.h:339 |
Statistics#
Signature |
Return Type |
Location |
Example |
|---|---|---|---|
|
size_t |
pd_period_array.h:357 |
|
|
std::optional<numpy::int64> |
pd_period_array.h:984 |
|
|
std::optional<numpy::int64> |
pd_period_array.h:975 |
|
|
IntegerArray<numpy::int32> |
pd_period_array.h:563 |
Comparison#
Signature |
Return Type |
Location |
Example |
|---|---|---|---|
|
size_t |
pd_period_array.h:251 |
Sorting#
Signature |
Return Type |
Location |
Example |
|---|---|---|---|
|
numpy::NDArray<size_t> |
pd_period_array.h:905 |
Combining#
Signature |
Return Type |
Location |
Example |
|---|---|---|---|
|
static PeriodArray |
pd_period_array.h:1067 |
Time Series#
I/O#
Signature |
Return Type |
Location |
Example |
|---|---|---|---|
|
std::string |
pd_period_array.h:1104 |
Conversion#
Signature |
Return Type |
Location |
Example |
|---|---|---|---|
|
PeriodArray |
pd_period_array.h:350 |
Iteration#
Signature |
Return Type |
Location |
Example |
|---|---|---|---|
|
DatetimeArray |
pd_period_array.h:666 |
Set Operations#
Signature |
Return Type |
Location |
Example |
|---|---|---|---|
|
PeriodArray |
pd_period_array.h:997 |
Type Checking#
Other Methods#
Signature |
Return Type |
Location |
Example |
|---|---|---|---|
|
std::optional<size_t> |
pd_period_array.h:956 |
|
|
std::optional<size_t> |
pd_period_array.h:937 |
|
|
const numpy::NDArray<numpy::int64>& |
pd_period_array.h:276 |
|
|
IntegerArray<numpy::int32> |
pd_period_array.h:488 |
|
|
IntegerArray<numpy::int32> |
pd_period_array.h:505 |
|
|
IntegerArray<numpy::int32> |
pd_period_array.h:529 |
|
|
IntegerArray<numpy::int32> |
pd_period_array.h:597 |
|
|
pd_period_array.h:697 |
||
|
dtype_type |
pd_period_array.h:209 |
|
|
bool |
pd_period_array.h:244 |
|
|
std::pair<numpy::NDArray<numpy::int64>, PeriodArray> |
pd_period_array.h:1023 |
|
|
PeriodFrequency |
pd_period_array.h:258 |
|
|
std::string |
pd_period_array.h:265 |
|
|
bool |
pd_period_array.h:370 |
|
|
IntegerArray<numpy::int32> |
pd_period_array.h:546 |
|
|
IntegerArray<numpy::int32> |
pd_period_array.h:447 |
|
|
size_t |
pd_period_array.h:223 |
|
|
constexpr int |
pd_period_array.h:230 |
|
|
numpy::int64 |
pd_period_array.h:321 |
|
|
pd_period_array.h:496 |
||
|
pd_period_array.h:513 |
||
|
pd_period_array.h:537 |
||
|
pd_period_array.h:554 |
||
|
pd_period_array.h:571 |
||
|
pd_period_array.h:455 |
||
|
pd_period_array.h:438 |
||
|
pd_period_array.h:588 |
||
|
pd_period_array.h:472 |
||
|
pd_period_array.h:421 |
||
|
IntegerArray<numpy::int32> |
pd_period_array.h:430 |
|
|
std::string |
pd_period_array.h:1126 |
|
|
IntegerArray<numpy::int32> |
pd_period_array.h:580 |
|
|
std::vector<size_t> |
pd_period_array.h:237 |
|
|
size_t |
pd_period_array.h:216 |
|
|
DatetimeArray |
pd_period_array.h:659 |
|
|
void |
pd_period_array.h:66 |
|
|
IntegerArray<numpy::int32> |
pd_period_array.h:464 |
|
|
IntegerArray<numpy::int32> |
pd_period_array.h:522 |
|
|
IntegerArray<numpy::int32> |
pd_period_array.h:481 |
|
|
IntegerArray<numpy::int32> |
pd_period_array.h:413 |
Code Examples#
The following examples are extracted from the test suite.
PeriodArray (pd_test_1_all.cpp:2927)
2917 }
2918
2919 // Subtract integer
2920 auto unshifted = shifted - 3;
2921 auto un0 = unshifted[0];
2922 if (!un0.has_value() || un0.value() != orig0.value()) {
2923 std::cout << " [FAIL] : unshifted should equal original" << std::endl;
2924 throw std::runtime_error("pd_test_period_array_arithmetic failed: unshift");
2925 }
2926
2927 // Subtract PeriodArray (get differences)
2928 pandas::PeriodArray arr2(std::vector<std::string>{
2929 "2024-04",
2930 "2024-03",
2931 "2024-01"
2932 }, "M");
2933
2934 auto diff = arr2 - arr;
2935 auto d0 = diff[0];
2936 if (!d0.has_value() || d0.value() != 3) {
2937 std::cout << " [FAIL] : diff[0] should be 3 (Apr - Jan)" << std::endl;
PeriodArray (pd_test_1_all.cpp:2927)
2917 }
2918
2919 // Subtract integer
2920 auto unshifted = shifted - 3;
2921 auto un0 = unshifted[0];
2922 if (!un0.has_value() || un0.value() != orig0.value()) {
2923 std::cout << " [FAIL] : unshifted should equal original" << std::endl;
2924 throw std::runtime_error("pd_test_period_array_arithmetic failed: unshift");
2925 }
2926
2927 // Subtract PeriodArray (get differences)
2928 pandas::PeriodArray arr2(std::vector<std::string>{
2929 "2024-04",
2930 "2024-03",
2931 "2024-01"
2932 }, "M");
2933
2934 auto diff = arr2 - arr;
2935 auto d0 = diff[0];
2936 if (!d0.has_value() || d0.value() != 3) {
2937 std::cout << " [FAIL] : diff[0] should be 3 (Apr - Jan)" << std::endl;
PeriodArray (pd_test_1_all.cpp:2927)
2917 }
2918
2919 // Subtract integer
2920 auto unshifted = shifted - 3;
2921 auto un0 = unshifted[0];
2922 if (!un0.has_value() || un0.value() != orig0.value()) {
2923 std::cout << " [FAIL] : unshifted should equal original" << std::endl;
2924 throw std::runtime_error("pd_test_period_array_arithmetic failed: unshift");
2925 }
2926
2927 // Subtract PeriodArray (get differences)
2928 pandas::PeriodArray arr2(std::vector<std::string>{
2929 "2024-04",
2930 "2024-03",
2931 "2024-01"
2932 }, "M");
2933
2934 auto diff = arr2 - arr;
2935 auto d0 = diff[0];
2936 if (!d0.has_value() || d0.value() != 3) {
2937 std::cout << " [FAIL] : diff[0] should be 3 (Apr - Jan)" << std::endl;
PeriodArray (pd_test_1_all.cpp:2927)
2917 }
2918
2919 // Subtract integer
2920 auto unshifted = shifted - 3;
2921 auto un0 = unshifted[0];
2922 if (!un0.has_value() || un0.value() != orig0.value()) {
2923 std::cout << " [FAIL] : unshifted should equal original" << std::endl;
2924 throw std::runtime_error("pd_test_period_array_arithmetic failed: unshift");
2925 }
2926
2927 // Subtract PeriodArray (get differences)
2928 pandas::PeriodArray arr2(std::vector<std::string>{
2929 "2024-04",
2930 "2024-03",
2931 "2024-01"
2932 }, "M");
2933
2934 auto diff = arr2 - arr;
2935 auto d0 = diff[0];
2936 if (!d0.has_value() || d0.value() != 3) {
2937 std::cout << " [FAIL] : diff[0] should be 3 (Apr - Jan)" << std::endl;
at (pd_test_1_all.cpp:6581)
6571 // Test isna/notna with float data
6572 {
6573 std::map<std::string, std::vector<numpy::float64>> float_data;
6574 float_data["X"] = {1.0, std::nan(""), 3.0};
6575 float_data["Y"] = {4.0, 5.0, std::nan("")};
6576 pandas::DataFrame df_na(float_data);
6577
6578 auto na_mask = df_na.isna();
6579 // Row 1, col 0 (X) should be NA
6580 if (!na_mask.getElementAt({1, 0})) {
6581 std::cout << " [FAIL] : in pd_test_dataframe_manipulation() : isna at (1,0) should be true" << std::endl;
6582 throw std::runtime_error("pd_test_dataframe_manipulation failed: isna at (1,0)");
6583 }
6584 // Row 2, col 1 (Y) should be NA
6585 if (!na_mask.getElementAt({2, 1})) {
6586 std::cout << " [FAIL] : in pd_test_dataframe_manipulation() : isna at (2,1) should be true" << std::endl;
6587 throw std::runtime_error("pd_test_dataframe_manipulation failed: isna at (2,1)");
6588 }
6589 // Row 0, col 0 should NOT be NA
6590 if (na_mask.getElementAt({0, 0})) {
6591 std::cout << " [FAIL] : in pd_test_dataframe_manipulation() : isna at (0,0) should be false" << std::endl;
mask (pd_test_1_all.cpp:9119)
9109void pd_test_datetime_mixin_array_constructor() {
9110 std::cout << "========= DatetimeTDMixin array constructor =========================";
9111
9112 // Create DatetimeArray with some values
9113 numpy::NDArray<numpy::datetime64> data(std::vector<size_t>{3});
9114 data.setElementAt({0}, numpy::datetime64(1000000000000000000LL, numpy::DateTimeUnit::Nanosecond)); // ~2001
9115 data.setElementAt({1}, numpy::datetime64(1500000000000000000LL, numpy::DateTimeUnit::Nanosecond)); // ~2017
9116 data.setElementAt({2}, numpy::datetime64(1600000000000000000LL, numpy::DateTimeUnit::Nanosecond)); // ~2020
9117
9118 numpy::NDArray<numpy::bool_> mask(std::vector<size_t>{3});
9119 mask.setElementAt({0}, numpy::bool_(false));
9120 mask.setElementAt({1}, numpy::bool_(false));
9121 mask.setElementAt({2}, numpy::bool_(false));
9122
9123 pandas::DatetimeArray arr(data, mask);
9124 pandas::DatetimeTDMixin idx(arr, "timestamps");
9125
9126 bool passed = (idx.size() == 3 && !idx.empty() &&
9127 idx.name().has_value() && *idx.name() == "timestamps" &&
9128 idx.inferred_type() == "datetime");
dropna (pd_test_1_all.cpp:531)
521 }
522
523 // Test isna array
524 numpy::NDArray<numpy::bool_> na_mask = arr.isna();
525 if (na_mask.getSize() != 4) {
526 std::cout << " [FAIL] : in pd_test_categorical_array_na_handling() : isna size != 4" << std::endl;
527 throw std::runtime_error("pd_test_categorical_array_na_handling failed: isna size != 4");
528 }
529
530 // Test dropna
531 pandas::CategoricalArray dropped = arr.dropna();
532 if (dropped.size() != 2) {
533 std::cout << " [FAIL] : in pd_test_categorical_array_na_handling() : dropna size != 2" << std::endl;
534 throw std::runtime_error("pd_test_categorical_array_na_handling failed: dropna size != 2");
535 }
536
537 // Test fillna (fill with existing category)
538 pandas::CategoricalArray filled = arr.fillna("a"); // 'a' is in categories
539 if (filled.has_na()) {
540 std::cout << " [FAIL] : in pd_test_categorical_array_na_handling() : fillna should have no NA" << std::endl;
541 throw std::runtime_error("pd_test_categorical_array_na_handling failed: fillna should have no NA");
fillna (pd_test_1_all.cpp:537)
527 throw std::runtime_error("pd_test_categorical_array_na_handling failed: isna size != 4");
528 }
529
530 // Test dropna
531 pandas::CategoricalArray dropped = arr.dropna();
532 if (dropped.size() != 2) {
533 std::cout << " [FAIL] : in pd_test_categorical_array_na_handling() : dropna size != 2" << std::endl;
534 throw std::runtime_error("pd_test_categorical_array_na_handling failed: dropna size != 2");
535 }
536
537 // Test fillna (fill with existing category)
538 pandas::CategoricalArray filled = arr.fillna("a"); // 'a' is in categories
539 if (filled.has_na()) {
540 std::cout << " [FAIL] : in pd_test_categorical_array_na_handling() : fillna should have no NA" << std::endl;
541 throw std::runtime_error("pd_test_categorical_array_na_handling failed: fillna should have no NA");
542 }
543
544 std::cout << " -> tests passed" << std::endl;
545 }
546
547 void pd_test_categorical_array_add_categories() {
isna (pd_test_1_all.cpp:524)
514 throw std::runtime_error("pd_test_categorical_array_na_handling failed: has_na() should be true");
515 }
516
517 // Test count (non-NA)
518 if (arr.count() != 2) {
519 std::cout << " [FAIL] : in pd_test_categorical_array_na_handling() : count() != 2" << std::endl;
520 throw std::runtime_error("pd_test_categorical_array_na_handling failed: count() != 2");
521 }
522
523 // Test isna array
524 numpy::NDArray<numpy::bool_> na_mask = arr.isna();
525 if (na_mask.getSize() != 4) {
526 std::cout << " [FAIL] : in pd_test_categorical_array_na_handling() : isna size != 4" << std::endl;
527 throw std::runtime_error("pd_test_categorical_array_na_handling failed: isna size != 4");
528 }
529
530 // Test dropna
531 pandas::CategoricalArray dropped = arr.dropna();
532 if (dropped.size() != 2) {
533 std::cout << " [FAIL] : in pd_test_categorical_array_na_handling() : dropna size != 2" << std::endl;
534 throw std::runtime_error("pd_test_categorical_array_na_handling failed: dropna size != 2");
notna (pd_test_1_all.cpp:6595)
6585 if (!na_mask.getElementAt({2, 1})) {
6586 std::cout << " [FAIL] : in pd_test_dataframe_manipulation() : isna at (2,1) should be true" << std::endl;
6587 throw std::runtime_error("pd_test_dataframe_manipulation failed: isna at (2,1)");
6588 }
6589 // Row 0, col 0 should NOT be NA
6590 if (na_mask.getElementAt({0, 0})) {
6591 std::cout << " [FAIL] : in pd_test_dataframe_manipulation() : isna at (0,0) should be false" << std::endl;
6592 throw std::runtime_error("pd_test_dataframe_manipulation failed: isna at (0,0)");
6593 }
6594
6595 auto notna_mask = df_na.notna();
6596 if (notna_mask.getElementAt({1, 0})) {
6597 std::cout << " [FAIL] : in pd_test_dataframe_manipulation() : notna at (1,0) should be false" << std::endl;
6598 throw std::runtime_error("pd_test_dataframe_manipulation failed: notna at (1,0)");
6599 }
6600 }
6601
6602 // Test fillna
6603 {
6604 std::map<std::string, std::vector<numpy::float64>> float_data;
6605 float_data["X"] = {1.0, std::nan(""), 3.0};
count (pd_test_1_all.cpp:66)
56 if (arr.is_na(0)) {
57 std::cout << " [FAIL] : in pd_test_boolean_array_na_handling() : is_na(0) should be false" << std::endl;
58 throw std::runtime_error("pd_test_boolean_array_na_handling failed: is_na(0) should be false");
59 }
60
61 if (!arr.has_na()) {
62 std::cout << " [FAIL] : in pd_test_boolean_array_na_handling() : has_na() should be true" << std::endl;
63 throw std::runtime_error("pd_test_boolean_array_na_handling failed: has_na() should be true");
64 }
65
66 if (arr.count() != 2) {
67 std::cout << " [FAIL] : in pd_test_boolean_array_na_handling() : count() should be 2" << std::endl;
68 throw std::runtime_error("pd_test_boolean_array_na_handling failed: count() should be 2");
69 }
70
71 std::cout << " -> tests passed" << std::endl;
72 }
73
74 void pd_test_boolean_array_kleene_and() {
75 std::cout << "========= BooleanArray: Kleene AND ======================= ";
max (pd_test_1_all.cpp:771)
761 pandas::CategoricalArray arr = pandas::CategoricalArray::from_codes(codes, cats, true); // ordered
762
763 // Test min
764 std::optional<std::string> min_val = arr.min();
765 if (!min_val.has_value() || *min_val != "low") {
766 std::cout << " [FAIL] : in pd_test_categorical_array_ordered_operations() : min != 'low'" << std::endl;
767 throw std::runtime_error("pd_test_categorical_array_ordered_operations failed: min != 'low'");
768 }
769
770 // Test max
771 std::optional<std::string> max_val = arr.max();
772 if (!max_val.has_value() || *max_val != "high") {
773 std::cout << " [FAIL] : in pd_test_categorical_array_ordered_operations() : max != 'high'" << std::endl;
774 throw std::runtime_error("pd_test_categorical_array_ordered_operations failed: max != 'high'");
775 }
776
777 // Test unordered throws for min/max
778 pandas::CategoricalArray unordered = arr.as_unordered();
779 bool threw = false;
780 try {
781 unordered.min();
min (pd_test_1_all.cpp:764)
754 }
755
756 void pd_test_categorical_array_ordered_operations() {
757 std::cout << "========= CategoricalArray: ordered operations (min/max) ======================= ";
758
759 std::vector<std::string> cats = {"low", "medium", "high"};
760 std::vector<numpy::int32> codes = {0, 2, 1, 0, -1}; // low, high, medium, low, NA
761 pandas::CategoricalArray arr = pandas::CategoricalArray::from_codes(codes, cats, true); // ordered
762
763 // Test min
764 std::optional<std::string> min_val = arr.min();
765 if (!min_val.has_value() || *min_val != "low") {
766 std::cout << " [FAIL] : in pd_test_categorical_array_ordered_operations() : min != 'low'" << std::endl;
767 throw std::runtime_error("pd_test_categorical_array_ordered_operations failed: min != 'low'");
768 }
769
770 // Test max
771 std::optional<std::string> max_val = arr.max();
772 if (!max_val.has_value() || *max_val != "high") {
773 std::cout << " [FAIL] : in pd_test_categorical_array_ordered_operations() : max != 'high'" << std::endl;
774 throw std::runtime_error("pd_test_categorical_array_ordered_operations failed: max != 'high'");
minute (pd_test_1_all.cpp:7505)
7495 std::cout << "========= minute property =============================";
7496
7497 std::vector<std::optional<numpy::datetime64>> values = {
7498 make_dt(0), // Minute 0
7499 make_dt(30 * NS_PER_MIN), // Minute 30
7500 make_dt(59 * NS_PER_MIN) // Minute 59
7501 };
7502 pandas::DatetimeArray arr(values);
7503 pandas::DatetimeIndex idx(arr);
7504
7505 auto minutes = idx.minute();
7506
7507 bool passed = (minutes.size() == 3);
7508 auto m0 = minutes[0];
7509 auto m1 = minutes[1];
7510 auto m2 = minutes[2];
7511 passed = passed && m0.has_value() && *m0 == 0;
7512 passed = passed && m1.has_value() && *m1 == 30;
7513 passed = passed && m2.has_value() && *m2 == 59;
7514
7515 if (!passed) {
len (pd_test_3_all.cpp:20867)
20857 auto title_result = s.str().title();
20858 if (title_result[0] != "Hello World" || title_result[1] != "Hello World" || title_result[2] != "Hello World") {
20859 std::cout << " [FAIL] : title() failed" << std::endl;
20860 throw std::runtime_error("pd_test_str_capitalize_title: title() failed");
20861 }
20862
20863 std::cout << " -> tests passed" << std::endl;
20864}
20865
20866// ============================================================================
20867// Test str().len()
20868// ============================================================================
20869
20870void pd_test_str_len() {
20871 std::cout << "========= Series.str().len() ============================";
20872
20873 pandas::Series<std::string> s({"a", "bb", "ccc", ""});
20874
20875 auto lens = s.str().len();
20876 if (lens[0] != 1 || lens[1] != 2 || lens[2] != 3 || lens[3] != 0) {
20877 std::cout << " [FAIL] : len() failed" << std::endl;
argsort (pd_test_1_all.cpp:1304)
1294 std::cout << "========= DatetimeArray: sorting ======================= ";
1295
1296 pandas::DatetimeArray arr(std::vector<std::string>{
1297 "2023-06-15",
1298 "NaT",
1299 "2023-01-01",
1300 "2023-12-31"
1301 });
1302
1303 // argsort ascending
1304 auto indices = arr.argsort(true, "last");
1305 // Expected order: 2023-01-01(2), 2023-06-15(0), 2023-12-31(3), NaT(1)
1306 if (indices.getElementAt({0}) != 2) {
1307 std::cout << " [FAIL] : argsort: first should be index 2 (2023-01-01)" << std::endl;
1308 throw std::runtime_error("pd_test_datetime_array_sorting failed: argsort first");
1309 }
1310 if (indices.getElementAt({3}) != 1) {
1311 std::cout << " [FAIL] : argsort: last should be index 1 (NaT)" << std::endl;
1312 throw std::runtime_error("pd_test_datetime_array_sorting failed: NaT position");
1313 }
concat (pd_test_1_all.cpp:17717)
17707}
17708
17709void pd_test_period_index_concat() {
17710 std::cout << "========= concat factory ==============================";
17711
17712 std::vector<int64_t> ordinals1 = {0, 1};
17713 std::vector<int64_t> ordinals2 = {2, 3};
17714 pandas::PeriodIndex idx1(ordinals1, "D");
17715 pandas::PeriodIndex idx2(ordinals2, "D");
17716
17717 pandas::PeriodIndex concatenated = pandas::PeriodIndex::concat({idx1, idx2});
17718
17719 bool passed = (concatenated.size() == 4);
17720 if (!passed) {
17721 std::cout << " [FAIL] : in pd_test_period_index_concat()" << std::endl;
17722 throw std::runtime_error("pd_test_period_index_concat failed");
17723 }
17724
17725 std::cout << " -> tests passed" << std::endl;
17726}
asfreq (pd_test_1_all.cpp:2869)
2859 std::cout << "========= PeriodArray: asfreq ======================= ";
2860
2861 // Monthly to quarterly
2862 pandas::PeriodArray arr_m(std::vector<std::string>{
2863 "2024-01",
2864 "2024-04",
2865 "2024-07",
2866 "NaT"
2867 }, "M");
2868
2869 auto arr_q = arr_m.asfreq("Q");
2870 if (arr_q.size() != 4) {
2871 std::cout << " [FAIL] : asfreq size should be 4" << std::endl;
2872 throw std::runtime_error("pd_test_period_array_asfreq failed: size");
2873 }
2874 if (arr_q.freqstr() != "Q") {
2875 std::cout << " [FAIL] : asfreq freqstr should be 'Q'" << std::endl;
2876 throw std::runtime_error("pd_test_period_array_asfreq failed: freqstr");
2877 }
2878
2879 // Check NaT is preserved
to_timestamp (pd_test_1_all.cpp:2830)
2820 void pd_test_period_array_to_timestamp() {
2821 std::cout << "========= PeriodArray: to_timestamp ======================= ";
2822
2823 pandas::PeriodArray arr(std::vector<std::string>{
2824 "2024-01",
2825 "2024-06",
2826 "NaT"
2827 }, "M");
2828
2829 // to_timestamp with start
2830 auto ts_start = arr.to_timestamp("start");
2831 if (ts_start.size() != 3) {
2832 std::cout << " [FAIL] : to_timestamp size should be 3" << std::endl;
2833 throw std::runtime_error("pd_test_period_array_to_timestamp failed: size");
2834 }
2835
2836 auto ts0 = ts_start[0];
2837 if (!ts0.has_value()) {
2838 std::cout << " [FAIL] : ts_start[0] should have value" << std::endl;
2839 throw std::runtime_error("pd_test_period_array_to_timestamp failed: ts_start[0]");
2840 }
to_string (pd_test_1_all.cpp:2693)
2683 pandas::PeriodArray arr_m(std::vector<std::string>{
2684 "2020-01",
2685 "NaT",
2686 "2025-06"
2687 }, "M");
2688
2689 // Year
2690 auto years = arr_m.year();
2691 auto y0 = years[0];
2692 if (!y0.has_value() || y0.value() != 2020) {
2693 std::cout << " [FAIL] : year[0] should be 2020, got " << (y0.has_value() ? std::to_string(y0.value()) : "NA") << std::endl;
2694 throw std::runtime_error("pd_test_period_array_year_month_quarter failed: year[0]");
2695 }
2696
2697 auto y1 = years[1];
2698 if (y1.has_value()) {
2699 std::cout << " [FAIL] : year[1] should be NA (NaT)" << std::endl;
2700 throw std::runtime_error("pd_test_period_array_year_month_quarter failed: year[1] should be NA");
2701 }
2702
2703 auto y2 = years[2];
copy (pd_test_1_all.cpp:5798)
5788// ============================================================================
5789// Copy/Rename Tests
5790// ============================================================================
5791
5792void pd_test_categorical_index_copy() {
5793 std::cout << "========= copy ========================================";
5794
5795 pandas::CategoricalArray arr({"a", "b", "c"});
5796 pandas::CategoricalIndex idx(arr, "original");
5797
5798 pandas::CategoricalIndex copied = idx.copy();
5799
5800 bool passed = (copied.size() == idx.size() && copied.name() == idx.name() &&
5801 copied.categories() == idx.categories() && copied.ordered() == idx.ordered());
5802 if (!passed) {
5803 std::cout << " [FAIL] : in pd_test_categorical_index_copy()" << std::endl;
5804 throw std::runtime_error("pd_test_categorical_index_copy failed");
5805 }
5806
5807 std::cout << " -> tests passed" << std::endl;
5808}
end_time (pd_test_1_all.cpp:17146)
17136 std::cout << " -> tests passed" << std::endl;
17137}
17138
17139void pd_test_period_index_end_time() {
17140 std::cout << "========= end_time property ===========================";
17141
17142 std::vector<int64_t> ordinals = {0}; // 1970-01-01 daily period
17143 pandas::PeriodIndex idx = pandas::PeriodIndex::from_ordinals(ordinals, "D");
17144
17145 pandas::DatetimeArray end_times = idx.end_time();
17146
17147 bool passed = (end_times.size() == 1 && !end_times.is_na(0));
17148 if (!passed) {
17149 std::cout << " [FAIL] : in pd_test_period_index_end_time()" << std::endl;
17150 throw std::runtime_error("pd_test_period_index_end_time failed");
17151 }
17152
17153 std::cout << " -> tests passed" << std::endl;
17154}
unique (pd_test_1_all.cpp:1345)
1335 pandas::DatetimeArray arr(std::vector<std::string>{
1336 "2023-01-01",
1337 "2023-06-15",
1338 "2023-01-01",
1339 "NaT",
1340 "2023-06-15",
1341 "NaT"
1342 });
1343
1344 // unique
1345 auto uniq = arr.unique();
1346 // Should have: NaT, 2023-01-01, 2023-06-15 (3 unique values)
1347 if (uniq.size() != 3) {
1348 std::cout << " [FAIL] : unique size should be 3, got " << uniq.size() << std::endl;
1349 throw std::runtime_error("pd_test_datetime_array_unique failed: size");
1350 }
1351
1352 // factorize
1353 auto [codes, uniques] = arr.factorize();
1354 // Codes for NaT should be -1
1355 if (codes.getElementAt({3}) != -1) {
is_leap_year (pd_test_1_all.cpp:1280)
1270 }
1271
1272 // is_month_end
1273 auto me = arr.is_month_end();
1274 if (!me[1].has_value() || !me[1].value()) {
1275 std::cout << " [FAIL] : 2023-03-31 should be month end" << std::endl;
1276 throw std::runtime_error("pd_test_datetime_array_boolean_props failed: month end");
1277 }
1278
1279 // is_leap_year
1280 auto ly = arr.is_leap_year();
1281 if (!ly[2].has_value() || !ly[2].value()) {
1282 std::cout << " [FAIL] : 2024 should be leap year" << std::endl;
1283 throw std::runtime_error("pd_test_datetime_array_boolean_props failed: leap year");
1284 }
1285 if (!ly[0].has_value() || ly[0].value()) {
1286 std::cout << " [FAIL] : 2023 should not be leap year" << std::endl;
1287 throw std::runtime_error("pd_test_datetime_array_boolean_props failed: not leap year");
1288 }
1289
1290 std::cout << " -> tests passed" << std::endl;
is_na (pd_test_1_all.cpp:51)
41 void pd_test_boolean_array_na_handling() {
42 std::cout << "========= BooleanArray: NA handling ======================= ";
43
44 pandas::BooleanArray arr({
45 std::optional<bool>(true),
46 std::nullopt, // NA at index 1
47 std::optional<bool>(false)
48 });
49
50 if (!arr.is_na(1)) {
51 std::cout << " [FAIL] : in pd_test_boolean_array_na_handling() : is_na(1) should be true" << std::endl;
52 throw std::runtime_error("pd_test_boolean_array_na_handling failed: is_na(1) should be true");
53 }
54
55 if (arr.is_na(0)) {
56 std::cout << " [FAIL] : in pd_test_boolean_array_na_handling() : is_na(0) should be false" << std::endl;
57 throw std::runtime_error("pd_test_boolean_array_na_handling failed: is_na(0) should be false");
58 }
59
60 if (!arr.has_na()) {
argmax (pd_test_1_all.cpp:1323)
1313 }
1314
1315 // argmin
1316 auto min_idx = arr.argmin();
1317 if (!min_idx.has_value() || min_idx.value() != 2) {
1318 std::cout << " [FAIL] : argmin should be 2 (2023-01-01)" << std::endl;
1319 throw std::runtime_error("pd_test_datetime_array_sorting failed: argmin");
1320 }
1321
1322 // argmax
1323 auto max_idx = arr.argmax();
1324 if (!max_idx.has_value() || max_idx.value() != 3) {
1325 std::cout << " [FAIL] : argmax should be 3 (2023-12-31)" << std::endl;
1326 throw std::runtime_error("pd_test_datetime_array_sorting failed: argmax");
1327 }
1328
1329 std::cout << " -> tests passed" << std::endl;
1330 }
1331
1332 void pd_test_datetime_array_unique() {
1333 std::cout << "========= DatetimeArray: unique/factorize ======================= ";
argmin (pd_test_1_all.cpp:1316)
1306 if (indices.getElementAt({0}) != 2) {
1307 std::cout << " [FAIL] : argsort: first should be index 2 (2023-01-01)" << std::endl;
1308 throw std::runtime_error("pd_test_datetime_array_sorting failed: argsort first");
1309 }
1310 if (indices.getElementAt({3}) != 1) {
1311 std::cout << " [FAIL] : argsort: last should be index 1 (NaT)" << std::endl;
1312 throw std::runtime_error("pd_test_datetime_array_sorting failed: NaT position");
1313 }
1314
1315 // argmin
1316 auto min_idx = arr.argmin();
1317 if (!min_idx.has_value() || min_idx.value() != 2) {
1318 std::cout << " [FAIL] : argmin should be 2 (2023-01-01)" << std::endl;
1319 throw std::runtime_error("pd_test_datetime_array_sorting failed: argmin");
1320 }
1321
1322 // argmax
1323 auto max_idx = arr.argmax();
1324 if (!max_idx.has_value() || max_idx.value() != 3) {
1325 std::cout << " [FAIL] : argmax should be 3 (2023-12-31)" << std::endl;
1326 throw std::runtime_error("pd_test_datetime_array_sorting failed: argmax");
data (pd_test_1_all.cpp:9114)
9104 throw std::runtime_error("pd_test_datetime_mixin_default_constructor failed");
9105 }
9106
9107 std::cout << " -> tests passed" << std::endl;
9108}
9109
9110void pd_test_datetime_mixin_array_constructor() {
9111 std::cout << "========= DatetimeTDMixin array constructor =========================";
9112
9113 // Create DatetimeArray with some values
9114 numpy::NDArray<numpy::datetime64> data(std::vector<size_t>{3});
9115 data.setElementAt({0}, numpy::datetime64(1000000000000000000LL, numpy::DateTimeUnit::Nanosecond)); // ~2001
9116 data.setElementAt({1}, numpy::datetime64(1500000000000000000LL, numpy::DateTimeUnit::Nanosecond)); // ~2017
9117 data.setElementAt({2}, numpy::datetime64(1600000000000000000LL, numpy::DateTimeUnit::Nanosecond)); // ~2020
9118
9119 numpy::NDArray<numpy::bool_> mask(std::vector<size_t>{3});
9120 mask.setElementAt({0}, numpy::bool_(false));
9121 mask.setElementAt({1}, numpy::bool_(false));
9122 mask.setElementAt({2}, numpy::bool_(false));
9123
9124 pandas::DatetimeArray arr(data, mask);
day (pd_test_1_all.cpp:1193)
1183 std::cout << " [FAIL] : month[0] should be 3" << std::endl;
1184 throw std::runtime_error("pd_test_datetime_array_component_month_day failed: month[0]");
1185 }
1186 auto m1 = months[1];
1187 if (!m1.has_value() || m1.value() != 12) {
1188 std::cout << " [FAIL] : month[1] should be 12" << std::endl;
1189 throw std::runtime_error("pd_test_datetime_array_component_month_day failed: month[1]");
1190 }
1191
1192 // Day
1193 auto days = arr.day();
1194 auto d0 = days[0];
1195 if (!d0.has_value() || d0.value() != 15) {
1196 std::cout << " [FAIL] : day[0] should be 15" << std::endl;
1197 throw std::runtime_error("pd_test_datetime_array_component_month_day failed: day[0]");
1198 }
1199 auto d1 = days[1];
1200 if (!d1.has_value() || d1.value() != 25) {
1201 std::cout << " [FAIL] : day[1] should be 25" << std::endl;
1202 throw std::runtime_error("pd_test_datetime_array_component_month_day failed: day[1]");
1203 }
dayofweek (pd_test_1_all.cpp:7565)
7555 // 1970-01-01 was a Thursday (day 3)
7556 std::vector<std::optional<numpy::datetime64>> values = {
7557 make_dt(0), // Thursday (3)
7558 make_dt(NS_PER_DAY), // Friday (4)
7559 make_dt(2 * NS_PER_DAY), // Saturday (5)
7560 make_dt(3 * NS_PER_DAY) // Sunday (6)
7561 };
7562 pandas::DatetimeArray arr(values);
7563 pandas::DatetimeIndex idx(arr);
7564
7565 auto dow = idx.dayofweek();
7566
7567 bool passed = (dow.size() == 4);
7568 if (!passed) {
7569 std::cout << " [FAIL] : in pd_test_datetime_index_dayofweek()" << std::endl;
7570 throw std::runtime_error("pd_test_datetime_index_dayofweek failed");
7571 }
7572
7573 std::cout << " -> tests passed" << std::endl;
7574}
dayofyear (pd_test_3_all.cpp:18582)
18572 auto seconds = s.dt().second();
18573 if (seconds[0] != 45 || seconds[1] != 30 || seconds[2] != 59) {
18574 std::cout << " [FAIL] : second() failed" << std::endl;
18575 throw std::runtime_error("pd_test_dt_time_components: second() failed");
18576 }
18577
18578 std::cout << " -> tests passed" << std::endl;
18579}
18580
18581// ============================================================================
18582// Test dt().dayofweek(), dt().dayofyear(), dt().quarter()
18583// ============================================================================
18584
18585void pd_test_dt_derived_properties() {
18586 std::cout << "========= Series.dt().dayofweek/dayofyear/quarter() ======";
18587
18588 // 2020-01-01 is a Wednesday (dayofweek=2), dayofyear=1, Q1
18589 // 2020-07-04 is a Saturday (dayofweek=5), dayofyear=186, Q3
18590 pandas::Series<std::string> s({"2020-01-01", "2020-07-04"});
18591
18592 auto dow = s.dt().dayofweek();
days_in_month (pd_test_1_all.cpp:2766)
2756 std::cout << " [FAIL] : day[0] should be 15" << std::endl;
2757 throw std::runtime_error("pd_test_period_array_day_components failed: day[0]");
2758 }
2759 auto d1 = days[1];
2760 if (!d1.has_value() || d1.value() != 25) {
2761 std::cout << " [FAIL] : day[1] should be 25" << std::endl;
2762 throw std::runtime_error("pd_test_period_array_day_components failed: day[1]");
2763 }
2764
2765 // Days in month
2766 auto dim = arr.days_in_month();
2767 auto dim0 = dim[0];
2768 if (!dim0.has_value() || dim0.value() != 31) {
2769 std::cout << " [FAIL] : days_in_month[0] should be 31 (March)" << std::endl;
2770 throw std::runtime_error("pd_test_period_array_day_components failed: days_in_month[0]");
2771 }
2772 auto dim1 = dim[1];
2773 if (!dim1.has_value() || dim1.value() != 31) {
2774 std::cout << " [FAIL] : days_in_month[1] should be 31 (December)" << std::endl;
2775 throw std::runtime_error("pd_test_period_array_day_components failed: days_in_month[1]");
2776 }
dtype (pd_test_1_all.cpp:295)
285 throw std::runtime_error("pd_test_boolean_array_reductions failed: mean");
286 }
287
288 std::cout << " -> tests passed" << std::endl;
289 }
290
291 void pd_test_boolean_array_dtype() {
292 std::cout << "========= BooleanArray: dtype ======================= ";
293
294 pandas::BooleanArray arr;
295 if (arr.dtype().name() != "boolean") {
296 std::cout << " [FAIL] : in pd_test_boolean_array_dtype() : dtype name should be 'boolean'" << std::endl;
297 throw std::runtime_error("pd_test_boolean_array_dtype failed: dtype name");
298 }
299
300 if (arr.dtype().kind() != "b") {
301 std::cout << " [FAIL] : in pd_test_boolean_array_dtype() : dtype kind should be 'b'" << std::endl;
302 throw std::runtime_error("pd_test_boolean_array_dtype failed: dtype kind");
303 }
304
305 std::cout << " -> tests passed" << std::endl;
empty (pd_test_1_all.cpp:941)
931#include "../pandas/pd_config.h"
932
933namespace dataframe_tests {
934
935namespace dataframe_tests_config {
936
937 void pd_test_config_version() {
938 std::cout << "========= df_config: version info ======================= ";
939 const char* version = pandas::DataFrameInfo::version();
940 if (version == nullptr || std::string(version).empty()) {
941 std::cout << "[FAIL] : in pd_test_config_version() : version is null or empty" << std::endl;
942 throw std::runtime_error("pd_test_config_version failed: version is null or empty");
943 }
944 std::cout << "-> tests passed" << std::endl;
945 }
946
947 void pd_test_config_na_repr() {
948 std::cout << "========= df_config: NA representation ======================= ";
949 const char* na_repr = pandas::DataFrameConfig::get_na_repr();
950 if (na_repr == nullptr) {
factorize (pd_test_1_all.cpp:1353)
1343 // unique
1344 auto uniq = arr.unique();
1345 // Should have: NaT, 2023-01-01, 2023-06-15 (3 unique values)
1346 if (uniq.size() != 3) {
1347 std::cout << " [FAIL] : unique size should be 3, got " << uniq.size() << std::endl;
1348 throw std::runtime_error("pd_test_datetime_array_unique failed: size");
1349 }
1350
1351 // factorize
1352 auto [codes, uniques] = arr.factorize();
1353 // Codes for NaT should be -1
1354 if (codes.getElementAt({3}) != -1) {
1355 std::cout << " [FAIL] : factorize: NaT code should be -1" << std::endl;
1356 throw std::runtime_error("pd_test_datetime_array_unique failed: NaT code");
1357 }
1358 // Same values should have same codes
1359 if (codes.getElementAt({0}) != codes.getElementAt({2})) {
1360 std::cout << " [FAIL] : factorize: 2023-01-01 values should have same code" << std::endl;
1361 throw std::runtime_error("pd_test_datetime_array_unique failed: same code");
1362 }
freq (pd_test_1_all.cpp:8233)
8223 std::cout << "========= freq property ===============================";
8224
8225 std::vector<std::optional<numpy::datetime64>> values = {
8226 numpy::datetime64(0LL, numpy::DateTimeUnit::Nanosecond),
8227 numpy::datetime64(86400000000000LL, numpy::DateTimeUnit::Nanosecond) // 1 day
8228 };
8229 pandas::DatetimeArray arr(values);
8230 pandas::DatetimeMixinIndex idx(arr);
8231
8232 // Default freq is nullopt or inferred
8233 auto f = idx.freq();
8234 std::string fs = idx.freqstr();
8235
8236 bool passed = true; // freq may or may not be set
8237 if (!passed) {
8238 std::cout << " [FAIL] : in pd_test_datetime_mixin_freq()" << std::endl;
8239 throw std::runtime_error("pd_test_datetime_mixin_freq failed");
8240 }
8241
8242 std::cout << " -> tests passed" << std::endl;
8243}
freqstr (pd_test_1_all.cpp:2671)
2661 }
2662
2663 pandas::PeriodDtype dtype_y("Y");
2664 if (dtype_y.name() != "period[Y]") {
2665 std::cout << " [FAIL] : dtype_y.name() should be 'period[Y]'" << std::endl;
2666 throw std::runtime_error("pd_test_period_array_freq_validation failed: dtype name Y");
2667 }
2668
2669 // Test frequency string
2670 pandas::PeriodArray arr(std::vector<std::string>{"2024-01-15"}, "D");
2671 if (arr.freqstr() != "D") {
2672 std::cout << " [FAIL] : arr.freqstr() should be 'D'" << std::endl;
2673 throw std::runtime_error("pd_test_period_array_freq_validation failed: freqstr");
2674 }
2675
2676 std::cout << " -> tests passed" << std::endl;
2677 }
2678
2679 void pd_test_period_array_year_month_quarter() {
2680 std::cout << "========= PeriodArray: year/month/quarter components ======================= ";
has_na (pd_test_1_all.cpp:61)
51 if (!arr.is_na(1)) {
52 std::cout << " [FAIL] : in pd_test_boolean_array_na_handling() : is_na(1) should be true" << std::endl;
53 throw std::runtime_error("pd_test_boolean_array_na_handling failed: is_na(1) should be true");
54 }
55
56 if (arr.is_na(0)) {
57 std::cout << " [FAIL] : in pd_test_boolean_array_na_handling() : is_na(0) should be false" << std::endl;
58 throw std::runtime_error("pd_test_boolean_array_na_handling failed: is_na(0) should be false");
59 }
60
61 if (!arr.has_na()) {
62 std::cout << " [FAIL] : in pd_test_boolean_array_na_handling() : has_na() should be true" << std::endl;
63 throw std::runtime_error("pd_test_boolean_array_na_handling failed: has_na() should be true");
64 }
65
66 if (arr.count() != 2) {
67 std::cout << " [FAIL] : in pd_test_boolean_array_na_handling() : count() should be 2" << std::endl;
68 throw std::runtime_error("pd_test_boolean_array_na_handling failed: count() should be 2");
69 }
70
71 std::cout << " -> tests passed" << std::endl;
hour (pd_test_1_all.cpp:7476)
7466 std::cout << "========= hour property ===============================";
7467
7468 std::vector<std::optional<numpy::datetime64>> values = {
7469 make_dt(0), // Hour 0
7470 make_dt(6 * NS_PER_HOUR), // Hour 6
7471 make_dt(23 * NS_PER_HOUR) // Hour 23
7472 };
7473 pandas::DatetimeArray arr(values);
7474 pandas::DatetimeIndex idx(arr);
7475
7476 auto hours = idx.hour();
7477
7478 bool passed = (hours.size() == 3);
7479 auto h0 = hours[0];
7480 auto h1 = hours[1];
7481 auto h2 = hours[2];
7482 passed = passed && h0.has_value() && *h0 == 0;
7483 passed = passed && h1.has_value() && *h1 == 6;
7484 passed = passed && h2.has_value() && *h2 == 23;
7485
7486 if (!passed) {
month (pd_test_1_all.cpp:1180)
1170 void pd_test_datetime_array_component_month_day() {
1171 std::cout << "========= DatetimeArray: month/day components ======================= ";
1172
1173 pandas::DatetimeArray arr(std::vector<std::string>{
1174 "2023-03-15",
1175 "2023-12-25",
1176 "NaT"
1177 });
1178
1179 // Month
1180 auto months = arr.month();
1181 auto m0 = months[0];
1182 if (!m0.has_value() || m0.value() != 3) {
1183 std::cout << " [FAIL] : month[0] should be 3" << std::endl;
1184 throw std::runtime_error("pd_test_datetime_array_component_month_day failed: month[0]");
1185 }
1186 auto m1 = months[1];
1187 if (!m1.has_value() || m1.value() != 12) {
1188 std::cout << " [FAIL] : month[1] should be 12" << std::endl;
1189 throw std::runtime_error("pd_test_datetime_array_component_month_day failed: month[1]");
1190 }
nbytes (pd_test_1_all.cpp:6214)
6204 }
6205
6206 // Test empty DataFrame
6207 pandas::DataFrame empty_df;
6208 if (!empty_df.empty()) {
6209 std::cout << " [FAIL] : in pd_test_dataframe_properties() : should be empty" << std::endl;
6210 throw std::runtime_error("pd_test_dataframe_properties failed: should be empty");
6211 }
6212
6213 // Test nbytes > 0 for non-empty
6214 if (df.nbytes() == 0) {
6215 std::cout << " [FAIL] : in pd_test_dataframe_properties() : nbytes should be > 0" << std::endl;
6216 throw std::runtime_error("pd_test_dataframe_properties failed: nbytes should be > 0");
6217 }
6218
6219 // Test columns index
6220 if (df.columns().size() != 3) {
6221 std::cout << " [FAIL] : in pd_test_dataframe_properties() : columns size != 3" << std::endl;
6222 throw std::runtime_error("pd_test_dataframe_properties failed: columns size != 3");
6223 }
ndim (pd_test_1_all.cpp:6195)
6185 pandas::DataFrame df(data);
6186
6187 // Test shape
6188 auto shape = df.shape();
6189 if (shape.size() != 2 || shape[0] != 4 || shape[1] != 3) {
6190 std::cout << " [FAIL] : in pd_test_dataframe_properties() : shape mismatch" << std::endl;
6191 throw std::runtime_error("pd_test_dataframe_properties failed: shape mismatch");
6192 }
6193
6194 // Test ndim
6195 if (df.ndim() != 2) {
6196 std::cout << " [FAIL] : in pd_test_dataframe_properties() : ndim != 2" << std::endl;
6197 throw std::runtime_error("pd_test_dataframe_properties failed: ndim != 2");
6198 }
6199
6200 // Test empty
6201 if (df.empty()) {
6202 std::cout << " [FAIL] : in pd_test_dataframe_properties() : should not be empty" << std::endl;
6203 throw std::runtime_error("pd_test_dataframe_properties failed: should not be empty");
6204 }
ordinal (pd_test_5_all.cpp:41796)
41786 std::cout << "----- case_11_period_nat_sentinel_api_self_check -----\n";
41787 pandas::Period nat1 = pandas::Period::NaT("D");
41788 pandas::Period nat2; // default ctor = NaT
41789 pandas::Period real(123, std::string("D"));
41790
41791 pandas_tests::check(nat1.isNaT(), "case11.NaT_factory_isNaT", local_fail);
41792 pandas_tests::check(nat2.isNaT(),
41793 "case11.default_ctor_isNaT", local_fail);
41794 pandas_tests::check(!real.isNaT(),
41795 "case11.real_period_is_NOT_NaT", local_fail);
41796 pandas_tests::check(nat1.ordinal() == pandas::PERIOD_NAT,
41797 "case11.NaT_ordinal_equals_PERIOD_NAT_sentinel", local_fail);
41798 pandas_tests::check(real.ordinal() == 123,
41799 "case11.real_period_ordinal_value", local_fail);
41800
41801 std::cout << " NaT.ordinal=" << nat1.ordinal()
41802 << " PERIOD_NAT=" << pandas::PERIOD_NAT
41803 << " real.ordinal=" << real.ordinal() << "\n";
41804}
41805
41806void case_12_period_oracle_parity_subset(int& local_fail) {
quarter (pd_test_1_all.cpp:1218)
1208 void pd_test_datetime_array_quarter() {
1209 std::cout << "========= DatetimeArray: quarter ======================= ";
1210
1211 pandas::DatetimeArray arr(std::vector<std::string>{
1212 "2023-01-15", // Q1
1213 "2023-05-20", // Q2
1214 "2023-09-10", // Q3
1215 "2023-11-25" // Q4
1216 });
1217
1218 auto quarters = arr.quarter();
1219
1220 auto q0 = quarters[0];
1221 if (!q0.has_value() || q0.value() != 1) {
1222 std::cout << " [FAIL] : quarter[0] should be 1" << std::endl;
1223 throw std::runtime_error("pd_test_datetime_array_quarter failed: quarter[0]");
1224 }
1225 auto q1 = quarters[1];
1226 if (!q1.has_value() || q1.value() != 2) {
1227 std::cout << " [FAIL] : quarter[1] should be 2" << std::endl;
1228 throw std::runtime_error("pd_test_datetime_array_quarter failed: quarter[1]");
repr (pd_test_1_all.cpp:10906)
10896 std::cout << " -> tests passed" << std::endl;
10897}
10898
10899void pd_test_extension_index_repr() {
10900 std::cout << "========= repr =========================";
10901
10902 pandas::CategoricalArray arr({"a", "b", "c"});
10903 // Use ExtensionIndex<CategoricalArray> directly to test base class repr
10904 pandas::ExtensionIndex<pandas::CategoricalArray> idx(arr, "test");
10905
10906 std::string repr_str = idx.repr();
10907
10908 bool passed = (!repr_str.empty() && repr_str.find("ExtensionIndex") != std::string::npos);
10909 if (!passed) {
10910 std::cout << " [FAIL] : in pd_test_extension_index_repr() : repr check failed" << std::endl;
10911 throw std::runtime_error("pd_test_extension_index_repr failed");
10912 }
10913
10914 std::cout << " -> tests passed" << std::endl;
10915}
second (pd_test_1_all.cpp:7534)
7524 std::cout << "========= second property =============================";
7525
7526 std::vector<std::optional<numpy::datetime64>> values = {
7527 make_dt(0), // Second 0
7528 make_dt(30 * NS_PER_SEC), // Second 30
7529 make_dt(59 * NS_PER_SEC) // Second 59
7530 };
7531 pandas::DatetimeArray arr(values);
7532 pandas::DatetimeIndex idx(arr);
7533
7534 auto seconds = idx.second();
7535
7536 bool passed = (seconds.size() == 3);
7537 auto s0 = seconds[0];
7538 auto s1 = seconds[1];
7539 auto s2 = seconds[2];
7540 passed = passed && s0.has_value() && *s0 == 0;
7541 passed = passed && s1.has_value() && *s1 == 30;
7542 passed = passed && s2.has_value() && *s2 == 59;
7543
7544 if (!passed) {
shape (pd_test_1_all.cpp:6188)
6178 std::cout << "========= properties =======================";
6179
6180 std::map<std::string, std::vector<numpy::float64>> data;
6181 data["A"] = {1.0, 2.0, 3.0, 4.0};
6182 data["B"] = {5.0, 6.0, 7.0, 8.0};
6183 data["C"] = {9.0, 10.0, 11.0, 12.0};
6184
6185 pandas::DataFrame df(data);
6186
6187 // Test shape
6188 auto shape = df.shape();
6189 if (shape.size() != 2 || shape[0] != 4 || shape[1] != 3) {
6190 std::cout << " [FAIL] : in pd_test_dataframe_properties() : shape mismatch" << std::endl;
6191 throw std::runtime_error("pd_test_dataframe_properties failed: shape mismatch");
6192 }
6193
6194 // Test ndim
6195 if (df.ndim() != 2) {
6196 std::cout << " [FAIL] : in pd_test_dataframe_properties() : ndim != 2" << std::endl;
6197 throw std::runtime_error("pd_test_dataframe_properties failed: ndim != 2");
6198 }
size (pd_test_1_all.cpp:22)
12#include "../pandas/pd_boolean_array.h"
13
14namespace dataframe_tests {
15
16namespace dataframe_tests_boolean_array {
17 void pd_test_boolean_array_constructors() {
18 std::cout << "========= BooleanArray: constructors ======================= ";
19
20 // Default constructor
21 pandas::BooleanArray arr1;
22 if (arr1.size() != 0) {
23 std::cout << " [FAIL] : in pd_test_boolean_array_constructors() : default constructor size != 0" << std::endl;
24 throw std::runtime_error("pd_test_boolean_array_constructors failed: default constructor size != 0");
25 }
26
27 // Initializer list constructor
28 pandas::BooleanArray arr2({
29 std::optional<bool>(true),
30 std::optional<bool>(false),
31 std::nullopt,
32 std::optional<bool>(true)
start_time (pd_test_1_all.cpp:2848)
2838 std::cout << " [FAIL] : ts_start[0] should have value" << std::endl;
2839 throw std::runtime_error("pd_test_period_array_to_timestamp failed: ts_start[0]");
2840 }
2841
2842 auto ts2 = ts_start[2];
2843 if (ts2.has_value()) {
2844 std::cout << " [FAIL] : ts_start[2] should be NaT" << std::endl;
2845 throw std::runtime_error("pd_test_period_array_to_timestamp failed: ts_start[2]");
2846 }
2847
2848 // start_time() alias
2849 auto start_times = arr.start_time();
2850 if (start_times.size() != 3) {
2851 std::cout << " [FAIL] : start_time size should be 3" << std::endl;
2852 throw std::runtime_error("pd_test_period_array_to_timestamp failed: start_time size");
2853 }
2854
2855 std::cout << " -> tests passed" << std::endl;
2856 }
2857
2858 void pd_test_period_array_asfreq() {
week (pd_test_timestamp_scalar.cpp:406)
396 // 2024-06-15 is a Saturday
397 pandas::Timestamp ts(2024, 6, 15);
398
399 if (ts.dayofweek() != 5) { pass = false; fail_msg = "2024-06-15 should be Saturday (5)"; }
400 if (ts.day_of_week() != 5) { pass = false; fail_msg = "day_of_week alias"; }
401 if (ts.dayofyear() != 167) { pass = false; fail_msg = "2024-06-15 should be day 167"; }
402 if (ts.day_of_year() != 167) { pass = false; fail_msg = "day_of_year alias"; }
403 if (ts.quarter() != 2) { pass = false; fail_msg = "June is Q2"; }
404 if (ts.days_in_month() != 30) { pass = false; fail_msg = "June has 30 days"; }
405
406 int week = ts.week();
407 if (week < 1 || week > 53) { pass = false; fail_msg = "week should be 1-53"; }
408
409 if (!pass) {
410 std::cout << " [FAIL] : in np_test_timestamp_derived() : " << fail_msg;
411 throw std::runtime_error("np_test_timestamp_derived failed: " + fail_msg);
412 }
413
414 std::cout << " -> tests passed" << std::endl;
415 }
weekday (pd_test_3_all.cpp:1471)
1461 std::cout << " [FAIL] date_range 10-arg form: expected size 10, got "
1462 << idx.size() << std::endl;
1463 throw std::runtime_error("date_range 10-arg form regressed");
1464 }
1465 }
1466
1467 std::cout << " -> tests passed" << std::endl;
1468}
1469
1470void pd_test_3_all_period_weekday() {
1471 std::cout << "========= PeriodArray.weekday() ======================";
1472
1473 // Create a PeriodArray with some dates
1474 std::vector<std::optional<numpy::int64>> ordinals = {0, 1, 2, 3, 4}; // Days from epoch
1475 pandas::PeriodArray arr(ordinals, "D");
1476
1477 pandas::IntegerArray<numpy::int32> weekdays = arr.weekday();
1478
1479 if (weekdays.size() != 5) {
1480 std::cout << " [FAIL] : in pd_test_3_all_period_weekday() : size should be 5" << std::endl;
1481 throw std::runtime_error("pd_test_3_all_period_weekday failed: size");
year (pd_test_1_all.cpp:1147)
1137 void pd_test_datetime_array_component_year() {
1138 std::cout << "========= DatetimeArray: year component ======================= ";
1139
1140 pandas::DatetimeArray arr(std::vector<std::string>{
1141 "2020-01-15",
1142 "NaT",
1143 "2025-06-20"
1144 });
1145
1146 auto years = arr.year();
1147
1148 auto y0 = years[0];
1149 if (!y0.has_value() || y0.value() != 2020) {
1150 std::cout << " [FAIL] : year[0] should be 2020" << std::endl;
1151 throw std::runtime_error("pd_test_datetime_array_component_year failed: year[0]");
1152 }
1153
1154 auto y1 = years[1];
1155 if (y1.has_value()) {
1156 std::cout << " [FAIL] : year[1] should be NA (NaT)" << std::endl;