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

Eia176 wide table #3590

Draft
wants to merge 14 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
76 changes: 76 additions & 0 deletions src/pudl/transform/eia176.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
"""Module to perform data cleaning functions on EIA176 data tables."""

import warnings

import pandas as pd
from dagster import ExperimentalWarning, asset, asset_check

from pudl.logging_helpers import get_logger

logger = get_logger(__name__)

# Asset Checks are still Experimental, silence the warning since we use them
Copy link
Member

Choose a reason for hiding this comment

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

FYI: They've graduated from "experimental" since you opened this draft PR, we can take this out! Benefits of waiting a month to review your PR 😅

# everywhere.
warnings.filterwarnings("ignore", category=ExperimentalWarning)


@asset
def _core_eia176__data(raw_eia176__data: pd.DataFrame) -> pd.DataFrame:
"""Take entity-attribute-value rows and convert to rows with primary key and one column per variable."""
raw_eia176__data["variable_name"] = (
raw_eia176__data["line"] + "_" + raw_eia176__data["atype"]
)
primary_key = ["report_year", "area", "id"]
variable_names = list(raw_eia176__data.groupby("variable_name").count().index)
wide_table = pd.DataFrame(columns=primary_key + variable_names)

granular_data = raw_eia176__data[
(raw_eia176__data["company"] != " Total of All Companies")
]
for report_year, area, id_ in granular_data.groupby(primary_key).count().index:
Copy link
Member

Choose a reason for hiding this comment

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

It looks to me like you're trying to manually do an unstack() operation (take the variable names in the "variable_name" column and turn them into a bunch of columns). There's 51k PK groups here, and doing iterrows() across each group and recombining is pretty expensive in pandas.

I was able to get a similarly shaped result across all years in ~5s by leveraging the built-in unstack functionality and some inelegant cleanup of unstack artifacts.

primary_key = ["report_year", "area", "id"]
raw_eia176__data["variable_name"] = (
    raw_eia176__data["line"] + "_" + raw_eia176__data["atype"]
)
# TODO should probably sanitize this company name somewhere beforehand
granular = raw_eia176__data.loc[
    raw_eia176__data.company.str.strip().str.lower() != "total of all companies"
]
unstacked = (
    granular
    .drop(columns=["itemsort", "item", "atype", "line", "company"])
    .set_index(primary_key + ["variable_name"])
    .unstack(level="variable_name")
)
# columns is a weird multi-index with ("value", "actual column name") - clean that up
unstacked.columns = unstacked.columns.droplevel(0)
unstacked.columns.name = None # gets rid of "variable_name" name of columns index

# TODO instead of "first NA value we see in each column" applied willy-nilly, we could check to see if there are any conflicting non-null values using .count() first.
condensed = unstacked.groupby(level=primary_key).first().reset_index()
return condensed

One sort of weird thing that I'm curious about - in #3501 it looks like we wanted to use item to identify variables - should we be doing that instead of the line + atype thing we have going on here?

Copy link
Member

Choose a reason for hiding this comment

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

Outputs for comparison/posterity:

`unstack`, all years
      report_year     area          id      1010_CS   1010_CT     1010_VL     101T_VL     1020_CS  1020_CT    1020_VL     102T_VL     1030_CS  1030_CT    1030_VL     103T_VL  1040_CS  1040_CT  1040_VL    104T_VL  1050_CS  1050_CT  1050_VL  105T_VL  1060_CS  1060_CT  1060_VL  106T_VL  110_VL  1110_CS  1110_CT  1110_VL  1120_CS  1120_CT     1120_VL   1130_CS  1130_CT     1130_VL  1140_CS  1140_CT    1140_VL  1150_CS  1150_CT  1150_VL  1160_CT  1160_VL  120_VL   1210_VL  1220_VL   1230_VL  1240_VL  1250_VL  1260_VL  1310_VL   1320_VL  1330_VL      1400_VL  1500_VL  1600_VL  1700_VL     1810_VL     1820_VL    1830_VL  1840_VL      1900_VL  2000_VL  210_VL    220_VL  230_VL      300_VL  3014_CT  3014_VL  3_VL  400_VL  410_CS    410_VL  420_VL       500_VL  5_CT  600_VL  6_CT       700_VL  800_VL  810_VL  810_YA  820_VL  820_YA  900_VL  9_VL
0            1997  Alabama  17600048AL     251371.0     625.0     29469.0     29469.0     69956.0     50.0     8358.0      8358.0         NaN      NaN        NaN         NaN      NaN      NaN      NaN        NaN      NaN      NaN      NaN      NaN      NaN      NaN      NaN      NaN     NaN      NaN      NaN      NaN      NaN      NaN         NaN       NaN      NaN         NaN      NaN      NaN        NaN      NaN      NaN      NaN      NaN      NaN     NaN       NaN      NaN       NaN      NaN      NaN      NaN      NaN       NaN      NaN          NaN      NaN      NaN      NaN         NaN         NaN        NaN      NaN      37827.0  -9795.0     NaN       NaN     NaN     28032.0      NaN      NaN   NaN     NaN     NaN       NaN     NaN          NaN   NaN     NaN   NaN      28032.0     NaN     NaN     NaN     NaN     NaN  1100.0   NaN
1            1997  Alabama  17600049AL     221993.0     501.0     28016.0     28016.0     27135.0     22.0     4606.0      4606.0         NaN      NaN        NaN         NaN      NaN      NaN      NaN        NaN      NaN      NaN      NaN      NaN      NaN      NaN      NaN      NaN     NaN      NaN      NaN      NaN      NaN      NaN         NaN       NaN      NaN         NaN      NaN      NaN        NaN      NaN      NaN      NaN      NaN      NaN     NaN       NaN      NaN       NaN      NaN      NaN      NaN      NaN       NaN      NaN          NaN      NaN      NaN      NaN         NaN         NaN        NaN      NaN      32622.0   1417.0     NaN       NaN     NaN         NaN      NaN      NaN   NaN     NaN     NaN       NaN     NaN      34039.0   NaN     NaN   NaN      34039.0     NaN     NaN     NaN     NaN     NaN  1018.0   NaN
2            1997  Alabama  17600139AL  246105034.0  423130.0  29308019.0  29308019.0  72340233.0  35652.0  9951817.0  20985483.0  16947052.0   1498.0  2724147.0  51277620.0      NaN      NaN      NaN  7028200.0      NaN      NaN      NaN      NaN      NaN      NaN      NaN      NaN     NaN      NaN      NaN      NaN      0.0     87.0  11033666.0       0.0    194.0  48553473.0      0.0      3.0  7028200.0      NaN      NaN      NaN      NaN      NaN     NaN  179045.0      NaN       NaN      NaN      NaN      NaN      NaN  783604.0      NaN          NaN      NaN      NaN      NaN         NaN         NaN  7800144.0      NaN  117362115.0  49682.0     NaN  404450.0     NaN         NaN      NaN      NaN   NaN     NaN     NaN       NaN     NaN  117007347.0   NaN     NaN   NaN  117411797.0     NaN     NaN     NaN     NaN     NaN  1017.0   NaN
3            1997  Alabama  17600141AL          NaN       NaN         NaN         NaN         NaN      NaN        NaN         NaN         NaN      NaN        NaN  14356530.0      NaN      NaN      NaN  1598402.0      NaN      NaN      NaN      NaN      NaN      NaN      NaN      NaN     NaN      NaN      NaN      NaN      NaN      NaN         NaN       0.0      9.0  14356530.0      0.0      1.0  1598402.0      NaN      NaN      NaN      NaN      NaN     NaN   52657.0      NaN       NaN      NaN      NaN      NaN      NaN       NaN      NaN          NaN      NaN      NaN      NaN  18275351.0         NaN        NaN      NaN   34282940.0  80555.0     NaN       NaN     NaN  10785270.0      NaN      NaN   NaN     NaN     NaN       NaN     NaN   23578225.0   NaN     NaN   NaN   34363495.0     NaN     NaN     NaN     NaN     NaN     NaN   NaN
4            1997  Alabama  17600162AL    1344834.0    3488.0    204256.0    204256.0    842826.0    523.0   135980.0    135980.0   2427378.0      7.0   703608.0    703608.0      NaN      NaN      NaN        NaN      NaN      NaN      NaN      NaN      NaN      NaN      NaN      NaN     NaN      NaN      NaN      NaN      NaN      NaN         NaN       NaN      NaN         NaN      NaN      NaN        NaN      NaN      NaN      NaN      NaN      NaN     NaN       NaN      NaN       NaN      NaN      NaN      NaN      NaN       NaN      NaN          NaN      NaN      NaN      NaN         NaN         NaN        NaN      NaN    1043844.0    165.0     NaN       NaN     NaN         NaN      NaN      NaN   NaN     NaN     NaN       NaN     NaN    1044009.0   NaN     NaN   NaN    1044009.0     NaN     NaN     NaN     NaN     NaN  1037.0   NaN
...           ...      ...         ...          ...       ...         ...         ...         ...      ...        ...         ...         ...      ...        ...         ...      ...      ...      ...        ...      ...      ...      ...      ...      ...      ...      ...      ...     ...      ...      ...      ...      ...      ...         ...       ...      ...         ...      ...      ...        ...      ...      ...      ...      ...      ...     ...       ...      ...       ...      ...      ...      ...      ...       ...      ...          ...      ...      ...      ...         ...         ...        ...      ...          ...      ...     ...       ...     ...         ...      ...      ...   ...     ...     ...       ...     ...          ...   ...     ...   ...          ...     ...     ...     ...     ...     ...     ...   ...
51365        2022  Wyoming  17678821WY          NaN       NaN         NaN         NaN         NaN      NaN        NaN         NaN   1926358.0      6.0   228238.0    228238.0      NaN      NaN      NaN        NaN      NaN      NaN      NaN      NaN      NaN      NaN      NaN      NaN     NaN      NaN      NaN      NaN      NaN      NaN         NaN       NaN      NaN         NaN      NaN      NaN        NaN      NaN      NaN      NaN      NaN      NaN     NaN       NaN      NaN  721281.0      NaN      NaN      NaN      NaN       NaN      NaN          NaN      NaN      NaN      NaN         NaN  13711595.0        NaN      NaN   14661114.0      0.0     NaN       NaN     NaN         NaN      NaN      NaN   NaN     NaN     NaN       NaN     NaN   14661114.0   NaN     NaN   NaN   14661114.0     NaN     NaN     NaN     NaN     NaN  1070.0   NaN
51366        2022  Wyoming  17695156WY          NaN       NaN         NaN         NaN         NaN      NaN        NaN         NaN         NaN      NaN        NaN   1851326.0      NaN      NaN      NaN        NaN      NaN      NaN      NaN      NaN      NaN      NaN      NaN      NaN     NaN      NaN      NaN      NaN      NaN      NaN         NaN   76757.0      1.0   1851326.0      NaN      NaN        NaN      NaN      NaN      NaN      NaN      NaN     NaN       NaN      NaN       NaN      NaN      NaN      NaN      NaN       NaN      NaN          NaN      NaN      NaN   1522.0    460891.0         NaN        NaN      NaN    2313739.0  -1522.0     NaN       NaN     NaN   2312217.0      NaN      NaN   NaN     NaN     NaN       NaN     NaN          NaN   NaN     NaN   NaN    2312217.0     NaN     NaN     NaN     NaN     NaN  1000.0   NaN
51367        2022  Wyoming  17695458WY    1588901.0    1550.0    134273.0    134273.0   1426548.0    277.0   125426.0    125426.0         NaN      NaN        NaN         NaN      NaN      NaN      NaN        NaN  19892.0      1.0   1819.0   1819.0      NaN      NaN      NaN      NaN     NaN      NaN      NaN      NaN      NaN      NaN         NaN       NaN      NaN         NaN      NaN      NaN        NaN      NaN      NaN      NaN      NaN      NaN     NaN    1530.0      NaN       NaN      NaN      NaN      NaN      NaN       NaN      NaN          NaN      NaN      NaN    215.0         NaN         NaN        NaN      NaN     263263.0   2823.0     NaN       NaN     NaN         NaN      NaN      2.0   NaN     NaN     NaN  266086.0     NaN          NaN   NaN     NaN   NaN     266086.0     NaN     NaN     NaN     NaN     NaN  1095.0   NaN
51368        2022  Wyoming  17696301WY          NaN       NaN         NaN         NaN         NaN      NaN        NaN         NaN         NaN      NaN        NaN   5450009.0      NaN      NaN      NaN        NaN      NaN      NaN      NaN      NaN      NaN      NaN      NaN      NaN     NaN      NaN      NaN      NaN      NaN      NaN         NaN  234285.0      2.0   5450009.0      NaN      NaN        NaN      NaN      NaN      NaN      NaN      NaN     NaN       NaN      NaN       NaN      NaN      NaN      NaN      NaN       NaN      NaN          NaN      NaN      NaN      NaN         NaN         NaN        NaN      NaN    5450009.0      NaN     NaN       NaN     NaN         NaN      NaN      NaN   NaN     NaN     NaN       NaN     NaN    5450009.0   NaN     NaN   NaN    5450009.0     NaN     NaN     NaN     NaN     NaN  1050.0   NaN
51369        2022  Wyoming  17699910WY          NaN       NaN         NaN         NaN         NaN      NaN        NaN         NaN         NaN      NaN        NaN         NaN      NaN      NaN      NaN        NaN      NaN      NaN      NaN      NaN      NaN      NaN      NaN      NaN     NaN      NaN      NaN      NaN      NaN      NaN         NaN       NaN      NaN         NaN      NaN      NaN        NaN      NaN      NaN      NaN      NaN      NaN     NaN       NaN      NaN       NaN      NaN      NaN      NaN      NaN       NaN      NaN  120000000.0      NaN      NaN      NaN         NaN         NaN        NaN      NaN          NaN      NaN     NaN       NaN     NaN         NaN      NaN      NaN   NaN     NaN     NaN       NaN     NaN          NaN   NaN     NaN   NaN          NaN     NaN     NaN     NaN     NaN     NaN     NaN   NaN

[51370 rows x 88 columns]
existing code, all years
      report_year     area          id      1010_CS   1010_CT     1010_VL     101T_VL     1020_CS  1020_CT    1020_VL     102T_VL     1030_CS  1030_CT    1030_VL     103T_VL  1040_CS  1040_CT  1040_VL    104T_VL  1050_CS  1050_CT  1050_VL  105T_VL  1060_CS  1060_CT  1060_VL  106T_VL  110_VL  1110_CS  1110_CT  1110_VL  1120_CS  1120_CT     1120_VL   1130_CS  1130_CT     1130_VL  1140_CS  1140_CT    1140_VL  1150_CS  1150_CT  1150_VL  1160_CT  1160_VL  120_VL   1210_VL  1220_VL   1230_VL  1240_VL  1250_VL  1260_VL  1310_VL   1320_VL  1330_VL      1400_VL  1500_VL  1600_VL  1700_VL     1810_VL     1820_VL    1830_VL  1840_VL      1900_VL  2000_VL  210_VL    220_VL  230_VL      300_VL  3014_CT  3014_VL  3_VL  400_VL  410_CS    410_VL  420_VL       500_VL  5_CT  600_VL  6_CT       700_VL  800_VL  810_VL  810_YA  820_VL  820_YA  900_VL  9_VL
0            1997  Alabama  17600048AL     251371.0     625.0     29469.0     29469.0     69956.0     50.0     8358.0      8358.0         NaN      NaN        NaN         NaN      NaN      NaN      NaN        NaN      NaN      NaN      NaN      NaN      NaN      NaN      NaN      NaN     NaN      NaN      NaN      NaN      NaN      NaN         NaN       NaN      NaN         NaN      NaN      NaN        NaN      NaN      NaN      NaN      NaN      NaN     NaN       NaN      NaN       NaN      NaN      NaN      NaN      NaN       NaN      NaN          NaN      NaN      NaN      NaN         NaN         NaN        NaN      NaN      37827.0  -9795.0     NaN       NaN     NaN     28032.0      NaN      NaN   NaN     NaN     NaN       NaN     NaN          NaN   NaN     NaN   NaN      28032.0     NaN     NaN     NaN     NaN     NaN  1100.0   NaN
1            1997  Alabama  17600049AL     221993.0     501.0     28016.0     28016.0     27135.0     22.0     4606.0      4606.0         NaN      NaN        NaN         NaN      NaN      NaN      NaN        NaN      NaN      NaN      NaN      NaN      NaN      NaN      NaN      NaN     NaN      NaN      NaN      NaN      NaN      NaN         NaN       NaN      NaN         NaN      NaN      NaN        NaN      NaN      NaN      NaN      NaN      NaN     NaN       NaN      NaN       NaN      NaN      NaN      NaN      NaN       NaN      NaN          NaN      NaN      NaN      NaN         NaN         NaN        NaN      NaN      32622.0   1417.0     NaN       NaN     NaN         NaN      NaN      NaN   NaN     NaN     NaN       NaN     NaN      34039.0   NaN     NaN   NaN      34039.0     NaN     NaN     NaN     NaN     NaN  1018.0   NaN
2            1997  Alabama  17600139AL  246105034.0  423130.0  29308019.0  29308019.0  72340233.0  35652.0  9951817.0  20985483.0  16947052.0   1498.0  2724147.0  51277620.0      NaN      NaN      NaN  7028200.0      NaN      NaN      NaN      NaN      NaN      NaN      NaN      NaN     NaN      NaN      NaN      NaN      0.0     87.0  11033666.0       0.0    194.0  48553473.0      0.0      3.0  7028200.0      NaN      NaN      NaN      NaN      NaN     NaN  179045.0      NaN       NaN      NaN      NaN      NaN      NaN  783604.0      NaN          NaN      NaN      NaN      NaN         NaN         NaN  7800144.0      NaN  117362115.0  49682.0     NaN  404450.0     NaN         NaN      NaN      NaN   NaN     NaN     NaN       NaN     NaN  117007347.0   NaN     NaN   NaN  117411797.0     NaN     NaN     NaN     NaN     NaN  1017.0   NaN
3            1997  Alabama  17600141AL          NaN       NaN         NaN         NaN         NaN      NaN        NaN         NaN         NaN      NaN        NaN  14356530.0      NaN      NaN      NaN  1598402.0      NaN      NaN      NaN      NaN      NaN      NaN      NaN      NaN     NaN      NaN      NaN      NaN      NaN      NaN         NaN       0.0      9.0  14356530.0      0.0      1.0  1598402.0      NaN      NaN      NaN      NaN      NaN     NaN   52657.0      NaN       NaN      NaN      NaN      NaN      NaN       NaN      NaN          NaN      NaN      NaN      NaN  18275351.0         NaN        NaN      NaN   34282940.0  80555.0     NaN       NaN     NaN  10785270.0      NaN      NaN   NaN     NaN     NaN       NaN     NaN   23578225.0   NaN     NaN   NaN   34363495.0     NaN     NaN     NaN     NaN     NaN     NaN   NaN
4            1997  Alabama  17600162AL    1344834.0    3488.0    204256.0    204256.0    842826.0    523.0   135980.0    135980.0   2427378.0      7.0   703608.0    703608.0      NaN      NaN      NaN        NaN      NaN      NaN      NaN      NaN      NaN      NaN      NaN      NaN     NaN      NaN      NaN      NaN      NaN      NaN         NaN       NaN      NaN         NaN      NaN      NaN        NaN      NaN      NaN      NaN      NaN      NaN     NaN       NaN      NaN       NaN      NaN      NaN      NaN      NaN       NaN      NaN          NaN      NaN      NaN      NaN         NaN         NaN        NaN      NaN    1043844.0    165.0     NaN       NaN     NaN         NaN      NaN      NaN   NaN     NaN     NaN       NaN     NaN    1044009.0   NaN     NaN   NaN    1044009.0     NaN     NaN     NaN     NaN     NaN  1037.0   NaN
...           ...      ...         ...          ...       ...         ...         ...         ...      ...        ...         ...         ...      ...        ...         ...      ...      ...      ...        ...      ...      ...      ...      ...      ...      ...      ...      ...     ...      ...      ...      ...      ...      ...         ...       ...      ...         ...      ...      ...        ...      ...      ...      ...      ...      ...     ...       ...      ...       ...      ...      ...      ...      ...       ...      ...          ...      ...      ...      ...         ...         ...        ...      ...          ...      ...     ...       ...     ...         ...      ...      ...   ...     ...     ...       ...     ...          ...   ...     ...   ...          ...     ...     ...     ...     ...     ...     ...   ...
51365        2022  Wyoming  17678821WY          NaN       NaN         NaN         NaN         NaN      NaN        NaN         NaN   1926358.0      6.0   228238.0    228238.0      NaN      NaN      NaN        NaN      NaN      NaN      NaN      NaN      NaN      NaN      NaN      NaN     NaN      NaN      NaN      NaN      NaN      NaN         NaN       NaN      NaN         NaN      NaN      NaN        NaN      NaN      NaN      NaN      NaN      NaN     NaN       NaN      NaN  721281.0      NaN      NaN      NaN      NaN       NaN      NaN          NaN      NaN      NaN      NaN         NaN  13711595.0        NaN      NaN   14661114.0      0.0     NaN       NaN     NaN         NaN      NaN      NaN   NaN     NaN     NaN       NaN     NaN   14661114.0   NaN     NaN   NaN   14661114.0     NaN     NaN     NaN     NaN     NaN  1070.0   NaN
51366        2022  Wyoming  17695156WY          NaN       NaN         NaN         NaN         NaN      NaN        NaN         NaN         NaN      NaN        NaN   1851326.0      NaN      NaN      NaN        NaN      NaN      NaN      NaN      NaN      NaN      NaN      NaN      NaN     NaN      NaN      NaN      NaN      NaN      NaN         NaN   76757.0      1.0   1851326.0      NaN      NaN        NaN      NaN      NaN      NaN      NaN      NaN     NaN       NaN      NaN       NaN      NaN      NaN      NaN      NaN       NaN      NaN          NaN      NaN      NaN   1522.0    460891.0         NaN        NaN      NaN    2313739.0  -1522.0     NaN       NaN     NaN   2312217.0      NaN      NaN   NaN     NaN     NaN       NaN     NaN          NaN   NaN     NaN   NaN    2312217.0     NaN     NaN     NaN     NaN     NaN  1000.0   NaN
51367        2022  Wyoming  17695458WY    1588901.0    1550.0    134273.0    134273.0   1426548.0    277.0   125426.0    125426.0         NaN      NaN        NaN         NaN      NaN      NaN      NaN        NaN  19892.0      1.0   1819.0   1819.0      NaN      NaN      NaN      NaN     NaN      NaN      NaN      NaN      NaN      NaN         NaN       NaN      NaN         NaN      NaN      NaN        NaN      NaN      NaN      NaN      NaN      NaN     NaN    1530.0      NaN       NaN      NaN      NaN      NaN      NaN       NaN      NaN          NaN      NaN      NaN    215.0         NaN         NaN        NaN      NaN     263263.0   2823.0     NaN       NaN     NaN         NaN      NaN      2.0   NaN     NaN     NaN  266086.0     NaN          NaN   NaN     NaN   NaN     266086.0     NaN     NaN     NaN     NaN     NaN  1095.0   NaN
51368        2022  Wyoming  17696301WY          NaN       NaN         NaN         NaN         NaN      NaN        NaN         NaN         NaN      NaN        NaN   5450009.0      NaN      NaN      NaN        NaN      NaN      NaN      NaN      NaN      NaN      NaN      NaN      NaN     NaN      NaN      NaN      NaN      NaN      NaN         NaN  234285.0      2.0   5450009.0      NaN      NaN        NaN      NaN      NaN      NaN      NaN      NaN     NaN       NaN      NaN       NaN      NaN      NaN      NaN      NaN       NaN      NaN          NaN      NaN      NaN      NaN         NaN         NaN        NaN      NaN    5450009.0      NaN     NaN       NaN     NaN         NaN      NaN      NaN   NaN     NaN     NaN       NaN     NaN    5450009.0   NaN     NaN   NaN    5450009.0     NaN     NaN     NaN     NaN     NaN  1050.0   NaN
51369        2022  Wyoming  17699910WY          NaN       NaN         NaN         NaN         NaN      NaN        NaN         NaN         NaN      NaN        NaN         NaN      NaN      NaN      NaN        NaN      NaN      NaN      NaN      NaN      NaN      NaN      NaN      NaN     NaN      NaN      NaN      NaN      NaN      NaN         NaN       NaN      NaN         NaN      NaN      NaN        NaN      NaN      NaN      NaN      NaN      NaN     NaN       NaN      NaN       NaN      NaN      NaN      NaN      NaN       NaN      NaN  120000000.0      NaN      NaN      NaN         NaN         NaN        NaN      NaN          NaN      NaN     NaN       NaN     NaN         NaN      NaN      NaN   NaN     NaN     NaN       NaN     NaN          NaN   NaN     NaN   NaN          NaN     NaN     NaN     NaN     NaN     NaN     NaN   NaN

[51370 rows x 88 columns]

They seem to be the same if you df.compare() the two as well.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Thanks. I was looking for a built-in function and it wasn't a simple transpose. I've worked this in but need to get the pre-commit hooks passing. Will chip away at this over the next few days.

# Get the data corresponding to one completed form EIA-176
form_data = granular_data[
(granular_data["report_year"] == report_year)
& (granular_data["area"] == area)
& (granular_data["id"] == id_)
]

wide_row = {"report_year": report_year, "area": area, "id": id_}

# Translate each piece of data entered into the form into its own column
for record in form_data.iterrows():
form_row = record[1]
wide_row[form_row["variable_name"]] = form_row["value"]

wide_table.loc[len(wide_table.index)] = wide_row

return wide_table


@asset_check(asset=_core_eia176__data, blocking=True)
def validate_totals():
"""Compare reported and calculated totals for different geographical aggregates, report any differences."""


def _compare_totals(
Copy link
Collaborator Author

Choose a reason for hiding this comment

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

This was helpful for validating raw inputs before tackling how to work with them, but I think I want to adapt this to just validate the output of the transposition function above. Planning to do that and roll it into the validate_totals function above for US-, state-, and other level aggregations.

reported_totals: pd.DataFrame,
calculated_totals: pd.DataFrame,
groupby_cols: list[str],
) -> pd.DataFrame:
"""Compare two dataframes representing reporting and calculated totals."""
reset_calculated = (
calculated_totals.sort_values(by=groupby_cols)
.reset_index()[groupby_cols + ["value"]]
.round(2)
Copy link
Member

Choose a reason for hiding this comment

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

You can use numpy.isclose() for comparing floats without rounding off to 2 decimal points everywhere!

)

reset_reported = (
reported_totals.sort_values(by=groupby_cols)
.reset_index()[groupby_cols + ["value"]]
.fillna(0)
)

return reset_calculated.compare(reset_reported)


# TODO: Reasonable boundaries -- in a script/notebook in the 'validate' directory? How are those executed?
Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Other ideas on validations to cover here as an asset check? I also see reasonable boundaries invalidate/gens_eia860_test.py and could pursue something similar for eia176.

Copy link
Member

Choose a reason for hiding this comment

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

I don't really know much about the actual semantics of the gas data - I think a reasonable thing to do is graph some of the different variables over time and see if anything jumps out as "suspicious", then bring that up and we can try to research that together.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Happy to just get min, max, and enumerated values based on data so far to validate against, maybe in a follow-up.

Copy link
Member

Choose a reason for hiding this comment

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

This sounds like a perfect follow-up PR!

87 changes: 87 additions & 0 deletions test/unit/transform/eia176_test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
import pandas as pd

from pudl.transform.eia176 import _compare_totals, _core_eia176__data


def get_test_df():
col_names = ["area", "atype", "company", "id", "line", "report_year", "value"]
df = pd.DataFrame(columns=col_names)
df.loc[0] = [
"New Mexico",
"VL",
"ZIA NATURAL GAS",
"17635019NM",
"1010",
"2022",
2013231.0,
]
df.loc[1] = [
"New Mexico",
"VL",
" Total of All Companies",
"17635019NM",
"1010",
"2022",
2013231.0,
]

return df


def test_core_eia176__data():
eav_model = get_test_df()

wide_table = _core_eia176__data(eav_model)
assert wide_table.shape == (1, 4)
row = wide_table.loc[0]
assert list(row.index) == ["report_year", "area", "id", "1010_VL"]
assert list(row.values) == ["2022", "New Mexico", "17635019NM", 2013231.0]


def test_compare_totals_no_diff():
states_df = get_test_df()
states_df.loc[2] = [
"New Mexico",
"VL",
"ANOTHER COMPANY",
"12345679NM",
"1010",
"2022",
1.0,
]
states_df.loc[1, "value"] += 1

reported_state_totals = states_df[states_df["company"] == " Total of All Companies"]
state_companies_df = states_df[states_df["company"] != " Total of All Companies"]
state_level_cols = ["report_year", "area", "line", "atype"]
calculated_state_totals = state_companies_df.groupby(state_level_cols).sum()
assert _compare_totals(
reported_state_totals, calculated_state_totals, state_level_cols
).empty


# TODO: Test on specific details here
def test_compare_totals_diff():
states_df = get_test_df()
states_df.loc[2] = [
"New Mexico",
"VL",
"ANOTHER COMPANY",
"12345679NM",
"1010",
"2022",
1.0,
]

reported_state_totals = states_df[states_df["company"] == " Total of All Companies"]
state_companies_df = states_df[states_df["company"] != " Total of All Companies"]
state_level_cols = ["report_year", "area", "line", "atype"]
calculated_state_totals = state_companies_df.groupby(state_level_cols).sum()
assert not _compare_totals(
reported_state_totals, calculated_state_totals, state_level_cols
).empty


# TODO: Implement, if we can even unit-test a function annotated as an asset check
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 able to! In my mind, asset checks are just assets, which can be called directly...

def test_validate__totals():
pass