Средневзвешенное значение данных - PullRequest
1 голос
/ 27 февраля 2020

Я нашел несколько ответов об усреднении фреймов данных, но ни один из них не включает обработку весов. Я нашел способ добиться желаемого результата (см. Заголовок), но мне интересно, есть ли более прямой способ достижения той же цели.

Что я делаю:

  • преобразовать каждый фрейм данных в массив массивов (строк), назовем его arOfArs: используя al oop для df.iloc[i].values и np.vstack
  • , поместите все arOfArs (которые раньше были фреймами данных ) в массив, назовем его arOfTransfDfs
  • возьмем среднее значение:

    ave = np.average(arOfTransfDfs, axis=0, weights=myWeights)
    

    где myWeights - массив, где каждое значение является весом соответствующего кадра данных .

  • преобразовать обратно в фрейм данных:

    dfOut = pd.DataFrame(np.row_stack(ave))
    

Как я уже сказал, это работает, и это еще сложнее, потому что мне приходится маскировать nan s из фрейма данных, но, надеюсь, есть более краткий способ сделать это.

1 Ответ

0 голосов
/ 27 февраля 2020

Вам не нужно преобразовывать кадры данных назад и вперед. Если вы посмотрите на то, что представляет собой средневзвешенное значение на математической основе, то это не что-то вроде avg (массив), а avg (массив * веса).

Поскольку вы не дали конкретную c часть данных Я взял некоторые случайные данные и веса и поместил их в один фрейм данных:

df=pd.DataFrame(np.random.randn(20,5),columns=['a','b','c','d','e'])
df['weights']=[2,4,6,8,10,12,14,16,18,20,19,17,15,13,11,9,7,5,3,1]
df.head()
Out[]: 
          a         b         c         d         e  weights
0  1.358269  0.377319 -0.097123 -0.790024  1.127523        2
1  1.011136 -1.541731 -0.331144  0.244773 -0.033312        4
2 -0.715343 -0.711782 -2.239824 -2.323896  0.568065        6
3  0.495619  0.779495 -1.020806 -0.093149  0.219650        8
4 -0.341321  0.309430  0.083620 -1.214781  0.970039       10

Если вы хотите получить среднее значение всех столбцов, кроме последнего (т. Е. Столбца веса), это будет

df.iloc[:,:-1].sum()
Out[]: 
a   -7.799888
b    5.150143
c   -7.783813
d    7.116149
e   -3.548300
dtype: float64

Если вы хотите включить вес, вы можете использовать функцию умножения, чтобы применить веса к каждому столбцу в кадре данных:

df.iloc[:,:-1].multiply(df.iloc[:,-1], axis="index").mean()
Out[]: 
a   -5.229274
b    3.356656
c   -3.182449
d    5.438353
e   -4.000169
dtype: float64

В случае, если я неправильно понял вашу проблему, пожалуйста, уточните подробнее

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