Форма переданных значений не совпадает - PullRequest
0 голосов
/ 04 апреля 2019

Заголовок кадра данных

strike,timestamp,optionType,IV,OptPrice,volume,spot,riskFree,divYield,mdate,ttm,volatility
11500.0,2019-04-03 09:21:23.035218,call,14.4,372.05,103.0,11713.2,0.0625,0.0112,2019-04-25 00:00:00.000000,0.05916,0.201913
11500.0,2019-04-03 09:21:23.035218,put,16.49,68.1,1173.0,11713.2,0.0625,0.0112,2019-04-25 00:00:00.000000,0.05916,0.144977
11500.0,2019-04-03 09:21:28.035640,call,14.4,372.05,103.0,11713.2,0.0625,0.0112,2019-04-25 00:00:00.000000,0.05916,0.201913
11500.0,2019-04-03 09:21:28.035640,put,16.49,68.1,1173.0,11713.2,0.0625,0.0112,2019-04-25 00:00:00.000000,0.05916,0.144977
11500.0,2019-04-03 09:21:33.036651,call,14.4,372.05,103.0,11713.2,0.0625,0.0112,2019-04-25 00:00:00.000000,0.05916,0.201914

Может быть считан в кадр данных путем вставки копии с кодом

import pandas as pd
df = pd.read_clipboard(sep=',')
def greeks(optionType, spot, strike, riskFree, ttm, vol, divYield=0):
        <do something>
        return [speed, zomma, color, ultima]

af = df.apply(lambda row: greeks(row["optionType"], row["spot"], row["strike"], row["riskFree"], row["ttm"], row["volatility"], row["divYield"]), axis=1)

Дает мне эту ошибку:

Shape of passed values is (5, 4), indices imply (5, 12)

Я пытался следовать этому SO ответу и второму комментарию к этому , но это не работает.

df['speed'], df['zomma'], df['color'], df['ultima'] = zip(*df.apply(lambda row: greeks(row["optionType"], row["spot"], row["strike"], row["riskFree"], row["ttm"], row["volatility"], row["divYield"]), axis=1))

Снова я получаю сообщение об ошибке, как и раньше.

Если я передаю подмножество df, имеющее точно такое же количество столбцов, что и количество аргументов функции greeks, который рассчитывает греки, код работает.

Как код ниже:

xf = df.iloc[:,[0,2,6,7,8,10,11]]
ef = xf.apply(lambda row: greeks(row["optionType"], row["spot"], row["strike"], row["riskFree"], row["ttm"], row["volatility"], row["divYield"]), axis=1)
ef = pd.DataFrame(item for item in ef)
xf = pd.concat([sf, cf], axis='columns')

Но это хлопот.Можем ли мы сделать так, чтобы функция могла быть применена к исходному кадру данных без поднабора, а затем снова присоединена к исходному кадру данных

...