将复杂功能应用于多个时间序列

时间:2016-03-05 20:51:11

标签: python-3.x pandas dataframe

我想要实现的是: 我有几个时间序列,我需要在每个点基础上组合并将结果作为单个新时间序列返回。

我知道您可以在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'])

2 个答案:

答案 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