如何基于Pandas DataFrame的每日资产价格计算周度平均价格?
如何用Pandas计算每日资产价格的周度滚动平均?
嘿,作为编程新手能想到用Pandas处理金融数据已经超棒啦!我来一步步带你实现这个需求——计算每7个连续交易日的平均价格(也就是滚动周度平均),结果可以存成单独的Series,也能直接加到原DataFrame里当新列。
第一步:确保你的数据是按时间排序的
这一步非常关键!如果你的DataFrame里的日期是乱序的,滚动平均的结果肯定会出错。假设你的DataFrame叫df,日期列是date,价格列是price,先执行这行代码排好序:
df = df.sort_values('date')
如果你的数据本身已经是按日期从早到晚排好的,这一步可以跳过,但养成排序的好习惯准没错~
第二步:用Pandas的rolling方法计算滚动平均
Pandas专门提供了rolling()函数来处理这种“滑动窗口”的计算,简直是为你的需求量身定做的!
方法1:直接在原DataFrame里新增周度平均列
一行代码就能搞定:
df['weekly_average_price'] = df['price'].rolling(window=7).mean()
window=7:表示我们要取连续7个数据的窗口.mean():对窗口里的数据求平均值
方法2:把结果存成单独的Pandas Series
如果你不想修改原DataFrame,也可以把结果存成单独的Series:
weekly_avg_series = df['price'].rolling(window=7).mean()
关于结果里的NaN你需要知道
运行完上面的代码后,你会发现前6行的周度平均是NaN(空值)——这很正常!因为前6天的数据不够7个,没法计算平均值。从第7行开始,每一行的平均值都是它自己加上前面6天的价格的平均,也就是滚动的7天窗口。
给你一个可直接运行的例子
我写了一段模拟代码,你可以复制到Python里运行,直观看看效果:
import pandas as pd import numpy as np # 生成10天的模拟资产价格数据 dates = pd.date_range(start='2024-01-01', periods=10) prices = np.random.randint(100, 200, size=10) # 随机生成100-200之间的价格 df = pd.DataFrame({'交易日期': dates, '资产价格': prices}) # 确保按日期排序 df = df.sort_values('交易日期') # 计算周度滚动平均并新增列 df['周度平均价格'] = df['资产价格'].rolling(window=7).mean() # 打印结果看看 print(df)
运行后你会看到类似这样的输出:
交易日期 资产价格 周度平均价格 0 2024-01-01 123 NaN 1 2024-01-02 156 NaN 2 2024-01-03 189 NaN 3 2024-01-04 145 NaN 4 2024-01-05 167 NaN 5 2024-01-06 132 NaN 6 2024-01-07 178 155.714286 7 2024-01-08 190 165.285714 8 2024-01-09 111 159.142857 9 2024-01-10 143 152.285714
看,第7行(索引6)的平均值就是前7天价格的平均,第8行是第2到第8天的平均,以此类推~
额外小技巧:如果你想去掉空值
如果不想保留前6行的NaN,可以用dropna()方法把它们删掉:
# 去掉空值后的Series clean_weekly_avg = df['周度平均价格'].dropna()
或者直接在计算时就处理:
df['周度平均价格'] = df['资产价格'].rolling(window=7).mean().dropna()
不过这样的话,原DataFrame的前6行的周度平均价格会变成NaN,只有后面的行有值——如果需要完整对齐原数据的话,还是保留NaN更合适。
内容的提问来源于stack exchange,提问作者Malte Brunst
相关产品推荐
相关产品推荐

