参考this thread我试图将函数应用于返回多个值的时间序列。它建议使用pd.Series对象进行解决。
import pandas as pd
import numpy as np
def some_function(data):
mu, std = norm.fit(data)
a = mu * 3
b = std * 5
return a, b
rng = pd.date_range('1/1/2011', periods=72, freq='H')
ts = pd.Series(np.random.randn(len(rng)), index=rng)
r = ts.resample('2h')
r[['a', 'b']] = r.agg(lambda x: pd.Series(some_function(x)))
但是,我想将此应用于重新采样数据,同时收到以下错误。我知道这是什么问题,但无法弄清楚如何实现我的目标。
ValueError: cannot set items on DatetimeIndexResampler
我想要的输出如下:
a b
2011-01-01 00:00:00 mu1 std1
2011-01-01 02:00:00 mu2 std2
干杯!
答案 0 :(得分:0)
def some_function(data):
mu, std = norm.fit(data)
a = mu * 3
b = std * 5
return a, b
rng = pd.date_range('1/1/2011', periods=72, freq='H')
ts = pd.Series(np.random.randn(len(rng)), index=rng)
ts.groupby(pd.TimeGrouper('2H')).apply(some_function).apply(pd.Series).rename(columns={0:'a',1:'b'})
Out[964]:
a b
2011-01-01 00:00:00 2.421663 5.230464
2011-01-01 02:00:00 -0.757646 0.966690
2011-01-01 04:00:00 1.642813 1.282784
答案 1 :(得分:0)
干杯,你让我走上了正确的道路,因为这似乎有效。但也许有更好的解决方案?
import pandas as pd
import numpy as np
from scipy.stats import norm
def some_function(data):
mu, std = norm.fit(data)
a = mu * 3
b = std * 5
return a, b
rng = pd.date_range('1/1/2011', periods=72, freq='H')
ts = pd.Series(np.random.randn(len(rng)), index=rng)
s = ts.groupby(pd.TimeGrouper('2H')).apply(some_function)
df = pd.DataFrame(s.tolist(), columns=['a', 'b'], index=s.index)