Аргументы функции в Pandas pivot_table - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть данные о направлении и скорости ветра во фрейме данных Pandas, в 10-минутных срезах. Это выглядит так:

      year  month  day  hour  minutes  direction  speed        filename
0   1999.0      1    1     0        0       84.0    7.1  mlrf1c1999.txt
1   1999.0      1    1     0       10       75.0    7.5  mlrf1c1999.txt
2   1999.0      1    1     0       20       79.0    7.2  mlrf1c1999.txt
3   1999.0      1    1     0       30       77.0    7.2  mlrf1c1999.txt
4   1999.0      1    1     0       40       76.0    6.7  mlrf1c1999.txt
5   1999.0      1    1     0       50       76.0    7.5  mlrf1c1999.txt
6   1999.0      1    1     1        0       81.0    6.9  mlrf1c1999.txt
7   1999.0      1    1     1       10       75.0    7.3  mlrf1c1999.txt
8   1999.0      1    1     1       20       77.0    7.4  mlrf1c1999.txt
9   1999.0      1    1     1       30       73.0    6.9  mlrf1c1999.txt
10  1999.0      1    1     1       40       78.0    6.5  mlrf1c1999.txt
11  1999.0      1    1     1       50       75.0    7.3  mlrf1c1999.txt
...
1147812  1997.0     12   31    21        0      261.0    6.0  mlrf1c1997.txt
1147813  1997.0     12   31    21       10      260.0    5.9  mlrf1c1997.txt
1147814  1997.0     12   31    21       20      262.0    5.5  mlrf1c1997.txt
1147815  1997.0     12   31    21       30      279.0    6.5  mlrf1c1997.txt
1147816  1997.0     12   31    21       40      283.0    7.3  mlrf1c1997.txt
1147817  1997.0     12   31    21       50      282.0    7.2  mlrf1c1997.txt
1147818  1997.0     12   31    22        0      277.0    6.9  mlrf1c1997.txt
1147819  1997.0     12   31    22       10      283.0    7.6  mlrf1c1997.txt
1147820  1997.0     12   31    22       20      283.0    7.2  mlrf1c1997.txt
1147821  1997.0     12   31    22       30      290.0    7.5  mlrf1c1997.txt
1147822  1997.0     12   31    22       40      289.0    7.2  mlrf1c1997.txt
1147823  1997.0     12   31    22       50      292.0    7.6  mlrf1c1997.txt
1147824  1997.0     12   31    23        0      296.0    7.7  mlrf1c1997.txt

Я пытаюсь изучить данные с помощью сводной таблицы, чтобы получить среднее направление и скорость в часовых срезах. Мне нужно применить округлую функцию Сципи к данным о направлении. Это требует указания высоких и низких аргументов для набора данных. Когда я пытаюсь это сделать, я получаю TypeError: объект 'numpy.float64' не вызывается.

df.pivot_table(values = ['direction'], index = ['day', 'hour'], aggfunc = circmean(df.direction, high=df.direction.max(), low=df.direction.min()))

df.pivot_table(values = ['direction'], index = ['day', 'hour'], aggfunc = circmean(df.direction, high=360, low=0))

Как я понимаю, для получения точных выводов Cirmean требует аргументов высокого и низкого аргументов. Когда я пытаюсь получить среднее значение показаний скорости ветра, используя np.mean, у меня нет трудностей:

df.pivot_table(values = ['speed'], index = ['day', 'hour'], aggfunc = np.mean)

Что дает:

             speed
day hour          
1   0     6.085055
    1     6.144919
    2     6.253006
    3     6.315291
    4     6.305656
    5     6.241176
    6     6.205701

Я также могу применить функцию Cirmean без параметров, например:

df.pivot_table(values = ['direction'], index = ['day', 'hour'], aggfunc = circmean)

Когда я делаю это, я получаю результаты, которые не могу интерпретировать (то есть они не находятся на 360 градусов):

          direction
day hour           
1   0      2.992024
    1      3.414254
    2      1.620715
    3      0.463309
    4      6.206874
    5      1.451950
    6      4.319550

Есть ли способ применить функцию и аргументы в параметре aggfunc pivot_table? Если нет, есть ли у кого-нибудь предложение о том, как мне получить циклические средства, которые мне нужны, из фрейма данных?

1 Ответ

0 голосов
/ 07 сентября 2018

Вот код, повторяющий ваш вопрос:

import io
import pandas as pd
from scipy.stats import circmean

doc = """      year  month  day  hour  minutes  direction  speed        filename
0   1999.0      1    1     0        0       84.0    7.1  mlrf1c1999.txt
1   1999.0      1    1     0       10       75.0    7.5  mlrf1c1999.txt
2   1999.0      1    1     0       20       79.0    7.2  mlrf1c1999.txt
3   1999.0      1    1     0       30       77.0    7.2  mlrf1c1999.txt
4   1999.0      1    1     0       40       76.0    6.7  mlrf1c1999.txt
5   1999.0      1    1     0       50       76.0    7.5  mlrf1c1999.txt
6   1999.0      1    1     1        0       81.0    6.9  mlrf1c1999.txt
7   1999.0      1    1     1       10       75.0    7.3  mlrf1c1999.txt
8   1999.0      1    1     1       20       77.0    7.4  mlrf1c1999.txt
9   1999.0      1    1     1       30       73.0    6.9  mlrf1c1999.txt
10  1999.0      1    1     1       40       78.0    6.5  mlrf1c1999.txt
11  1999.0      1    1     1       50       75.0    7.3  mlrf1c1999.txt
1147812  1997.0     12   31    21        0      261.0    6.0  mlrf1c1997.txt
1147813  1997.0     12   31    21       10      260.0    5.9  mlrf1c1997.txt
1147814  1997.0     12   31    21       20      262.0    5.5  mlrf1c1997.txt
1147815  1997.0     12   31    21       30      279.0    6.5  mlrf1c1997.txt
1147816  1997.0     12   31    21       40      283.0    7.3  mlrf1c1997.txt
1147817  1997.0     12   31    21       50      282.0    7.2  mlrf1c1997.txt
1147818  1997.0     12   31    22        0      277.0    6.9  mlrf1c1997.txt
1147819  1997.0     12   31    22       10      283.0    7.6  mlrf1c1997.txt
1147820  1997.0     12   31    22       20      283.0    7.2  mlrf1c1997.txt
1147821  1997.0     12   31    22       30      290.0    7.5  mlrf1c1997.txt
1147822  1997.0     12   31    22       40      289.0    7.2  mlrf1c1997.txt
1147823  1997.0     12   31    22       50      292.0    7.6  mlrf1c1997.txt
1147824  1997.0     12   31    23        0      296.0    7.7  mlrf1c1997.txt"""    

df = pd.read_csv(io.StringIO(doc), sep='\s+')

Сердитое примечание: в лучшем вопросе ожидается приведенный выше код, потребовалось немного нежелательных упражнений и времени, чтобы воспроизвести его в ответе. Подробнее см. https://stackoverflow.com/help/mcve.

# Now you need a function accepting an arguement for `aggfunc`

def avg(x):
    # x will be a pd.Series, equalling df.direction
    return circmean(x, high=x.max(), low=x.min())

# just to learn how it works with 'mean'
df2 = df.pivot_table(values='direction', index=['day', 'hour'], aggfunc = 'mean')

# now putting the desired function
df3 = df.pivot_table(values='direction', index=['day', 'hour'], aggfunc = avg)

Есть предупреждение, но я надеюсь, что вы знаете, как справиться с этим (возможно, вы хотите преобразовать градусы в радианах внутри avg):

RuntimeWarning: недопустимое значение, встречающееся в true_divide ang = (выборка - низкая) * 2 * пи / (высокая - низкая)

Надеюсь, это поможет.

...