Skip to content

Commit 91184d9

Browse files
authored
Merge pull request #150 from martinfleis/categorical_align_bug
BUG: support custom index in area_interpolate
2 parents 5acb23f + 8429782 commit 91184d9

File tree

2 files changed

+32
-4
lines changed

2 files changed

+32
-4
lines changed

Diff for: tobler/area_weighted/area_interpolate.py

+10-4
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,10 @@ def _area_tables_binning_parallel(source_df, target_df, n_jobs=-1):
129129

130130
# Build DOK table
131131
table = coo_matrix(
132-
(areas, (ids_src, ids_tgt),),
132+
(
133+
areas,
134+
(ids_src, ids_tgt),
135+
),
133136
shape=(df1.shape[0], df2.shape[0]),
134137
dtype=np.float32,
135138
)
@@ -190,7 +193,10 @@ def _area_tables_binning(source_df, target_df, spatial_index):
190193
areas = df1.geometry.values[ids_src].intersection(df2.geometry.values[ids_tgt]).area
191194

192195
table = coo_matrix(
193-
(areas, (ids_src, ids_tgt),),
196+
(
197+
areas,
198+
(ids_src, ids_tgt),
199+
),
194200
shape=(df1.shape[0], df2.shape[0]),
195201
dtype=np.float32,
196202
)
@@ -359,7 +365,7 @@ def _area_interpolate_binning(
359365
else:
360366
table = _area_tables_binning_parallel(source_df, target_df, n_jobs=n_jobs)
361367

362-
den = source_df[source_df.geometry.name].area.values
368+
den = source_df.area.values
363369
if allocate_total:
364370
den = np.asarray(table.sum(axis=1))
365371
den = den + (den == 0)
@@ -415,7 +421,7 @@ def _area_interpolate_binning(
415421
)[0]
416422

417423
categorical = pd.DataFrame(categorical)
418-
categorical = categorical.div(target_df.area, axis="rows")
424+
categorical = categorical.div(target_df.area.values, axis="rows")
419425

420426
if extensive_variables:
421427
dfs.append(extensive)

Diff for: tobler/tests/test_dasymetric.py

+22
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,28 @@ def test_area_interpolate():
5959
assert_almost_equal(area.animal_capybara.sum(), 20, decimal=0)
6060

6161

62+
@pytest.mark.skipif(QUILTMISSING, reason="quilt3 not available.")
63+
def test_area_interpolate_custom_index():
64+
sac1, sac2 = datasets()
65+
sac1.index = sac1.index * 2
66+
sac2.index = sac2.index * 13
67+
area = area_interpolate(
68+
source_df=sac1,
69+
target_df=sac2,
70+
extensive_variables=["TOT_POP"],
71+
intensive_variables=["pct_poverty"],
72+
categorical_variables=["animal"],
73+
)
74+
assert_almost_equal(area.TOT_POP.sum(), 1796856, decimal=0)
75+
assert_almost_equal(area.pct_poverty.sum(), 2140, decimal=0)
76+
assert_almost_equal(area.animal_cat.sum(), 32, decimal=0)
77+
assert_almost_equal(area.animal_dog.sum(), 19, decimal=0)
78+
assert_almost_equal(area.animal_donkey.sum(), 22, decimal=0)
79+
assert_almost_equal(area.animal_wombat.sum(), 23, decimal=0)
80+
assert_almost_equal(area.animal_capybara.sum(), 20, decimal=0)
81+
assert not area.isna().any().any()
82+
83+
6284
@pytest.mark.skipif(QUILTMISSING, reason="quilt3 not available.")
6385
def test_masked_area_interpolate():
6486
sac1, sac2 = datasets()

0 commit comments

Comments
 (0)