Преобразование ежедневных цен на акции в ежемесячные цены на акции и получение средних цен за период - повторная выборка создает новые даты, отсутствующие в индексе - PullRequest
0 голосов
/ 13 апреля 2020
import yfinance as yf
import pandas as pd 

data = yf.download('SPY', start='2017-12-31', end='2019-12-31') 
df = data[['Adj Close']] 

df.resample('2Q',closed='left').mean() 

В результате повторной выборки показаны даты окончания кварталов 30-06-2018, 31-12-2018, 30-06-2019 и 31-12-2019. Но некоторые из этих дат не входят в исходные данные. Среднее значение рассчитывается правильно.

Это должны быть правильные даты 29-06-2018, 31-12-2018, 28-06-2019, 30-12-2019.

Как я могу использовать повторную выборку, но вывести правильные даты в исходных данных?

f = {'Date': 'last', 'Adj Close': 'mean'}
df.reset_index().groupby([[d.year for d in df.index],[d.month==6 for d in 
df.index]],as_index=False).agg(f).sort_values('Date')

Я использовал groupby, который выводит правильные даты (т.е. последнюю дату квартала, которая находится в исходных данных), но среднее значение рассчитывается неправильно. Это почему?

1 Ответ

0 голосов
/ 13 апреля 2020

a) df.resample('2Q', closed='left').mean() дает

             Adj Close
Date                  
2018-06-30  260.626654
2018-12-31  268.594670
2019-06-30  273.702913
2019-12-31  297.780020

, что эквивалентно

pd.DataFrame({'Date': ['2018-06-30', '2018-12-31', '2019-06-30', '2019-12-31'],
              'Adj Close': [df[(df.index <= '2018-06-29')].mean().values[0],
                            df[(df.index >  '2018-06-29') & (df.index <  '2018-12-31')].mean().values[0],
                            df[(df.index >= '2018-12-31') & (df.index <= '2019-06-28')].mean().values[0],
                            df[(df.index >  '2019-06-28')].mean().values[0]]})

         Date   Adj Close
0  2018-06-30  260.626654
1  2018-12-31  268.594670
2  2019-06-30  273.702913
3  2019-12-31  297.780020

, где 31 декабря 2018 года был присвоен Q1 2019.

b ) df.resample('2Q', kind='period').mean() дает

         Adj Close
Date              
2018Q1  260.626654
2018Q3  268.398217
2019Q1  273.943730
2019Q3  297.780020

, что эквивалентно

pd.DataFrame({'Date': ['2018Q1', '2018Q3', '2019Q1', '2019Q3'],
              'Adj Close': [df[(df.index <= '2018-06-29')].mean().values[0],
                            df[(df.index >  '2018-06-29') & (df.index <= '2018-12-31')].mean().values[0],
                            df[(df.index >  '2018-12-31') & (df.index <= '2019-06-28')].mean().values[0],
                            df[(df.index >  '2019-06-28')].mean().values[0]]})

     Date   Adj Close
0  2018Q1  260.626654
1  2018Q3  268.398217
2  2019Q1  273.943730
3  2019Q3  297.780020

, а также

f = {'Date': 'last', 'Adj Close': 'mean'}
df.reset_index().groupby([[d.year for d in df.index], [d.quarter <= 2 for d in df.index]], as_index=False).agg(f).sort_values('Date')

        Date   Adj Close
1 2018-06-29  260.626654
0 2018-12-31  268.398217
3 2019-06-28  273.943730
2 2019-12-30  297.780020

, где 31 декабря 2018 года был присвоен Q4 2018.

...