<p>这里是<code>filltemps</code>的替代品,它在我的机器上运行速度快10倍。它还使用<code>apply</code>,如请求:)</p>
<pre class="lang-py prettyprint-override"><code>def interpolate_temps(temp_data, other_data):
""" Interpolate temperature by place and location on a daily frequency.
Parameters
temp_data : pd.DataFrame
with columns:
date : datetime
place : categorical
temp : numerical
quantity : numerical
other_Data : pd.DataFrame
with columns:
date : datetime
place : categorical
Returns
-
pd.DataFrame
With date and place in the index and a temp column
"""
def weighted_average(df, col1, col2):
"""Average of col1 weighted by col2"""
return (df[col1] * df[col2]).sum() / df[col2].sum()
results = []
for place in temp_data.place.unique():
dates_needed = other_data[other_data.place == place].date.unique()
result = (temp_data[temp_data.place==place]
.groupby('date')
.apply(weighted_average, 'temp', 'quantity')
.reindex(dates_needed, method='ffill')
.to_frame('temp')
.assign(place=place)
.set_index('place', append=True)
)
results.append(result)
return pd.concat(results)
</code></pre>
<p>它遵循与您相同的基本结构:</p>
<ol>
<li><p>遍历每个地方。在</p>
<ol>
<li><p>取按日期划分的温度加权平均值。</p></li>
<li><p>用<code>ffill</code>填充缺少的值。</p></li>
<li><p>添加“放置”作为列。</p></li>
</ol></li>
<li><p>加入每个地方的结果</p></li>
</ol>
<p>时间上的主要进步是在运行<code>ffill</code>之前将时间缩短到某个特定地点所需的日期。这也会提高内存效率,因为我们没有生成这么多命名的中间对象。代码中出现这一问题的最大地方是<code>totmp = pd.concat([totmp, mp])</code>,在这里您创建了<code>len(place)</code>不同版本的<code>totmp</code>,而在{<cd8>}中,我们一直等到最后一次<code>pd.concat(results)</code>。在</p>
<p><code>interpolate_temps</code>的结果在索引中有<code>date</code>和{<cd12>},因此可以这样连接它:</p>
^{pr2}$
<p>或者像以前一样重置索引并合并。在</p>
<p>我唯一的建议是使用更详细的变量名。我从来没有真正弄明白其中的许多是什么意思,这使得理解代码变得更加困难。在</p>