【发布时间】:2020-09-16 18:33:00
【问题描述】:
我有一些价格数据(例如来自 yahoo Finance),以每日粒度日期时间变量作为索引,让我们称其为 df,并将其作为价值变量的微软收盘价。要获得月平均收盘价,我显然可以做以下两个之一:
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 中添加一个具有每日粒度的列,该列具有每个每日收盘价与其每月平均值的偏差。所以 2020 年 1 月 1 日 - 平均值(1 月 20 日),2020 年 1 月 2 日 - 平均值(1 月 20 日),2020 年 2 月 1 日 - 平均值(2 月 20 日)。
因为 dfm 和 df 有不同的索引,我不能只做 df-dfm。
我唯一能想到的是循环遍历 df,在 dfm 上放置一个计数器并在循环中放置一个 if 语句,这是一种非常 c 类型的方法,但不是很 Python。我猜它看起来像这样(但这不起作用):
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]
【问题讨论】: