Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add kaya_variables, kaya_factors, and kaya_lmdi methods to the comput… #884

Open
wants to merge 1 commit into
base: main
Choose a base branch
from

Conversation

zacharyschmidt
Copy link

…e module. Also add the kaya subdirectory that contains the implementation for the kaya methods. (#875)

Please confirm that this PR has done the following:

  • Tests Added
  • Documentation Added
  • Name of contributors Added to AUTHORS.rst
  • Description in RELEASE_NOTES.md Added

Description of PR

This PR adds three methods to the public api of the compute module: kaya_variables(), kaya_factors(), and kaya_lmdi(). The implementation for these methods is in the new kaya submodule.

…e module. Also add the kaya subdirectory that contains the implementation for the kaya methods. (IAMconsortium#875)
Copy link

codecov bot commented Nov 2, 2024

Codecov Report

Attention: Patch coverage is 96.14325% with 14 lines in your changes missing coverage. Please review.

Project coverage is 95.1%. Comparing base (ddbb88e) to head (b741dbb).
Report is 33 commits behind head on main.

Files with missing lines Patch % Lines
pyam/compute.py 87.2% 7 Missing ⚠️
pyam/kaya/kaya_factors.py 88.8% 4 Missing ⚠️
pyam/kaya/kaya_variables.py 94.9% 3 Missing ⚠️
Additional details and impacted files
@@           Coverage Diff           @@
##            main    #884     +/-   ##
=======================================
+ Coverage   95.0%   95.1%   +0.1%     
=======================================
  Files         64      74     +10     
  Lines       6134    6579    +445     
=======================================
+ Hits        5828    6260    +432     
- Misses       306     319     +13     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

@danielhuppmann
Copy link
Member

Thanks for the PR! Looks like the legacy-test is failing is because the unit's are ordered differently

model   scenario region variable unit                        year              
model_a scen_a   World  GNP/P    USD * billion / a / million 2010    NaN  0.006
                                 USD * billion / million / a 2010  0.006    NaN

Will take a look more closely next week, don't worry about the failing test for now, will think about how to avoid that.

Copy link
Member

@danielhuppmann danielhuppmann left a comment

Choose a reason for hiding this comment

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

Took a first look at the PR and made a few comments for improvements, Quite a lot of material here...

It would be helpful if you could remove the LMDI decomposition and add that as a separate PR later.

Comment on lines +260 to +261
scenarios : iterable of tuples (model, scenario, region)
The (model, scenario, region) combinations to be included.
Copy link
Member

Choose a reason for hiding this comment

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

Wondering about two issues with the scenarios filter:

  1. Why not just compute kaya-variables for all data in the IamDataFrame?
  2. If it's necessary to filter, why not allow filter-kwargs and add those below, like?
    def kaya_variables(self, append=False, **kwargs)
        _data = self._df.filter(**kwargs)
       ...

I'm concerned about adding an argument "scenarios" that is actually a combination of model-scenario-region, that's quite confusing...

@@ -249,6 +251,248 @@ def bias(self, name, method, axis):
"""
_compute_bias(self._df, name, method, axis)

def kaya_variables(self, scenarios, append=False):
Copy link
Member

Choose a reason for hiding this comment

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

There's a method kaya_variables and an imported module with the same name, which then also has a method of that name... Hard to follow the code logic here.

TEST_DF = IamDataFrame(
pd.DataFrame(
[
[input_variable_names.POPULATION, "million", 1000],
Copy link
Member

Choose a reason for hiding this comment

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

From a testing perspective, it would be useful to have the actual values here, not the module-internal translation...

Suggested change
[input_variable_names.POPULATION, "million", 1000],
["Population", "million", 1000],

Comment on lines +29 to +35
kaya_variable_frames.append(_calc_pop(input))
kaya_variable_frames.append(_calc_gdp(input))
kaya_variable_frames.append(_calc_fe(input))
kaya_variable_frames.append(_calc_pe(input))
kaya_variable_frames.append(_calc_pe_ff(input))
kaya_variable_frames.append(_calc_tfc(input))
kaya_variable_frames.append(_calc_nfc(input))
Copy link
Member

Choose a reason for hiding this comment

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

Would be more efficient (and easier to read) to do:

Suggested change
kaya_variable_frames.append(_calc_pop(input))
kaya_variable_frames.append(_calc_gdp(input))
kaya_variable_frames.append(_calc_fe(input))
kaya_variable_frames.append(_calc_pe(input))
kaya_variable_frames.append(_calc_pe_ff(input))
kaya_variable_frames.append(_calc_tfc(input))
kaya_variable_frames.append(_calc_nfc(input))
kaya_variable_frames.append = pyam.concat(
[
_calc_pop(input),
_calc_gdp(input),
_calc_fe(input),
_calc_pe(input),
_calc_pe_ff(input),
_calc_tfc(input),
_calc_nfc(input),
]
)

)
if input.empty:
break
kaya_factors_frames.append(_calc_gnp_per_p(input))
Copy link
Member

Choose a reason for hiding this comment

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

As in my other comment, this could be simplified using pyam.concat().

@@ -0,0 +1,7 @@
Pop_LMDI = "Population (LMDI)"
Copy link
Member

Choose a reason for hiding this comment

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

Following the current IAMC-variable naming convention, it would be preferably to use square brackets for these identifiers.

Suggested change
Pop_LMDI = "Population (LMDI)"
Pop_LMDI = "Population [LMDI]"

Comment on lines +255 to +256
"""Compute the variables needed to compute Kaya factors
for the Kaya Decomposition Analysis.
Copy link
Member

Choose a reason for hiding this comment

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

The first sentence of the docstring should fit in one line, per numpy conventions.

Suggested change
"""Compute the variables needed to compute Kaya factors
for the Kaya Decomposition Analysis.
"""Compute the variables needed to compute Kaya factors

Comment on lines +317 to +318
"""Compute the Kaya factors needed to compute factors
for the Kaya Decomposition Analysis.
Copy link
Member

Choose a reason for hiding this comment

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

Suggested change
"""Compute the Kaya factors needed to compute factors
for the Kaya Decomposition Analysis.
"""Compute the factors for the Kaya Decomposition Analysis

Comment on lines +87 to +89
ignore_units=True,
append=False,
).rename(unit={"unknown": ""})
Copy link
Member

Choose a reason for hiding this comment

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

Should be possible to directly se the resulting unit.

Suggested change
ignore_units=True,
append=False,
).rename(unit={"unknown": ""})
ignore_units="",
append=False,
)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants