<p>矢量化!!!!!!!!(嗯……大部分情况下)</p>
<p>想法是,使用“合并”(自连接)</strong>作为“DataFrame.<strong>查找”</strong>,它适用于完全不同的应用程序,例如:<a href="https://stackoverflow.com/questions/52583677/pandas-dataframe-lookup/52583747?noredirect=1#comment92102660_52583747">Pandas DataFrame.lookup</a></p>
<p>从原始修复扩展</p>
<p><strong>步骤1)</strong>ProfitLoss.py\<strong>用于预测TM1、月开始、季度开始、年开始,因为无论如何都要调用它</p>
<pre><code>import datetime
import time
import math
from Util import ObjectUtil
from Util import DateTimeUtil
import pandas as pd
import numpy as np
from Util import ObjectUtil
class ProfitLoss(object):
def set(self, field, val):
setattr(self, field, val)
def to_dict(self):
result = ObjectUtil.objectPropertiesToDictionary(self)
result["TM1"] = self.COB - datetime.timedelta(days=1)
result["MonthStart"] = self.COB.replace(day=1)
result["QuarterStart"] = DateTimeUtil.getQuarterStart(self.COB, self.COB.year)
result["YearStart"] = datetime.datetime(self.COB.year, 1, 1)
return result
@staticmethod
def from_dict(dict):
if dict is None:
return None
profitLosses = []
for k, v in dict.items():
numPnl = len(v)
for i in range(0, numPnl):
pnl = ProfitLoss()
profitLosses.append(pnl)
break
for k, v in dict.items():
if k == "from_dict":
break
i = 0
for val in v.values():
if isinstance(val, pd.Timestamp):
val = datetime.datetime(val.year, val.month, val.day)
val = None if val == np.nan else val
if isinstance(val, float) and math.isnan(val):
val = None
profitLosses[i].set(k, val)
i+=1
return profitLosses
</code></pre>
<p><strong>步骤2)</strong>合并(即自连接),而不是数据帧。<strong>应用</strong>或数据帧。<strong>查找</strong>:</p>
<pre><code> pdPnl = pd.DataFrame.from_records([pnl.to_dict() for pnl in profitLosses])
pdPnl = pdPnl.merge(pdPnl, how='inner', left_on=["TM1"], right_on=["COB"], suffixes = ('','_tm1'))
pdPnl = pdPnl.merge(pdPnl, how='inner', left_on=["MonthStart"], right_on=["COB"], suffixes = ('','_MonthStart'))
pdPnl = pdPnl.merge(pdPnl, how='inner', left_on=["QuarterStart"], right_on=["COB"], suffixes = ('','_QuaterStart'))
pdPnl = pdPnl.merge(pdPnl, how='inner', left_on=["YearStart"], right_on=["COB"], suffixes = ('','_YearStart'))
# Vectorized
pdPnl["DTDRealizedPnl"] = pdPnl["InceptionRealizedPnl"] - pdPnl["InceptionRealizedPnl_tm1"]
pdPnl["DTDUnrealizedPnl"] = pdPnl["InceptionUnrealizedPnl"] - pdPnl["InceptionUnrealizedPnl_tm1"]
pdPnl["MTDRealizedPnl"] = pdPnl["InceptionRealizedPnl"] - pdPnl["InceptionRealizedPnl_MonthStart"]
pdPnl["MTDUnrealizedPnl"] = pdPnl["InceptionUnrealizedPnl"] - pdPnl["InceptionUnrealizedPnl_MonthStart"]
pdPnl["YTDRealizedPnl"] = pdPnl["InceptionRealizedPnl"] - pdPnl["InceptionRealizedPnl_YearStart"]
pdPnl["YTDUnrealizedPnl"] = pdPnl["InceptionUnrealizedPnl"] - pdPnl["InceptionUnrealizedPnl_YearStart"]
# Not yet vectorized
pdPnl["SharpeRatio"] = pdPnl.apply(lambda rw : PnlCalculatorBase.computeSharpeRatio(pdPnl, rw["COB"]), axis=1)
pdPnl["MaxDrawDown"] = pdPnl.apply(lambda rw : PnlCalculatorBase.computeMaxDrawDown(pdPnl, rw["COB"]), axis=1)
pnlDict = pdPnl.to_dict()
updatedProfitLosses = ProfitLoss.ProfitLoss.from_dict(pnlDict)
</code></pre>
<p>实际上,我不确定合并/自连接是否比显式循环更有效。而且,我还没有弄清楚该怎么做<strong>Sharpe Ratio</strong>和<strong>MaxDrawdown</strong>!!熊猫的窗口功能似乎没有帮助</p>
<p>人?!谢谢</p>