Среднее геометрическое в DataFrame - PullRequest
1 голос
/ 05 июня 2019

Я пытаюсь получить геометрическое среднее в строках, DataFrame выглядит следующим образом:

               PLTRNSU00013 PLSRBEX00014 PLATTFI00018 PLALMTL00023 PLAMBRA00013   PLAMICA00010 PLAMPLI00019 NL0000474351 PLAPATR00018 PLAPLS000016
 2010-07-01          NaN          NaN          NaN          NaN          NaN          NaN          NaN          NaN          NaN          NaN  
 2010-10-01          NaN          NaN          NaN          NaN          NaN          NaN          NaN     0.968237          NaN          NaN 
 2011-01-01          NaN          NaN          NaN          NaN          NaN          NaN          NaN          NaN          NaN          NaN  
 2011-04-01          NaN          NaN          NaN          NaN          NaN          NaN          NaN          NaN          NaN          NaN  
 2011-07-01     0.979871          NaN          NaN          NaN          NaN          NaN          NaN      1.00999          NaN          NaN 
 2011-10-01          NaN          NaN          NaN          NaN          NaN       1.00737         NaN          NaN          NaN          NaN  
 2012-01-01          NaN          NaN          NaN          NaN          NaN          NaN          NaN          NaN      1.05766          NaN 
 2012-04-01          NaN          NaN          NaN          NaN          NaN          NaN          NaN          NaN     0.979955          NaN 
 2012-07-01          NaN          NaN          NaN          NaN          NaN          NaN          NaN          NaN      1.01718          NaN 
 2012-10-01          NaN     0.916302          NaN          NaN          NaN          NaN          NaN     0.979858          NaN          NaN 

Я не нашел никакого метода построения панд, поэтому я использовал gmean из scipy from scipy.stats.mstats import gmean, нопри вызове в строке:

In [285]:gmean(DataFrame.loc['2015-10-01'])
Traceback (most recent call last):

  File "<ipython-input-28-e9186c65a04d>", line 1, in <module>
    gmean(DataFrame.loc['2015-10-01'])

  File "D:\Python\lib\site-packages\scipy\stats\stats.py", line 305, in gmean
    log_a = np.log(np.array(a, dtype=dtype))

 AttributeError: 'float' object has no attribute 'log'

Я получаю исключение AttributeError Я пытался избавиться от Nan с помощью

In [287]: gmean(DataFrame.loc['2015-10-01'].dropna())
Traceback (most recent call last):

  File "<ipython-input-29-e8807696d6be>", line 1, in <module>
    gmean(DataFrame.loc['2015-10-01'].dropna())

  File "D:\Python\lib\site-packages\scipy\stats\stats.py", line 305, in gmean
    log_a = np.log(np.array(a, dtype=dtype))

AttributeError: 'numpy.float64' object has no attribute 'log'

Я могу сделать это вручную с помощью math pow метод, но конечно он очень неэффективен, работает только со скалярами.

Ответы [ 2 ]

1 голос
/ 05 июня 2019

Не уверен, почему Gmean не работает для вас. Вы уже проверили типы данных ваших столбцов? они, вероятно, не np.float32 или np.float64?

Решение, подобное предложенному Куангом Хоангом, могло бы работать, но я думаю, только если продукт не вызывает переполнения. Я представляю, что gmean берет журналы, суммирует результаты, строит среднее значение и возвращает e ^ (среднее).

Конечно, вы можете сделать это вручную, если хотите. Отбрасывание NA ранее (или использование индексатора, который просто игнорирует их).

Так было бы что-то вроде:

import numpy as np
values= your_df.loc[your_id]
indexer= ~values.isna()
avg_log=values[indexer].map(np.log).mean()
np.exp(avg_log)

Если вы используете этот метод, обязательно используйте как минимум np.float64 для журнала и средних операций.

1 голос
/ 05 июня 2019

Мы можем сделать это вручную с помощью numpy:

np.exp(np.log(df.prod(axis=1))/df.notna().sum(1))

Выход:

2010-07-01         NaN
2010-10-01    0.968237
2011-01-01         NaN
2011-04-01         NaN
2011-07-01    0.994817
2011-10-01    1.007370
2012-01-01    1.057660
2012-04-01    0.979955
2012-07-01    1.017180
2012-10-01    0.947547
dtype: float64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...