интеграция trapz по индексу фрейма данных после группировки - PullRequest
4 голосов
/ 21 марта 2019

У меня есть некоторые данные, и я хочу сначала по некоторому интервалу сгруппировать столбец Target, а затем интегрировать целевой столбец по интервалу индекса.

import numpy as np
import pandas as pd
from scipy import integrate


df = pd.DataFrame({'A': np.array([100, 105.4, 108.3, 111.1, 113, 114.7, 120, 125, 129, 130, 131, 133,135,140, 141, 142]),
                   'B': np.array([11, 11.8, 12.3, 12.8, 13.1,13.6, 13.9, 14.4, 15, 15.1, 15.2, 15.3, 15.5, 16, 16.5, 17]),
                   'C': np.array([55, 56.3, 57, 58, 59.5, 60.4, 61, 61.5, 62, 62.1, 62.2, 62.3, 62.5, 63, 63.5, 64]),
                   'Target': np.array([4000, 4200.34, 4700, 5300, 5800, 6400, 6800, 7200, 7500, 7510, 7530, 7540, 7590,
                                      8000, 8200, 8300])})

df['y'] = df.groupby(pd.cut(df.iloc[:, 3], np.arange(0, max(df.iloc[:, 3]) + 100, 100))).sum().apply(lambda g: integrate.trapz(g.Target, x = g.index))

Выше код дает мне:

AttributeError: ("'Series' object has no attribute 'Target'", 'occurred at index A')

Если я попробую это:

colNames = ['A', 'B', 'C', 'Target']
df['z'] = df.groupby(pd.cut(df.iloc[:, 3], np.arange(0, max(df.iloc[:, 3]) + 100, 100))).sum().apply(lambda g: integrate.trapz(g[colNames[3]], x = g.index))

Я получаю:

TypeError: 'str' object cannot be interpreted as an integer

During handling of the above exception, another exception occurred:

....
KeyError: ('Target', 'occurred at index A')

1 Ответ

1 голос
/ 30 марта 2019

У вас есть несколько проблем в вашем коде:

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

  • с apply, вы применяете integrate.trapz к каждой строке.Это бессмысленно.По этой причине я спросил в своем комментарии, нужно ли в каждой строке интеграл от 0 до целевого значения в такой строке.

Если вы хотите преобразовать ваши данные с интервалами в 100 встолбец «Цель» от 0, как вы сделали, сначала вы можете получить сумму по интервалам «Цель» от 0 до 100

>>>i_df = df.groupby(pd.cut(df.iloc[:, 3], np.arange(0, max(df.iloc[:, 3]) + 100, 100))).sum()

Затем вы получите трапецеидальный интеграл от столбца «Цель» с интерваламииз 100

>>>integrate.trapz(i_df['Target'], dx=100)
10242034.0

Вы не можете использовать x = i_df.index, потому что вычитание операции (внутренняя в trapz) не определено для интервалов, и вы создали индекс интервалов.Если вам нужно использовать индекс данных, вы должны сбросить его.

>>>i_df = df.groupby(pd.cut(df.iloc[:, 3], np.arange(0, max(df.iloc[:, 3]) + 100, 100))).sum().reset_index(drop=True)
>>>integrate.trapz(i_df['Target'], x=100*i_df.index)
10242034.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...