【问题标题】:How do I create a Loop using Python that calculates means for each timeseries subsample sequence?如何使用 Python 创建一个循环来计算每个时间序列子样本序列的平均值?
【发布时间】:2019-11-12 21:51:06
【问题描述】:

我正在尝试创建一个以时间序列和多个拆分作为参数的函数。如果拆分 = 3,我希望该函数将时间序列数据分成三份并计算每个拆分的平均值。 我在下面创建的代码累积计算平均值。 这是示例数据:

data = pd.Series([1,2,3,4,5,6,7,8,9,9])

这是我创建的函数:

def multi_mean(ts, n_splits = 3):
    ts_ranges = []
    mn_range = []
    for i in range(1,n_splits+1):
        result = int(round(len(ts)/(i),0))
        for j in range(1,i+1):
            result2 = ts[:result*j].mean()
            mn_range.append(result2)         
    return mn_range

虚假数据上的函数提供以下结果列表:

rs1 = multi_mean(data,2)
[5.4,3.0,5.4]

第一个数字是 i =1 的拆分,即整个样本。 第二个数字是 i = 2 的第一个平均值,它是前 5 个数字的平均值。 i = 2 的第二个数字平均所有数字。 我无法弄清楚如何在循环中构造切片,以便获得所需的结果。 我想要以下期望的结果:

[5.4,3.0,7.8]

最后,我希望将每一轮 i 输出到一个单独的列表对象中。

【问题讨论】:

  • 当 n_splits=2 时,为什么你的答案中有 3 个数字?
  • 我想要一系列拆分。所以 split = 2 实际上是两轮拆分。第一轮是整个样本。第二轮将数据分成两半。
  • 如果/当它不是完全可分的时候,你将如何处理剩余部分,比如 10/3
  • 您能否进一步扩展您正在尝试做的事情?你有什么理由使用 Pandas 而不是 NumPy?

标签: python pandas loops list-comprehension nested-loops


【解决方案1】:

关键部分是您忘记指定每个切片的开始。 顺便说一句,你不需要像熊猫系列那样做;一个简单的列表就可以了

更改中心线以开始切片:

    result2 = sum(ts[result*(j-1):result*j]) / result

输出:

[5.4, 3.0, 7.8]

【讨论】:

    【解决方案2】:

    Prune 成功修复了您的代码,但我忍不住要分享一个不同的解决方案。向 NumPy 致敬!

    import numpy as np
    import itertools as itt
    
    arr_1 = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 9])
    
    
    def split_means(arr, num_splits):
        means_gen = ((curr_slice.mean() for curr_slice in np.array_split(arr, i)) for i in range(1, num_splits + 1))
        means_iter = itt.chain.from_iterable(means_gen)
        return list(means_iter)
    
    
    print(split_means(arr_1, 2))
    

    【讨论】:

    • Prune 解决了这个问题,但我也感谢你的解决方案,因为我也在努力学习函数式编程
    猜你喜欢
    • 2019-01-20
    • 1970-01-01
    • 2017-03-16
    • 2020-09-15
    • 2018-06-08
    • 2016-09-02
    • 2021-05-24
    • 1970-01-01
    • 2013-11-17
    相关资源
    最近更新 更多