4

Pandas データフレーム 'dt = myfunc()' があり、以下のように IDLE からの画面出力をコピーします。

>>> from __future__ import division
>>> dt = __get_stk_data__(['*'], frq='CQQ', from_db=False) # my function
>>> dt = dt[dt['ebt']==0][['tax','ebt']]
>>> type(dt)
<class 'pandas.core.frame.DataFrame'>
>>> dt
                tax ebt
STK_ID RPT_Date        
000719 20100331   0   0
       20100630   0   0
       20100930   0   0
       20110331   0   0
002164 20080331   0   0
300155 20120331   0   0
600094 20090331   0   0
       20090630   0   0
       20090930   0   0
600180 20090331   0   0
600757 20110331   0   0
>>> dt['tax_rate'] = dt.tax/dt.ebt
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "D:\Python\Lib\site-packages\pandas\core\series.py", line 72, in wrapper
    return Series(na_op(self.values, other.values),
  File "D:\Python\Lib\site-packages\pandas\core\series.py", line 53, in na_op
    result = op(x, y)
ZeroDivisionError: float division
>>> 

Pandas が 'ZeroDivisionError: float division' を発生させる理由を理解するのに多くの時間がかかりますが、Pandas は以下のサンプル コードで非常にうまく機能します。

tuples = [('000719','20100331'),('000719','20100930'),('002164','20080331')]
index = MultiIndex.from_tuples(tuples, names=['STK_ID', 'RPT_Date'])
dt =DataFrame({'tax':[0,0,0],'ebt':[0,0,0]},index=index)
dt['tax_rate'] = dt.tax/dt.ebt

>>> dt
                 ebt  tax  tax_rate
STK_ID RPT_Date                    
000719 20100331    0    0       NaN
       20100930    0    0       NaN
002164 20080331    0    0       NaN
>>> 

Pandas は両方のケースで「NaN」を提供すると思いますが、最初のケースで「ZeroDivisionError」が発生するのはなぜですか? それを修正する方法?


以下のコードと画面出力は、デバッグするための詳細情報を提供するために添付されています

def __by_Q__(df):
    ''' this function transforms the input financial report data (which
        is accumulative) to qurterly data
    '''
    df_q1=df[df.index.map(lambda x: x[1].endswith("0331"))]

    print 'before diff:\n'
    print df.dtypes
    df_delta = df.diff()
    print '\nafter diff: \n'
    print df_delta.dtypes


    q1_mask = df_delta.index.map(lambda x: x[1].endswith("0331"));
    df_q234 = df_delta[~q1_mask]

    rst = concat([df_q1,df_q234])

    rst=rst.sort_index()
    return rst

画面出力:

before diff:

sales                      float64
discount                    object
net_sales                  float64
cogs                       float64
ebt                        float64
tax                        float64

after diff: 

sales                      object
discount                   object
net_sales                  object
cogs                       object
ebt                        object
tax                        object
4

2 に答える 2

3

@bigbug、SQLite バックエンドからどのようにデータを取得していますか? を見るとpandas.io.sqlread_frameメソッドには、coerce_float可能であれば数値データを float に変換するパラメーターがあります。

2 番目の例が機能するのは、DataFrame コンストラクターが型について巧妙になろうとするためです。dtype を object に設定すると失敗します。

In [16]: dt = DataFrame({'tax':[0,0,0], 'ebt':[0,0,0]},index=index,dtype=object)

In [17]: dt.tax/dt.ebt
---------------------------------------------------------------------------
ZeroDivisionError                         Traceback (most recent call last)

データ インポート コードをもう一度確認して、何を見つけたか教えてください。

于 2012-09-11T01:43:19.490 に答える
0

NaN私はその動作を再現することができませんでした (整数、浮動小数点数、numpy 配列からDataFrame を作成しようとしましたtax_rate) ebt

dt['tax_rate'] = numpy.nan
dt['tax_rate'][dt.ebt != 0] = dt.tax[dt.ebt != 0] / dt.ebt[dt.ebt != 0]
于 2012-09-10T14:35:51.990 に答える