【问题标题】:Transforming financial data from postgres to pandas dataframe for use with Zipline将财务数据从 postgres 转换为 pandas 数据框以用于 Zipline
【发布时间】:2013-01-09 00:42:07
【问题描述】:

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

我正在尝试将我在 postgres 中的数千只股票的月度回报数据转换为以下形式:

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

例如

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

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

...到下面描述的形式,这是 Zipline 运行其回测器所需要的。 (我想。Zipline 的回测器可以轻松地处理这样的月度数据吗?我知道可以,但是有什么技巧吗?)


下面是一个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)

下面是一个时间序列,是我需要的格式。

&gt; 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——尽管,从阅读源代码,实际上是通过 pandas 中的函数)针对股息、拆分等进行调整,因此在它和我的返回数据之间存在同构(减去初始价格)(所以,这里没问题)。

(编辑:如果您希望我写下我所拥有的,或者附上我的 iPython 笔记本或要点,请告诉我;我只是怀疑它是否会有所帮助,但如果需要,我绝对可以做到。)

【问题讨论】:

    标签: python pandas etl zipline


    【解决方案1】:

    我怀疑您试图将日期设置为索引为时过早。我的建议是首先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)
    

    【讨论】:

    • 哇,太棒了。谢谢,安迪。问题一:df4中的列名为(monthly returns, TICKER);这是什么意思?这与 Zipline 返回的名称不同(只是 TICKER)。此外,列是 TimeSeries 吗? (我还没有测试过……)最后……有什么快速熟练使用 pandas 的技巧吗?再次感谢。
    • @IsaacHodes 该列是一个 MultiIndex(这就像一个双标题,如果df2 中有更多列,则很有用,但在这里不是那么有用),您可以通过“更正”这个df2.columns = df2.columns.get_level_values(1)。我会考虑一下关于学习 pandas 的建议(一个好的开始可能是查看其他人的 SO 问题..)祝你好运:)
    • 欣赏它。再次感谢。
    • @IsaacHodes 我的建议:购买the book,非常好。
    • 我知道了,我只需要坐下来刻意过一遍!到目前为止,我非常喜欢它。感谢您的帮助!
    猜你喜欢
    • 2019-02-24
    • 1970-01-01
    • 1970-01-01
    • 2014-08-19
    • 2019-05-14
    • 2020-06-17
    • 1970-01-01
    • 1970-01-01
    • 2019-07-01
    相关资源
    最近更新 更多