gpt4 book ai didi

python - 将异构时间序列添加到 DataFrame

转载 作者:太空狗 更新时间:2023-10-30 00:11:33 28 4
gpt4 key购买 nike

目标

我有一些 CSV 格式的多种产品的金融交易数据,我想使用 pandas 进行分析。交易以非常规的时间间隔发生,时间戳精确到 1 秒,这导致一些交易“同时”发生,即具有相同的时间戳。

目前的目标是绘制每种产品的累计交易量图。

目前的进展

交易数据已使用 read_csv() 读取到 DataFrame 中,在解析的日期时间上建立索引。

<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 447 entries, 2012-12-07 17:16:46 to 2012-12-10 16:28:29
Data columns:
Account Name 447 non-null values
Exchange 447 non-null values
Instrument 447 non-null values
Fill ID 447 non-null values
Side 447 non-null values
Quantity 447 non-null values
Price 447 non-null values
dtypes: float64(1), int64(1), object(5)

添加了一个“QuantitySigned”列。

我做了一个“groupby”,这样我就可以通过仪器访问数据。

grouped = trades.groupby('Instrument', sort=True)
for name, group in grouped:
group.QuantitySigned.cumsum().plot(label=name)
plt.legend()

问题

上面的工作,但我想在一个 DataFrame 中有 TimeSeries(每个仪器一个),即每个仪器一列,这样我就可以使用 DataFrame.plot()。问题是没有两个 TimeSeries 具有完全相同的索引,即我需要合并所有 TimeSeries 的索引。

我知道这应该有效,给出下面的简单示例:

index=pd.date_range('2012-12-21', periods=5)
s1 = Series(randn(3), index=index[:3])
s2 = Series(randn(3), index=index[2:])
df = DataFrame(index=index)
df['s1'] = s1
df['s2'] = s2

但是,当尝试将 TimeSeries 聚合到 DataFrame 时会抛出异常,我认为这与重复的索引元素有关:

grouped = trades.groupby('Instrument', sort=True)
df = DataFrame(index=trades.index)
for name, group in grouped:
df[name] = group.QuantitySigned.cumsum()
df.plot()

Exception: Reindexing only valid with uniquely valued Index objects

我这样做“正确”了吗?对于如何以更好的方式解决这个问题,有什么建议吗?

可运行示例

这是一个抛出异常的可运行示例:

import pandas as pd
from pandas import Series
from pandas import DataFrame

index = pd.tseries.index.DatetimeIndex(['2012-12-22', '2012-12-23', '2012-12-23'])

s1 = Series(randn(2), index[:2]) # No duplicate index elements
df1 = DataFrame(s1, index=index) # This works

s2 = Series(randn(2), index[-2:]) # Duplicate index elements
df2 = DataFrame(s2, index=index) # This throws

解决方案

感谢@crewbum 提供的解决方案。

grouped = trades.groupby('Instrument', sort=True)
dflist = list()
for name, group in grouped:
dflist.append(DataFrame({name : group.QuantitySigned.cumsum()}))
results = pd.concat(dflist)
results = results.sort().ffill().fillna(0)
results.plot()

注意:我先转发填充,然后再将剩余的 NaN 设置为零。正如@crewbum 指出的那样,ffill() 和 bfill() 是 0.10.0 的新功能。

我正在使用:

  • Pandas 0.10.0
  • numpy 1.6.1
  • Python 2.7.3。

最佳答案

pd.concat() 默认在索引上执行“外部”连接,可以通过向前和/或向后及时填充来填充空洞。

In [17]: pd.concat([DataFrame({'s1': s1}), DataFrame({'s2': s2})]).ffill().bfill()
Out[17]:
s1 s2
2012-12-21 9.0e-01 -0.3
2012-12-22 5.0e-03 -0.3
2012-12-23 -2.9e-01 -0.3
2012-12-23 -2.9e-01 -0.3
2012-12-24 -2.9e-01 -1.8
2012-12-25 -2.9e-01 -1.4

我应该补充一点,ffill()bfill() 是 pandas 0.10.0 中的新功能。在此之前,您可以使用 fillna(method='ffill')fillna(method='bfill')

关于python - 将异构时间序列添加到 DataFrame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13983876/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com