减去日期时间索引上不同粒度的数据框列

问题描述 投票:0回答:1

我有一些价格数据(例如来自Yahoo财务),其每日粒度datetime变量为索引,我们称其为df,并说其Microsoft收盘价为值变量。要获得每月平均收盘价,我显然可以执行以下两个操作之一:

import yfinance as yf
import pandas as pd
df = yf.download("CMG", start="2012-01-01",end="2020-01-01" )
dfm = df.resample("M").mean()
dfm2 = df.groupby(df.index.to_period("M")).mean()

对我来说,它们看起来非常相似,唯一的区别是我可以分辨的是,在重新采样时,新的日期时间索引是月末,groupby to_period的索引为yyyy-mm。

我现在想在df中添加一个具有每日粒度的列,该列的每个每日收盘价均偏离其月均值。所以1 / jan / 2020-平均值(jan-20),2 / jan / 2020-平均值(jan-20),1 / feb / 2020-平均值(feb-20)。

因为dfm和df具有不同的索引,所以我不能只做df-dfm。

我唯一能想到的是通过df循环,在dfm上放置一个计数器,然后在循环中放置一个if语句,这是非常c的方法,但不是很pythonic。我猜它看起来像这样(但这没用):

counter = 0
df["dailyminusmonthly"] =""

for i in df:
if i.index <= dfm[counter].index:
    i.dailyminusmonthly = i.close - dfm.close[counter]
else:
    counter = counter +1
    i.dailyminusmonthly = i.close - dfm.close[counter]
python pandas
1个回答
0
投票

用途:

df['dailyminusmonthly']= (df['Close'].to_period('M') - df.groupby(df.index.to_period("M"))['Close'].mean()).to_numpy()
© www.soinside.com 2019 - 2024. All rights reserved.