ARROW-10317: [Python] Document compute function options - #12076

Closed
pitrou wants to merge 5 commits into
apache:masterfrom
pitrou:ARROW-10317-py-doc-function-options
Closed

ARROW-10317: [Python] Document compute function options#12076
pitrou wants to merge 5 commits into
apache:masterfrom
pitrou:ARROW-10317-py-doc-function-options

Conversation

@pitrou

Copy link
Copy Markdown
Member

Add docstrings for parameters of the various function options classes.
Automatically ingest those parameter docstrings into the generated compute function docstrings
(this uses vendored code from numpydoc).

Example with the min_max parameter docs:

  • before:
array : Array-like
Argument to compute function
skip_nulls : optional
Parameter for ScalarAggregateOptions constructor. Either `options`
or `skip_nulls` can be passed, but not both at the same time.
min_count : optional
Parameter for ScalarAggregateOptions constructor. Either `options`
or `min_count` can be passed, but not both at the same time.
options : pyarrow.compute.ScalarAggregateOptions, optional
Parameters altering compute function semantics.
memory_pool : pyarrow.MemoryPool, optional
If not passed, will allocate memory from the default memory pool.
  • after:
array : Array-like
Argument to compute function.
skip_nulls : bool, default True
Whether to skip (ignore) nulls in the input.
If False, any null in the input forces the output to null.
min_count : int, default 1
Minimum number of non-null values in the input. If the number
of non-null values is below `min_count`, the output is null.
options : pyarrow.compute.ScalarAggregateOptions, optional
Alternative way of passing options.
memory_pool : pyarrow.MemoryPool, optional
If not passed, will allocate memory from the default memory pool.

@pitrou

Copy link
Copy Markdown
MemberAuthor

cc @amol-

@github-actions

Copy link
Copy Markdown

@pitroupitrou changed the title ARROW-10317: [Python] Document compute function options.ARROW-10317: [Python] Document compute function optionsJan 4, 2022
@pitrou
pitrouforce-pushed the ARROW-10317-py-doc-function-options branch 2 times, most recently from 90e92cb to b2e0374CompareJanuary 10, 2022 14:24
@pitrou

pitrou commented Jan 11, 2022

Copy link
Copy Markdown
MemberAuthor

Ping @jorisvandenbossche

It would be nice for this PR to be reviewed soon because it needs rebasing and updating every time a new compute function is added.

@pitrou
pitrouforce-pushed the ARROW-10317-py-doc-function-options branch from b2e0374 to 6647879CompareJanuary 11, 2022 13:38
Comment threadpython/pyarrow/_compute.pyx Outdated

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.

Are we sure there is a strong guarantee that the options of skip_nulls and min_count will always forever match with those of ScalarAggregate? I mean, now they match, but I'm concerned that in 6 months we will have forgotten that the docstrings influence multiple classes and might accidentally add options that don't exist in the classes that reuse the existing docstrings.

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'm not sure what you mean? skip_nulls and min_count are individual options, not functions.

@jorisvandenbosschejorisvandenbosscheJan 13, 2022

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.

You mean whether they will stay the same for ScalarAggregateOptions vs ElementWiseAggregateOptions vs ... (the different places it is being used)?

It seems quite unlikely to me that the general description will not be correct anymore for one of those functions, but we can also always then update it if that would change (also if we all inline them duplicated, we need to think about updating the docstring if behaviour in C++ would change ..)

@amol-amol-Jan 13, 2022

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.

Yes, I mean that there might be a point where the various places where they are used are not aligned anymore.
I'm not concerned about the current state of things, the functions report the docstrings of individual options etc, I'm mostly concerned that in 1 year from now we will forget how we designed that to be and someone might think that it's reasonable for example to add one more option in _skip_nulls_doc() causing a wrong option to be added to one of the Option classes using that function.

I guess one possible solution would be to have something inspecting the class and confirming the arguments in __init__ match with those documented. And throwing an error when they don't. At least developers would be informed when they break something.

@pitroupitrouJan 13, 2022

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.

someone might think that it's reasonable for example to add one more option in _skip_nulls_doc() causing a wrong option to be added to one of the Option classes using that function.

Hmm, I don't understand. Why would someone add an option there?
The entire purpose of _skip_nulls_doc() is to factor the documentation for a single optionskip_nulls. It's not documenting a hypothetical function named "skip_nulls" to which people would add other options.

@jorisvandenbosschejorisvandenbosscheJan 13, 2022

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.

I guess one possible solution would be to have something inspecting the class and confirming the arguments in __init__ match with those documented.

We have numpydoc validation check that already should do something like that? (I don't remember if it is ran by default, or is ran for the compute module)

But, that would also not really solve your concern that the "meaning" of the keyword would change for one of the functions? (checking that the signature keywords match with the documented keywords doesn't guarantee anything about whether the description content is correct or not)

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.

Hmm, I don't understand. Why would someone add an option there?

I suppose that Alessandro means something like the following: assume that at some point we add an additional accepted value to skip_nulls, and document it in the skip_nulls_doc() function. But that new value might only be accepted by a subset of the compute kernels that have a skip_nulls argument, and thus we would get an incorrect docstring for the others.

Now, since skip_nulls is a boolean keyword (True/False) currently, it seems not that likely there will be a new accepted value being added.
And again, if that happens, I think we can handle it at that time, and I think we will remember that this skip_nulls_doc() is used in several places, and thus have to verify if our changes are correct for all places where this is being used.

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.

You are right, the numpydoc check would catch a set of issues. I'm wondering btw if it's actually running given that it didn't catch https://github.com/apache/arrow/blob/master/python/pyarrow/array.pxi#L714

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.

I'm wondering btw if it's actually running given that it didn't catch https://github.com/apache/arrow/blob/master/python/pyarrow/array.pxi#L714

I think the check for proper whitespace around the colon is not yet enabled. For now, #7732 only enabled check "PR01", which checks if all parameters are present in the docstring

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.

On further inspection, it seems that archery numpydoc doesn't check class methods, opened https://issues.apache.org/jira/browse/ARROW-15321

@jorisvandenbosschejorisvandenbossche 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.

This is really nice!

Comment threadpython/pyarrow/compute.py Outdated
Comment threadpython/pyarrow/tests/test_compute.py Outdated
Comment on lines 734 to 735

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.

Suggested change
Generatedvaluesareuniformly-distributed, double-precision""" +
"""inrange [0, 1).
Generatedvaluesareuniformly-distributed, double-precision\
inrange [0, 1).

This is an alternative way to do this, doesn't need to end/start triple quotes, but because of the strange indentation not necessarily nicer ..

Comment threadpython/pyarrow/_compute.pyx Outdated
Comment threadpython/pyarrow/_compute.pyx Outdated
Comment threadpython/pyarrow/_compute.pyx Outdated
Comment threadpython/pyarrow/_compute.pyx Outdated

@jorisvandenbosschejorisvandenbosscheJan 13, 2022

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.

You mean whether they will stay the same for ScalarAggregateOptions vs ElementWiseAggregateOptions vs ... (the different places it is being used)?

It seems quite unlikely to me that the general description will not be correct anymore for one of those functions, but we can also always then update it if that would change (also if we all inline them duplicated, we need to think about updating the docstring if behaviour in C++ would change ..)

Comment threadpython/pyarrow/_compute.pyx Outdated
Add docstrings for parameters of the various function options classes.
Automatically ingest those parameter docstrings into the generated compute function docstrings
(this uses vendored code from `numpydoc`).
Example with the `min_max` parameter docs:
* before:
```
array : Array-like
Argument to compute function
skip_nulls : optional
Parameter for ScalarAggregateOptions constructor. Either `options`
or `skip_nulls` can be passed, but not both at the same time.
min_count : optional
Parameter for ScalarAggregateOptions constructor. Either `options`
or `min_count` can be passed, but not both at the same time.
options : pyarrow.compute.ScalarAggregateOptions, optional
Parameters altering compute function semantics.
memory_pool : pyarrow.MemoryPool, optional
If not passed, will allocate memory from the default memory pool.
```
* after:
```
array : Array-like
Argument to compute function.
skip_nulls : bool, default True
Whether to skip (ignore) nulls in the input.
If False, any null in the input forces the output to null.
min_count : int, default 1
Minimum number of non-null values in the input. If the number
of non-null values is below `min_count`, the output is null.
options : pyarrow.compute.ScalarAggregateOptions, optional
Alternative way of passing options.
memory_pool : pyarrow.MemoryPool, optional
If not passed, will allocate memory from the default memory pool.
```
@pitrou
pitrouforce-pushed the ARROW-10317-py-doc-function-options branch from 6647879 to 69b44e2CompareJanuary 13, 2022 11:11
@pitrou
pitrouforce-pushed the ARROW-10317-py-doc-function-options branch from 0be4a14 to c6beb8cCompareJanuary 13, 2022 12:35
@pitrou
pitrou deleted the ARROW-10317-py-doc-function-options branch January 13, 2022 15:52
@ursabot

ursabot commented Jan 13, 2022

Copy link
Copy Markdown

Benchmark runs are scheduled for baseline = 111347d and contender = 0c5cd73. 0c5cd73 is a master commit associated with this PR. Results will be available as each benchmark for each run completes.
Conbench compare runs links:
[Finished ⬇️0.0% ⬆️0.0%] ec2-t3-xlarge-us-east-2
[Failed ⬇️0.45% ⬆️0.0%] ursa-i9-9960x
[Finished ⬇️0.35% ⬆️0.0%] ursa-thinkcentre-m75q
Supported benchmarks:
ec2-t3-xlarge-us-east-2: Supported benchmark langs: Python. Runs only benchmarks with cloud = True
ursa-i9-9960x: Supported benchmark langs: Python, R, JavaScript
ursa-thinkcentre-m75q: Supported benchmark langs: C++, Java

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@pitrou@ursabot@amol-@jorisvandenbossche
, '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-10317: [Python] Document compute function options - #12076

Closed
pitrou wants to merge 5 commits into
apache:masterfrom
pitrou:ARROW-10317-py-doc-function-options
Closed

ARROW-10317: [Python] Document compute function options#12076
pitrou wants to merge 5 commits into
apache:masterfrom
pitrou:ARROW-10317-py-doc-function-options

Conversation

@pitrou

Copy link
Copy Markdown
Member

Add docstrings for parameters of the various function options classes.
Automatically ingest those parameter docstrings into the generated compute function docstrings
(this uses vendored code from numpydoc).

Example with the min_max parameter docs:

  • before:
array : Array-like
Argument to compute function
skip_nulls : optional
Parameter for ScalarAggregateOptions constructor. Either `options`
or `skip_nulls` can be passed, but not both at the same time.
min_count : optional
Parameter for ScalarAggregateOptions constructor. Either `options`
or `min_count` can be passed, but not both at the same time.
options : pyarrow.compute.ScalarAggregateOptions, optional
Parameters altering compute function semantics.
memory_pool : pyarrow.MemoryPool, optional
If not passed, will allocate memory from the default memory pool.
  • after:
array : Array-like
Argument to compute function.
skip_nulls : bool, default True
Whether to skip (ignore) nulls in the input.
If False, any null in the input forces the output to null.
min_count : int, default 1
Minimum number of non-null values in the input. If the number
of non-null values is below `min_count`, the output is null.
options : pyarrow.compute.ScalarAggregateOptions, optional
Alternative way of passing options.
memory_pool : pyarrow.MemoryPool, optional
If not passed, will allocate memory from the default memory pool.

@pitrou

Copy link
Copy Markdown
MemberAuthor

cc @amol-

@github-actions

Copy link
Copy Markdown

@pitroupitrou changed the title ARROW-10317: [Python] Document compute function options.ARROW-10317: [Python] Document compute function optionsJan 4, 2022
@pitrou
pitrouforce-pushed the ARROW-10317-py-doc-function-options branch 2 times, most recently from 90e92cb to b2e0374CompareJanuary 10, 2022 14:24
@pitrou

pitrou commented Jan 11, 2022

Copy link
Copy Markdown
MemberAuthor

Ping @jorisvandenbossche

It would be nice for this PR to be reviewed soon because it needs rebasing and updating every time a new compute function is added.

@pitrou
pitrouforce-pushed the ARROW-10317-py-doc-function-options branch from b2e0374 to 6647879CompareJanuary 11, 2022 13:38
Comment threadpython/pyarrow/_compute.pyx Outdated

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.

Are we sure there is a strong guarantee that the options of skip_nulls and min_count will always forever match with those of ScalarAggregate? I mean, now they match, but I'm concerned that in 6 months we will have forgotten that the docstrings influence multiple classes and might accidentally add options that don't exist in the classes that reuse the existing docstrings.

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'm not sure what you mean? skip_nulls and min_count are individual options, not functions.

@jorisvandenbosschejorisvandenbosscheJan 13, 2022

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.

You mean whether they will stay the same for ScalarAggregateOptions vs ElementWiseAggregateOptions vs ... (the different places it is being used)?

It seems quite unlikely to me that the general description will not be correct anymore for one of those functions, but we can also always then update it if that would change (also if we all inline them duplicated, we need to think about updating the docstring if behaviour in C++ would change ..)

@amol-amol-Jan 13, 2022

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.

Yes, I mean that there might be a point where the various places where they are used are not aligned anymore.
I'm not concerned about the current state of things, the functions report the docstrings of individual options etc, I'm mostly concerned that in 1 year from now we will forget how we designed that to be and someone might think that it's reasonable for example to add one more option in _skip_nulls_doc() causing a wrong option to be added to one of the Option classes using that function.

I guess one possible solution would be to have something inspecting the class and confirming the arguments in __init__ match with those documented. And throwing an error when they don't. At least developers would be informed when they break something.

@pitroupitrouJan 13, 2022

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.

someone might think that it's reasonable for example to add one more option in _skip_nulls_doc() causing a wrong option to be added to one of the Option classes using that function.

Hmm, I don't understand. Why would someone add an option there?
The entire purpose of _skip_nulls_doc() is to factor the documentation for a single optionskip_nulls. It's not documenting a hypothetical function named "skip_nulls" to which people would add other options.

@jorisvandenbosschejorisvandenbosscheJan 13, 2022

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.

I guess one possible solution would be to have something inspecting the class and confirming the arguments in __init__ match with those documented.

We have numpydoc validation check that already should do something like that? (I don't remember if it is ran by default, or is ran for the compute module)

But, that would also not really solve your concern that the "meaning" of the keyword would change for one of the functions? (checking that the signature keywords match with the documented keywords doesn't guarantee anything about whether the description content is correct or not)

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.

Hmm, I don't understand. Why would someone add an option there?

I suppose that Alessandro means something like the following: assume that at some point we add an additional accepted value to skip_nulls, and document it in the skip_nulls_doc() function. But that new value might only be accepted by a subset of the compute kernels that have a skip_nulls argument, and thus we would get an incorrect docstring for the others.

Now, since skip_nulls is a boolean keyword (True/False) currently, it seems not that likely there will be a new accepted value being added.
And again, if that happens, I think we can handle it at that time, and I think we will remember that this skip_nulls_doc() is used in several places, and thus have to verify if our changes are correct for all places where this is being used.

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.

You are right, the numpydoc check would catch a set of issues. I'm wondering btw if it's actually running given that it didn't catch https://github.com/apache/arrow/blob/master/python/pyarrow/array.pxi#L714

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.

I'm wondering btw if it's actually running given that it didn't catch https://github.com/apache/arrow/blob/master/python/pyarrow/array.pxi#L714

I think the check for proper whitespace around the colon is not yet enabled. For now, #7732 only enabled check "PR01", which checks if all parameters are present in the docstring

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.

On further inspection, it seems that archery numpydoc doesn't check class methods, opened https://issues.apache.org/jira/browse/ARROW-15321

@jorisvandenbosschejorisvandenbossche 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.

This is really nice!

Comment threadpython/pyarrow/compute.py Outdated
Comment threadpython/pyarrow/tests/test_compute.py Outdated
Comment on lines 734 to 735

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.

Suggested change
Generatedvaluesareuniformly-distributed, double-precision""" +
"""inrange [0, 1).
Generatedvaluesareuniformly-distributed, double-precision\
inrange [0, 1).

This is an alternative way to do this, doesn't need to end/start triple quotes, but because of the strange indentation not necessarily nicer ..

Comment threadpython/pyarrow/_compute.pyx Outdated
Comment threadpython/pyarrow/_compute.pyx Outdated
Comment threadpython/pyarrow/_compute.pyx Outdated
Comment threadpython/pyarrow/_compute.pyx Outdated

@jorisvandenbosschejorisvandenbosscheJan 13, 2022

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.

You mean whether they will stay the same for ScalarAggregateOptions vs ElementWiseAggregateOptions vs ... (the different places it is being used)?

It seems quite unlikely to me that the general description will not be correct anymore for one of those functions, but we can also always then update it if that would change (also if we all inline them duplicated, we need to think about updating the docstring if behaviour in C++ would change ..)

Comment threadpython/pyarrow/_compute.pyx Outdated
Add docstrings for parameters of the various function options classes.
Automatically ingest those parameter docstrings into the generated compute function docstrings
(this uses vendored code from `numpydoc`).
Example with the `min_max` parameter docs:
* before:
```
array : Array-like
Argument to compute function
skip_nulls : optional
Parameter for ScalarAggregateOptions constructor. Either `options`
or `skip_nulls` can be passed, but not both at the same time.
min_count : optional
Parameter for ScalarAggregateOptions constructor. Either `options`
or `min_count` can be passed, but not both at the same time.
options : pyarrow.compute.ScalarAggregateOptions, optional
Parameters altering compute function semantics.
memory_pool : pyarrow.MemoryPool, optional
If not passed, will allocate memory from the default memory pool.
```
* after:
```
array : Array-like
Argument to compute function.
skip_nulls : bool, default True
Whether to skip (ignore) nulls in the input.
If False, any null in the input forces the output to null.
min_count : int, default 1
Minimum number of non-null values in the input. If the number
of non-null values is below `min_count`, the output is null.
options : pyarrow.compute.ScalarAggregateOptions, optional
Alternative way of passing options.
memory_pool : pyarrow.MemoryPool, optional
If not passed, will allocate memory from the default memory pool.
```
@pitrou
pitrouforce-pushed the ARROW-10317-py-doc-function-options branch from 6647879 to 69b44e2CompareJanuary 13, 2022 11:11
@pitrou
pitrouforce-pushed the ARROW-10317-py-doc-function-options branch from 0be4a14 to c6beb8cCompareJanuary 13, 2022 12:35
@pitrou
pitrou deleted the ARROW-10317-py-doc-function-options branch January 13, 2022 15:52
@ursabot

ursabot commented Jan 13, 2022

Copy link
Copy Markdown

Benchmark runs are scheduled for baseline = 111347d and contender = 0c5cd73. 0c5cd73 is a master commit associated with this PR. Results will be available as each benchmark for each run completes.
Conbench compare runs links:
[Finished ⬇️0.0% ⬆️0.0%] ec2-t3-xlarge-us-east-2
[Failed ⬇️0.45% ⬆️0.0%] ursa-i9-9960x
[Finished ⬇️0.35% ⬆️0.0%] ursa-thinkcentre-m75q
Supported benchmarks:
ec2-t3-xlarge-us-east-2: Supported benchmark langs: Python. Runs only benchmarks with cloud = True
ursa-i9-9960x: Supported benchmark langs: Python, R, JavaScript
ursa-thinkcentre-m75q: Supported benchmark langs: C++, Java

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@pitrou@ursabot@amol-@jorisvandenbossche
, '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-10317: [Python] Document compute function options - #12076

Closed
pitrou wants to merge 5 commits into
apache:masterfrom
pitrou:ARROW-10317-py-doc-function-options
Closed

ARROW-10317: [Python] Document compute function options#12076
pitrou wants to merge 5 commits into
apache:masterfrom
pitrou:ARROW-10317-py-doc-function-options

Conversation

@pitrou

Copy link
Copy Markdown
Member

Add docstrings for parameters of the various function options classes.
Automatically ingest those parameter docstrings into the generated compute function docstrings
(this uses vendored code from numpydoc).

Example with the min_max parameter docs:

  • before:
array : Array-like
Argument to compute function
skip_nulls : optional
Parameter for ScalarAggregateOptions constructor. Either `options`
or `skip_nulls` can be passed, but not both at the same time.
min_count : optional
Parameter for ScalarAggregateOptions constructor. Either `options`
or `min_count` can be passed, but not both at the same time.
options : pyarrow.compute.ScalarAggregateOptions, optional
Parameters altering compute function semantics.
memory_pool : pyarrow.MemoryPool, optional
If not passed, will allocate memory from the default memory pool.
  • after:
array : Array-like
Argument to compute function.
skip_nulls : bool, default True
Whether to skip (ignore) nulls in the input.
If False, any null in the input forces the output to null.
min_count : int, default 1
Minimum number of non-null values in the input. If the number
of non-null values is below `min_count`, the output is null.
options : pyarrow.compute.ScalarAggregateOptions, optional
Alternative way of passing options.
memory_pool : pyarrow.MemoryPool, optional
If not passed, will allocate memory from the default memory pool.

@pitrou

Copy link
Copy Markdown
MemberAuthor

cc @amol-

@github-actions

Copy link
Copy Markdown

@pitroupitrou changed the title ARROW-10317: [Python] Document compute function options.ARROW-10317: [Python] Document compute function optionsJan 4, 2022
@pitrou
pitrouforce-pushed the ARROW-10317-py-doc-function-options branch 2 times, most recently from 90e92cb to b2e0374CompareJanuary 10, 2022 14:24
@pitrou

pitrou commented Jan 11, 2022

Copy link
Copy Markdown
MemberAuthor

Ping @jorisvandenbossche

It would be nice for this PR to be reviewed soon because it needs rebasing and updating every time a new compute function is added.

@pitrou
pitrouforce-pushed the ARROW-10317-py-doc-function-options branch from b2e0374 to 6647879CompareJanuary 11, 2022 13:38
Comment threadpython/pyarrow/_compute.pyx Outdated

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.

Are we sure there is a strong guarantee that the options of skip_nulls and min_count will always forever match with those of ScalarAggregate? I mean, now they match, but I'm concerned that in 6 months we will have forgotten that the docstrings influence multiple classes and might accidentally add options that don't exist in the classes that reuse the existing docstrings.

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'm not sure what you mean? skip_nulls and min_count are individual options, not functions.

@jorisvandenbosschejorisvandenbosscheJan 13, 2022

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.

You mean whether they will stay the same for ScalarAggregateOptions vs ElementWiseAggregateOptions vs ... (the different places it is being used)?

It seems quite unlikely to me that the general description will not be correct anymore for one of those functions, but we can also always then update it if that would change (also if we all inline them duplicated, we need to think about updating the docstring if behaviour in C++ would change ..)

@amol-amol-Jan 13, 2022

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.

Yes, I mean that there might be a point where the various places where they are used are not aligned anymore.
I'm not concerned about the current state of things, the functions report the docstrings of individual options etc, I'm mostly concerned that in 1 year from now we will forget how we designed that to be and someone might think that it's reasonable for example to add one more option in _skip_nulls_doc() causing a wrong option to be added to one of the Option classes using that function.

I guess one possible solution would be to have something inspecting the class and confirming the arguments in __init__ match with those documented. And throwing an error when they don't. At least developers would be informed when they break something.

@pitroupitrouJan 13, 2022

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.

someone might think that it's reasonable for example to add one more option in _skip_nulls_doc() causing a wrong option to be added to one of the Option classes using that function.

Hmm, I don't understand. Why would someone add an option there?
The entire purpose of _skip_nulls_doc() is to factor the documentation for a single optionskip_nulls. It's not documenting a hypothetical function named "skip_nulls" to which people would add other options.

@jorisvandenbosschejorisvandenbosscheJan 13, 2022

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.

I guess one possible solution would be to have something inspecting the class and confirming the arguments in __init__ match with those documented.

We have numpydoc validation check that already should do something like that? (I don't remember if it is ran by default, or is ran for the compute module)

But, that would also not really solve your concern that the "meaning" of the keyword would change for one of the functions? (checking that the signature keywords match with the documented keywords doesn't guarantee anything about whether the description content is correct or not)

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.

Hmm, I don't understand. Why would someone add an option there?

I suppose that Alessandro means something like the following: assume that at some point we add an additional accepted value to skip_nulls, and document it in the skip_nulls_doc() function. But that new value might only be accepted by a subset of the compute kernels that have a skip_nulls argument, and thus we would get an incorrect docstring for the others.

Now, since skip_nulls is a boolean keyword (True/False) currently, it seems not that likely there will be a new accepted value being added.
And again, if that happens, I think we can handle it at that time, and I think we will remember that this skip_nulls_doc() is used in several places, and thus have to verify if our changes are correct for all places where this is being used.

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.

You are right, the numpydoc check would catch a set of issues. I'm wondering btw if it's actually running given that it didn't catch https://github.com/apache/arrow/blob/master/python/pyarrow/array.pxi#L714

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.

I'm wondering btw if it's actually running given that it didn't catch https://github.com/apache/arrow/blob/master/python/pyarrow/array.pxi#L714

I think the check for proper whitespace around the colon is not yet enabled. For now, #7732 only enabled check "PR01", which checks if all parameters are present in the docstring

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.

On further inspection, it seems that archery numpydoc doesn't check class methods, opened https://issues.apache.org/jira/browse/ARROW-15321

@jorisvandenbosschejorisvandenbossche 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.

This is really nice!

Comment threadpython/pyarrow/compute.py Outdated
Comment threadpython/pyarrow/tests/test_compute.py Outdated
Comment on lines 734 to 735

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.

Suggested change
Generatedvaluesareuniformly-distributed, double-precision""" +
"""inrange [0, 1).
Generatedvaluesareuniformly-distributed, double-precision\
inrange [0, 1).

This is an alternative way to do this, doesn't need to end/start triple quotes, but because of the strange indentation not necessarily nicer ..

Comment threadpython/pyarrow/_compute.pyx Outdated
Comment threadpython/pyarrow/_compute.pyx Outdated
Comment threadpython/pyarrow/_compute.pyx Outdated
Comment threadpython/pyarrow/_compute.pyx Outdated

@jorisvandenbosschejorisvandenbosscheJan 13, 2022

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.

You mean whether they will stay the same for ScalarAggregateOptions vs ElementWiseAggregateOptions vs ... (the different places it is being used)?

It seems quite unlikely to me that the general description will not be correct anymore for one of those functions, but we can also always then update it if that would change (also if we all inline them duplicated, we need to think about updating the docstring if behaviour in C++ would change ..)

Comment threadpython/pyarrow/_compute.pyx Outdated
Add docstrings for parameters of the various function options classes.
Automatically ingest those parameter docstrings into the generated compute function docstrings
(this uses vendored code from `numpydoc`).
Example with the `min_max` parameter docs:
* before:
```
array : Array-like
Argument to compute function
skip_nulls : optional
Parameter for ScalarAggregateOptions constructor. Either `options`
or `skip_nulls` can be passed, but not both at the same time.
min_count : optional
Parameter for ScalarAggregateOptions constructor. Either `options`
or `min_count` can be passed, but not both at the same time.
options : pyarrow.compute.ScalarAggregateOptions, optional
Parameters altering compute function semantics.
memory_pool : pyarrow.MemoryPool, optional
If not passed, will allocate memory from the default memory pool.
```
* after:
```
array : Array-like
Argument to compute function.
skip_nulls : bool, default True
Whether to skip (ignore) nulls in the input.
If False, any null in the input forces the output to null.
min_count : int, default 1
Minimum number of non-null values in the input. If the number
of non-null values is below `min_count`, the output is null.
options : pyarrow.compute.ScalarAggregateOptions, optional
Alternative way of passing options.
memory_pool : pyarrow.MemoryPool, optional
If not passed, will allocate memory from the default memory pool.
```
@pitrou
pitrouforce-pushed the ARROW-10317-py-doc-function-options branch from 6647879 to 69b44e2CompareJanuary 13, 2022 11:11
@pitrou
pitrouforce-pushed the ARROW-10317-py-doc-function-options branch from 0be4a14 to c6beb8cCompareJanuary 13, 2022 12:35
@pitrou
pitrou deleted the ARROW-10317-py-doc-function-options branch January 13, 2022 15:52
@ursabot

ursabot commented Jan 13, 2022

Copy link
Copy Markdown

Benchmark runs are scheduled for baseline = 111347d and contender = 0c5cd73. 0c5cd73 is a master commit associated with this PR. Results will be available as each benchmark for each run completes.
Conbench compare runs links:
[Finished ⬇️0.0% ⬆️0.0%] ec2-t3-xlarge-us-east-2
[Failed ⬇️0.45% ⬆️0.0%] ursa-i9-9960x
[Finished ⬇️0.35% ⬆️0.0%] ursa-thinkcentre-m75q
Supported benchmarks:
ec2-t3-xlarge-us-east-2: Supported benchmark langs: Python. Runs only benchmarks with cloud = True
ursa-i9-9960x: Supported benchmark langs: Python, R, JavaScript
ursa-thinkcentre-m75q: Supported benchmark langs: C++, Java

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@pitrou@ursabot@amol-@jorisvandenbossche
, '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-10317: [Python] Document compute function options - #12076

Closed
pitrou wants to merge 5 commits into
apache:masterfrom
pitrou:ARROW-10317-py-doc-function-options
Closed

ARROW-10317: [Python] Document compute function options#12076
pitrou wants to merge 5 commits into
apache:masterfrom
pitrou:ARROW-10317-py-doc-function-options

Conversation

@pitrou

Copy link
Copy Markdown
Member

Add docstrings for parameters of the various function options classes.
Automatically ingest those parameter docstrings into the generated compute function docstrings
(this uses vendored code from numpydoc).

Example with the min_max parameter docs:

  • before:
array : Array-like
Argument to compute function
skip_nulls : optional
Parameter for ScalarAggregateOptions constructor. Either `options`
or `skip_nulls` can be passed, but not both at the same time.
min_count : optional
Parameter for ScalarAggregateOptions constructor. Either `options`
or `min_count` can be passed, but not both at the same time.
options : pyarrow.compute.ScalarAggregateOptions, optional
Parameters altering compute function semantics.
memory_pool : pyarrow.MemoryPool, optional
If not passed, will allocate memory from the default memory pool.
  • after:
array : Array-like
Argument to compute function.
skip_nulls : bool, default True
Whether to skip (ignore) nulls in the input.
If False, any null in the input forces the output to null.
min_count : int, default 1
Minimum number of non-null values in the input. If the number
of non-null values is below `min_count`, the output is null.
options : pyarrow.compute.ScalarAggregateOptions, optional
Alternative way of passing options.
memory_pool : pyarrow.MemoryPool, optional
If not passed, will allocate memory from the default memory pool.

@pitrou

Copy link
Copy Markdown
MemberAuthor

cc @amol-

@github-actions

Copy link
Copy Markdown

@pitroupitrou changed the title ARROW-10317: [Python] Document compute function options.ARROW-10317: [Python] Document compute function optionsJan 4, 2022
@pitrou
pitrouforce-pushed the ARROW-10317-py-doc-function-options branch 2 times, most recently from 90e92cb to b2e0374CompareJanuary 10, 2022 14:24
@pitrou

pitrou commented Jan 11, 2022

Copy link
Copy Markdown
MemberAuthor

Ping @jorisvandenbossche

It would be nice for this PR to be reviewed soon because it needs rebasing and updating every time a new compute function is added.

@pitrou
pitrouforce-pushed the ARROW-10317-py-doc-function-options branch from b2e0374 to 6647879CompareJanuary 11, 2022 13:38
Comment threadpython/pyarrow/_compute.pyx Outdated

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.

Are we sure there is a strong guarantee that the options of skip_nulls and min_count will always forever match with those of ScalarAggregate? I mean, now they match, but I'm concerned that in 6 months we will have forgotten that the docstrings influence multiple classes and might accidentally add options that don't exist in the classes that reuse the existing docstrings.

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'm not sure what you mean? skip_nulls and min_count are individual options, not functions.

@jorisvandenbosschejorisvandenbosscheJan 13, 2022

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.

You mean whether they will stay the same for ScalarAggregateOptions vs ElementWiseAggregateOptions vs ... (the different places it is being used)?

It seems quite unlikely to me that the general description will not be correct anymore for one of those functions, but we can also always then update it if that would change (also if we all inline them duplicated, we need to think about updating the docstring if behaviour in C++ would change ..)

@amol-amol-Jan 13, 2022

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.

Yes, I mean that there might be a point where the various places where they are used are not aligned anymore.
I'm not concerned about the current state of things, the functions report the docstrings of individual options etc, I'm mostly concerned that in 1 year from now we will forget how we designed that to be and someone might think that it's reasonable for example to add one more option in _skip_nulls_doc() causing a wrong option to be added to one of the Option classes using that function.

I guess one possible solution would be to have something inspecting the class and confirming the arguments in __init__ match with those documented. And throwing an error when they don't. At least developers would be informed when they break something.

@pitroupitrouJan 13, 2022

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.

someone might think that it's reasonable for example to add one more option in _skip_nulls_doc() causing a wrong option to be added to one of the Option classes using that function.

Hmm, I don't understand. Why would someone add an option there?
The entire purpose of _skip_nulls_doc() is to factor the documentation for a single optionskip_nulls. It's not documenting a hypothetical function named "skip_nulls" to which people would add other options.

@jorisvandenbosschejorisvandenbosscheJan 13, 2022

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.

I guess one possible solution would be to have something inspecting the class and confirming the arguments in __init__ match with those documented.

We have numpydoc validation check that already should do something like that? (I don't remember if it is ran by default, or is ran for the compute module)

But, that would also not really solve your concern that the "meaning" of the keyword would change for one of the functions? (checking that the signature keywords match with the documented keywords doesn't guarantee anything about whether the description content is correct or not)

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.

Hmm, I don't understand. Why would someone add an option there?

I suppose that Alessandro means something like the following: assume that at some point we add an additional accepted value to skip_nulls, and document it in the skip_nulls_doc() function. But that new value might only be accepted by a subset of the compute kernels that have a skip_nulls argument, and thus we would get an incorrect docstring for the others.

Now, since skip_nulls is a boolean keyword (True/False) currently, it seems not that likely there will be a new accepted value being added.
And again, if that happens, I think we can handle it at that time, and I think we will remember that this skip_nulls_doc() is used in several places, and thus have to verify if our changes are correct for all places where this is being used.

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.

You are right, the numpydoc check would catch a set of issues. I'm wondering btw if it's actually running given that it didn't catch https://github.com/apache/arrow/blob/master/python/pyarrow/array.pxi#L714

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.

I'm wondering btw if it's actually running given that it didn't catch https://github.com/apache/arrow/blob/master/python/pyarrow/array.pxi#L714

I think the check for proper whitespace around the colon is not yet enabled. For now, #7732 only enabled check "PR01", which checks if all parameters are present in the docstring

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.

On further inspection, it seems that archery numpydoc doesn't check class methods, opened https://issues.apache.org/jira/browse/ARROW-15321

@jorisvandenbosschejorisvandenbossche 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.

This is really nice!

Comment threadpython/pyarrow/compute.py Outdated
Comment threadpython/pyarrow/tests/test_compute.py Outdated
Comment on lines 734 to 735

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.

Suggested change
Generatedvaluesareuniformly-distributed, double-precision""" +
"""inrange [0, 1).
Generatedvaluesareuniformly-distributed, double-precision\
inrange [0, 1).

This is an alternative way to do this, doesn't need to end/start triple quotes, but because of the strange indentation not necessarily nicer ..

Comment threadpython/pyarrow/_compute.pyx Outdated
Comment threadpython/pyarrow/_compute.pyx Outdated
Comment threadpython/pyarrow/_compute.pyx Outdated
Comment threadpython/pyarrow/_compute.pyx Outdated

@jorisvandenbosschejorisvandenbosscheJan 13, 2022

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.

You mean whether they will stay the same for ScalarAggregateOptions vs ElementWiseAggregateOptions vs ... (the different places it is being used)?

It seems quite unlikely to me that the general description will not be correct anymore for one of those functions, but we can also always then update it if that would change (also if we all inline them duplicated, we need to think about updating the docstring if behaviour in C++ would change ..)

Comment threadpython/pyarrow/_compute.pyx Outdated
Add docstrings for parameters of the various function options classes.
Automatically ingest those parameter docstrings into the generated compute function docstrings
(this uses vendored code from `numpydoc`).
Example with the `min_max` parameter docs:
* before:
```
array : Array-like
Argument to compute function
skip_nulls : optional
Parameter for ScalarAggregateOptions constructor. Either `options`
or `skip_nulls` can be passed, but not both at the same time.
min_count : optional
Parameter for ScalarAggregateOptions constructor. Either `options`
or `min_count` can be passed, but not both at the same time.
options : pyarrow.compute.ScalarAggregateOptions, optional
Parameters altering compute function semantics.
memory_pool : pyarrow.MemoryPool, optional
If not passed, will allocate memory from the default memory pool.
```
* after:
```
array : Array-like
Argument to compute function.
skip_nulls : bool, default True
Whether to skip (ignore) nulls in the input.
If False, any null in the input forces the output to null.
min_count : int, default 1
Minimum number of non-null values in the input. If the number
of non-null values is below `min_count`, the output is null.
options : pyarrow.compute.ScalarAggregateOptions, optional
Alternative way of passing options.
memory_pool : pyarrow.MemoryPool, optional
If not passed, will allocate memory from the default memory pool.
```
@pitrou
pitrouforce-pushed the ARROW-10317-py-doc-function-options branch from 6647879 to 69b44e2CompareJanuary 13, 2022 11:11
@pitrou
pitrouforce-pushed the ARROW-10317-py-doc-function-options branch from 0be4a14 to c6beb8cCompareJanuary 13, 2022 12:35
@pitrou
pitrou deleted the ARROW-10317-py-doc-function-options branch January 13, 2022 15:52
@ursabot

ursabot commented Jan 13, 2022

Copy link
Copy Markdown

Benchmark runs are scheduled for baseline = 111347d and contender = 0c5cd73. 0c5cd73 is a master commit associated with this PR. Results will be available as each benchmark for each run completes.
Conbench compare runs links:
[Finished ⬇️0.0% ⬆️0.0%] ec2-t3-xlarge-us-east-2
[Failed ⬇️0.45% ⬆️0.0%] ursa-i9-9960x
[Finished ⬇️0.35% ⬆️0.0%] ursa-thinkcentre-m75q
Supported benchmarks:
ec2-t3-xlarge-us-east-2: Supported benchmark langs: Python. Runs only benchmarks with cloud = True
ursa-i9-9960x: Supported benchmark langs: Python, R, JavaScript
ursa-thinkcentre-m75q: Supported benchmark langs: C++, Java

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@pitrou@ursabot@amol-@jorisvandenbossche
, '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-10317: [Python] Document compute function options - #12076

Closed
pitrou wants to merge 5 commits into
apache:masterfrom
pitrou:ARROW-10317-py-doc-function-options
Closed

ARROW-10317: [Python] Document compute function options#12076
pitrou wants to merge 5 commits into
apache:masterfrom
pitrou:ARROW-10317-py-doc-function-options

Conversation

@pitrou

Copy link
Copy Markdown
Member

Add docstrings for parameters of the various function options classes.
Automatically ingest those parameter docstrings into the generated compute function docstrings
(this uses vendored code from numpydoc).

Example with the min_max parameter docs:

  • before:
array : Array-like
Argument to compute function
skip_nulls : optional
Parameter for ScalarAggregateOptions constructor. Either `options`
or `skip_nulls` can be passed, but not both at the same time.
min_count : optional
Parameter for ScalarAggregateOptions constructor. Either `options`
or `min_count` can be passed, but not both at the same time.
options : pyarrow.compute.ScalarAggregateOptions, optional
Parameters altering compute function semantics.
memory_pool : pyarrow.MemoryPool, optional
If not passed, will allocate memory from the default memory pool.
  • after:
array : Array-like
Argument to compute function.
skip_nulls : bool, default True
Whether to skip (ignore) nulls in the input.
If False, any null in the input forces the output to null.
min_count : int, default 1
Minimum number of non-null values in the input. If the number
of non-null values is below `min_count`, the output is null.
options : pyarrow.compute.ScalarAggregateOptions, optional
Alternative way of passing options.
memory_pool : pyarrow.MemoryPool, optional
If not passed, will allocate memory from the default memory pool.

@pitrou

Copy link
Copy Markdown
MemberAuthor

cc @amol-

@github-actions

Copy link
Copy Markdown

@pitroupitrou changed the title ARROW-10317: [Python] Document compute function options.ARROW-10317: [Python] Document compute function optionsJan 4, 2022
@pitrou
pitrouforce-pushed the ARROW-10317-py-doc-function-options branch 2 times, most recently from 90e92cb to b2e0374CompareJanuary 10, 2022 14:24
@pitrou

pitrou commented Jan 11, 2022

Copy link
Copy Markdown
MemberAuthor

Ping @jorisvandenbossche

It would be nice for this PR to be reviewed soon because it needs rebasing and updating every time a new compute function is added.

@pitrou
pitrouforce-pushed the ARROW-10317-py-doc-function-options branch from b2e0374 to 6647879CompareJanuary 11, 2022 13:38
Comment threadpython/pyarrow/_compute.pyx Outdated

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.

Are we sure there is a strong guarantee that the options of skip_nulls and min_count will always forever match with those of ScalarAggregate? I mean, now they match, but I'm concerned that in 6 months we will have forgotten that the docstrings influence multiple classes and might accidentally add options that don't exist in the classes that reuse the existing docstrings.

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'm not sure what you mean? skip_nulls and min_count are individual options, not functions.

@jorisvandenbosschejorisvandenbosscheJan 13, 2022

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.

You mean whether they will stay the same for ScalarAggregateOptions vs ElementWiseAggregateOptions vs ... (the different places it is being used)?

It seems quite unlikely to me that the general description will not be correct anymore for one of those functions, but we can also always then update it if that would change (also if we all inline them duplicated, we need to think about updating the docstring if behaviour in C++ would change ..)

@amol-amol-Jan 13, 2022

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.

Yes, I mean that there might be a point where the various places where they are used are not aligned anymore.
I'm not concerned about the current state of things, the functions report the docstrings of individual options etc, I'm mostly concerned that in 1 year from now we will forget how we designed that to be and someone might think that it's reasonable for example to add one more option in _skip_nulls_doc() causing a wrong option to be added to one of the Option classes using that function.

I guess one possible solution would be to have something inspecting the class and confirming the arguments in __init__ match with those documented. And throwing an error when they don't. At least developers would be informed when they break something.

@pitroupitrouJan 13, 2022

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.

someone might think that it's reasonable for example to add one more option in _skip_nulls_doc() causing a wrong option to be added to one of the Option classes using that function.

Hmm, I don't understand. Why would someone add an option there?
The entire purpose of _skip_nulls_doc() is to factor the documentation for a single optionskip_nulls. It's not documenting a hypothetical function named "skip_nulls" to which people would add other options.

@jorisvandenbosschejorisvandenbosscheJan 13, 2022

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.

I guess one possible solution would be to have something inspecting the class and confirming the arguments in __init__ match with those documented.

We have numpydoc validation check that already should do something like that? (I don't remember if it is ran by default, or is ran for the compute module)

But, that would also not really solve your concern that the "meaning" of the keyword would change for one of the functions? (checking that the signature keywords match with the documented keywords doesn't guarantee anything about whether the description content is correct or not)

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.

Hmm, I don't understand. Why would someone add an option there?

I suppose that Alessandro means something like the following: assume that at some point we add an additional accepted value to skip_nulls, and document it in the skip_nulls_doc() function. But that new value might only be accepted by a subset of the compute kernels that have a skip_nulls argument, and thus we would get an incorrect docstring for the others.

Now, since skip_nulls is a boolean keyword (True/False) currently, it seems not that likely there will be a new accepted value being added.
And again, if that happens, I think we can handle it at that time, and I think we will remember that this skip_nulls_doc() is used in several places, and thus have to verify if our changes are correct for all places where this is being used.

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.

You are right, the numpydoc check would catch a set of issues. I'm wondering btw if it's actually running given that it didn't catch https://github.com/apache/arrow/blob/master/python/pyarrow/array.pxi#L714

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.

I'm wondering btw if it's actually running given that it didn't catch https://github.com/apache/arrow/blob/master/python/pyarrow/array.pxi#L714

I think the check for proper whitespace around the colon is not yet enabled. For now, #7732 only enabled check "PR01", which checks if all parameters are present in the docstring

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.

On further inspection, it seems that archery numpydoc doesn't check class methods, opened https://issues.apache.org/jira/browse/ARROW-15321

@jorisvandenbosschejorisvandenbossche 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.

This is really nice!

Comment threadpython/pyarrow/compute.py Outdated
Comment threadpython/pyarrow/tests/test_compute.py Outdated
Comment on lines 734 to 735

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.

Suggested change
Generatedvaluesareuniformly-distributed, double-precision""" +
"""inrange [0, 1).
Generatedvaluesareuniformly-distributed, double-precision\
inrange [0, 1).

This is an alternative way to do this, doesn't need to end/start triple quotes, but because of the strange indentation not necessarily nicer ..

Comment threadpython/pyarrow/_compute.pyx Outdated
Comment threadpython/pyarrow/_compute.pyx Outdated
Comment threadpython/pyarrow/_compute.pyx Outdated
Comment threadpython/pyarrow/_compute.pyx Outdated

@jorisvandenbosschejorisvandenbosscheJan 13, 2022

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.

You mean whether they will stay the same for ScalarAggregateOptions vs ElementWiseAggregateOptions vs ... (the different places it is being used)?

It seems quite unlikely to me that the general description will not be correct anymore for one of those functions, but we can also always then update it if that would change (also if we all inline them duplicated, we need to think about updating the docstring if behaviour in C++ would change ..)

Comment threadpython/pyarrow/_compute.pyx Outdated
Add docstrings for parameters of the various function options classes.
Automatically ingest those parameter docstrings into the generated compute function docstrings
(this uses vendored code from `numpydoc`).
Example with the `min_max` parameter docs:
* before:
```
array : Array-like
Argument to compute function
skip_nulls : optional
Parameter for ScalarAggregateOptions constructor. Either `options`
or `skip_nulls` can be passed, but not both at the same time.
min_count : optional
Parameter for ScalarAggregateOptions constructor. Either `options`
or `min_count` can be passed, but not both at the same time.
options : pyarrow.compute.ScalarAggregateOptions, optional
Parameters altering compute function semantics.
memory_pool : pyarrow.MemoryPool, optional
If not passed, will allocate memory from the default memory pool.
```
* after:
```
array : Array-like
Argument to compute function.
skip_nulls : bool, default True
Whether to skip (ignore) nulls in the input.
If False, any null in the input forces the output to null.
min_count : int, default 1
Minimum number of non-null values in the input. If the number
of non-null values is below `min_count`, the output is null.
options : pyarrow.compute.ScalarAggregateOptions, optional
Alternative way of passing options.
memory_pool : pyarrow.MemoryPool, optional
If not passed, will allocate memory from the default memory pool.
```
@pitrou
pitrouforce-pushed the ARROW-10317-py-doc-function-options branch from 6647879 to 69b44e2CompareJanuary 13, 2022 11:11
@pitrou
pitrouforce-pushed the ARROW-10317-py-doc-function-options branch from 0be4a14 to c6beb8cCompareJanuary 13, 2022 12:35
@pitrou
pitrou deleted the ARROW-10317-py-doc-function-options branch January 13, 2022 15:52
@ursabot

ursabot commented Jan 13, 2022

Copy link
Copy Markdown

Benchmark runs are scheduled for baseline = 111347d and contender = 0c5cd73. 0c5cd73 is a master commit associated with this PR. Results will be available as each benchmark for each run completes.
Conbench compare runs links:
[Finished ⬇️0.0% ⬆️0.0%] ec2-t3-xlarge-us-east-2
[Failed ⬇️0.45% ⬆️0.0%] ursa-i9-9960x
[Finished ⬇️0.35% ⬆️0.0%] ursa-thinkcentre-m75q
Supported benchmarks:
ec2-t3-xlarge-us-east-2: Supported benchmark langs: Python. Runs only benchmarks with cloud = True
ursa-i9-9960x: Supported benchmark langs: Python, R, JavaScript
ursa-thinkcentre-m75q: Supported benchmark langs: C++, Java

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@pitrou@ursabot@amol-@jorisvandenbossche
, '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-10317: [Python] Document compute function options - #12076

Closed
pitrou wants to merge 5 commits into
apache:masterfrom
pitrou:ARROW-10317-py-doc-function-options
Closed

ARROW-10317: [Python] Document compute function options#12076
pitrou wants to merge 5 commits into
apache:masterfrom
pitrou:ARROW-10317-py-doc-function-options

Conversation

@pitrou

Copy link
Copy Markdown
Member

Add docstrings for parameters of the various function options classes.
Automatically ingest those parameter docstrings into the generated compute function docstrings
(this uses vendored code from numpydoc).

Example with the min_max parameter docs:

  • before:
array : Array-like
Argument to compute function
skip_nulls : optional
Parameter for ScalarAggregateOptions constructor. Either `options`
or `skip_nulls` can be passed, but not both at the same time.
min_count : optional
Parameter for ScalarAggregateOptions constructor. Either `options`
or `min_count` can be passed, but not both at the same time.
options : pyarrow.compute.ScalarAggregateOptions, optional
Parameters altering compute function semantics.
memory_pool : pyarrow.MemoryPool, optional
If not passed, will allocate memory from the default memory pool.
  • after:
array : Array-like
Argument to compute function.
skip_nulls : bool, default True
Whether to skip (ignore) nulls in the input.
If False, any null in the input forces the output to null.
min_count : int, default 1
Minimum number of non-null values in the input. If the number
of non-null values is below `min_count`, the output is null.
options : pyarrow.compute.ScalarAggregateOptions, optional
Alternative way of passing options.
memory_pool : pyarrow.MemoryPool, optional
If not passed, will allocate memory from the default memory pool.

@pitrou

Copy link
Copy Markdown
MemberAuthor

cc @amol-

@github-actions

Copy link
Copy Markdown

@pitroupitrou changed the title ARROW-10317: [Python] Document compute function options.ARROW-10317: [Python] Document compute function optionsJan 4, 2022
@pitrou
pitrouforce-pushed the ARROW-10317-py-doc-function-options branch 2 times, most recently from 90e92cb to b2e0374CompareJanuary 10, 2022 14:24
@pitrou

pitrou commented Jan 11, 2022

Copy link
Copy Markdown
MemberAuthor

Ping @jorisvandenbossche

It would be nice for this PR to be reviewed soon because it needs rebasing and updating every time a new compute function is added.

@pitrou
pitrouforce-pushed the ARROW-10317-py-doc-function-options branch from b2e0374 to 6647879CompareJanuary 11, 2022 13:38
Comment threadpython/pyarrow/_compute.pyx Outdated

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.

Are we sure there is a strong guarantee that the options of skip_nulls and min_count will always forever match with those of ScalarAggregate? I mean, now they match, but I'm concerned that in 6 months we will have forgotten that the docstrings influence multiple classes and might accidentally add options that don't exist in the classes that reuse the existing docstrings.

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'm not sure what you mean? skip_nulls and min_count are individual options, not functions.

@jorisvandenbosschejorisvandenbosscheJan 13, 2022

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.

You mean whether they will stay the same for ScalarAggregateOptions vs ElementWiseAggregateOptions vs ... (the different places it is being used)?

It seems quite unlikely to me that the general description will not be correct anymore for one of those functions, but we can also always then update it if that would change (also if we all inline them duplicated, we need to think about updating the docstring if behaviour in C++ would change ..)

@amol-amol-Jan 13, 2022

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.

Yes, I mean that there might be a point where the various places where they are used are not aligned anymore.
I'm not concerned about the current state of things, the functions report the docstrings of individual options etc, I'm mostly concerned that in 1 year from now we will forget how we designed that to be and someone might think that it's reasonable for example to add one more option in _skip_nulls_doc() causing a wrong option to be added to one of the Option classes using that function.

I guess one possible solution would be to have something inspecting the class and confirming the arguments in __init__ match with those documented. And throwing an error when they don't. At least developers would be informed when they break something.

@pitroupitrouJan 13, 2022

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.

someone might think that it's reasonable for example to add one more option in _skip_nulls_doc() causing a wrong option to be added to one of the Option classes using that function.

Hmm, I don't understand. Why would someone add an option there?
The entire purpose of _skip_nulls_doc() is to factor the documentation for a single optionskip_nulls. It's not documenting a hypothetical function named "skip_nulls" to which people would add other options.

@jorisvandenbosschejorisvandenbosscheJan 13, 2022

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.

I guess one possible solution would be to have something inspecting the class and confirming the arguments in __init__ match with those documented.

We have numpydoc validation check that already should do something like that? (I don't remember if it is ran by default, or is ran for the compute module)

But, that would also not really solve your concern that the "meaning" of the keyword would change for one of the functions? (checking that the signature keywords match with the documented keywords doesn't guarantee anything about whether the description content is correct or not)

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.

Hmm, I don't understand. Why would someone add an option there?

I suppose that Alessandro means something like the following: assume that at some point we add an additional accepted value to skip_nulls, and document it in the skip_nulls_doc() function. But that new value might only be accepted by a subset of the compute kernels that have a skip_nulls argument, and thus we would get an incorrect docstring for the others.

Now, since skip_nulls is a boolean keyword (True/False) currently, it seems not that likely there will be a new accepted value being added.
And again, if that happens, I think we can handle it at that time, and I think we will remember that this skip_nulls_doc() is used in several places, and thus have to verify if our changes are correct for all places where this is being used.

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.

You are right, the numpydoc check would catch a set of issues. I'm wondering btw if it's actually running given that it didn't catch https://github.com/apache/arrow/blob/master/python/pyarrow/array.pxi#L714

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.

I'm wondering btw if it's actually running given that it didn't catch https://github.com/apache/arrow/blob/master/python/pyarrow/array.pxi#L714

I think the check for proper whitespace around the colon is not yet enabled. For now, #7732 only enabled check "PR01", which checks if all parameters are present in the docstring

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.

On further inspection, it seems that archery numpydoc doesn't check class methods, opened https://issues.apache.org/jira/browse/ARROW-15321

@jorisvandenbosschejorisvandenbossche 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.

This is really nice!

Comment threadpython/pyarrow/compute.py Outdated
Comment threadpython/pyarrow/tests/test_compute.py Outdated
Comment on lines 734 to 735

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.

Suggested change
Generatedvaluesareuniformly-distributed, double-precision""" +
"""inrange [0, 1).
Generatedvaluesareuniformly-distributed, double-precision\
inrange [0, 1).

This is an alternative way to do this, doesn't need to end/start triple quotes, but because of the strange indentation not necessarily nicer ..

Comment threadpython/pyarrow/_compute.pyx Outdated
Comment threadpython/pyarrow/_compute.pyx Outdated
Comment threadpython/pyarrow/_compute.pyx Outdated
Comment threadpython/pyarrow/_compute.pyx Outdated

@jorisvandenbosschejorisvandenbosscheJan 13, 2022

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.

You mean whether they will stay the same for ScalarAggregateOptions vs ElementWiseAggregateOptions vs ... (the different places it is being used)?

It seems quite unlikely to me that the general description will not be correct anymore for one of those functions, but we can also always then update it if that would change (also if we all inline them duplicated, we need to think about updating the docstring if behaviour in C++ would change ..)

Comment threadpython/pyarrow/_compute.pyx Outdated
Add docstrings for parameters of the various function options classes.
Automatically ingest those parameter docstrings into the generated compute function docstrings
(this uses vendored code from `numpydoc`).
Example with the `min_max` parameter docs:
* before:
```
array : Array-like
Argument to compute function
skip_nulls : optional
Parameter for ScalarAggregateOptions constructor. Either `options`
or `skip_nulls` can be passed, but not both at the same time.
min_count : optional
Parameter for ScalarAggregateOptions constructor. Either `options`
or `min_count` can be passed, but not both at the same time.
options : pyarrow.compute.ScalarAggregateOptions, optional
Parameters altering compute function semantics.
memory_pool : pyarrow.MemoryPool, optional
If not passed, will allocate memory from the default memory pool.
```
* after:
```
array : Array-like
Argument to compute function.
skip_nulls : bool, default True
Whether to skip (ignore) nulls in the input.
If False, any null in the input forces the output to null.
min_count : int, default 1
Minimum number of non-null values in the input. If the number
of non-null values is below `min_count`, the output is null.
options : pyarrow.compute.ScalarAggregateOptions, optional
Alternative way of passing options.
memory_pool : pyarrow.MemoryPool, optional
If not passed, will allocate memory from the default memory pool.
```
@pitrou
pitrouforce-pushed the ARROW-10317-py-doc-function-options branch from 6647879 to 69b44e2CompareJanuary 13, 2022 11:11
@pitrou
pitrouforce-pushed the ARROW-10317-py-doc-function-options branch from 0be4a14 to c6beb8cCompareJanuary 13, 2022 12:35
@pitrou
pitrou deleted the ARROW-10317-py-doc-function-options branch January 13, 2022 15:52
@ursabot

ursabot commented Jan 13, 2022

Copy link
Copy Markdown

Benchmark runs are scheduled for baseline = 111347d and contender = 0c5cd73. 0c5cd73 is a master commit associated with this PR. Results will be available as each benchmark for each run completes.
Conbench compare runs links:
[Finished ⬇️0.0% ⬆️0.0%] ec2-t3-xlarge-us-east-2
[Failed ⬇️0.45% ⬆️0.0%] ursa-i9-9960x
[Finished ⬇️0.35% ⬆️0.0%] ursa-thinkcentre-m75q
Supported benchmarks:
ec2-t3-xlarge-us-east-2: Supported benchmark langs: Python. Runs only benchmarks with cloud = True
ursa-i9-9960x: Supported benchmark langs: Python, R, JavaScript
ursa-thinkcentre-m75q: Supported benchmark langs: C++, Java

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@pitrou@ursabot@amol-@jorisvandenbossche
, '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-10317: [Python] Document compute function options - #12076

Closed
pitrou wants to merge 5 commits into
apache:masterfrom
pitrou:ARROW-10317-py-doc-function-options
Closed

ARROW-10317: [Python] Document compute function options#12076
pitrou wants to merge 5 commits into
apache:masterfrom
pitrou:ARROW-10317-py-doc-function-options

Conversation

@pitrou

Copy link
Copy Markdown
Member

Add docstrings for parameters of the various function options classes.
Automatically ingest those parameter docstrings into the generated compute function docstrings
(this uses vendored code from numpydoc).

Example with the min_max parameter docs:

  • before:
array : Array-like
Argument to compute function
skip_nulls : optional
Parameter for ScalarAggregateOptions constructor. Either `options`
or `skip_nulls` can be passed, but not both at the same time.
min_count : optional
Parameter for ScalarAggregateOptions constructor. Either `options`
or `min_count` can be passed, but not both at the same time.
options : pyarrow.compute.ScalarAggregateOptions, optional
Parameters altering compute function semantics.
memory_pool : pyarrow.MemoryPool, optional
If not passed, will allocate memory from the default memory pool.
  • after:
array : Array-like
Argument to compute function.
skip_nulls : bool, default True
Whether to skip (ignore) nulls in the input.
If False, any null in the input forces the output to null.
min_count : int, default 1
Minimum number of non-null values in the input. If the number
of non-null values is below `min_count`, the output is null.
options : pyarrow.compute.ScalarAggregateOptions, optional
Alternative way of passing options.
memory_pool : pyarrow.MemoryPool, optional
If not passed, will allocate memory from the default memory pool.

@pitrou

Copy link
Copy Markdown
MemberAuthor

cc @amol-

@github-actions

Copy link
Copy Markdown

@pitroupitrou changed the title ARROW-10317: [Python] Document compute function options.ARROW-10317: [Python] Document compute function optionsJan 4, 2022
@pitrou
pitrouforce-pushed the ARROW-10317-py-doc-function-options branch 2 times, most recently from 90e92cb to b2e0374CompareJanuary 10, 2022 14:24
@pitrou

pitrou commented Jan 11, 2022

Copy link
Copy Markdown
MemberAuthor

Ping @jorisvandenbossche

It would be nice for this PR to be reviewed soon because it needs rebasing and updating every time a new compute function is added.

@pitrou
pitrouforce-pushed the ARROW-10317-py-doc-function-options branch from b2e0374 to 6647879CompareJanuary 11, 2022 13:38
Comment threadpython/pyarrow/_compute.pyx Outdated

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.

Are we sure there is a strong guarantee that the options of skip_nulls and min_count will always forever match with those of ScalarAggregate? I mean, now they match, but I'm concerned that in 6 months we will have forgotten that the docstrings influence multiple classes and might accidentally add options that don't exist in the classes that reuse the existing docstrings.

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'm not sure what you mean? skip_nulls and min_count are individual options, not functions.

@jorisvandenbosschejorisvandenbosscheJan 13, 2022

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.

You mean whether they will stay the same for ScalarAggregateOptions vs ElementWiseAggregateOptions vs ... (the different places it is being used)?

It seems quite unlikely to me that the general description will not be correct anymore for one of those functions, but we can also always then update it if that would change (also if we all inline them duplicated, we need to think about updating the docstring if behaviour in C++ would change ..)

@amol-amol-Jan 13, 2022

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.

Yes, I mean that there might be a point where the various places where they are used are not aligned anymore.
I'm not concerned about the current state of things, the functions report the docstrings of individual options etc, I'm mostly concerned that in 1 year from now we will forget how we designed that to be and someone might think that it's reasonable for example to add one more option in _skip_nulls_doc() causing a wrong option to be added to one of the Option classes using that function.

I guess one possible solution would be to have something inspecting the class and confirming the arguments in __init__ match with those documented. And throwing an error when they don't. At least developers would be informed when they break something.

@pitroupitrouJan 13, 2022

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.

someone might think that it's reasonable for example to add one more option in _skip_nulls_doc() causing a wrong option to be added to one of the Option classes using that function.

Hmm, I don't understand. Why would someone add an option there?
The entire purpose of _skip_nulls_doc() is to factor the documentation for a single optionskip_nulls. It's not documenting a hypothetical function named "skip_nulls" to which people would add other options.

@jorisvandenbosschejorisvandenbosscheJan 13, 2022

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.

I guess one possible solution would be to have something inspecting the class and confirming the arguments in __init__ match with those documented.

We have numpydoc validation check that already should do something like that? (I don't remember if it is ran by default, or is ran for the compute module)

But, that would also not really solve your concern that the "meaning" of the keyword would change for one of the functions? (checking that the signature keywords match with the documented keywords doesn't guarantee anything about whether the description content is correct or not)

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.

Hmm, I don't understand. Why would someone add an option there?

I suppose that Alessandro means something like the following: assume that at some point we add an additional accepted value to skip_nulls, and document it in the skip_nulls_doc() function. But that new value might only be accepted by a subset of the compute kernels that have a skip_nulls argument, and thus we would get an incorrect docstring for the others.

Now, since skip_nulls is a boolean keyword (True/False) currently, it seems not that likely there will be a new accepted value being added.
And again, if that happens, I think we can handle it at that time, and I think we will remember that this skip_nulls_doc() is used in several places, and thus have to verify if our changes are correct for all places where this is being used.

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.

You are right, the numpydoc check would catch a set of issues. I'm wondering btw if it's actually running given that it didn't catch https://github.com/apache/arrow/blob/master/python/pyarrow/array.pxi#L714

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.

I'm wondering btw if it's actually running given that it didn't catch https://github.com/apache/arrow/blob/master/python/pyarrow/array.pxi#L714

I think the check for proper whitespace around the colon is not yet enabled. For now, #7732 only enabled check "PR01", which checks if all parameters are present in the docstring

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.

On further inspection, it seems that archery numpydoc doesn't check class methods, opened https://issues.apache.org/jira/browse/ARROW-15321

@jorisvandenbosschejorisvandenbossche 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.

This is really nice!

Comment threadpython/pyarrow/compute.py Outdated
Comment threadpython/pyarrow/tests/test_compute.py Outdated
Comment on lines 734 to 735

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.

Suggested change
Generatedvaluesareuniformly-distributed, double-precision""" +
"""inrange [0, 1).
Generatedvaluesareuniformly-distributed, double-precision\
inrange [0, 1).

This is an alternative way to do this, doesn't need to end/start triple quotes, but because of the strange indentation not necessarily nicer ..

Comment threadpython/pyarrow/_compute.pyx Outdated
Comment threadpython/pyarrow/_compute.pyx Outdated
Comment threadpython/pyarrow/_compute.pyx Outdated
Comment threadpython/pyarrow/_compute.pyx Outdated

@jorisvandenbosschejorisvandenbosscheJan 13, 2022

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.

You mean whether they will stay the same for ScalarAggregateOptions vs ElementWiseAggregateOptions vs ... (the different places it is being used)?

It seems quite unlikely to me that the general description will not be correct anymore for one of those functions, but we can also always then update it if that would change (also if we all inline them duplicated, we need to think about updating the docstring if behaviour in C++ would change ..)

Comment threadpython/pyarrow/_compute.pyx Outdated
Add docstrings for parameters of the various function options classes.
Automatically ingest those parameter docstrings into the generated compute function docstrings
(this uses vendored code from `numpydoc`).
Example with the `min_max` parameter docs:
* before:
```
array : Array-like
Argument to compute function
skip_nulls : optional
Parameter for ScalarAggregateOptions constructor. Either `options`
or `skip_nulls` can be passed, but not both at the same time.
min_count : optional
Parameter for ScalarAggregateOptions constructor. Either `options`
or `min_count` can be passed, but not both at the same time.
options : pyarrow.compute.ScalarAggregateOptions, optional
Parameters altering compute function semantics.
memory_pool : pyarrow.MemoryPool, optional
If not passed, will allocate memory from the default memory pool.
```
* after:
```
array : Array-like
Argument to compute function.
skip_nulls : bool, default True
Whether to skip (ignore) nulls in the input.
If False, any null in the input forces the output to null.
min_count : int, default 1
Minimum number of non-null values in the input. If the number
of non-null values is below `min_count`, the output is null.
options : pyarrow.compute.ScalarAggregateOptions, optional
Alternative way of passing options.
memory_pool : pyarrow.MemoryPool, optional
If not passed, will allocate memory from the default memory pool.
```
@pitrou
pitrouforce-pushed the ARROW-10317-py-doc-function-options branch from 6647879 to 69b44e2CompareJanuary 13, 2022 11:11
@pitrou
pitrouforce-pushed the ARROW-10317-py-doc-function-options branch from 0be4a14 to c6beb8cCompareJanuary 13, 2022 12:35
@pitrou
pitrou deleted the ARROW-10317-py-doc-function-options branch January 13, 2022 15:52
@ursabot

ursabot commented Jan 13, 2022

Copy link
Copy Markdown

Benchmark runs are scheduled for baseline = 111347d and contender = 0c5cd73. 0c5cd73 is a master commit associated with this PR. Results will be available as each benchmark for each run completes.
Conbench compare runs links:
[Finished ⬇️0.0% ⬆️0.0%] ec2-t3-xlarge-us-east-2
[Failed ⬇️0.45% ⬆️0.0%] ursa-i9-9960x
[Finished ⬇️0.35% ⬆️0.0%] ursa-thinkcentre-m75q
Supported benchmarks:
ec2-t3-xlarge-us-east-2: Supported benchmark langs: Python. Runs only benchmarks with cloud = True
ursa-i9-9960x: Supported benchmark langs: Python, R, JavaScript
ursa-thinkcentre-m75q: Supported benchmark langs: C++, Java

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@pitrou@ursabot@amol-@jorisvandenbossche
, '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-10317: [Python] Document compute function options - #12076

Closed
pitrou wants to merge 5 commits into
apache:masterfrom
pitrou:ARROW-10317-py-doc-function-options
Closed

ARROW-10317: [Python] Document compute function options#12076
pitrou wants to merge 5 commits into
apache:masterfrom
pitrou:ARROW-10317-py-doc-function-options

Conversation

@pitrou

Copy link
Copy Markdown
Member

Add docstrings for parameters of the various function options classes.
Automatically ingest those parameter docstrings into the generated compute function docstrings
(this uses vendored code from numpydoc).

Example with the min_max parameter docs:

  • before:
array : Array-like
Argument to compute function
skip_nulls : optional
Parameter for ScalarAggregateOptions constructor. Either `options`
or `skip_nulls` can be passed, but not both at the same time.
min_count : optional
Parameter for ScalarAggregateOptions constructor. Either `options`
or `min_count` can be passed, but not both at the same time.
options : pyarrow.compute.ScalarAggregateOptions, optional
Parameters altering compute function semantics.
memory_pool : pyarrow.MemoryPool, optional
If not passed, will allocate memory from the default memory pool.
  • after:
array : Array-like
Argument to compute function.
skip_nulls : bool, default True
Whether to skip (ignore) nulls in the input.
If False, any null in the input forces the output to null.
min_count : int, default 1
Minimum number of non-null values in the input. If the number
of non-null values is below `min_count`, the output is null.
options : pyarrow.compute.ScalarAggregateOptions, optional
Alternative way of passing options.
memory_pool : pyarrow.MemoryPool, optional
If not passed, will allocate memory from the default memory pool.

@pitrou

Copy link
Copy Markdown
MemberAuthor

cc @amol-

@github-actions

Copy link
Copy Markdown

@pitroupitrou changed the title ARROW-10317: [Python] Document compute function options.ARROW-10317: [Python] Document compute function optionsJan 4, 2022
@pitrou
pitrouforce-pushed the ARROW-10317-py-doc-function-options branch 2 times, most recently from 90e92cb to b2e0374CompareJanuary 10, 2022 14:24
@pitrou

pitrou commented Jan 11, 2022

Copy link
Copy Markdown
MemberAuthor

Ping @jorisvandenbossche

It would be nice for this PR to be reviewed soon because it needs rebasing and updating every time a new compute function is added.

@pitrou
pitrouforce-pushed the ARROW-10317-py-doc-function-options branch from b2e0374 to 6647879CompareJanuary 11, 2022 13:38
Comment threadpython/pyarrow/_compute.pyx Outdated

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.

Are we sure there is a strong guarantee that the options of skip_nulls and min_count will always forever match with those of ScalarAggregate? I mean, now they match, but I'm concerned that in 6 months we will have forgotten that the docstrings influence multiple classes and might accidentally add options that don't exist in the classes that reuse the existing docstrings.

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'm not sure what you mean? skip_nulls and min_count are individual options, not functions.

@jorisvandenbosschejorisvandenbosscheJan 13, 2022

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.

You mean whether they will stay the same for ScalarAggregateOptions vs ElementWiseAggregateOptions vs ... (the different places it is being used)?

It seems quite unlikely to me that the general description will not be correct anymore for one of those functions, but we can also always then update it if that would change (also if we all inline them duplicated, we need to think about updating the docstring if behaviour in C++ would change ..)

@amol-amol-Jan 13, 2022

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.

Yes, I mean that there might be a point where the various places where they are used are not aligned anymore.
I'm not concerned about the current state of things, the functions report the docstrings of individual options etc, I'm mostly concerned that in 1 year from now we will forget how we designed that to be and someone might think that it's reasonable for example to add one more option in _skip_nulls_doc() causing a wrong option to be added to one of the Option classes using that function.

I guess one possible solution would be to have something inspecting the class and confirming the arguments in __init__ match with those documented. And throwing an error when they don't. At least developers would be informed when they break something.

@pitroupitrouJan 13, 2022

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.

someone might think that it's reasonable for example to add one more option in _skip_nulls_doc() causing a wrong option to be added to one of the Option classes using that function.

Hmm, I don't understand. Why would someone add an option there?
The entire purpose of _skip_nulls_doc() is to factor the documentation for a single optionskip_nulls. It's not documenting a hypothetical function named "skip_nulls" to which people would add other options.

@jorisvandenbosschejorisvandenbosscheJan 13, 2022

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.

I guess one possible solution would be to have something inspecting the class and confirming the arguments in __init__ match with those documented.

We have numpydoc validation check that already should do something like that? (I don't remember if it is ran by default, or is ran for the compute module)

But, that would also not really solve your concern that the "meaning" of the keyword would change for one of the functions? (checking that the signature keywords match with the documented keywords doesn't guarantee anything about whether the description content is correct or not)

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.

Hmm, I don't understand. Why would someone add an option there?

I suppose that Alessandro means something like the following: assume that at some point we add an additional accepted value to skip_nulls, and document it in the skip_nulls_doc() function. But that new value might only be accepted by a subset of the compute kernels that have a skip_nulls argument, and thus we would get an incorrect docstring for the others.

Now, since skip_nulls is a boolean keyword (True/False) currently, it seems not that likely there will be a new accepted value being added.
And again, if that happens, I think we can handle it at that time, and I think we will remember that this skip_nulls_doc() is used in several places, and thus have to verify if our changes are correct for all places where this is being used.

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.

You are right, the numpydoc check would catch a set of issues. I'm wondering btw if it's actually running given that it didn't catch https://github.com/apache/arrow/blob/master/python/pyarrow/array.pxi#L714

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.

I'm wondering btw if it's actually running given that it didn't catch https://github.com/apache/arrow/blob/master/python/pyarrow/array.pxi#L714

I think the check for proper whitespace around the colon is not yet enabled. For now, #7732 only enabled check "PR01", which checks if all parameters are present in the docstring

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.

On further inspection, it seems that archery numpydoc doesn't check class methods, opened https://issues.apache.org/jira/browse/ARROW-15321

@jorisvandenbosschejorisvandenbossche 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.

This is really nice!

Comment threadpython/pyarrow/compute.py Outdated
Comment threadpython/pyarrow/tests/test_compute.py Outdated
Comment on lines 734 to 735

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.

Suggested change
Generatedvaluesareuniformly-distributed, double-precision""" +
"""inrange [0, 1).
Generatedvaluesareuniformly-distributed, double-precision\
inrange [0, 1).

This is an alternative way to do this, doesn't need to end/start triple quotes, but because of the strange indentation not necessarily nicer ..

Comment threadpython/pyarrow/_compute.pyx Outdated
Comment threadpython/pyarrow/_compute.pyx Outdated
Comment threadpython/pyarrow/_compute.pyx Outdated
Comment threadpython/pyarrow/_compute.pyx Outdated

@jorisvandenbosschejorisvandenbosscheJan 13, 2022

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.

You mean whether they will stay the same for ScalarAggregateOptions vs ElementWiseAggregateOptions vs ... (the different places it is being used)?

It seems quite unlikely to me that the general description will not be correct anymore for one of those functions, but we can also always then update it if that would change (also if we all inline them duplicated, we need to think about updating the docstring if behaviour in C++ would change ..)

Comment threadpython/pyarrow/_compute.pyx Outdated
Add docstrings for parameters of the various function options classes.
Automatically ingest those parameter docstrings into the generated compute function docstrings
(this uses vendored code from `numpydoc`).
Example with the `min_max` parameter docs:
* before:
```
array : Array-like
Argument to compute function
skip_nulls : optional
Parameter for ScalarAggregateOptions constructor. Either `options`
or `skip_nulls` can be passed, but not both at the same time.
min_count : optional
Parameter for ScalarAggregateOptions constructor. Either `options`
or `min_count` can be passed, but not both at the same time.
options : pyarrow.compute.ScalarAggregateOptions, optional
Parameters altering compute function semantics.
memory_pool : pyarrow.MemoryPool, optional
If not passed, will allocate memory from the default memory pool.
```
* after:
```
array : Array-like
Argument to compute function.
skip_nulls : bool, default True
Whether to skip (ignore) nulls in the input.
If False, any null in the input forces the output to null.
min_count : int, default 1
Minimum number of non-null values in the input. If the number
of non-null values is below `min_count`, the output is null.
options : pyarrow.compute.ScalarAggregateOptions, optional
Alternative way of passing options.
memory_pool : pyarrow.MemoryPool, optional
If not passed, will allocate memory from the default memory pool.
```
@pitrou
pitrouforce-pushed the ARROW-10317-py-doc-function-options branch from 6647879 to 69b44e2CompareJanuary 13, 2022 11:11
@pitrou
pitrouforce-pushed the ARROW-10317-py-doc-function-options branch from 0be4a14 to c6beb8cCompareJanuary 13, 2022 12:35
@pitrou
pitrou deleted the ARROW-10317-py-doc-function-options branch January 13, 2022 15:52
@ursabot

ursabot commented Jan 13, 2022

Copy link
Copy Markdown

Benchmark runs are scheduled for baseline = 111347d and contender = 0c5cd73. 0c5cd73 is a master commit associated with this PR. Results will be available as each benchmark for each run completes.
Conbench compare runs links:
[Finished ⬇️0.0% ⬆️0.0%] ec2-t3-xlarge-us-east-2
[Failed ⬇️0.45% ⬆️0.0%] ursa-i9-9960x
[Finished ⬇️0.35% ⬆️0.0%] ursa-thinkcentre-m75q
Supported benchmarks:
ec2-t3-xlarge-us-east-2: Supported benchmark langs: Python. Runs only benchmarks with cloud = True
ursa-i9-9960x: Supported benchmark langs: Python, R, JavaScript
ursa-thinkcentre-m75q: Supported benchmark langs: C++, Java

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@pitrou@ursabot@amol-@jorisvandenbossche