2012-09-10 2 views
4

나는 팬더의 dataframe 'DT =이 myfunc을()'이 있고, 아래로 IDLE에서 화면 출력을 복사 플로트 부문 :왜 팬더가 한 케이스에서는 'ZeroDivisionError'가 발생하지만 다른 케이스에서는 그렇지 않습니다.

>>> 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 
>>> 

이 팬더는 'ZeroDivisionError을 제기 이유를 알아 내기 위해 나에게 많은 시간을 비용 '팬더 샘플 코드 아래에 아주 잘 작동하는 동안 :

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 
>>> 

내가 팬더 제공 기대'ZeroDivisionError는 '첫 번째 경우에 발생하는'이유는 두 경우 모두에 대한 'NaN이를? 그것을 고치는 방법? 코드 아래


은 & 화면 출력

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 
+0

첫 번째 예제에서 dt.dtypes를 확인할 수 있습니까? 나는 행동을 재현 할 수 없다. –

+0

'dt.dtypes'는 '세금'을 표시하고 'ebt'는 '개체'입니다 (이유를 모르겠습니다). 이메일을받을 수 있습니까? 전체 소스 코드와 SQLite 데이터 파일을 보내면 시나리오를 재현 할 수 있습니다. 일반적으로 프로그램은 SQLite 백엔드에서 재무 보고서 데이터를 가져 와서 재무 비율을 계산하려고 시도합니다 ... – bigbug

답변

2

@bigbug 어떻게 SQLite는 백엔드에서 데이터를 받고, : ebt 비 제로 일 때 그 값을 덮어? pandas.io.sql을 보면 read_frame 메서드에 coerce_float 매개 변수가 있습니다. 가능한 경우 수치 데이터를 float로 변환해야합니다.

두 번째 예제는 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) 

데이터를 다시 가져 와서 내가 찾은 것을 알려주십시오.

+0

'df = psql.frame_query (sqlstr, con = cx, coerce_float = True)'는 데이터를 가져 오는 코드입니다 SQLite에서. 'psql.frame_query'는 잘 작동한다고 생각합니다. 데이터가있는 SQLite 열의 'float64'를 만들고, 'object'열을 비어있는 (NULL) SQLite 열에 할당합니다. (팬더는 'float64'에 기본값으로 할당 할 수 있습니까?). 나는 단계별로 내부 논리 흐름을 추적하고 'DataFrame.diff()'가 원인이라고 판단하고, 'float64'에서 'object'로 데이터 유형을 변경합니다! – bigbug

+0

관련 코드 및 출력을 질문 영역에 첨부합니다. pls보세요. 'diff()'가 경계에 부딪 힐 때 데이터 유형을 변경합니까? – bigbug

+0

아, 그게 혼합 된 dtype DataFrame에 대한 버그입니다. 여기에 버그 보고서를 제출했습니다. 해결 방법으로 할인 열을 float로 변환하면 작동합니다 (https://github.com/pydata/pandas/issues/1896 참조) –

0

을 (I 만들고 시도 정수, 수레 및 열등 배열의 데이터 프레임)을 사용하면 tax_rate 열에 NaN을 집어 넣는 것이 더 좋습니다.

dt['tax_rate'] = numpy.nan 
dt['tax_rate'][dt.ebt != 0] = dt.tax[dt.ebt != 0]/dt.ebt[dt.ebt != 0] 
관련 문제