У меня есть 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.