pandas 重新采样函数打印中间蜡烛
pandas Resample function print intermediate candle
当我们需要将分钟数据转换为每日数据时,我们使用以下代码
df.resample('D').apply({'low': lambda s: s.min(),'high': lambda s: s.max(),'volume': lambda s: s.sum()}).dropna()
它每天给我一支蜡烛。现在我正在寻找的不是给我一根蜡烛,而是给我那天所有的蜡烛(每日蜡烛),中间状态。
假设一天从 9:30 开始并在 16:00 结束,所以第一根每日蜡烛将有 open/High/Low/Close 的 9:30 分钟蜡烛并在 9:31 打开将是 9:30 关闭将是 9:31 并且将比较高、低并相应地更新。
我需要市场回放功能,以便用户可以在数据开始到来时看到白天谁的每日蜡烛正在发生变化。
任何帮助将不胜感激。
我第一次误解了你的问题,现在为你提供一个新的答案。
首先让我们获取一些数据:
import yfinance as yf
ticker = "msft"
df = yf.download(ticker, period="4d", interval="1m",)
df = df.loc[:, ["Open", "High", "Low", "Close", "Volume"]]
让我们创建一个名为 df1 的新数据框来保存您的结果。
由于这是最后一条数据,因此每个柱的收盘线都相同,所以我们将从那里开始。
df1 = pd.DataFrame()
df1["Close"] = df["Close"]
如果我们按日期分组,则开盘价将始终是该日期的第一个值。
df1["Open"] = df.groupby(pd.Grouper(level=0, freq="D"))["Open"].transform("first")
到目前为止我们有:
Close Open
Datetime
2020-06-10 09:30:00-04:00 191.260 191.125
2020-06-10 09:31:00-04:00 191.260 191.125
2020-06-10 09:33:00-04:00 191.405 191.125
2020-06-10 09:34:00-04:00 191.490 191.125
2020-06-10 09:35:00-04:00 191.510 191.125
... ... ...
2020-06-15 15:55:00-04:00 188.690 184.580
2020-06-15 15:56:00-04:00 188.700 184.580
2020-06-15 15:57:00-04:00 188.610 184.580
2020-06-15 15:58:00-04:00 188.470 184.580
2020-06-15 15:59:00-04:00 189.170 184.580
低值和高值是使用扩展计算的。
df1["Low"] = (
df.groupby(pd.Grouper(level=0, freq="D"))["Low"].expanding().min().droplevel(0)
)
df1["High"] = (
df.groupby(pd.Grouper(level=0, freq="D"))["High"].expanding().max().droplevel(0)
)
最后可以使用 cumsum over groupby date 计算体积。
df1["Volume"] = df.groupby(pd.Grouper(level=0, freq="D"))["Volume"].cumsum()
您的最终数据框如下所示:
print(df1[["Open", "High", "Low", "Close", "Volume"]])
Open High Low Close Volume
Datetime
2020-06-10 09:30:00-04:00 191.125 191.390 191.010 191.260 965121
2020-06-10 09:31:00-04:00 191.125 191.450 191.010 191.260 1112327
2020-06-10 09:33:00-04:00 191.125 191.590 191.010 191.405 1433916
2020-06-10 09:34:00-04:00 191.125 191.590 191.010 191.490 1566392
2020-06-10 09:35:00-04:00 191.125 191.800 191.010 191.510 1759454
... ... ... ... ... ...
2020-06-15 15:55:00-04:00 184.580 190.820 184.010 188.690 26253657
2020-06-15 15:56:00-04:00 184.580 190.820 184.010 188.700 26477100
2020-06-15 15:57:00-04:00 184.580 190.820 184.010 188.610 26738140
2020-06-15 15:58:00-04:00 184.580 190.820 184.010 188.470 27120167
2020-06-15 15:59:00-04:00 184.580 190.820 184.010 189.170 27933060
[1421 rows x 5 columns]
当我们需要将分钟数据转换为每日数据时,我们使用以下代码
df.resample('D').apply({'low': lambda s: s.min(),'high': lambda s: s.max(),'volume': lambda s: s.sum()}).dropna()
它每天给我一支蜡烛。现在我正在寻找的不是给我一根蜡烛,而是给我那天所有的蜡烛(每日蜡烛),中间状态。
假设一天从 9:30 开始并在 16:00 结束,所以第一根每日蜡烛将有 open/High/Low/Close 的 9:30 分钟蜡烛并在 9:31 打开将是 9:30 关闭将是 9:31 并且将比较高、低并相应地更新。
我需要市场回放功能,以便用户可以在数据开始到来时看到白天谁的每日蜡烛正在发生变化。
任何帮助将不胜感激。
我第一次误解了你的问题,现在为你提供一个新的答案。
首先让我们获取一些数据:
import yfinance as yf
ticker = "msft"
df = yf.download(ticker, period="4d", interval="1m",)
df = df.loc[:, ["Open", "High", "Low", "Close", "Volume"]]
让我们创建一个名为 df1 的新数据框来保存您的结果。 由于这是最后一条数据,因此每个柱的收盘线都相同,所以我们将从那里开始。
df1 = pd.DataFrame()
df1["Close"] = df["Close"]
如果我们按日期分组,则开盘价将始终是该日期的第一个值。
df1["Open"] = df.groupby(pd.Grouper(level=0, freq="D"))["Open"].transform("first")
到目前为止我们有:
Close Open
Datetime
2020-06-10 09:30:00-04:00 191.260 191.125
2020-06-10 09:31:00-04:00 191.260 191.125
2020-06-10 09:33:00-04:00 191.405 191.125
2020-06-10 09:34:00-04:00 191.490 191.125
2020-06-10 09:35:00-04:00 191.510 191.125
... ... ...
2020-06-15 15:55:00-04:00 188.690 184.580
2020-06-15 15:56:00-04:00 188.700 184.580
2020-06-15 15:57:00-04:00 188.610 184.580
2020-06-15 15:58:00-04:00 188.470 184.580
2020-06-15 15:59:00-04:00 189.170 184.580
低值和高值是使用扩展计算的。
df1["Low"] = (
df.groupby(pd.Grouper(level=0, freq="D"))["Low"].expanding().min().droplevel(0)
)
df1["High"] = (
df.groupby(pd.Grouper(level=0, freq="D"))["High"].expanding().max().droplevel(0)
)
最后可以使用 cumsum over groupby date 计算体积。
df1["Volume"] = df.groupby(pd.Grouper(level=0, freq="D"))["Volume"].cumsum()
您的最终数据框如下所示:
print(df1[["Open", "High", "Low", "Close", "Volume"]])
Open High Low Close Volume
Datetime
2020-06-10 09:30:00-04:00 191.125 191.390 191.010 191.260 965121
2020-06-10 09:31:00-04:00 191.125 191.450 191.010 191.260 1112327
2020-06-10 09:33:00-04:00 191.125 191.590 191.010 191.405 1433916
2020-06-10 09:34:00-04:00 191.125 191.590 191.010 191.490 1566392
2020-06-10 09:35:00-04:00 191.125 191.800 191.010 191.510 1759454
... ... ... ... ... ...
2020-06-15 15:55:00-04:00 184.580 190.820 184.010 188.690 26253657
2020-06-15 15:56:00-04:00 184.580 190.820 184.010 188.700 26477100
2020-06-15 15:57:00-04:00 184.580 190.820 184.010 188.610 26738140
2020-06-15 15:58:00-04:00 184.580 190.820 184.010 188.470 27120167
2020-06-15 15:59:00-04:00 184.580 190.820 184.010 189.170 27933060
[1421 rows x 5 columns]