<p>矢量化!!!!!!!!(嗯。。。大部分情况下)</p>
<p>想法是,使用<strong>“merge”(self-join)</strong>,就像“DataFrame.<strong>lookup</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>利润损失.py\<strong>预先计算TM1、MonthStart、QuarterStart、yearlstart,因为无论如何都要调用它。在</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>合并(即自连接),而不是DataFrame。<strong>应用</strong>或DataFrame。<strong>查找</strong>:</p>
^{pr2}$
<p>实际上,我不确定merge/self-join是否比显式循环更高效。另外,我还不知道该怎么做,尽管<strong>夏普比率</strong>和<strong>MaxDrawdown</strong>!!熊猫的窗口功能似乎没有帮助。。。在</p>
<p>人?!谢谢!!在</p>