我想要实现的是: 我有几个时间序列,我需要在每个点基础上组合并将结果作为单个新时间序列返回。
我知道您可以在numpy
中使用系列中的各种pandas
函数,但我不清楚如何将复杂函数应用于多个时间序列。
我想申请的功能:
def direction_day(y_values):
# taking a numpy array of floats
sig_sum = np.sum(np.sign(y_values))
abs_sum = np.sum(np.abs(np.sign(y_values)))
return (sig_sum / abs_sum)
我当前TimeSeries
个对象的示例:
def ret_random_ts():
dates = ['2016-1-{}'.format(i)for i in range(1,21)]
values = [np.random.randn(4,3) for i in range(20)]
return pd.Series(values, index=dates)
当然,我总是可以使用TimeSeries
循环遍历for
并将它们粘合在一起。
但是,我想知道是否有选项将函数传递给每个日期包含多个值的TimeSeries
对象,并为每个日期应用该函数?
即:
ts = ret_random_ts()
ts.apply_func(direction_day,Series['Dates'])
答案 0 :(得分:3)
您可以使用map
:
ts.map(direction_day)
2016-1-1 0.166667
2016-1-2 0.000000
2016-1-3 0.166667
2016-1-4 0.666667
2016-1-5 0.000000
2016-1-6 -0.166667
或apply
(产生相同的结果)
ts.apply(direction_day)
或apply
与lambda(产生相同的结果)
ts.apply(lambda y: direction_day(y))
每个方法都将应用元素(对于Series
的值),因为Series
只有一列。 DataFrame
方法有元素工作或行/列(有关详细信息,请参阅此question)。在您的情况下,Series
的值是数组的数组,因此整个数组将传递给函数。如果您想要更多控制,我建议使用DataFrame
而不是包含数组的Series
,这不是在pandas中工作的首选方式。但是你的数据有两个以上的维度(3),pandas还提供了另一个名为Panel的数据结构,但我从未使用Panel
,所以我无法帮助你。
例如,这种数组将传递给您的direction_day
函数:
[[ 1.76405235, 0.40015721, 0.97873798],
[ 2.2408932 , 1.86755799, -0.97727788],
[ 0.95008842, -0.15135721, -0.10321885],
[ 0.4105985 , 0.14404357, 1.45427351]]
答案 1 :(得分:1)
ts.apply(direction_day)
2016-1-1 -0.333333
2016-1-2 -0.500000
2016-1-3 -0.333333
2016-1-4 0.000000
2016-1-5 0.166667
2016-1-6 0.666667
2016-1-7 0.166667
2016-1-8 0.166667
2016-1-9 0.333333
2016-1-10 0.000000
2016-1-11 -0.333333
2016-1-12 0.166667
2016-1-13 -0.500000
2016-1-14 0.166667
2016-1-15 0.000000
2016-1-16 -0.333333
2016-1-17 -0.166667
2016-1-18 -0.166667
2016-1-19 -0.166667
2016-1-20 0.000000
dtype: float64