对于数据集DF,我想添加从辅助数据集TEMP获取的温度。
临时工并没有所有的日期。缺少的日期需要以这样一种方式进行插值,即为缺失的值填充最新的可用值。例如,如果2019-2-20缺少温度,但2019-2-19可用,则将填充此值。这可以通过使用pd.DataFrame(x.asfreq('D')).ffill().reset_index(drop=False)
来完成。在
当每天有多个温度测量值时,应采用加权平均值。
在当前代码中,使用isin
预先选择日期以限制数据大小。在
代码可以工作,但如果数据变大,则不是最佳的,特别是如果需要填写1000个地点和日期的温度数据并将其合并到DF中。我正在寻找一个关于时间/内存的更好的解决方案,例如基于itertools、apply、generator expression或其他任何东西。在
下面我展示了一个虚拟的小的可复制的代码示例。在
模块:
import numpy as np
import pandas as pd
虚拟数据:
^{pr2}$代码:
if 'temp' in DF.columns:
del DF['temp']
else: print('No variable temp found in DF')
def filltemps(dat1, dat2):
"""dat1: TEMP
dat2: DF"""
global totmp
places = dat2['place'].unique()
mx=len(places)
totmp = pd.DataFrame(columns=['date', 'temp', 'place'])
for i in range(mx):
mp=[]
dd1=[]
nsp = pd.DataFrame(dat1[ (dat1['place']==places[i]) ])
nsp = nsp[['date', 'quantity', 'temp']]
prod = lambda w,z: w*z
nsp['sumn'] = prod(nsp['temp'], nsp['quantity'])
wavg = lambda y,x: y/x
c3 = wavg(nsp.groupby('date')['sumn'].agg('sum'), nsp.groupby('date')['quantity'].agg('sum'))
mp = pd.DataFrame(c3.asfreq('D')).ffill().reset_index(drop=False)
mp.columns = ['date', 'temp']
mp['place'] = np.array([places[i]] * len(mp))
mp['date'] = pd.to_datetime(mp['date'])
dd1 = dat2.loc[dat2['place']==places[i], ['date']]
mp = mp[ mp['date'].isin(list(pd.to_datetime(dd1['date']))) ]
totmp = pd.concat([totmp, mp])
return totmp
%timeit TEMP2 = filltemps(TEMP, DF)
计时显示每个环路116 ms±401µs(平均值±标准偏差,7次运行,每次10次循环)
在TEMP2中,可以看出,正如预期的那样,计算了C处的加权平均值:
TEMP2 = filltemps(TEMP, DF)
TEMP2将与原始DF合并。请注意,如果没有早期数据可用,则可能会缺少值。在
DF = pd.merge(DF, TEMP2, how='left', on=['date', 'place'])
DF,预期结果,应该是这样的:
非常感谢您的指点和帮助!在
这里是
filltemps
的替代品,它在我的机器上运行速度快10倍。它还使用apply
,如请求:)它遵循与您相同的基本结构:
遍历每个地方。在
取按日期划分的温度加权平均值。
用
ffill
填充缺少的值。添加“放置”作为列。
加入每个地方的结果
时间上的主要进步是在运行}中,我们一直等到最后一次
ffill
之前将时间缩短到某个特定地点所需的日期。这也会提高内存效率,因为我们没有生成这么多命名的中间对象。代码中出现这一问题的最大地方是totmp = pd.concat([totmp, mp])
,在这里您创建了len(place)
不同版本的totmp
,而在{pd.concat(results)
。在},因此可以这样连接它:
^{pr2}$interpolate_temps
的结果在索引中有date
和{或者像以前一样重置索引并合并。在
我唯一的建议是使用更详细的变量名。我从来没有真正弄明白其中的许多是什么意思,这使得理解代码变得更加困难。在
我的解决方案与ob Vaishali相似,但我想指出
asfreq
的一个陷阱。在让我们从头开始。我们计算加权平均数:
现在我们计算完整的日期范围:
^{pr2}$我们使用此数据范围重新编制温度索引:
与
as_freq
相反,我们现在还将处理温度时间序列比位置序列“短”的情况。在最后,我们可以把所有的东西放在一起:
如果我们通过更改最后日期来稍微修改输入:
Ruthger的解决方案提供了:
瓦西里:
乔格:
简要介绍:
计算加权平均温度。在TEMP中按位置填充缺少的日期,并将结果数据帧与DF合并。在
相关问题 更多 >
编程相关推荐