【问题标题】:Pandas Multi-Index - Can't convert non-uniquely indexed DataFrame to PanelPandas 多索引 - 无法将非唯一索引的 DataFrame 转换为面板
【发布时间】:2016-09-12 14:29:46
【问题描述】:

鉴于时间序列数据,我正在尝试在 Python 中使用具有固定效果的面板 OLS。我找到了这种方法:

Fixed effect in Pandas or Statsmodels

我的输入数据是这样的(我会称之为df):

    Name    Permits_13  Score_13    Permits_14  Score_14    Permits_15  Score_15
0   P.S. 015 ROBERTO CLEMENTE   12.0    284 22  279 32  283
1   P.S. 019 ASHER LEVY 18.0    296 51  301 55  308
2   P.S. 020 ANNA SILVER    9.0 294 9   290 10  293
3   P.S. 034 FRANKLIN D. ROOSEVELT  3.0 294 4   292 1   296
4   P.S. 064 ROBERT SIMON   3.0 287 15  288 17  291
5   P.S. 110 FLORENCE NIGHTINGALE   0.0 313 3   306 4   308
6   P.S. 134 HENRIETTA SZOLD    4.0 290 12  292 17  288
7   P.S. 137 JOHN L. BERNSTEIN  4.0 276 12  273 17  274
8   P.S. 140 NATHAN STRAUS  13.0    282 37  284 59  284
9   P.S. 142 AMALIA CASTRO  7.0 290 15  285 25  284
10  P.S. 184M SHUANG WEN    5.0 327 12  327 9   327

所以首先我必须将其转换为多索引(_13、_14、_15 依次代表 2013、2014 和 2015 年的数据):

df = df.dropna()
df = df.drop_duplicates()

rng = pandas.date_range(start=pandas.datetime(2013, 1, 1), periods=3, freq='A')
index = pandas.MultiIndex.from_product([rng, df['Name']], names=['date', 'id'])
d1 = numpy.array(df.ix[:, ['Score_13', 'Permits_13']])
d2 = numpy.array(df.ix[:, ['Score_14', 'Permits_14']])
d3 = numpy.array(df.ix[:, ['Score_15', 'Permits_15']])
data = numpy.concatenate((d1, d2, d3), axis=0)
s = pandas.DataFrame(data, index=index, columns=['y', 'x']) 
s = s.drop_duplicates()

结果如下:

        y   x
date    id      
2013-12-31  P.S. 015 ROBERTO CLEMENTE   284 12
P.S. 019 ASHER LEVY 296 18
P.S. 020 ANNA SILVER    294 9
P.S. 034 FRANKLIN D. ROOSEVELT  294 3
P.S. 064 ROBERT SIMON   287 3
P.S. 110 FLORENCE NIGHTINGALE   313 0
P.S. 134 HENRIETTA SZOLD    290 4
P.S. 137 JOHN L. BERNSTEIN  276 4
P.S. 140 NATHAN STRAUS  282 13
P.S. 142 AMALIA CASTRO  290 7
P.S. 184M SHUANG WEN    327 5
P.S. 188 THE ISLAND SCHOOL  279 4
HENRY STREET SCHOOL FOR INTERNATIONAL STUDIES   255 4
TECHNOLOGY, ARTS, AND SCIENCES STUDIO   282 18
THE EAST VILLAGE COMMUNITY SCHOOL   306 35
UNIVERSITY NEIGHBORHOOD MIDDLE SCHOOL   277 4
THE CHILDREN'S WORKSHOP SCHOOL  302 35
NEIGHBORHOOD SCHOOL 299 15
EARTH SCHOOL    305 3
SCHOOL FOR GLOBAL LEADERS   286 15
TOMPKINS SQUARE MIDDLE SCHOOL   306 3
P.S. 001 ALFRED E. SMITH    303 20
P.S. 002 MEYER LONDON   306 8
P.S. 003 CHARRETTE SCHOOL   325 62
P.S. 006 LILLIE D. BLAKE    333 89
P.S. 011 WILLIAM T. HARRIS  320 30
P.S. 033 CHELSEA PREP   313 5
P.S. 040 AUGUSTUS SAINT-GAUDENS 326 23
P.S. 041 GREENWICH VILLAGE  326 25
P.S. 042 BENJAMIN ALTMAN    314 30
... ... ... ...
2015-12-31  P.S. 054 CHARLES W. LENG    309 2
P.S. 055 HENRY M. BOEHM 311 3
P.S. 56 THE LOUIS DESARIO SCHOOL    323 4
P.S. 057 HUBERT H. HUMPHREY 287 2
SPACE SHUTTLE COLUMBIA SCHOOL   307 0
P.S. 060 ALICE AUSTEN   303 1
I.S. 061 WILLIAM A MORRIS   291 2
MARSH AVENUE SCHOOL FOR EXPEDITIONARY LEARNING  316 0
P.S. 069 DANIEL D. TOMPKINS 307 2
I.S. 072 ROCCO LAURIE   308 1
I.S. 075 FRANK D. PAULO 318 9
THE MICHAEL J. PETRIDES SCHOOL  310 0
STATEN ISLAND SCHOOL OF CIVIC LEADERSHIP    309 0
P.S. 075 MAYDA CORTIELLA    282 19
P.S. 086 THE IRVINGTON  286 38
P.S. 106 EDWARD EVERETT HALE    280 27
P.S. 116 ELIZABETH L FARRELL    291 3
P.S. 123 SUYDAM 287 14
P.S. 145 ANDREW JACKSON 285 4
P.S. 151 LYNDON B. JOHNSON  271 27
J.H.S. 162 THE WILLOUGHBY   283 22
P.S. 274 KOSCIUSKO  282 2
J.H.S. 291 ROLAND HAYES 279 13
P.S. 299 THOMAS WARREN FIELD    288 5
I.S. 347 SCHOOL OF HUMANITIES   284 45
I.S. 349 MATH, SCIENCE & TECH.  285 45
P.S. 376    301 9
P.S. 377 ALEJANDRINA B. DE GAUTIER  277 3
P.S. /I.S. 384 FRANCES E. CARTER    291 4
ALL CITY LEADERSHIP SECONDARY SCHOOL    325 18

但是,当我尝试调用时:

reg  = PanelOLS(y=s['y'],x=s[['x']],time_effects=True)

我收到一个错误:

ValueError: Can't convert non-unique indexed DataFrame to Panel

这是我第一次使用 Pandas,这可能是一个简单的问题,但我不知道是什么问题。据我所知,我有一个需要的多索引对象。

我不明白为什么我有重复(我放了很多 drop_duplicates() 试图摆脱任何重复的数据——不过我不认为这是答案)。如果我有同一所学校三年的数据,我不应该以某种方式重复数据吗(例如,只看Name 行)?

编辑

df是 935 行 × 7 列,在去掉 NaN 行之后。 所以我预计s 是 2805 行 × 2 列,这正是我所拥有的。

如果我运行这个:

s = s.reset_index().groupby(s.index.names).first()
reg  = PanelOLS(y=s['y'],x=s[['x']],time_effects=True)

我收到另一个错误:

ValueError: 操作数不能与形状一起广播 (2763,) (3,)

谢谢。

【问题讨论】:

    标签: python pandas regression multi-index


    【解决方案1】:

    使用提供的 pickle 文件,我运行了回归,它运行良好。

    -------------------------Summary of Regression Analysis-------------------------
    
    Formula: Y ~ <x>
    
    Number of Observations:         2763
    Number of Degrees of Freedom:   4
    
    R-squared:         0.0268
    Adj R-squared:     0.0257
    
    Rmse:             16.4732
    
    F-stat (1, 2759):    25.3204, p-value:     0.0000
    
    Degrees of Freedom: model 3, resid 2759
    
    -----------------------Summary of Estimated Coefficients------------------------
          Variable       Coef    Std Err     t-stat    p-value    CI 2.5%   CI 97.5%
    --------------------------------------------------------------------------------
                 x     0.1666     0.0191       8.72     0.0000     0.1292     0.2041
    ---------------------------------End of Summary---------------------------------
    

    我在 Jupyter Notebook 中运行了这个

    【讨论】:

    • 感谢您的回答,@piRSquared。我想问你为什么会发生这种情况,如果我在代码的开头(在转换之前)去掉了重复项。使用此代码,我得到NotImplementedError: Only 2-level MultiIndex are supported
    • drop_duplicates 正在检查重复的数据行,而不是重复的索引值。由于重复的索引值,您会收到错误。为了解决您的问题,您需要摆脱重复的索引值。 reset_index 将您的索引放回数据帧的数据部分,然后受制于 drop_duplicates 方法。
    • 我在这里,现在:AttributeError: 'NoneType' object has no attribute 'conjugate'。我在这里放了一个s 数据框的例子:dl.dropboxusercontent.com/u/37155213/Sample.pkl。在调用 PanelOLS 方法之前,我运行了 s = s.astype(np.float)。感谢您的耐心等待。
    • 这很奇怪,@piRSquared。我可以在前面提到的公共文件夹中运行一个示例,但不能通过 Jupyter Notebook 运行。
    猜你喜欢
    • 2021-12-02
    • 2018-05-04
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    • 2019-04-13
    • 1970-01-01
    • 2021-12-08
    • 2021-11-30
    相关资源
    最近更新 更多