numpy / scipy:经过一段时间后,让一个系列向另一个系列汇聚

时间:2015-12-07 19:41:26

标签: python numpy pandas scipy

我在pandas数据框中有许多系列,代表每年观察到的费率。

对于一项实验,我希望其中一些系列的费率能够在上一年观察到的其他系列费率中收敛。

例如,假设我有这些数据,并且我认为列a是列b的一个有意义的目标,例如,以小的,偶数大小的增量渐近地接近十年期间(或减少;并不重要)。

我当然可以在一个循环中执行此操作,但我想知道是否有一种更为通用的numpyscipy向量化方法,使一个系列方法渐近渐远地下架。

rate               a         b                  
year                                                                       
2006               0.393620  0.260998          
2007               0.408620  0.260527
2008               0.396732  0.257396 
2009               0.418029  0.249123 
2010               0.414246  0.253526  
2011               0.415873  0.256586  
2012               0.414616  0.253865     
2013               0.408332  0.257504    
2014               0.401821  0.259208  

2 个答案:

答案 0 :(得分:5)

一般来说,你会在某个范围内应用“缓和功能”。

例如,请考虑下图:

enter image description here

在这里,我们有两个原始数据集。我们将减去两者,将差值乘以第三行中显示的缓动函数,然后将结果添加回第一条曲线。这将产生一个新系列,即灰色区域左侧的原始数据,灰色区域内两者的混合,以及灰色区域右侧另一条曲线的数据。

举个例子:

import numpy as np
import matplotlib.pyplot as plt

# Generate some interesting random data
np.random.seed(1)
series1 = np.random.normal(0, 1, 1000).cumsum() + 20
series2 = np.random.normal(0, 1, 1000).cumsum()
# Our x-coordinates
index = np.arange(series1.size)

# Boundaries of the gray "easing region"
i0, i1 = 300, 700    

# In this case, I've chosen a sinusoidal easing function...
x = np.pi * (index - i0) / (i1 - i0)
easing = 0.5 * np.cos(x) + 0.5

# To the left of the gray region, easing should be 1 (all series2)
easing[index < i0] = 1

# To the right, it should be 0 (all series1)
easing[index >= i1] = 0

# Now let's calculate the new series that will slowly approach the first
# We'll operate on the difference and then add series1 back in 
diff = series2 - series1
series3 = easing * diff + series1

另外,如果你对上面的情节感到好奇,那么它是如何生成的:

fig, axes = plt.subplots(nrows=4, sharex=True)

axes[0].plot(series1, color='lightblue', lw=2)
axes[0].plot(series2, color='salmon', lw=1.5)
axes[0].set(ylabel='Original Series')

axes[1].plot(diff, color='gray')
axes[1].set(ylabel='Difference')

axes[2].plot(easing, color='black', lw=2)
axes[2].margins(y=0.1)
axes[2].set(ylabel='Easing')

axes[3].plot(series1, color='lightblue', lw=2)
axes[3].plot(series3, color='salmon', ls='--', lw=2, dashes=(12,20))
axes[3].set(ylabel='Modified Series')

for ax in axes:
    ax.locator_params(axis='y', nbins=4)
for ax in axes[-2:]:
    ax.axvspan(i0, i1, color='0.8', alpha=0.5)

plt.show()

答案 1 :(得分:2)

好的,所以这只是您在代码表单comment中描述的过程,假设ab是您的两个numpy数组:

b += (a[-1]-b[-1])/len(b)*numpy.arange(1,len(b)+1)

(a[-1]-b[-1])/len(b)是一个&#34; chunk&#34;并且在每个&#34;迭代中添加了另外一个&#34;迭代&#34; (年)通过乘以numpy.arange()数组。我尝试了一些情节,除非你调整它,否则它看起来并不好看,但它是你所要求的。

Example of what this looks like