我在pandas数据框中有许多系列,代表每年观察到的费率。
对于一项实验,我希望其中一些系列的费率能够在上一年观察到的其他系列费率中收敛。
例如,假设我有这些数据,并且我认为列a
是列b
的一个有意义的目标,例如,以小的,偶数大小的增量渐近地接近十年期间(或减少;并不重要)。
我当然可以在一个循环中执行此操作,但我想知道是否有一种更为通用的numpy
或scipy
向量化方法,使一个系列方法渐近渐远地下架。
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
答案 0 :(得分:5)
一般来说,你会在某个范围内应用“缓和功能”。
例如,请考虑下图:
在这里,我们有两个原始数据集。我们将减去两者,将差值乘以第三行中显示的缓动函数,然后将结果添加回第一条曲线。这将产生一个新系列,即灰色区域左侧的原始数据,灰色区域内两者的混合,以及灰色区域右侧另一条曲线的数据。
举个例子:
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中描述的过程,假设a
和b
是您的两个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()
数组。我尝试了一些情节,除非你调整它,否则它看起来并不好看,但它是你所要求的。