- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试有效地计算 Pandas DataFrame 每一列的运行总和,并以指数方式衰减。 DataFrame 包含世界上每个国家/地区的每日分数。数据框看起来像这样:
AF UK US
2014-07-01 0.998042 0.595720 0.524698
2014-07-02 0.380649 0.838436 0.355149
2014-07-03 0.306240 0.274755 0.964524
2014-07-04 0.396721 0.836027 0.225848
2014-07-05 0.151291 0.677794 0.603548
2014-07-06 0.558846 0.050535 0.551785
2014-07-07 0.463514 0.552748 0.265537
2014-07-08 0.240282 0.278825 0.116432
2014-07-09 0.309446 0.096573 0.246021
2014-07-10 0.800977 0.583496 0.713893
我不确定如何在不遍历数据框的情况下计算滚动总和(有衰减),因为我需要知道昨天的分数才能计算今天的分数。但是要计算昨天的分数,我需要知道前天的分数等。这是我一直在使用的代码,但我想要一种更有效的方法来处理它。
for j, val in df.iteritems():
for i, row in enumerate(val):
df[j].iloc[i] = row + val[i-1]*np.exp(-0.05)
最佳答案
您可以利用以下事实:当指数乘以它们的指数时:
例如:
N(2) = N(2) + N(1) * exp(-0.05)
N(3) = N(3) + (N(2) + N(1) * exp(-0.05))*exp(-0.05)
N(3) = N(3) + N(2)*exp(-0.05) + N(1)*exp(-0.1)
N(4) = ...and so on
然后可以使用 numpy 对其进行矢量化:
dataset = pd.DataFrame(np.random.rand(1000,3), columns=["A", "B","C"])
weightspace = np.exp(np.linspace(len(dataset), 0, num=len(dataset))*-0.05)
def rollingsum(array):
weights = weightspace[0-len(array):]
# Convolve the array and the weights to obtain the result
a = np.dot(array, weights).sum()
return a
a = pd.expanding_apply(dataset, rollingsum)
pd.expanding_apply
向每一行反向应用 rollingsum 函数,调用它 len(dataset)
次。 np.linspace
生成一个大小为 len(dataset)
的数据集,并计算每行乘以 exp(-0.05)
的次数当前行。
因为它是矢量化的,所以应该很快:
%timeit a = pd.expanding_apply(dataset, rollingsum)
10 loops, best of 3: 25.5 ms per loop
这与(注意我使用的是 python 3 并且必须对第一行的行为进行更改...)进行比较:
def multipleApply(df):
for j, val in df.iteritems():
for i, row in enumerate(val):
if i == 0:
continue
df[j].iloc[i] = row + val[i-1]*np.exp(-0.05)
结果如下:
In[68]: %timeit multipleApply(dataset)
1 loops, best of 3: 414 ms per loop
关于python - Python Pandas DataFrame 上的指数衰减,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25649412/
liwen01 2024.08.18 前言 无论是在产品开发还是在日常生活中,在使用无线网络的时候,都会经常遇到一些信号不好的问题,也会产生不少疑问: 为什么我们在高速移动的高铁上网络会变
我正在使用 Kinect 获取每个关节的位置和方向,然后将它们发送到 Unity。我注意到值有很多“跳跃”或波动,例如,有时我不移动我的手,而在 Unity 中它会旋转 180 度。 我想要的是一个平
在下面的示例中, #include #include //okay: // template decltype(auto) runner(T&& t, F f) { return f(st
出于某种原因,即使我设置了衰减因子,我的学习率似乎也没有改变。我添加了一个回调来查看学习率,它似乎在每个纪元之后都是一样的。为什么没有变化 class LearningRatePrinter(Call
考虑下面的代码: #include #include using namespace std; template void Test2(future f, Work w) { async([
我是一名优秀的程序员,十分优秀!