pandas Python中使用rolling()计算动态移动平均线的函数

ntjbwcob  于 2023-06-20  发布在  Python
关注(0)|答案(1)|浏览(118)

我试图计算一个动态移动平均线的基础上的价值在现有的列。我试图实现的操作是,我有一个样本数据框架,其中有三列a,b,c。我想写一个动态函数来应用于我的整个数据框架,其中创建了一个新的列d,这样
列d值应根据列b中的窗口大小计算为列c中值的移动平均值。如果列b中的值是负的,则必须向后计算平均值,如果是0,则平均值将是nan,如果列b的值大于或小于 Dataframe 的长度,则平均值将等于列C中的值。
更好地理解;索引0处的df ['d ']应该是[100,53,48,28]的平均值,因为索引0处的df ['b']是4。索引1处的相似df ['d ']应该是[53,100]的平均值,因为索引1处的df ['b']是-2。因为它是-2,所以它以相反的顺序运行。同样地,index 2处的df ['d]应该是[48,28]的平均值,因为index 2处的df ['b ']是2。索引3处的df ['d ']应=' nan ',因为索引3处的df ['b']为0。索引4处的df ['d ']应= 1,因为索引4处的df ['b']为1。最后,索引5处的df ['d ']应该等于202,因为索引5处的df ['b']是4。前面没有4行可以计算移动平均线。
我的代码如下,它给了我奇怪的结果。任何帮助都很感激。

import numpy as np
import pandas as pd

# Create the DataFrame
data = {
    'a': [1, 2, 3, 4, 5, 6],
    'b': [4, -2, 2, 0, 1, 4],
    'c': [100, 53, 48, 28, 18, 202]
}

df = pd.DataFrame(data)

# Function to calculate the custom rolling average
def custom_rolling_average(window_values):
    if len(window_values) > 0:
        return window_values.mean()
    else:
        return np.nan

# Calculate the rolling average
df['d'] = np.nan
for i, row in df.iterrows():
    window_size = abs(row['b'])
    window_start = max(i - window_size + 1, 0)
    window_end = i
    window_values = df.loc[window_start:window_end, 'c'].astype(float)
    if window_size == 0:
        df.at[i, 'd'] = np.nan
    else:
        df.at[i, 'd'] = custom_rolling_average(window_values)
ymdaylpp

ymdaylpp1#

您可以用途:

for row in df.itertuples():
    start = df.index.get_loc(row.Index)
    end = start + row.b
    end = end if (end > 0) & (end <= len(df)) else None
    step = 1 if row.b > 0 else -1
    df.loc[row.Index, 'd'] = df.iloc[start:end:step]['c'].mean()

输出:

>>> df
   a  b    c       d
0  1  4  100   57.25
1  2 -2   53   76.50
2  3  2   48   38.00
3  4  0   28     NaN
4  5  1   18   18.00
5  6  4  202  202.00

相关问题