【发布时间】:2012-12-08 15:56:15
【问题描述】:
目标
我有一些 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 的新功能。
我正在使用:
- 熊猫 0.10.0
- numpy 1.6.1
- Python 2.7.3。
【问题讨论】:
-
我找到了similar question。我尝试了 Wes 推荐的方法,但抛出了同样的异常。
-
您能否提供一个可运行的示例,其中包含说明问题的示例数据?
-
@BrenBarn 我在原始帖子中添加了一个可运行的示例。经过反思,我认为我可以理解为什么 DataFrame 不支持这种行为。传入的“重复”TimeSeries 元素属于哪一行是不明确的。尽管如此,我还是想听听有关如何使这种工作或其他方法发挥作用的任何建议。
标签: python dataframe pandas time-series