Вставка NaN в df из groupby - пользовательский пример - PullRequest
0 голосов
/ 09 января 2020

У меня есть DataFrame df, который имеет несколько столбцов, quoteDatetime, underlyingSymbol, expiration, strike, optionType, iv. quoteDatetime - строка, представляющая date, лежащий в основеSymbol - string, срок действия - string, представляющий date, страйк - double, optionType - string может содержать два значения: "C "или" P ", а iv представляет собой double.

Я сделал df.groupby

strikesByCP = df.groupby('optionType').strike.agg(list)

, который возвращает удары для ["C" и удары для "P"]. Выглядит примерно так:

gb = 
C    [2640, 2635, 2630, 2625, 2620, 2615,...]
P    [2460, 2455, 2450, 2445, 2440, 2435,...]

Мне нужно вставить строку в df, если соответствующий удар находится в groupby, но не в df при данном истечении , где строка содержит те же значения, что и другие столбцы, и NaN для столбца iv, кроме удара в этой строке, полученного от groupby.

Так что если df выглядит например:

quoteDatetime, underlyingSymbol, expiration, strike, optionType, iv
=================================================================
[2019-01-03T11:00:00, SPX, 2019-01-18T00:00:00, 2635, C, .216458]
[2019-01-03T11:00:00, SPX, 2019-01-18T00:00:00, 2625, C, .2108  ]
[...                                                            ]
[2019-01-03T11:00:00, SPX, 2019-02-19T00:00:00, 2420, P, .1908  ]
[2019-01-03T11:00:00, SPX, 2019-02-19T00:00:00, 2435, P, .1808  ]

И, скажем, "C" содержат 2630 (или любой другой удар, не относящийся к этой группе с истечением в df), а "P" содержат 2425, 2430 новые строки будут вставляться в df для каждого отсутствующего удара, например, после того, как df будет выглядеть так:

[2019-01-03T11:00:00, SPX, 2019-01-18T00:00:00, 2635, C, .216458]
[2019-01-03T11:00:00, SPX, 2019-01-18T00:00:00, 2630, C, NaN    ]
[2019-01-03T11:00:00, SPX, 2019-01-18T00:00:00, 2625, C, .2108  ]
[...                                                            ]
[2019-01-03T11:00:00, SPX, 2019-02-19T00:00:00, 2420, P, .1908  ]
[2019-01-03T11:00:00, SPX, 2019-02-19T00:00:00, 2425, P, NaN    ]
[2019-01-03T11:00:00, SPX, 2019-02-19T00:00:00, 2430, P, NaN    ]
[2019-01-03T11:00:00, SPX, 2019-02-19T00:00:00, 2435, P, .1808  ]
[...                                                            ]

Идея состоит в том, чтобы получить каждый раздел expiry / optionType df иметь запись для каждого удара в качестве другого раздела expiry / optionType, чтобы затем иметь возможность интерполировать NaN.

Я могу сделать это с большим количеством циклов, но кажется, что либо pandas уже есть что-то, что делает это. Например, если series ежемесячно, автоматически вставляются дни и вставляется NaN в соответствующие места.

upsampled = series.resample('D') 

В качестве альтернативы также приветствуется функциональный стиль для решения этой проблемы.

Было бы замечательно, если бы я мог сказать,

df.Upsample('expiry', 'strike', gb)

или какую-то грамматику что, и при каждом истечении срока действия, если страйк не существует в df [expiry], который находится в gb, новая строка с идентичными значениями из других столбцов в строке в этой группе срока действия будет вставлена ​​с удар от gb, а iv = NaN.

...