ARROW-2135: [Python] Fix NaN conversion when casting from Numpy array - #1681

Closed
pitrou wants to merge 1 commit into
apache:masterfrom
pitrou:ARROW-2135-nan-conversion-when-casting
Closed

ARROW-2135: [Python] Fix NaN conversion when casting from Numpy array#1681
pitrou wants to merge 1 commit into
apache:masterfrom
pitrou:ARROW-2135-nan-conversion-when-casting

Conversation

@pitrou

Copy link
Copy Markdown
Member

No description provided.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For some reason (macro expansion?) these #ifs wouldn't work correctly here, even though NPY_INT64 is defined to NPY_LONG.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm, actually, that must be because NPY_LONGLONG is not a macro...

@pitrou
pitrouforce-pushed the ARROW-2135-nan-conversion-when-casting branch 2 times, most recently from 6cbf133 to d602be7CompareFebruary 28, 2018 19:13
@pitroupitrou closed this Feb 28, 2018
@pitroupitrou reopened this Feb 28, 2018
@pitrou
pitrouforce-pushed the ARROW-2135-nan-conversion-when-casting branch 3 times, most recently from 84766bc to cd37393CompareFebruary 28, 2018 20:01

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

std::fill(null_bitmap_data_, null_bitmap_data_ + null_bytes, 0) is a bit more idiomatic.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm, perhaps. This is really a copy/paste of NumPyConverter::InitNullBitmap()...

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Possibly time for a subclass then?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there already a test for things like a = [1.0, 2.0, 3.1, np.nan] where a user passes in an integer type?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You mean for the truncation behavior? Let me look.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No, I don't think so. I'm not sure we specify the truncation mode anywhere either?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It looks like it's a hard cast:

In [7]: pa.array([1, 2, 3.190, np.nan], type=pa.int64())
Out[6]:
<pyarrow.lib.Int64Array object at 0x7f537e42dd68>
[
1,
2,
3,
NA
]

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's fine. Was just wondering.

Comment threadcpp/src/arrow/python/type_traits.h Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

inline is redundant here: http://en.cppreference.com/w/cpp/language/inline.

A function defined entirely inside a class/struct/union definition, whether it's a member function or a non-member friend function, is implicitly an inline function.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see. This is really using the same convention as the rest of the file, though.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hm, so that's also called isnull. Shouldn't that mean v == Py_None?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Probably needs a test as well since it isn't failing.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice catch :-) I'm not sure how to test it. Defining isnull is necessary for compiling, but that path isn't taken at runtime as object arrays are handled separately.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

At some point we may want to have an STL-compatible view class that makes interacting with iterators constructs in the STL much easier. We have a lot of code that is manually handling iteration using a size/count and a buffer.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Which iterators are you thinking about? Do you mean the ndarray 1d iterator?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's one, though I added begin()/end() for that in #1651.

@pitrou
pitrouforce-pushed the ARROW-2135-nan-conversion-when-casting branch 3 times, most recently from 73916de to bb56637CompareMarch 1, 2018 09:56

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

By the way, I don't know what that is, but this is required to have the tests pass. Why do we always treat NaT as null but not floating-point NaN? @wesm

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AFAIU There's no other way to interpret NaT other than NULL (unless there's a standard that defines it in a different way than "missing"). nan is part of the IEEE floating point specification (as I'm sure you know) and it has a different meaning than null.

@pitrou

Copy link
Copy Markdown
MemberAuthor

I addressed some review comments now.

@pitrou
pitrouforce-pushed the ARROW-2135-nan-conversion-when-casting branch from bb56637 to 375418fCompareMarch 1, 2018 12:23
@pitrou

Copy link
Copy Markdown
MemberAuthor

@pitrou
pitrouforce-pushed the ARROW-2135-nan-conversion-when-casting branch from 375418f to 0af573bCompareMarch 5, 2018 11:41
@pitrou
pitrouforce-pushed the ARROW-2135-nan-conversion-when-casting branch from 0af573b to 939428dCompareMarch 8, 2018 12:33
@pitrou

Copy link
Copy Markdown
MemberAuthor

Rebased.

@pitrou

Copy link
Copy Markdown
MemberAuthor

AppVeyor at https://ci.appveyor.com/project/pitrou/arrow/build/1.0.175

@wesmwesm left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+1, thanks for cleaning up the int/uint size issues here, much cleaner now

@wesmwesm closed this in 171340fMar 12, 2018
@pitrou
pitrou deleted the ARROW-2135-nan-conversion-when-casting branch March 12, 2018 19:04
@wesm

wesm commented Mar 12, 2018

Copy link
Copy Markdown
Member

see ARROW-2298 for adding an option about NaN conversions

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@pitrou@wesm@cpcloud
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

ARROW-2135: [Python] Fix NaN conversion when casting from Numpy array - #1681

Closed
pitrou wants to merge 1 commit into
apache:masterfrom
pitrou:ARROW-2135-nan-conversion-when-casting
Closed

ARROW-2135: [Python] Fix NaN conversion when casting from Numpy array#1681
pitrou wants to merge 1 commit into
apache:masterfrom
pitrou:ARROW-2135-nan-conversion-when-casting

Conversation

@pitrou

Copy link
Copy Markdown
Member

No description provided.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For some reason (macro expansion?) these #ifs wouldn't work correctly here, even though NPY_INT64 is defined to NPY_LONG.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm, actually, that must be because NPY_LONGLONG is not a macro...

@pitrou
pitrouforce-pushed the ARROW-2135-nan-conversion-when-casting branch 2 times, most recently from 6cbf133 to d602be7CompareFebruary 28, 2018 19:13
@pitroupitrou closed this Feb 28, 2018
@pitroupitrou reopened this Feb 28, 2018
@pitrou
pitrouforce-pushed the ARROW-2135-nan-conversion-when-casting branch 3 times, most recently from 84766bc to cd37393CompareFebruary 28, 2018 20:01

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

std::fill(null_bitmap_data_, null_bitmap_data_ + null_bytes, 0) is a bit more idiomatic.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm, perhaps. This is really a copy/paste of NumPyConverter::InitNullBitmap()...

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Possibly time for a subclass then?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there already a test for things like a = [1.0, 2.0, 3.1, np.nan] where a user passes in an integer type?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You mean for the truncation behavior? Let me look.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No, I don't think so. I'm not sure we specify the truncation mode anywhere either?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It looks like it's a hard cast:

In [7]: pa.array([1, 2, 3.190, np.nan], type=pa.int64())
Out[6]:
<pyarrow.lib.Int64Array object at 0x7f537e42dd68>
[
1,
2,
3,
NA
]

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's fine. Was just wondering.

Comment threadcpp/src/arrow/python/type_traits.h Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

inline is redundant here: http://en.cppreference.com/w/cpp/language/inline.

A function defined entirely inside a class/struct/union definition, whether it's a member function or a non-member friend function, is implicitly an inline function.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see. This is really using the same convention as the rest of the file, though.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hm, so that's also called isnull. Shouldn't that mean v == Py_None?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Probably needs a test as well since it isn't failing.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice catch :-) I'm not sure how to test it. Defining isnull is necessary for compiling, but that path isn't taken at runtime as object arrays are handled separately.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

At some point we may want to have an STL-compatible view class that makes interacting with iterators constructs in the STL much easier. We have a lot of code that is manually handling iteration using a size/count and a buffer.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Which iterators are you thinking about? Do you mean the ndarray 1d iterator?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's one, though I added begin()/end() for that in #1651.

@pitrou
pitrouforce-pushed the ARROW-2135-nan-conversion-when-casting branch 3 times, most recently from 73916de to bb56637CompareMarch 1, 2018 09:56

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

By the way, I don't know what that is, but this is required to have the tests pass. Why do we always treat NaT as null but not floating-point NaN? @wesm

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AFAIU There's no other way to interpret NaT other than NULL (unless there's a standard that defines it in a different way than "missing"). nan is part of the IEEE floating point specification (as I'm sure you know) and it has a different meaning than null.

@pitrou

Copy link
Copy Markdown
MemberAuthor

I addressed some review comments now.

@pitrou
pitrouforce-pushed the ARROW-2135-nan-conversion-when-casting branch from bb56637 to 375418fCompareMarch 1, 2018 12:23
@pitrou

Copy link
Copy Markdown
MemberAuthor

@pitrou
pitrouforce-pushed the ARROW-2135-nan-conversion-when-casting branch from 375418f to 0af573bCompareMarch 5, 2018 11:41
@pitrou
pitrouforce-pushed the ARROW-2135-nan-conversion-when-casting branch from 0af573b to 939428dCompareMarch 8, 2018 12:33
@pitrou

Copy link
Copy Markdown
MemberAuthor

Rebased.

@pitrou

Copy link
Copy Markdown
MemberAuthor

AppVeyor at https://ci.appveyor.com/project/pitrou/arrow/build/1.0.175

@wesmwesm left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+1, thanks for cleaning up the int/uint size issues here, much cleaner now

@wesmwesm closed this in 171340fMar 12, 2018
@pitrou
pitrou deleted the ARROW-2135-nan-conversion-when-casting branch March 12, 2018 19:04
@wesm

wesm commented Mar 12, 2018

Copy link
Copy Markdown
Member

see ARROW-2298 for adding an option about NaN conversions

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@pitrou@wesm@cpcloud
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

ARROW-2135: [Python] Fix NaN conversion when casting from Numpy array - #1681

Closed
pitrou wants to merge 1 commit into
apache:masterfrom
pitrou:ARROW-2135-nan-conversion-when-casting
Closed

ARROW-2135: [Python] Fix NaN conversion when casting from Numpy array#1681
pitrou wants to merge 1 commit into
apache:masterfrom
pitrou:ARROW-2135-nan-conversion-when-casting

Conversation

@pitrou

Copy link
Copy Markdown
Member

No description provided.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For some reason (macro expansion?) these #ifs wouldn't work correctly here, even though NPY_INT64 is defined to NPY_LONG.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm, actually, that must be because NPY_LONGLONG is not a macro...

@pitrou
pitrouforce-pushed the ARROW-2135-nan-conversion-when-casting branch 2 times, most recently from 6cbf133 to d602be7CompareFebruary 28, 2018 19:13
@pitroupitrou closed this Feb 28, 2018
@pitroupitrou reopened this Feb 28, 2018
@pitrou
pitrouforce-pushed the ARROW-2135-nan-conversion-when-casting branch 3 times, most recently from 84766bc to cd37393CompareFebruary 28, 2018 20:01

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

std::fill(null_bitmap_data_, null_bitmap_data_ + null_bytes, 0) is a bit more idiomatic.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm, perhaps. This is really a copy/paste of NumPyConverter::InitNullBitmap()...

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Possibly time for a subclass then?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there already a test for things like a = [1.0, 2.0, 3.1, np.nan] where a user passes in an integer type?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You mean for the truncation behavior? Let me look.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No, I don't think so. I'm not sure we specify the truncation mode anywhere either?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It looks like it's a hard cast:

In [7]: pa.array([1, 2, 3.190, np.nan], type=pa.int64())
Out[6]:
<pyarrow.lib.Int64Array object at 0x7f537e42dd68>
[
1,
2,
3,
NA
]

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's fine. Was just wondering.

Comment threadcpp/src/arrow/python/type_traits.h Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

inline is redundant here: http://en.cppreference.com/w/cpp/language/inline.

A function defined entirely inside a class/struct/union definition, whether it's a member function or a non-member friend function, is implicitly an inline function.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see. This is really using the same convention as the rest of the file, though.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hm, so that's also called isnull. Shouldn't that mean v == Py_None?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Probably needs a test as well since it isn't failing.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice catch :-) I'm not sure how to test it. Defining isnull is necessary for compiling, but that path isn't taken at runtime as object arrays are handled separately.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

At some point we may want to have an STL-compatible view class that makes interacting with iterators constructs in the STL much easier. We have a lot of code that is manually handling iteration using a size/count and a buffer.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Which iterators are you thinking about? Do you mean the ndarray 1d iterator?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's one, though I added begin()/end() for that in #1651.

@pitrou
pitrouforce-pushed the ARROW-2135-nan-conversion-when-casting branch 3 times, most recently from 73916de to bb56637CompareMarch 1, 2018 09:56

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

By the way, I don't know what that is, but this is required to have the tests pass. Why do we always treat NaT as null but not floating-point NaN? @wesm

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AFAIU There's no other way to interpret NaT other than NULL (unless there's a standard that defines it in a different way than "missing"). nan is part of the IEEE floating point specification (as I'm sure you know) and it has a different meaning than null.

@pitrou

Copy link
Copy Markdown
MemberAuthor

I addressed some review comments now.

@pitrou
pitrouforce-pushed the ARROW-2135-nan-conversion-when-casting branch from bb56637 to 375418fCompareMarch 1, 2018 12:23
@pitrou

Copy link
Copy Markdown
MemberAuthor

@pitrou
pitrouforce-pushed the ARROW-2135-nan-conversion-when-casting branch from 375418f to 0af573bCompareMarch 5, 2018 11:41
@pitrou
pitrouforce-pushed the ARROW-2135-nan-conversion-when-casting branch from 0af573b to 939428dCompareMarch 8, 2018 12:33
@pitrou

Copy link
Copy Markdown
MemberAuthor

Rebased.

@pitrou

Copy link
Copy Markdown
MemberAuthor

AppVeyor at https://ci.appveyor.com/project/pitrou/arrow/build/1.0.175

@wesmwesm left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+1, thanks for cleaning up the int/uint size issues here, much cleaner now

@wesmwesm closed this in 171340fMar 12, 2018
@pitrou
pitrou deleted the ARROW-2135-nan-conversion-when-casting branch March 12, 2018 19:04
@wesm

wesm commented Mar 12, 2018

Copy link
Copy Markdown
Member

see ARROW-2298 for adding an option about NaN conversions

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@pitrou@wesm@cpcloud
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

ARROW-2135: [Python] Fix NaN conversion when casting from Numpy array - #1681

Closed
pitrou wants to merge 1 commit into
apache:masterfrom
pitrou:ARROW-2135-nan-conversion-when-casting
Closed

ARROW-2135: [Python] Fix NaN conversion when casting from Numpy array#1681
pitrou wants to merge 1 commit into
apache:masterfrom
pitrou:ARROW-2135-nan-conversion-when-casting

Conversation

@pitrou

Copy link
Copy Markdown
Member

No description provided.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For some reason (macro expansion?) these #ifs wouldn't work correctly here, even though NPY_INT64 is defined to NPY_LONG.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm, actually, that must be because NPY_LONGLONG is not a macro...

@pitrou
pitrouforce-pushed the ARROW-2135-nan-conversion-when-casting branch 2 times, most recently from 6cbf133 to d602be7CompareFebruary 28, 2018 19:13
@pitroupitrou closed this Feb 28, 2018
@pitroupitrou reopened this Feb 28, 2018
@pitrou
pitrouforce-pushed the ARROW-2135-nan-conversion-when-casting branch 3 times, most recently from 84766bc to cd37393CompareFebruary 28, 2018 20:01

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

std::fill(null_bitmap_data_, null_bitmap_data_ + null_bytes, 0) is a bit more idiomatic.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm, perhaps. This is really a copy/paste of NumPyConverter::InitNullBitmap()...

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Possibly time for a subclass then?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there already a test for things like a = [1.0, 2.0, 3.1, np.nan] where a user passes in an integer type?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You mean for the truncation behavior? Let me look.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No, I don't think so. I'm not sure we specify the truncation mode anywhere either?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It looks like it's a hard cast:

In [7]: pa.array([1, 2, 3.190, np.nan], type=pa.int64())
Out[6]:
<pyarrow.lib.Int64Array object at 0x7f537e42dd68>
[
1,
2,
3,
NA
]

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's fine. Was just wondering.

Comment threadcpp/src/arrow/python/type_traits.h Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

inline is redundant here: http://en.cppreference.com/w/cpp/language/inline.

A function defined entirely inside a class/struct/union definition, whether it's a member function or a non-member friend function, is implicitly an inline function.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see. This is really using the same convention as the rest of the file, though.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hm, so that's also called isnull. Shouldn't that mean v == Py_None?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Probably needs a test as well since it isn't failing.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice catch :-) I'm not sure how to test it. Defining isnull is necessary for compiling, but that path isn't taken at runtime as object arrays are handled separately.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

At some point we may want to have an STL-compatible view class that makes interacting with iterators constructs in the STL much easier. We have a lot of code that is manually handling iteration using a size/count and a buffer.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Which iterators are you thinking about? Do you mean the ndarray 1d iterator?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's one, though I added begin()/end() for that in #1651.

@pitrou
pitrouforce-pushed the ARROW-2135-nan-conversion-when-casting branch 3 times, most recently from 73916de to bb56637CompareMarch 1, 2018 09:56

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

By the way, I don't know what that is, but this is required to have the tests pass. Why do we always treat NaT as null but not floating-point NaN? @wesm

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AFAIU There's no other way to interpret NaT other than NULL (unless there's a standard that defines it in a different way than "missing"). nan is part of the IEEE floating point specification (as I'm sure you know) and it has a different meaning than null.

@pitrou

Copy link
Copy Markdown
MemberAuthor

I addressed some review comments now.

@pitrou
pitrouforce-pushed the ARROW-2135-nan-conversion-when-casting branch from bb56637 to 375418fCompareMarch 1, 2018 12:23
@pitrou

Copy link
Copy Markdown
MemberAuthor

@pitrou
pitrouforce-pushed the ARROW-2135-nan-conversion-when-casting branch from 375418f to 0af573bCompareMarch 5, 2018 11:41
@pitrou
pitrouforce-pushed the ARROW-2135-nan-conversion-when-casting branch from 0af573b to 939428dCompareMarch 8, 2018 12:33
@pitrou

Copy link
Copy Markdown
MemberAuthor

Rebased.

@pitrou

Copy link
Copy Markdown
MemberAuthor

AppVeyor at https://ci.appveyor.com/project/pitrou/arrow/build/1.0.175

@wesmwesm left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+1, thanks for cleaning up the int/uint size issues here, much cleaner now

@wesmwesm closed this in 171340fMar 12, 2018
@pitrou
pitrou deleted the ARROW-2135-nan-conversion-when-casting branch March 12, 2018 19:04
@wesm

wesm commented Mar 12, 2018

Copy link
Copy Markdown
Member

see ARROW-2298 for adding an option about NaN conversions

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@pitrou@wesm@cpcloud
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

ARROW-2135: [Python] Fix NaN conversion when casting from Numpy array - #1681

Closed
pitrou wants to merge 1 commit into
apache:masterfrom
pitrou:ARROW-2135-nan-conversion-when-casting
Closed

ARROW-2135: [Python] Fix NaN conversion when casting from Numpy array#1681
pitrou wants to merge 1 commit into
apache:masterfrom
pitrou:ARROW-2135-nan-conversion-when-casting

Conversation

@pitrou

Copy link
Copy Markdown
Member

No description provided.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For some reason (macro expansion?) these #ifs wouldn't work correctly here, even though NPY_INT64 is defined to NPY_LONG.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm, actually, that must be because NPY_LONGLONG is not a macro...

@pitrou
pitrouforce-pushed the ARROW-2135-nan-conversion-when-casting branch 2 times, most recently from 6cbf133 to d602be7CompareFebruary 28, 2018 19:13
@pitroupitrou closed this Feb 28, 2018
@pitroupitrou reopened this Feb 28, 2018
@pitrou
pitrouforce-pushed the ARROW-2135-nan-conversion-when-casting branch 3 times, most recently from 84766bc to cd37393CompareFebruary 28, 2018 20:01

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

std::fill(null_bitmap_data_, null_bitmap_data_ + null_bytes, 0) is a bit more idiomatic.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm, perhaps. This is really a copy/paste of NumPyConverter::InitNullBitmap()...

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Possibly time for a subclass then?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there already a test for things like a = [1.0, 2.0, 3.1, np.nan] where a user passes in an integer type?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You mean for the truncation behavior? Let me look.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No, I don't think so. I'm not sure we specify the truncation mode anywhere either?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It looks like it's a hard cast:

In [7]: pa.array([1, 2, 3.190, np.nan], type=pa.int64())
Out[6]:
<pyarrow.lib.Int64Array object at 0x7f537e42dd68>
[
1,
2,
3,
NA
]

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's fine. Was just wondering.

Comment threadcpp/src/arrow/python/type_traits.h Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

inline is redundant here: http://en.cppreference.com/w/cpp/language/inline.

A function defined entirely inside a class/struct/union definition, whether it's a member function or a non-member friend function, is implicitly an inline function.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see. This is really using the same convention as the rest of the file, though.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hm, so that's also called isnull. Shouldn't that mean v == Py_None?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Probably needs a test as well since it isn't failing.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice catch :-) I'm not sure how to test it. Defining isnull is necessary for compiling, but that path isn't taken at runtime as object arrays are handled separately.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

At some point we may want to have an STL-compatible view class that makes interacting with iterators constructs in the STL much easier. We have a lot of code that is manually handling iteration using a size/count and a buffer.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Which iterators are you thinking about? Do you mean the ndarray 1d iterator?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's one, though I added begin()/end() for that in #1651.

@pitrou
pitrouforce-pushed the ARROW-2135-nan-conversion-when-casting branch 3 times, most recently from 73916de to bb56637CompareMarch 1, 2018 09:56

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

By the way, I don't know what that is, but this is required to have the tests pass. Why do we always treat NaT as null but not floating-point NaN? @wesm

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AFAIU There's no other way to interpret NaT other than NULL (unless there's a standard that defines it in a different way than "missing"). nan is part of the IEEE floating point specification (as I'm sure you know) and it has a different meaning than null.

@pitrou

Copy link
Copy Markdown
MemberAuthor

I addressed some review comments now.

@pitrou
pitrouforce-pushed the ARROW-2135-nan-conversion-when-casting branch from bb56637 to 375418fCompareMarch 1, 2018 12:23
@pitrou

Copy link
Copy Markdown
MemberAuthor

@pitrou
pitrouforce-pushed the ARROW-2135-nan-conversion-when-casting branch from 375418f to 0af573bCompareMarch 5, 2018 11:41
@pitrou
pitrouforce-pushed the ARROW-2135-nan-conversion-when-casting branch from 0af573b to 939428dCompareMarch 8, 2018 12:33
@pitrou

Copy link
Copy Markdown
MemberAuthor

Rebased.

@pitrou

Copy link
Copy Markdown
MemberAuthor

AppVeyor at https://ci.appveyor.com/project/pitrou/arrow/build/1.0.175

@wesmwesm left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+1, thanks for cleaning up the int/uint size issues here, much cleaner now

@wesmwesm closed this in 171340fMar 12, 2018
@pitrou
pitrou deleted the ARROW-2135-nan-conversion-when-casting branch March 12, 2018 19:04
@wesm

wesm commented Mar 12, 2018

Copy link
Copy Markdown
Member

see ARROW-2298 for adding an option about NaN conversions

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@pitrou@wesm@cpcloud
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

ARROW-2135: [Python] Fix NaN conversion when casting from Numpy array - #1681

Closed
pitrou wants to merge 1 commit into
apache:masterfrom
pitrou:ARROW-2135-nan-conversion-when-casting
Closed

ARROW-2135: [Python] Fix NaN conversion when casting from Numpy array#1681
pitrou wants to merge 1 commit into
apache:masterfrom
pitrou:ARROW-2135-nan-conversion-when-casting

Conversation

@pitrou

Copy link
Copy Markdown
Member

No description provided.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For some reason (macro expansion?) these #ifs wouldn't work correctly here, even though NPY_INT64 is defined to NPY_LONG.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm, actually, that must be because NPY_LONGLONG is not a macro...

@pitrou
pitrouforce-pushed the ARROW-2135-nan-conversion-when-casting branch 2 times, most recently from 6cbf133 to d602be7CompareFebruary 28, 2018 19:13
@pitroupitrou closed this Feb 28, 2018
@pitroupitrou reopened this Feb 28, 2018
@pitrou
pitrouforce-pushed the ARROW-2135-nan-conversion-when-casting branch 3 times, most recently from 84766bc to cd37393CompareFebruary 28, 2018 20:01

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

std::fill(null_bitmap_data_, null_bitmap_data_ + null_bytes, 0) is a bit more idiomatic.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm, perhaps. This is really a copy/paste of NumPyConverter::InitNullBitmap()...

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Possibly time for a subclass then?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there already a test for things like a = [1.0, 2.0, 3.1, np.nan] where a user passes in an integer type?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You mean for the truncation behavior? Let me look.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No, I don't think so. I'm not sure we specify the truncation mode anywhere either?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It looks like it's a hard cast:

In [7]: pa.array([1, 2, 3.190, np.nan], type=pa.int64())
Out[6]:
<pyarrow.lib.Int64Array object at 0x7f537e42dd68>
[
1,
2,
3,
NA
]

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's fine. Was just wondering.

Comment threadcpp/src/arrow/python/type_traits.h Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

inline is redundant here: http://en.cppreference.com/w/cpp/language/inline.

A function defined entirely inside a class/struct/union definition, whether it's a member function or a non-member friend function, is implicitly an inline function.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see. This is really using the same convention as the rest of the file, though.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hm, so that's also called isnull. Shouldn't that mean v == Py_None?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Probably needs a test as well since it isn't failing.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice catch :-) I'm not sure how to test it. Defining isnull is necessary for compiling, but that path isn't taken at runtime as object arrays are handled separately.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

At some point we may want to have an STL-compatible view class that makes interacting with iterators constructs in the STL much easier. We have a lot of code that is manually handling iteration using a size/count and a buffer.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Which iterators are you thinking about? Do you mean the ndarray 1d iterator?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's one, though I added begin()/end() for that in #1651.

@pitrou
pitrouforce-pushed the ARROW-2135-nan-conversion-when-casting branch 3 times, most recently from 73916de to bb56637CompareMarch 1, 2018 09:56

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

By the way, I don't know what that is, but this is required to have the tests pass. Why do we always treat NaT as null but not floating-point NaN? @wesm

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AFAIU There's no other way to interpret NaT other than NULL (unless there's a standard that defines it in a different way than "missing"). nan is part of the IEEE floating point specification (as I'm sure you know) and it has a different meaning than null.

@pitrou

Copy link
Copy Markdown
MemberAuthor

I addressed some review comments now.

@pitrou
pitrouforce-pushed the ARROW-2135-nan-conversion-when-casting branch from bb56637 to 375418fCompareMarch 1, 2018 12:23
@pitrou

Copy link
Copy Markdown
MemberAuthor

@pitrou
pitrouforce-pushed the ARROW-2135-nan-conversion-when-casting branch from 375418f to 0af573bCompareMarch 5, 2018 11:41
@pitrou
pitrouforce-pushed the ARROW-2135-nan-conversion-when-casting branch from 0af573b to 939428dCompareMarch 8, 2018 12:33
@pitrou

Copy link
Copy Markdown
MemberAuthor

Rebased.

@pitrou

Copy link
Copy Markdown
MemberAuthor

AppVeyor at https://ci.appveyor.com/project/pitrou/arrow/build/1.0.175

@wesmwesm left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+1, thanks for cleaning up the int/uint size issues here, much cleaner now

@wesmwesm closed this in 171340fMar 12, 2018
@pitrou
pitrou deleted the ARROW-2135-nan-conversion-when-casting branch March 12, 2018 19:04
@wesm

wesm commented Mar 12, 2018

Copy link
Copy Markdown
Member

see ARROW-2298 for adding an option about NaN conversions

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@pitrou@wesm@cpcloud
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

ARROW-2135: [Python] Fix NaN conversion when casting from Numpy array - #1681

Closed
pitrou wants to merge 1 commit into
apache:masterfrom
pitrou:ARROW-2135-nan-conversion-when-casting
Closed

ARROW-2135: [Python] Fix NaN conversion when casting from Numpy array#1681
pitrou wants to merge 1 commit into
apache:masterfrom
pitrou:ARROW-2135-nan-conversion-when-casting

Conversation

@pitrou

Copy link
Copy Markdown
Member

No description provided.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For some reason (macro expansion?) these #ifs wouldn't work correctly here, even though NPY_INT64 is defined to NPY_LONG.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm, actually, that must be because NPY_LONGLONG is not a macro...

@pitrou
pitrouforce-pushed the ARROW-2135-nan-conversion-when-casting branch 2 times, most recently from 6cbf133 to d602be7CompareFebruary 28, 2018 19:13
@pitroupitrou closed this Feb 28, 2018
@pitroupitrou reopened this Feb 28, 2018
@pitrou
pitrouforce-pushed the ARROW-2135-nan-conversion-when-casting branch 3 times, most recently from 84766bc to cd37393CompareFebruary 28, 2018 20:01

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

std::fill(null_bitmap_data_, null_bitmap_data_ + null_bytes, 0) is a bit more idiomatic.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm, perhaps. This is really a copy/paste of NumPyConverter::InitNullBitmap()...

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Possibly time for a subclass then?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there already a test for things like a = [1.0, 2.0, 3.1, np.nan] where a user passes in an integer type?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You mean for the truncation behavior? Let me look.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No, I don't think so. I'm not sure we specify the truncation mode anywhere either?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It looks like it's a hard cast:

In [7]: pa.array([1, 2, 3.190, np.nan], type=pa.int64())
Out[6]:
<pyarrow.lib.Int64Array object at 0x7f537e42dd68>
[
1,
2,
3,
NA
]

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's fine. Was just wondering.

Comment threadcpp/src/arrow/python/type_traits.h Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

inline is redundant here: http://en.cppreference.com/w/cpp/language/inline.

A function defined entirely inside a class/struct/union definition, whether it's a member function or a non-member friend function, is implicitly an inline function.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see. This is really using the same convention as the rest of the file, though.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hm, so that's also called isnull. Shouldn't that mean v == Py_None?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Probably needs a test as well since it isn't failing.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice catch :-) I'm not sure how to test it. Defining isnull is necessary for compiling, but that path isn't taken at runtime as object arrays are handled separately.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

At some point we may want to have an STL-compatible view class that makes interacting with iterators constructs in the STL much easier. We have a lot of code that is manually handling iteration using a size/count and a buffer.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Which iterators are you thinking about? Do you mean the ndarray 1d iterator?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's one, though I added begin()/end() for that in #1651.

@pitrou
pitrouforce-pushed the ARROW-2135-nan-conversion-when-casting branch 3 times, most recently from 73916de to bb56637CompareMarch 1, 2018 09:56

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

By the way, I don't know what that is, but this is required to have the tests pass. Why do we always treat NaT as null but not floating-point NaN? @wesm

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AFAIU There's no other way to interpret NaT other than NULL (unless there's a standard that defines it in a different way than "missing"). nan is part of the IEEE floating point specification (as I'm sure you know) and it has a different meaning than null.

@pitrou

Copy link
Copy Markdown
MemberAuthor

I addressed some review comments now.

@pitrou
pitrouforce-pushed the ARROW-2135-nan-conversion-when-casting branch from bb56637 to 375418fCompareMarch 1, 2018 12:23
@pitrou

Copy link
Copy Markdown
MemberAuthor

@pitrou
pitrouforce-pushed the ARROW-2135-nan-conversion-when-casting branch from 375418f to 0af573bCompareMarch 5, 2018 11:41
@pitrou
pitrouforce-pushed the ARROW-2135-nan-conversion-when-casting branch from 0af573b to 939428dCompareMarch 8, 2018 12:33
@pitrou

Copy link
Copy Markdown
MemberAuthor

Rebased.

@pitrou

Copy link
Copy Markdown
MemberAuthor

AppVeyor at https://ci.appveyor.com/project/pitrou/arrow/build/1.0.175

@wesmwesm left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+1, thanks for cleaning up the int/uint size issues here, much cleaner now

@wesmwesm closed this in 171340fMar 12, 2018
@pitrou
pitrou deleted the ARROW-2135-nan-conversion-when-casting branch March 12, 2018 19:04
@wesm

wesm commented Mar 12, 2018

Copy link
Copy Markdown
Member

see ARROW-2298 for adding an option about NaN conversions

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@pitrou@wesm@cpcloud
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

ARROW-2135: [Python] Fix NaN conversion when casting from Numpy array - #1681

Closed
pitrou wants to merge 1 commit into
apache:masterfrom
pitrou:ARROW-2135-nan-conversion-when-casting
Closed

ARROW-2135: [Python] Fix NaN conversion when casting from Numpy array#1681
pitrou wants to merge 1 commit into
apache:masterfrom
pitrou:ARROW-2135-nan-conversion-when-casting

Conversation

@pitrou

Copy link
Copy Markdown
Member

No description provided.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For some reason (macro expansion?) these #ifs wouldn't work correctly here, even though NPY_INT64 is defined to NPY_LONG.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm, actually, that must be because NPY_LONGLONG is not a macro...

@pitrou
pitrouforce-pushed the ARROW-2135-nan-conversion-when-casting branch 2 times, most recently from 6cbf133 to d602be7CompareFebruary 28, 2018 19:13
@pitroupitrou closed this Feb 28, 2018
@pitroupitrou reopened this Feb 28, 2018
@pitrou
pitrouforce-pushed the ARROW-2135-nan-conversion-when-casting branch 3 times, most recently from 84766bc to cd37393CompareFebruary 28, 2018 20:01

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

std::fill(null_bitmap_data_, null_bitmap_data_ + null_bytes, 0) is a bit more idiomatic.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm, perhaps. This is really a copy/paste of NumPyConverter::InitNullBitmap()...

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Possibly time for a subclass then?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there already a test for things like a = [1.0, 2.0, 3.1, np.nan] where a user passes in an integer type?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You mean for the truncation behavior? Let me look.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No, I don't think so. I'm not sure we specify the truncation mode anywhere either?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It looks like it's a hard cast:

In [7]: pa.array([1, 2, 3.190, np.nan], type=pa.int64())
Out[6]:
<pyarrow.lib.Int64Array object at 0x7f537e42dd68>
[
1,
2,
3,
NA
]

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's fine. Was just wondering.

Comment threadcpp/src/arrow/python/type_traits.h Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

inline is redundant here: http://en.cppreference.com/w/cpp/language/inline.

A function defined entirely inside a class/struct/union definition, whether it's a member function or a non-member friend function, is implicitly an inline function.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see. This is really using the same convention as the rest of the file, though.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hm, so that's also called isnull. Shouldn't that mean v == Py_None?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Probably needs a test as well since it isn't failing.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice catch :-) I'm not sure how to test it. Defining isnull is necessary for compiling, but that path isn't taken at runtime as object arrays are handled separately.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

At some point we may want to have an STL-compatible view class that makes interacting with iterators constructs in the STL much easier. We have a lot of code that is manually handling iteration using a size/count and a buffer.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Which iterators are you thinking about? Do you mean the ndarray 1d iterator?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's one, though I added begin()/end() for that in #1651.

@pitrou
pitrouforce-pushed the ARROW-2135-nan-conversion-when-casting branch 3 times, most recently from 73916de to bb56637CompareMarch 1, 2018 09:56

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

By the way, I don't know what that is, but this is required to have the tests pass. Why do we always treat NaT as null but not floating-point NaN? @wesm

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AFAIU There's no other way to interpret NaT other than NULL (unless there's a standard that defines it in a different way than "missing"). nan is part of the IEEE floating point specification (as I'm sure you know) and it has a different meaning than null.

@pitrou

Copy link
Copy Markdown
MemberAuthor

I addressed some review comments now.

@pitrou
pitrouforce-pushed the ARROW-2135-nan-conversion-when-casting branch from bb56637 to 375418fCompareMarch 1, 2018 12:23
@pitrou

Copy link
Copy Markdown
MemberAuthor

@pitrou
pitrouforce-pushed the ARROW-2135-nan-conversion-when-casting branch from 375418f to 0af573bCompareMarch 5, 2018 11:41
@pitrou
pitrouforce-pushed the ARROW-2135-nan-conversion-when-casting branch from 0af573b to 939428dCompareMarch 8, 2018 12:33
@pitrou

Copy link
Copy Markdown
MemberAuthor

Rebased.

@pitrou

Copy link
Copy Markdown
MemberAuthor

AppVeyor at https://ci.appveyor.com/project/pitrou/arrow/build/1.0.175

@wesmwesm left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+1, thanks for cleaning up the int/uint size issues here, much cleaner now

@wesmwesm closed this in 171340fMar 12, 2018
@pitrou
pitrou deleted the ARROW-2135-nan-conversion-when-casting branch March 12, 2018 19:04
@wesm

wesm commented Mar 12, 2018

Copy link
Copy Markdown
Member

see ARROW-2298 for adding an option about NaN conversions

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@pitrou@wesm@cpcloud