html_url,issue_url,id,node_id,user,created_at,updated_at,author_association,body,reactions,performed_via_github_app,issue
https://github.com/pydata/xarray/issues/1625#issuecomment-510415725,https://api.github.com/repos/pydata/xarray/issues/1625,510415725,MDEyOklzc3VlQ29tbWVudDUxMDQxNTcyNQ==,6213168,2019-07-11T09:48:07Z,2019-07-11T09:48:07Z,MEMBER,Closed by #2876 ,"{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,264517839
https://github.com/pydata/xarray/issues/1625#issuecomment-378904185,https://api.github.com/repos/pydata/xarray/issues/1625,378904185,MDEyOklzc3VlQ29tbWVudDM3ODkwNDE4NQ==,6213168,2018-04-05T11:26:23Z,2018-04-05T11:26:23Z,MEMBER,"Updated title. I'm happy with the explicit approach.
New design prototype:
```
wallet, restaurant_bill = xarray.align(wallet, restaurant_bill, join='outer', fill_value=0)
print(wallet - restaurant_bill)
array([50, 40])
Coordinates:
* currency (currency) object 'EUR' 'USD'
```","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,264517839
https://github.com/pydata/xarray/issues/1625#issuecomment-335849053,https://api.github.com/repos/pydata/xarray/issues/1625,335849053,MDEyOklzc3VlQ29tbWVudDMzNTg0OTA1Mw==,1217238,2017-10-11T15:26:36Z,2017-10-11T15:26:36Z,MEMBER,"This behavior is consistent with the default behavior on pandas, which always does an outer join for arithmetic:
```
In [6]: wallet.to_series() - restaurant_bill.to_series()
currency
EUR NaN
USD 40.0
dtype: float64
```
So I don't think we want to change this in an inconsistent way in xarray.
I do agree that we should have support for an explicit fill value in alignment/reindexing and arithmetic. For consistency with pandas (and elsewhere in xarray), let's call it `fill_value`.
> - change `__add__`,` __sub__` etc. to invoke `xarray.align(fillvalue=0)`
> - change `__mul__`, `__truediv__` etc. to invoke `xarray.align(fillvalue=1)`
I can see the logic in using an identity value instead of NaN as a default in arithmetic. One peril of this approach is that it isn't always evident what the right identity is. In fact, according to NumPy:
```
In [16]: import numpy as np
In [17]: print(np.add.identity)
0
In [18]: print(np.multiply.identity)
1
In [19]: print(np.subtract.identity)
None
In [20]: print(np.divide.identity)
None
```
Let me give a couple other examples of why I don't think we should use an identity of some sort as the default:
- Suppose we are comparing a model to observations. `model - observations` gives the residuals -- unless the variables are mis-aligned, in which case it would give a residual equal to one of the variables.
- Suppose we want to do a weighted average. `(observations * weights).sum()` gives a sensible answer -- but not if a missing weight defaults to 1 (all the weights put together are supposed to sum to 1!).","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,264517839