我一直致力于一个使用时间序列进行计算的项目。
我希望获得数据的底层和Celing(类似于Excel的FLOOR和CEILING中的整个列
我检查了自定义numpy函数,但看不到包含显着性级别的任何内容
我定义了自定义函数
def ceil(x, s):
return s * math.ceil(float(x)/s)
def floor(x, s):
return s * math.floor(float(x)/s)
但是我无法在整个列上同时使用它们
因此我需要单独迭代每一行:
for i in symbols:
symbols[i]['PutStrike']=0
symbols[i]['CallStrike']=0
for counter in range(0,len(symbols[0])):
symbols[i]['PutStrike'][counter]=floor(symbols[i]['FUT'][counter],Strike_Diff[i])
symbols[i]['CallStrike'][counter]=ceil(symbols[i]['FUT'][counter],Strike_Diff[i])
return symbols
当然,这不是正确的方法,而且耗费时间
我想要的是这样的:
def CalculateIV(symbols):
for i in symbols:
symbols[i]['PutStrike']=0
symbols[i]['CallStrike']=0
symbols[i]['PutStrike']=floor(symbols[i]['FUT'],Strike_Diff[i])
symbols[i]['CallStrike']=ceil(symbols[i]['FUT'],Strike_Diff[i])
return symbols
然而,当我跑步时,我得到:
CalculateIV(abc)
Traceback (most recent call last):
File "<ipython-input-456-599f9aa19e37>", line 1, in <module>
CalculateIV(abc)
File "<ipython-input-452-190c395d86ed>", line 9, in CalculateIV
symbols[i]['PutStrike']=floor(symbols[i]['FUT'],Strike_Diff[i])
File "<ipython-input-260-8a88fc57ddf5>", line 2, in floor
return s * math.floor(float(x)/s)
File "C:\Users\jay\Anaconda2\lib\site-packages\pandas\core\series.py", line 93, in wrapper
"{0}".format(str(converter)))
TypeError: cannot convert the series to <type 'float'>
有人可以建议一种替代/更快的方法或任何可以减轻这种情况的库。
先谢谢
答案 0 :(得分:0)
这比我想象的要容易得多
我必须在numpy(np.vectorize)
中使用vectorize函数def ceil(x, s):
return s * math.ceil(float(x)/s)
def floor(x, s):
return s * math.floor(float(x)/s)
vfloor=np.vectorize(floor)
vceil=np.vectorize(ceil)
因此现在这些函数被矢量化了。
我可以立即使用它在几秒钟内处理多个数据帧。
def CalculateIV(symbols):
for i in symbols:
symbols[i]['PutStrike']=0
symbols[i]['CallStrike']=0
symbols[i]['PutStrike']=vfloor(symbols[i]['FUT'],Strike_Diff[i])
symbols[i]['CallStrike']=vceil(symbols[i]['FUT'],Strike_Diff[i])
return symbols
如果pqr中有多个数据帧。
我可以使用下面的方法收集楼层和ceil值
output=CalculateIV(pqr)