Второй экземпляр класса Python создает пустой фрейм данных Pandas - PullRequest
0 голосов
/ 19 июня 2020

Следующий код содержит класс ReturnsAnalysis, который при вызове создает атрибут self.df.

Я использую Jupyter Notebook.

Первый раз, когда я его вызываю (для 'mean_historical_return' ), Я получаю заполненный фрейм данных, как и ожидалось.

Однако во второй раз (для 'ema_historical_return') фрейм данных пуст.

import datetime
import pandas as pd
import numpy as np
from pypfopt import expected_returns
from sklearn.linear_model import LinearRegression

# get sample of 200 randomly selected stocks between 2010-01-01 and 2019-12-31 (10 years)
df_sample = pd.read_csv('sample.csv', index_col='trading_date', parse_dates=True)

# split sample into expected and actual prices
df_exp_price = df_sample[df_sample.index <= np.datetime64('2018-12-31')]
df_act_price = df_sample[df_sample.index >= np.datetime64('2019-01-01')]

class ReturnsAnalysis:

    def __init__(self, exp_ret, act_ret):
        self.df = pd.DataFrame(exp_ret, columns=['expected']).join(
            pd.DataFrame(act_ret, columns=['actual'])
        )

# results dict to store results in 
results = {}

# mean historical return
e = expected_returns.mean_historical_return(df_exp_price)
a = expected_returns.mean_historical_return(df_act_price)
results['mean_historical_return'] = ReturnsAnalysis(
    exp_ret=e,
    act_ret=a
)

# exponentially weighted mean historical return
e = expected_returns.ema_historical_return(df_exp_price)
a = expected_returns.ema_historical_return(df_act_price)
results['ema_historical_return'] = ReturnsAnalysis(
    exp_ret=e,
    act_ret=a
)

results['mean_historical_return'].df.head()

results['ema_historical_return'].df.head()

Я проверил эти переменные e и a содержат значения. В обоих случаях это Pandas Series.

Я ожидаю, что во второй раз, когда я вызываю ReturnsAnalysis, я должен получить второй заполненный df.

Я подумал, есть ли у него что-то делать с pypfopt, но я проверил репозиторий github и не вижу ничего очевидного.

ОБНОВЛЕНИЕ:

Я упростил код выше, полностью удалив объект ReturnsAnalysis. Вот что у меня осталось:

# imports
import datetime
import pandas as pd
import numpy as np
from pypfopt import expected_returns
from sklearn.linear_model import LinearRegression

# get sample of 200 randomly selected stocks between 2010-01-01 and 2019-12-31 (10 years)
df_sample = pd.read_csv('sample.csv', index_col='trading_date', parse_dates=True)

# split sample into expected and actual prices
df_exp_price = df_sample[df_sample.index <= np.datetime64('2018-12-31')]
df_act_price = df_sample[df_sample.index >= np.datetime64('2019-01-01')]

# mean historical return
e = expected_returns.mean_historical_return(df_exp_price)
a = expected_returns.mean_historical_return(df_act_price)

df_mean = pd.DataFrame(e, columns=['expected']).join(
    pd.DataFrame(a, columns=['actual'])
)

# exponentially weighted mean historical return
e = expected_returns.ema_historical_return(df_exp_price)
a = expected_returns.ema_historical_return(df_act_price)

df_ema = pd.DataFrame(e, columns=['expected']).join(
    pd.DataFrame(a, columns=['actual'])
)

Я получаю то же поведение, что и раньше: df_mean содержит значения, но df_ema пусто.

Я ожидаю, что df_ema также будет содержать значения.

Но - если я сделаю следующее, я получу df со значениями:

df_ema = pd.DataFrame(tuple(e), index=e.keys(), columns=['expected']).join(
    pd.DataFrame(tuple(a), index=a.keys(), columns=['actual'])
)
df_ema.head()
...