python - 在 Pandas 数据框中每个日期只有 1 条记录

标签 python pandas dataframe

背景:在 mplfinance 中,我希望能够在同一柱中绘制多个交易标记。据我了解,目前您只能将 1 个(或 1 个买入和 1 个卖出)添加到同一柱。除非我创建另一个系列,否则我不能在同一柱的同一侧再进行 2 笔交易。

这是一个例子:

d = {'TradeDate': ['2018-10-15 06:00:00',
                   '2018-10-29 03:00:00',
                   '2018-10-29 03:00:00',
                   '2018-10-29 06:00:00',
                   '2018-11-15 05:00:00',
                   '2018-11-15 05:00:00',
                   '2018-11-15 05:00:00'],
     'Price': [1.1596,
               1.1433,
               1.13926,
               1.14015,
               1.1413,
               1.1400,
               1.1403]}
df = pd.DataFrame(data=d)

df

    TradeDate           Price
0   2018-10-15 06:00:00 1.15960
1   2018-10-29 03:00:00 1.14330
2   2018-10-29 03:00:00 1.13926
3   2018-10-29 06:00:00 1.14015
4   2018-11-15 05:00:00 1.14130
5   2018-11-15 05:00:00 1.14000
6   2018-11-15 05:00:00 1.14030

如您所见,有 2 个日期时间的多笔交易。现在我想应用一条规则,说“如果每个日期有超过 1 笔交易(此处:价格),则为额外价格创建一个新列,继续这样做,直到同一 TradeDate(日期时间)的所有价格都已跨列分布,并且所有日期时间都是唯一的”。因此,同一日期的价格越多,需要的额外列就越多。

最终结果看起来像这样(我手动骗取了这些数据):

    TradeDate           Price   Price2  Price3
0   2018-10-15 06:00:00 1.15960 NaN     NaN
1   2018-10-29 03:00:00 1.14330 1.13926 NaN
3   2018-10-29 06:00:00 1.14015 NaN     NaN
4   2018-11-15 05:00:00 1.14130 1.14000 1.1403

最佳答案

诀窍是为每个唯一的日期时间添加一个增量计数器。这样,如果多次遇到日期时间,则此计数器会增加。

为此,我们按交易日期分组,并获得给定交易日期的重复交易日期的累计计数。然后我将这个值加 1,这样我们的计数从 1 开始,而不是 0。

df["TradeDate_count"] = df.groupby("TradeDate").cumcount() + 1

print(df)
            TradeDate    Price  TradeDate_count
0 2018-10-15 06:00:00  1.15960                1
1 2018-10-29 03:00:00  1.14330                1
2 2018-10-29 03:00:00  1.13926                2
3 2018-10-29 06:00:00  1.14015                1
4 2018-11-15 05:00:00  1.14130                1
5 2018-11-15 05:00:00  1.14000                2
6 2018-11-15 05:00:00  1.14030                3

现在我们已经添加了该列,我们可以简单地进行调整以获得您想要的结果。请注意,我添加了一个 rename(...) 方法,只是为了将“价格”添加到我们的列名称中。我还使用了 rename_axis 方法,因为我们的数据透视表向我们返回了一些用户难以查看的列的命名索引,因此我认为最好将其删除。

new_df = (df.pivot(index="TradeDate", columns="TradeDate_count", values="Price")
           .rename(columns="price{}".format)
           .rename_axis(columns=None))

                      price1   price2  price3
TradeDate                                    
2018-10-15 06:00:00  1.15960      NaN     NaN
2018-10-29 03:00:00  1.14330  1.13926     NaN
2018-10-29 06:00:00  1.14015      NaN     NaN
2018-11-15 05:00:00  1.14130  1.14000  1.1403

关于python - 在 Pandas 数据框中每个日期只有 1 条记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64036014/

相关文章:

python - 如何使用google python oauth库来实现OpenID Connect?

python - 如何在绘图破折号中更改图像大小

python - 类方法和类方法中定义的变量

python - 计算 Pandas 分类的 "concentration"

python - Spark使用前一行的值将新列添加到数据框

python - 使用 pandas 将年度格式的数据转换为财务数据

python - 在不使用用户函数的情况下使用不同名称将图像保存在For循环中(scikit-Python)

python - 在 Pandas 中进行 t-1 计算的更快方法

python - pandas Python Series 对象是可变的,因此它们不能在查询方法中散列

python - Pandas :增加日期时间