【发布时间】:2014-09-14 14:05:00
【问题描述】:
我有实现所需计算结果的工作代码,但我目前正在使用一种迭代 pandas 数组的算法。这显然比纯 pandas DataFrame 计算要慢。想要一些关于如何使用 pandas 函数来加快计算速度的建议
生成虚拟数据的代码
df = pd.DataFrame(index=pd.date_range(start='2014-01-01', periods=365))
df['Month'] = df.index.month
df['MTD'] = (df.index.day+0.001)/10000
这基本上是一个带有 MTD 数据的 pandas DataFrame,具有一定的价值。这纯粹是为了让我们有一些数据可以使用。
需要计算
我需要的是一个新的 DataFrame,它将开始(投资)日期作为列 - 用一些月初值填充它们。索引是所有可能的日期,值应该是 YTD 数字。我正在使用此 Dataframe 作为投资日期的查找/缓存
伪代码
YTD = (1+最后一个 MTD 数字) * ((1+最后一个 MTD 数字)... 直到所需日期的所有月份
工作功能
def calculate_YTD(df): # slow takes 3.5s on my machine!!!!!!
YTD_df = pd.DataFrame(index=df.index)
for investment_date in [datetime.datetime(2014,x+1,1) for x in range(12)]:
YTD_df[investment_date] =1.0 # pre-populate with dummy floats
for date in df.index: # iterate over all dates in period
h = (df[investment_date:date].groupby('Month')['MTD'].max().fillna(0) + 1).product() -1
YTD_df[investment_date][date] = h
return YTD_df
我已硬编码投资日期列表以简化问题陈述。在我的机器上,这段代码需要 2.5 到 3.5 秒。关于如何加快速度的任何建议?
【问题讨论】: