【问题标题】:how to get result of expanding/resample function in original dataframe using python如何使用python在原始数据框中获取扩展/重采样函数的结果
【发布时间】:2022-08-06 08:05:09
【问题描述】:

有一个带有 1 分钟时间戳的数据框,该时间戳为令牌的开盘价、最高价、最低价、收盘价、成交量。 使用扩展或重采样功能,可以根据时间间隔获得新的数据帧。就我而言,它的时间间隔为 1 天。

我希望在原始数据框中获得上述输出。请协助。

原始数据框:

所需的数据框:

这里 \"date_1d\" 是我的用例的时间间隔。我使用了扩展功能,但随着 \"date_1d\" 列中的值变化,扩展功能适用于整个数据框

df[\"high_1d\"] =  df[\"high\"].expanding().max()

df[\"low_1d\"] =  df[\"low\"].expanding().min()

df[\"volume_1d\"] =  df[\"volume\"].expanding().min()

那么下一个挑战是如何根据“date_1d”列找到打开和关闭

如果不清楚我想要的输出,请协助或提出更多问题。

仅供参考 - 5 年的数据量很大 100 个代币的 1 分钟数据

提前致谢

素克旺

  • 我不确定是否了解您的需求。您想每天对行进行分组并保持低列的最小值、高列的最大值和卷列的最小值?最后,您是否希望每天排一排?
  • 如果您参考所需的输出,对于 date_1d 中的相同值,每行分别使用 max、min、sum 函数对 high_1d、low_1d、volume_1d 列递增
  • 我正在使用扩展函数,但 date_1d 列中的时刻值从 2019 年 10 月 22 日变为 2019 年 10 月 23 日,我希望高、低和音量列忽略 2019 年 10 月 22 日的值,只取 2019 年 10 月 23 日的值进行进一步计算
  • 并且所有内容都需要在原始数据框中完成,而不是像帖子中提到的那样制作新的数据框
  • 好的我明白了。你能分享不是图片格式的原始数据吗?

标签: python dataframe


【解决方案1】:

我不确定我是否理解正确,但对我来说,您似乎想每天 groupbyeach 并为他们计算 first last min max。 date_1d 列是否已经存在?

如果不:

df["date_1d"] = df["date"].dt.strftime('%Y%m%d')

对于计算:

df["open_1d"] = df.groupby("date_1d")['open'].transform('first')
df["high_1d"] =  df.groupby("date_1d")['high'].transform('max')
df["low_1d"] =  df.groupby("date_1d")['low'].transform('min')
df["close_1d"] = df.groupby("date_1d")['close'].transform('last')

编辑:看看你的代码,如果它像你期望的那样工作(直到我们有你的一些数据我只能猜测,对不起:D)

df['high_1d'] = df.groupby('date_1d')['high'].expanding().max().values

它按“date_1d”对数据进行分组,但在组中只考虑逐行(以及上述行)

【讨论】:

  • 上面的公式工作正常。但现在认为 date_1d 用于 groupby,现在参考“日期”列,您将看到其增量 1 分钟的时间戳。所以你的公式工作正常,但我希望结果是这样的:对于第 1 行 - 只考虑第 1 行,对于第 2 行 - 考虑第 1 行和第 2 行,对于第 3 行 - 考虑第 1,2,&3 行(所以增量直到“日期”列中的值相同)
  • 如果解释清楚,请告诉我。再次感谢
  • 查看熊猫文档中的here。您可以按“date1d”分组并仍然使用您刚才描述的expanding() 功能......是您正在搜索的内容吗?
  • 所以就像我们做 groupby 一样,结果应该是行的增量。它的第 5 行应该按从 0 到 5 行的值分组,而不考虑低于 5 的行。您的建议中现在正在发生这种情况。希望它清楚
  • 嘿 Rabinzel,文档是我使用的东西,我已经使用 resample 函数在新的数据框中导出结果。挑战是在我的帖子中提到的原始数据框中添加该结果,如果您引用所需的输出
【解决方案2】:

不是最简洁的解决方案,但pd.merge 可以解决打开和关闭的问题。

import yfinance as yf
import datetime

df = yf.download("AAPL", interval="1m",
                   start=datetime.date.today()-datetime.timedelta(days=6))
df["Day"] = df.index.date
df = pd.merge(df,df.loc[:, ['Day', "Open"]].groupby(
    "Day").first(),on="Day",suffixes=('','_1d') ).set_index(df.index)
df = pd.merge(df,df.loc[:, ['Day', "Close"]].groupby(
    "Day").last(),on="Day",suffixes=('','_1d') ).set_index(df.index)
df['High_1d'] = ((df.loc[:, ['Day', 'High']].groupby(
    df['Day'])).expanding().max()).droplevel(level=0)
df['Low_1d'] = ((df.loc[:, ['Day', 'Low']].groupby(
    df['Day'])).expanding().min()).droplevel(level=0)
df['Volume_1d'] = ((df.loc[:, ['Day', 'Volume']].groupby(
    df['Day'])).expanding().sum()).droplevel(level=0)
df

快乐编码!

【讨论】:

    猜你喜欢
    • 2016-11-02
    • 1970-01-01
    • 2012-05-04
    • 1970-01-01
    • 2017-12-02
    • 2022-01-04
    • 2020-01-02
    • 1970-01-01
    • 2014-02-17
    相关资源
    最近更新 更多