【问题标题】:Panda runtime warning Cannot compare type 'Timestamp' with type 'str', sort order is undefined for incomparable objectsPanda 运行时警告无法将“时间戳”类型与“str”类型进行比较,无法比较对象的排序顺序未定义
【发布时间】:2016-08-15 06:55:49
【问题描述】:

我目前正在为 coursera 计算金融学做作业 2。

在执行这一行时:

ep.eventprofiler(df_events, d_data, i_lookback=20, i_lookforward=20,
            s_filename=report_filename, b_market_neutral=True, b_errorbars=True,
            s_market_sym='SPY')

我得到错误:

anaconda/lib/python2.7/site-packages/pandas/indexes/base.py:2397: RuntimeWarning: Cannot compare type 'Timestamp' with type 'str', sort order is undefined for incomparable objects
  return this.join(other, how=how, return_indexers=return_indexers)

它会创建 pdf 文件,显示发生的事件数,但不会实际绘制事件。我不确定为什么会发生这种情况。我正在使用熊猫 0.18.0

有什么想法吗?感谢您的帮助。

df_events.dtypes 示例:

ALTR    float64
ALXN    float64
AMAT    float64
AMD     float64
AMGN    float64
AMP     float64
AMT     float64
         ...
WDC     float64
WEC     float64
WFC     float64
WFM     float64
WHR     float64
WIN     float64
WLP     float64
WM      float64
WMB     float64
WMT     float64
XLNX    float64
XOM     float64
XRAY    float64
XRX     float64
XYL     float64
YHOO    float64
YUM     float64
ZION    float64
ZMH     float64
SPY     float64
dtype: object

这是 d_data.dtypes 日志示例:

           YHOO    YUM   ZION    ZMH     SPY
2008-01-02 16:00:00  23.72  37.88  45.29  66.29  144.93
2008-01-03 16:00:00  23.84  37.35  44.38  66.36  144.86
2008-01-04 16:00:00  23.16  36.82  42.40  66.50  141.31
2008-01-07 16:00:00  23.18  37.68  43.28  68.66  141.19

我明白了

 d_data.dtypes
*** AttributeError: 'dict' object has no attribute 'dtypes'

当我尝试打印出 d_data dtypes 时。

【问题讨论】:

  • 看起来DataFrame 中某些列的dtype 不是datetime,而是stringprint df_events.dtypes 是什么?如果d_dataDataFrameprint d_data.dtypes
  • 你能添加数据和数据类型的样本吗?
  • @jezrael 我已经用日志样本更新了这个问题。事件配置文件采用矩阵,因此将 d_data 作为 dict 应该不是问题吧?
  • 谢谢,df_events.index 是什么?是DatetimeIndex 吗?

标签: python pandas computational-finance


【解决方案1】:

问题是由线路引起的:

df_rets = df_rets - df_rets[s_market_sym]

在这几行中:

if b_market_neutral == True:
    df_rets = df_rets - df_rets[s_market_sym]
    del df_rets[s_market_sym]
    del df_events[s_market_sym]

eventprofiler(...) 函数中。坦率地说,我认为这条线是一个错误,至少应该说它应该作为评论 - 因为背后的逻辑超出了我的理解。其他都很好。

如果您将参数b_market_neutral 设置为False,它会给您一个漂亮的图表,但在计算平均回报时也会考虑到SPY 市场数据。因此,为了在计算平均值时使用“正确”逻辑,解决方法是注释此行并使用此修改重新编译 QSTK。

希望这会有所帮助。

问候, 丹尼尔

【讨论】:

    【解决方案2】:

    @DanielTC 感谢您指出问题所在,我可以确认。

    我认为逻辑是应该从个人中减去市场回报 股票每日回报,所以你只剩下股票的收益/损失

    我是这样解决的:

    if b_market_neutral is True:
        # it fails here: df_rets = df_rets - df_rets[s_market_sym]
        df_rets = df_rets.sub(df_rets[s_market_sym].values, axis=0) # this works
        del df_rets[s_market_sym]
        del df_events[s_market_sym]
    

    【讨论】:

      【解决方案3】:

      @Atti,你是对的。

      pandas.core.frame.DataFrame 
      
      Expression df - df['A'] is deprecated after pandas release 0.15.2
      

      Warning
      df - df['A']
      is now deprecated and will be removed in a future release. The preferred way to replicate this behavior is df.sub(df['A'], axis=0)
      

      【讨论】:

        猜你喜欢
        • 2020-08-15
        • 1970-01-01
        • 2020-08-13
        • 2018-12-30
        • 1970-01-01
        • 1970-01-01
        • 2018-09-01
        • 2020-04-21
        • 1970-01-01
        相关资源
        最近更新 更多