将财务数据从postgres转换为pandas数据框,以便与Zipline一起使用

时间:2013-01-25 04:15:00

标签: python pandas etl zipline

我是Pandas和Zipline的新手,我正在努力学习如何使用它们(并将它与我拥有的数据一起使用)。任何类型的提示,即使没有完整的解决方案,将非常感激。我已经尝试了很多东西,并且已经非常接近,但特别是遇到了索引问题,Exception: Reindexing only valid with uniquely valued Index objects。 [Pandas 0.10.0,Python 2.7]

我正试图通过以下形式转换我在postgres中的数千种股票的月度回报数据:

ticker_symbol :: String, monthly_return :: Float, date :: Timestamp

e.g。

AAPL, 0.112, 28/2/1992
GS, 0.13, 30/11/1981
GS, -0.23, 22/12/1981

注意:报告的频率是每月一次,但这里会有相当多的NaN数据,因为我在这里的6000多家公司并非同时出现这些数据。

...到下面描述的形式,这是Zipline运行其后测试器所需要的。 (我想.Zipline的backtester可以轻松地使用这样的月度数据吗?我知道可以,但是这样做的提示是什么?)


下面是一个DataFrame(时间序列?这个怎么说?),我需要的格式:

> data

<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 2268 entries, 1993-01-04 00:00:00+00:00 to 2001-12-31 00:00:00+00:00
Data columns:
AA      2268  non-null values
AAPL    2268  non-null values
GE      2268  non-null values
IBM     2268  non-null values
JNJ     2268  non-null values
KO      2268  non-null values
MSFT    2268  non-null values
PEP     2268  non-null values
SPX     2268  non-null values
XOM     2268  non-null values
dtypes: float64(10)

以下是TimeSeries,采用我需要的格式。

> data.AAPL

Date
1993-01-04 00:00:00+00:00    73.00
1993-01-05 00:00:00+00:00    73.12
...

2001-12-28 00:00:00+00:00    36.15
2001-12-31 00:00:00+00:00    35.55
Name: AAPL, Length: 2268

注意,这里没有返回数据,而是价格。它们被调整(通过Zipline的load_from_yahoo - 从阅读来源,实际上是通过大熊猫中的函数来获得红利,分裂等等,因此在它和我的返回数据之间存在同构(减去初始价格)(所以,这里没问题)。

(编辑:如果你想让我写下我所拥有的东西,或者附上我的iPython笔记本或要点,请告诉我;我只是怀疑它会有所帮助,但如果有要求,我绝对可以这样做。)< / p>

1 个答案:

答案 0 :(得分:3)

我怀疑你是想过早地将日期设置为索引。我的建议是首先set_index作为日期公司名称,然后您可以unstack公司名称和resample

这样的事情:

In [11]: df1
Out[11]: 
  ticker_symbol  monthly_return                date
0          AAPL           0.112 1992-02-28 00:00:00
1            GS           0.130 1981-11-30 00:00:00
2            GS          -0.230 1981-12-22 00:00:00

df2 = df2.set_index(['date','ticker_symbol'])
df3 = df2.unstack(level=1)
df4 = df.resample('M')

In [14]: df2
Out[14]: 
                          monthly_return
date       ticker_symbol                
1992-02-28 AAPL                    0.112
1981-11-30 GS                      0.130
1981-12-22 GS                     -0.230

In [15]: df3
Out[15]: 
               monthly_return      
ticker_symbol            AAPL    GS
date                               
1981-11-30                NaN  0.13
1981-12-22                NaN -0.23
1992-02-28              0.112   NaN

In [16]: df4
Out[16]: 
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 124 entries, 1981-11-30 00:00:00 to 1992-02-29 00:00:00
Freq: M
Data columns:
(monthly_return, AAPL)    1  non-null values
(monthly_return, GS)      2  non-null values
dtypes: float64(2)