【问题标题】:Rescale price list from a longer length to a smaller length将价格表从较长的长度重新调整为较短的长度
【发布时间】:2017-12-20 01:28:12
【问题描述】:

给定以下具有 60 个元素的 pandas 数据框。

import pandas as pd
data = [60,62.75,73.28,75.77,70.28
    ,67.85,74.58,72.91,68.33,78.59
    ,75.58,78.93,74.61,85.3,84.63
    ,84.61,87.76,95.02,98.83,92.44
    ,84.8,89.51,90.25,93.82,86.64
    ,77.84,76.06,77.75,72.13,80.2
    ,79.05,76.11,80.28,76.38,73.3
    ,72.28,77,69.28,71.31,79.25
    ,75.11,73.16,78.91,84.78,85.17
    ,91.53,94.85,87.79,97.92,92.88
    ,91.92,88.32,81.49,88.67,91.46
    ,91.71,82.17,93.05,103.98,105]

data_pd = pd.DataFrame(data, columns=["price"])

是否有一个公式可以重新调整此比例,以便对于从索引0 到索引i+1 开始的大于 20 个元素的每个窗口,将数据重新调整为 20 个元素?

这是一个循环,它使用用于重新缩放的数据创建窗口,我只是不知道为手头的这个问题进行重新缩放的任何方法。关于如何做到这一点有什么建议吗?

miniLenght = 20
rescaledData = []
for i in range(len(data_pd)):
    if(i >= miniLenght):
        dataForScaling = data_pd[0:i]
        scaledDataToMinLenght = dataForScaling #do the scaling here so that the length of the rescaled data is always equal to miniLenght
        rescaledData.append(scaledDataToMinLenght)

基本上在重新调整后,rescaledData 应该有 40 个数组,每个数组的长度为 20 个价格。

【问题讨论】:

  • 你如何重新缩放?
  • 看看df.rolling。可能有点用处。
  • 用于滚动窗口。我已经在循环中创建了带有数据的窗口。问题不在于如何滚动窗户。它是关于如何将数据从较长的长度重新调整为较小的长度

标签: python pandas interpolation resampling rescale


【解决方案1】:

通过阅读本文,您似乎正在将列表的大小重新调整为 20 个索引,然后在 20 个索引处插入数据。

我们将像他们一样制作索引 (range(0, len(large), step = len(large)/miniLenght)),然后使用 numpys interp - 有上百万种插值数据的方法。 np.interp 使用线性插值,因此如果您要求例如索引 1.5,您会得到点 1 和 2 的平均值,依此类推。

所以,这里是你的代码的快速修改来做到这一点(注意,我们可能可以使用“滚动”完全矢量化它):

import numpy as np
miniLenght = 20
rescaledData = []

for i in range(len(data_pd)):
    if(i >= miniLenght):
        dataForScaling = data_pd['price'][0:i]
        #figure out how many 'steps' we have
        steps = len(dataForScaling)
        #make indices where the data needs to be sliced to get 20 points
        indices = np.arange(0,steps, step = steps/miniLenght)
        #use np.interp at those points, with the original values as given
        rescaledData.append(np.interp(indices, np.arange(steps), dataForScaling))

而且输出如预期:

[array([ 60.  ,  62.75,  73.28,  75.77,  70.28,  67.85,  74.58,  72.91,
         68.33,  78.59,  75.58,  78.93,  74.61,  85.3 ,  84.63,  84.61,
         87.76,  95.02,  98.83,  92.44]),
 array([ 60.    ,  63.2765,  73.529 ,  74.9465,  69.794 ,  69.5325,
         74.079 ,  71.307 ,  72.434 ,  77.2355,  77.255 ,  76.554 ,
         81.024 ,  84.8645,  84.616 ,  86.9725,  93.568 ,  98.2585,
         93.079 ,  85.182 ]),.....

【讨论】:

  • 感谢@jeremycg 的回答。就是这样 :) 我会在 15 小时内奖励这个答案,只要它允许我;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-15
  • 2020-07-15
相关资源
最近更新 更多