2016-11-28 2 views
1

Я новичок в python, и я пытаюсь найти std круговых данных (направления ветра), группируя данные по некоторым характеристикам. Вот набор df, который я использую.groupby apply не дает ожидаемого результата

Profile bin  inflow_direction 
0 1  51  331.7 
1 1  51  332.8 
2 1  51  334.1 
3 1  51  335.4 
4 1  51  336.4 
5 1  66  337.3 
6 1  66  337.5 
7 1  66  337.6 
8 1  66  337.7 
9 1  66  337.6 

Мне нужен std для каждой группы ящиков внутри каждого профиля. Я определил функцию зЬй как:

def circstd(j) : samples = np.radians (j) return scipy.stats.circstd(samples, high=6.283185307179586, low=0, axis=None)

когда я группа:

df.groupby(['Profile','bin']).apply(circstd) 

Выездное является:

idscng_f bin 
1   51  0.567811 

      66  0.671470 

Но я ожидал

idscng_f bin 
1   51  0.0296 

      66  0.0025 

В чем проблема?

+0

попытка указать столбец, на котором действие должно быть выполнено? + Преобразование в радианы на одном и том же этапе усложняет ситуацию. Разделите эти две вещи, заставьте их работать, понять их, а затем объединить их вместе, если вы хотите –

+0

Как я могу указать - используя группу по - столбец, на котором должно выполняться действие? – ydopico

+0

см. Метод 1 по ответу @Nickil Maveli ниже. –

ответ

1

Использование np.std после преобразования углов из градусов в радианы:

def simple_circstd(j) : 
    return np.std(np.radians(j))['inflow_direction'] 

Выполните Groupby:

df.groupby(['Profile','bin']).apply(simple_circtd) 

В результате получается выход:

Profile bin 
1  51  0.029650 
     66  0.002367 
dtype: float64 
+0

Вы имеете в виду точность. Он теряет точность в основном после 3/4 десятичных цифр. –

+0

Результат для метода 1 дает мне другой результат. idscng_f бин -51 1.490116e-08 66 2.367480e-03 DTYPE: float64 Второй метод дает мне результат нужен, но мне интересно, если она будет работать для других углов, так как круговые данные. – ydopico

+0

О, причина, по которой я включил 'np.nonzero', состоял в том, что я получал нулевые значения для других элементов и всего лишь 1 конечное значение для предоставленных фиктивных данных. Это не так с реальным. Я удалю его, если он даст вам неправильные результаты. И да, второй подход будет работать, поскольку он в основном преобразует из града в рад и вычисляет 'std' в круговом массиве. –

1

Вы можете указать SeriesGroupBy объект для использования apply() ,

df.groupby(['Profile','bin'])["inflow_direction"].apply(circstd) будет выполнять работу.

выход:

Profile bin 
1  51  0.029650 
     66  0.002367 
Name: inflow_direction, dtype: float64 
+0

Ницца! Это тоже дает правильный результат. Никогда раньше не приходило в голову. –