Среднегодовое взвешенное значение для панд - PullRequest
0 голосов
/ 07 июня 2018

Средний / Новичок Python пользователь здесь.Мне нужно выяснить, как рассчитать годовые веса и средневзвешенные значения на основе некоторых данных фондового рынка, которые я проанализировал во фреймах данных.

У меня есть рыночные значения и даты из некоторого интервала 2003-2018 гг., Которые даются примерно так (намного больше значений, чем показывает этот фрагмент):

ticker  date    marketcap       open    high    low     close
A   2003-03-31  8466487038.0    13.38   13.47   13.0    13.15
A   2003-06-30  11273789220.5   19.5    19.76   19.46   19.55
AA  2017-03-31  6031414196.0    34.06   34.74   33.6    34.4
AA  2017-06-30  6426297428.0    33.16   33.45   32.535  32.65
ICE 2016-03-31  29363680289.5   46.396  47.184  46.242  47.028
ICE 2016-06-30  31796255816.0   50.602  51.349  50.321  51.192

Я просто хочу взять годовой вес для каждой рыночной тикера.

Т.е.:

Weight(YEAR) = AVGTickerMarketCap(YEAR) / AllTickersMarketCap(YEAR)

Поскольку каждый год для marketcap существует более одного значения, мне нужно в среднем рассчитывать сначала значение marketcap за 2003, 2004, 2005 ... и т. Д. Для каждого тикера - отсюда AVGTickerMarketCap (YEAR).

Я могу только выяснить, как несколько вычислить AllTickersMarketCap (ГОД):

df1['date'] = pd.to_datetime(df1.date)
avg_all = df1.groupby(df1.date.dt.year['marketcap'].transform('mean')

Но, похоже, для этого используется только первый тикер "A" и применяется то же самое среднее значение для "A""каждый год, независимо от их тикера.

Где проблема и как мне тогда найти AVGTickerMarketCap (YEAR)?

1 Ответ

0 голосов
/ 07 июня 2018

Правильный синтаксис для получения столбца, содержащего ваши среднегодовые значения, будет

avg_all = df1['marketcap'].groupby(df1.date.dt.year).transform('mean')

Аналогично, чтобы получить среднее значение для каждого года и тикера, который вы запустите:

avg_all = df1['marketcap'].groupby([df1.date.dt.year,df1.ticker]).transform('mean')

Если выне хотите, чтобы это был столбец, который вы можете отобразить обратно на ваш фрейм данных, но вместо этого просто хотите новый фрейм данных с вашими значениями для каждого года / тикера, который вы можете выложить .transform('mean') с помощью .mean().

В данных вашего примера каждый тикер имеет уникальный год, который одинаков для всех значений этого тикера и отличается от всех других значений тикера, поэтому группировка по году и группировка по году и тикеру являются эквивалентными операциями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...