Issue 1:
See SO post

https://stackoverflow.com/q/46498784/2336654

Code Sample, a copy-pastable example if possible

from pandas import Series

class Xseries(Series):
_metadata = ['attr']

@property
def _constructor(self):
return Xseries

def __init__(self, *args, **kwargs):
self.attr = kwargs.pop('attr', 0)
super().__init__(*args, **kwargs)

s = Xseries([1, 2, 3], attr=3)

Problem description

According to https://pandas.pydata.org/pandas-docs/stable/internals.html#define-original-properties

I should be able to define an original property and have it passed on when a new object is constructed.

This works

s.mul(2).attr

3

While this doesn't

s.__mul__(2).attr

0

Expected Output

I expected both output to be 3

Output of pd.show_versions()

[paste the output of pd.show_versions() here below this line]

INSTALLED VERSIONS

commit: None

python: 3.6.0.final.0

python-bits: 64

OS: Darwin

OS-release: 16.7.0

machine: x86_64

processor: i386

byteorder: little

LC_ALL: None

LANG: en_US.UTF-8

LOCALE: en_US.UTF-8

pandas: 0.20.3

pytest: 3.2.1

pip: 9.0.1

setuptools: 36.3.0

Cython: 0.25.2

numpy: 1.13.1

scipy: 0.18.1

xarray: 0.9.5

IPython: 6.1.0

sphinx: 1.5.1

patsy: 0.4.1

dateutil: 2.6.1

pytz: 2017.2

blosc: None

bottleneck: 1.2.0

tables: 3.3.0

numexpr: 2.6.1

feather: 0.4.0

matplotlib: 2.0.0

openpyxl: 2.4.1

xlrd: 1.0.0

xlwt: 1.2.0

xlsxwriter: 0.9.6

lxml: 3.7.2

bs4: 4.5.3

html5lib: 0.999999999

sqlalchemy: 1.1.5

pymysql: None

psycopg2: None

jinja2: 2.9.6

s3fs: None

pandas_gbq: None

pandas_datareader: 0.4.0

Issue 2:
#!/bin/env python
"""
Example bug in derived Pandas Series.

__finalized__ is not called in arithmetic binary operators, but it is in in some booleans cases.

>>> m = MySeries([1, 2, 3], name='test')
>>> m.x = 42
>>> n=m[:2]
>>> n
0 1
1 2
dtype: int64
>>> n.x
42
>>> o=n+1
>>> o
0 2
1 3
dtype: int64
>>> o.x
Traceback (most recent call last):
...
AttributeError: 'MySeries' object has no attribute 'x'
>>> m = MySeries([True, False, True], name='test2')
>>> m.x = 42
>>> n=m[:2]
>>> n
0 True
1 False
dtype: bool
>>> n.x
42
>>> o=n ^ True
>>> o
0 False
1 True
dtype: bool
>>> o.x
42
>>> p = n ^ o
>>> p
0 True
1 True
dtype: bool
>>> p.x
42

"""

import pandas as pd

class MySeries(pd.Series):
_metadata = ['x']

@property
def _constructor(self):
return MySeries

if __name__ == "__main__":
import doctest
doctest.testmod()

Expected Output

In all cases, the metadata 'x' should be transferred from the passed values when applying binary operators.

When the right-hand value is a constant, the left-hand value metadata should be used in finalize for arithmetic operators, just like it is for Boolean binary operators.

When two series are used in binary operators, some resolution should be possible in finalize.

I would pass the second (right-hand) value by calling finalize(self, other=other), leaving the resolution to the derived class implementer, but there might be a smarter approach.

output of pd.show_versions()

pd.show_versions()

INSTALLED VERSIONS

commit: None

python: 2.7.6.final.0

python-bits: 64

OS: Linux

OS-release: 3.19.0-59-generic

machine: x86_64

processor: x86_64

byteorder: little

LC_ALL: None

LANG: en_US.UTF-8

pandas: 0.18.1

nose: 1.3.7

pip: None

setuptools: 20.2.2

Cython: 0.24

numpy: 1.11.0

scipy: 0.17.0

statsmodels: 0.6.1

xarray: None

IPython: 4.0.1

sphinx: 1.3.1

patsy: 0.4.0

dateutil: 2.4.2

pytz: 2015.7

blosc: None

bottleneck: 1.0.0

tables: 3.2.2

numexpr: 2.5.2

matplotlib: 1.5.0

openpyxl: 2.2.6

xlrd: 0.9.4

xlwt: 1.0.0

xlsxwriter: 0.7.7

lxml: 3.4.4

bs4: 4.4.1

html5lib: 0.9999999

httplib2: None

apiclient: None

sqlalchemy: 1.0.9

pymysql: None

psycopg2: None

jinja2: 2.8

boto: 2.38.0

pandas_datareader: None