Функция pd.Grouper - ошибка одного из многих df - PullRequest
0 голосов
/ 06 июня 2018

Я пытаюсь перебрать несколько отдельных df с pd.Grouper в качестве ответа здесь.

Теперь, это работает для 7 из моих 8 dfи занимает всего несколько секунд.Однако один из них - даже самый большой не попадает в ловушку и не зависает, и в конечном итоге умирает из-за ошибки памяти, и я понятия не имею, почему, поскольку значения df почти идентичны.

Блок кода проблемы приведен ниже:

g = df.groupby(pd.Grouper(freq="5s"))
df2 = pd.DataFrame(
    dict(
    open = g["price"].first(),
    close = g["price"].last(),
    high = g["price"].max(),
    low = g["price"].min(),
    volume = g["volume"].sum(),
    buy_volume = g["buy_volume"].sum(),
    sell_volume = -g["sell_volume"].sum(),
    num_trades = g["size"].count(),
    num_buy_trades = g["buy_trade"].sum(),
    num_sell_trades = g["sell_trade"].sum(),
    pct_buy_trades  = g["buy_trade"].mean() * 100,
    pct_sell_trades = g["sell_trade"].mean() * 100,
    )
)

Пример файла df в следующем формате:

<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 3589964 entries, 1970-01-01 00:00:01.528000 to 2018-06-03 05:54:02.690000
Data columns (total 8 columns):
price          float64
size           float64
buy_sell       bool
volume         float64
buy_volume     float64
sell_volume    float64
buy_trade      bool
sell_trade     bool
dtypes: bool(3), float64(5)
memory usage: 254.6 MB

с записями по 3,5 мили, как показано ниже:

     price    size     buy_sell    volume   buy_volume  sell_volume buy_trade   sell_trade
T
2018-05-18 12:05:11.407 8097.02 0.007823    False   0.007823    0.007823    0.000000    True    False
2018-05-18 12:05:11.720 8097.02 0.129632    False   0.129632    0.129632    0.000000    True    False
2018-05-18 12:05:12.402 8097.02 0.037028    False   0.037028    0.037028    0.000000    True    False
2018-05-18 12:05:12.786 8097.03 0.307939    False   0.307939    0.307939    0.000000    True    False
2018-05-18 12:05:12.786 8097.02 0.025517    False   0.025517    0.025517    0.000000    True    False
2018-05-18 12:05:12.788 8097.03 0.014835    False   0.014835    0.014835    0.000000    True    False
2018-05-18 12:05:14.226 8097.03 0.006198    False   0.006198    0.006198    0.000000    True    False
2018-05-18 12:05:14.341 8092.00 -0.010989   True    0.010989    0.000000    -0.010989   False   True
2018-05-18 12:05:15.307 8092.00 -0.000011   True    0.000011    0.000000    -0.000011   False   True
2018-05-18 12:05:15.307 8091.99 -0.019989   True    0.019989    0.000000    -0.019989   False   True
2018-05-18 12:05:15.387 8091.99 -0.007340   True    0.007340    0.000000    -0.007340   False   True
2018-05-18 12:05:15.603 8091.99 -0.002440   True    0.002440    0.000000    -0.002440   False   True
2018-05-18 12:05:15.679 8090.01 -0.098909   True    0.098909    0.000000    -0.098909   False   True

Это еще один df, который работает полностьюнормально и завершается через несколько секунд:

<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 1952985 entries, 2018-05-18 12:05:11.791000 to 2018-06-03 05:53:57
Data columns (total 8 columns):
price          float64
side           object
size           int64
volume         int64
buy_volume     float64
sell_volume    float64
buy_trade      bool
sell_trade     bool
dtypes: bool(2), float64(3), int64(2), object(1)
memory usage: 188.0+ MB

    price   side    size    volume  buy_volume  sell_volume buy_trade   sell_trade
timestamp                               
2018-05-18 12:05:11.791 8112.0  Sell    -4085   4085    0.0 -4085.0 False   True
2018-05-18 12:05:11.811 8111.5  Sell    -598    598 0.0 -598.0  False   True
2018-05-18 12:05:11.849 8111.5  Sell    -3000   3000    0.0 -3000.0 False   True
2018-05-18 12:05:11.876 8111.5  Sell    -1300   1300    0.0 -1300.0 False   True
2018-05-18 12:05:11.949 8111.5  Sell    -3408   3408    0.0 -3408.0 False   True
2018-05-18 12:05:12.476 8111.5  Sell    -50000  50000   0.0 -50000.0    False   True
2018-05-18 12:05:12.523 8111.5  Sell    -2500   2500    0.0 -2500.0 False   True
2018-05-18 12:05:12.698 8111.5  Sell    -8000   8000    0.0 -8000.0 False   True
2018-05-18 12:05:12.722 8111.5  Sell    -8000   8000    0.0 -8000.0 False   True
2018-05-18 12:05:12.809 8111.5  Sell    -815    815 0.0 -815.0  False   True
  • Я не знаю, почему это происходит .. как мне вообще начать отлаживать его?

IЯ ждал, чтобы скопировать сообщение об ошибке, но оно застряло на 50 минут.

Спасибо за любую помощь, это не помогло мне!

1 Ответ

0 голосов
/ 06 июня 2018

Моя первая идея - сортировка index по sort_index.

Если проблема с производительностью не устранена, должна возникнуть проблема с символами данных в DataetimeIndex - groupby. Создайте многоsmall 5s groups.

EDIT:

После двойная проверка DatetimIndex:

DatetimeIndex: 3589964 entries, 1970-01-01 00:00:01.528000 to 2018-06-03 05:54:02.690000

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

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