【问题标题】:Applying complex function to several timeseries将复杂函数应用于多个时间序列
【发布时间】:2016-06-19 14:07:20
【问题描述】:

我想要实现的是: 我有几个时间序列,我需要按点组合它们并将结果作为一个新的时间序列返回。

我知道您可以在pandas 的系列上使用各种numpy 函数,但我不清楚如何将复杂函数应用于多个时间序列。

我要应用的功能:

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)

当然,我总是可以用for 循环遍历TimeSeries 并将它们粘合在一起。 但是,我想知道是否可以选择将函数传递给每个日期包含多个值的 TimeSeries 对象,并将该函数应用于每个日期?

即:

ts = ret_random_ts()
ts.apply_func(direction_day,Series['Dates'])

【问题讨论】:

    标签: python-3.x pandas dataframe


    【解决方案1】:

    你可以使用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]]
    

    【讨论】:

    • 这会将函数应用于每个数据点的一个 y 值,还是将其应用于所有 y 值?由于我的函数需要一个列表/可迭代的,y 值是否会这样传递给我的函数?因为在我的测试运行中似乎就是这种情况。
    • 我刚刚完成了我的回答,以提供一些精确度。我已经运行了这两个函数并且它运行(它不会产生错误),但我不知道结果是否符合您的期望。
    • 嗯。我不确定确实如此,但是您的回答使我对此事有了一些了解。干杯!
    【解决方案2】:
    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-09
      • 2021-08-09
      • 2019-03-13
      • 1970-01-01
      相关资源
      最近更新 更多