2013-01-18 3 views
10

이 질문에 대한 답을 찾지 못했지만 매우 간단하지만 아직 아무것도 찾을 수 없었습니다. 제가 뭔가를 놓친다면 사과드립니다. 나는 판다 버전 0.10.0을하고 난 다음 형식의 데이터를 실험 한 : 당신이 볼 수 있듯이, 나는 3 차원 시계열 데이터를 표현하기 위해 노력하고MultiIndex 열을 사용하여 pandas 데이터 프레임에 필드를 추가하십시오.

import pandas 
import numpy as np 
import datetime 
start_date = datetime.datetime(2009,3,1,6,29,59) 
r = pandas.date_range(start_date, periods=12) 
cols_1 = ['AAPL', 'AAPL', 'GOOG', 'GOOG', 'GS', 'GS'] 
cols_2 = ['close', 'rate', 'close', 'rate', 'close', 'rate'] 
dat = np.random.randn(12, 6) 
cols = pandas.MultiIndex.from_arrays([cols_1, cols_2], names=['ticker','field']) 
dftst = pandas.DataFrame(dat, columns=cols, index=r) 
print dftst 



ticker     AAPL    GOOG     GS   
field     close  rate  close  rate  close  rate 
2009-03-01 06:29:59 1.956255 -2.074371 -0.200568 0.759772 -0.951543 0.514577 
2009-03-02 06:29:59 0.069611 -2.684352 -0.310006 0.730205 -0.302949 -0.830452 
2009-03-03 06:29:59 2.077130 -0.903784 0.449857 -1.357464 -0.469572 -0.008757 
2009-03-04 06:29:59 1.585358 -2.063672 0.600889 -1.741606 -0.299875 0.565253 
2009-03-05 06:29:59 0.269123 0.226593 1.132663 0.485035 0.796858 -0.423112 
2009-03-06 06:29:59 0.094879 -1.040069 0.613450 -0.175266 -0.065172 3.374658 
2009-03-07 06:29:59 -1.255167 -0.326474 0.437053 -0.231594 0.437703 -0.256811 
2009-03-08 06:29:59 0.115454 -1.096841 -1.189211 -0.208098 -0.807860 0.158198 
2009-03-09 06:29:59 2.142816 0.173878 -0.160932 0.367309 -0.449765 -0.325400 
2009-03-10 06:29:59 0.470669 -0.346805 1.152648 0.844632 1.031602 -0.012502 
2009-03-11 06:29:59 -1.366954 0.452177 0.010713 -1.331553 0.226781 0.456900 
2009-03-12 06:29:59 2.182409 0.890023 -0.627318 -1.516574 -1.565416 -0.694320 

. 그래서 나는 timeseries 인덱스와 MultiIndex 컬럼을 가지고 있습니다. 나는 데이터를 조각 내기에 꽤 편안하다. 나는 가까운 데이터의 단지 뒤 평균을 원한다면, 나는 다음과 같은 작업을 수행 할 수 있습니다

pandas.rolling_mean(dftst.ix[:,::2], 5) 


ticker     AAPL  GOOG  GS 
field     close  close  close 
2009-03-01 06:29:59  NaN  NaN  NaN 
2009-03-02 06:29:59  NaN  NaN  NaN 
2009-03-03 06:29:59  NaN  NaN  NaN 
2009-03-04 06:29:59  NaN  NaN  NaN 
2009-03-05 06:29:59 0.410966 -0.412356 0.722951 
2009-03-06 06:29:59 -0.103187 -0.497165 0.137731 
2009-03-07 06:29:59 0.000194 -0.645375 -0.298504 
2009-03-08 06:29:59 -0.074036 -0.541717 -0.035906 
2009-03-09 06:29:59 -0.391863 -0.671918 -0.554380 
2009-03-10 06:29:59 -0.336397 -0.411845 -0.992615 
2009-03-11 06:29:59 -0.251645 -0.289512 -0.458246 
2009-03-12 06:29:59 -0.138925 0.244572 -0.230743 

은 내가 할 수없는 것은 avg_close처럼, 새로운 필드를 만들고 할당합니다.

dftst의 : 이상적으로는 다음과 같은 것을 할 싶습니다 [을 : 'avg_close'] = pandas.rolling_mean (dftst.ix의 [을 : : : 2, 5)

나는를 교환하더라도 나는 다음과 같은 일을 지정할 수,

dftst = dftst.swaplevel(1,0,axis=1) 
print dftst['close'] 

ticker     AAPL  GOOG  GS 
2009-03-01 06:29:59 1.178557 -0.505672 -0.336645 
2009-03-02 06:29:59 0.234305 0.581429 -0.232252 
2009-03-03 06:29:59 -0.734798 0.117810 1.658418 
2009-03-04 06:29:59 -1.555033 -0.298322 0.127408 
2009-03-05 06:29:59 0.244102 -1.030041 -0.562039 
2009-03-06 06:29:59 -0.297454 1.150564 -1.930883 
2009-03-07 06:29:59 0.818910 -0.905296 1.219946 
2009-03-08 06:29:59 0.586816 0.965242 0.928546 
2009-03-09 06:29:59 -0.357693 0.071455 0.072956 
2009-03-10 06:29:59 0.651803 -0.685937 0.805779 
2009-03-11 06:29:59 0.569802 -0.062447 -1.349261 
2009-03-12 06:29:59 -1.886335 0.205778 -0.864273 

dftst['avg_close'] = pandas.rolling_mean(dftst['close'], 3) 


----> 1 dftst['avg_close'] = pandas.rolling_mean(dftst['close'], 3) 

/usr/local/lib/python2.7/dist-packages/pandas/core/frame.pyc in 
__setitem__(self, key, value) 2041   else: 2042    # set column 

-> 2043    self._set_item(key, value) 2044  2045  def _boolean_set(self, key, value): 

/usr/local/lib/python2.7/dist-packages/pandas/core/frame.pyc in 
_set_item(self, key, value) 2077   """ 2078   value = self._sanitize_column(key, value) 
-> 2079   NDFrame._set_item(self, key, value) 2080  2081  def insert(self, loc, column, value): 

/usr/local/lib/python2.7/dist-packages/pandas/core/generic.pyc in 
_set_item(self, key, value) 
    544 
    545  def _set_item(self, key, value): 
--> 546   self._data.set(key, value) 
    547   self._clear_item_cache() 
    548 

/usr/local/lib/python2.7/dist-packages/pandas/core/internals.pyc in set(self, item, value) 
    951   except KeyError: 
    952    # insert at end 

--> 953    self.insert(len(self.items), item, value) 
    954 
    955   self._known_consolidated = False 

/usr/local/lib/python2.7/dist-packages/pandas/core/internals.pyc in insert(self, loc, item, value) 
    963 
    964   # new block 

--> 965   self._add_new_block(item, value, loc=loc) 
    966 
    967   if len(self.blocks) > 100: 

/usr/local/lib/python2.7/dist-packages/pandas/core/internals.pyc in 
_add_new_block(self, item, value, loc) 
    992    loc = self.items.get_loc(item) 
    993   new_block = make_block(value, self.items[loc:loc+1].copy(), 
--> 994        self.items) 
    995   self.blocks.append(new_block) 
    996 

/usr/local/lib/python2.7/dist-packages/pandas/core/internals.pyc in make_block(values, items, ref_items) 
    463   klass = ObjectBlock 
    464 
--> 465  return klass(values, items, ref_items, ndim=values.ndim) 
    466 
    467 # TODO: flexible with index=None and/or items=None 


/usr/local/lib/python2.7/dist-packages/pandas/core/internals.pyc in 
__init__(self, values, items, ref_items, ndim) 
    30   if len(items) != len(values): 
    31    raise AssertionError('Wrong number of items passed (%d vs %d)' 
---> 32         % (len(items), len(values))) 
    33 
    34   self._ref_locs = None 

AssertionError: Wrong number of items passed (1 vs 3) 

을 내 열 MultiIndex되지 않은 경우 : 내 MultiIndex의 수준, 나는 그것이 작동 할 수 없습니다,

start_date = datetime.datetime(2009,3,1,6,29,59) 
r = pandas.date_range(start_date, periods=12) 
cols = ['AAPL', 'GOOG', 'GS'] 
dat = np.random.randn(12, 3) 
dftst2 = pandas.DataFrame(dat, columns=cols, index=r) 
print dftst2 

         AAPL  GOOG  GS 
2009-03-01 06:29:59 2.476787 2.386037 -0.777566 
2009-03-02 06:29:59 -0.820647 1.006159 -0.590240 
2009-03-03 06:29:59 0.433960 0.104458 0.282641 
2009-03-04 06:29:59 0.300190 -0.300786 -1.780412 
2009-03-05 06:29:59 -0.247919 1.616572 1.145594 
2009-03-06 06:29:59 -0.779130 0.695256 0.845819 
2009-03-07 06:29:59 0.572073 0.349394 -3.557776 
2009-03-08 06:29:59 2.019885 0.358346 1.350812 
2009-03-09 06:29:59 0.472328 -0.334223 -0.605862 
2009-03-10 06:29:59 -1.570479 0.410808 0.616515 
2009-03-11 06:29:59 1.177562 -0.240396 -2.126951 
2009-03-12 06:29:59 0.311566 -1.743213 0.382617 

다른 필드를 기준으로 필드를 추가하려면 I 다음을 수행 할 수 있습니다.

dftst2['GOOG_avg'] = pandas.rolling_mean(dftst2['GOOG'], 3) 
print dftst2 


         AAPL  GOOG  GS GOOG_avg 
2009-03-01 06:29:59 2.476787 2.386037 -0.777566  NaN 
2009-03-02 06:29:59 -0.820647 1.006159 -0.590240  NaN 
2009-03-03 06:29:59 0.433960 0.104458 0.282641 1.165551 
2009-03-04 06:29:59 0.300190 -0.300786 -1.780412 0.269944 
2009-03-05 06:29:59 -0.247919 1.616572 1.145594 0.473415 
2009-03-06 06:29:59 -0.779130 0.695256 0.845819 0.670347 
2009-03-07 06:29:59 0.572073 0.349394 -3.557776 0.887074 
2009-03-08 06:29:59 2.019885 0.358346 1.350812 0.467666 
2009-03-09 06:29:59 0.472328 -0.334223 -0.605862 0.124506 
2009-03-10 06:29:59 -1.570479 0.410808 0.616515 0.144977 
2009-03-11 06:29:59 1.177562 -0.240396 -2.126951 -0.054604 
2009-03-12 06:29:59 0.311566 -1.743213 0.382617 -0.524267 

이 나는 ​​패널 객체를 사용하여 시도했지만, 지금까지 내가 MultiIndex의 열이 필드 이상적으로 컬럼의 다른 수준이 방송 될 추가하는 빠른 방법을 발견하지 않았습니다. 이 질문에 답변하는 다른 게시물이 있다면 사과드립니다. 어떤 제안이라도 대단히 감사 할 것입니다.

답변

1

난 당신이 원하는 방송을하는 방법을 알고하지 않습니다하지만 엄격한 할당이 그것을 수행해야합니다

dftst[(('GOOG', 'avg_close'))] = 7 

더 구체적으로 여전히 방송하지 않고 :이 특정 문제에 대한

for tic in cols_1: 
    dftst[(tic, 'avg_close')] = pandas.rolling_mean(dftst[(tic, 'close')],5) 
+0

이 게시물 주셔서 감사합니다, 나는 패널 객체로 그것을 할 방법을 찾아 냈습니다. 그러나 Panel 객체로는 할 수없는 몇 가지 핵심 요소가있는 것으로 보입니다. 나는 다른 게시판에서 특정 패널에 대해 특정 질문을 할 것이다. 다시 한 번 감사드립니다! – granders19

0

을 , 그것은 Panel 객체를 사용하는 것처럼 보인다. 나는 ('가까이', '속도')을 수행하여 항목에 다음과 같은 이동하면

pn = dftst.T.to_panel() 
print pn 

Out[83]: 
<class 'pandas.core.panel.Panel'> 
Dimensions: 12 (items) x 3 (major_axis) x 2 (minor_axis) 
Items axis: 2009-03-01 06:29:59 to 2009-03-12 06:29:59 
Major_axis axis: AAPL to GS 
Minor_axis axis: close to rate 

: 나는 다음 (내 원래의 게시물에서 복용 dftst)를했다 지금

pn = pn.transpose(2,0,1) 
print pn 

Out[91]: 
<class 'pandas.core.panel.Panel'> 
Dimensions: 2 (items) x 12 (major_axis) x 3 (minor_axis) 
Items axis: close to rate 
Major_axis axis: 2009-03-01 06:29:59 to 2009-03-12 06:29:59 
Minor_axis axis: AAPL to GS 

I 시계열 작업을하고 패널 객체의 필드로 추가 할 수 있습니다 :

pn['avg_close'] = pandas.rolling_mean(pn['close'], 5) 
print pn 

Out[93]: 
<class 'pandas.core.panel.Panel'> 
Dimensions: 3 (items) x 12 (major_axis) x 3 (minor_axis) 
Items axis: close to avg_close 
Major_axis axis: 2009-03-01 06:29:59 to 2009-03-12 06:29:59 
Minor_axis axis: AAPL to GS 

print pn['avg_close'] 

Out[94]: 
ticker     AAPL  GOOG  GS 
2009-03-01 06:29:59  NaN  NaN  NaN 
2009-03-02 06:29:59  NaN  NaN  NaN 
2009-03-03 06:29:59  NaN  NaN  NaN 
2009-03-04 06:29:59  NaN  NaN  NaN 
2009-03-05 06:29:59 0.303719 -0.129300 -0.037954 
2009-03-06 06:29:59 -0.006839 0.206331 0.336467 
2009-03-07 06:29:59 0.128299 0.174935 0.698275 
2009-03-08 06:29:59 0.471010 -0.137343 0.671049 
2009-03-09 06:29:59 -0.279855 -0.033427 0.848610 
2009-03-10 06:29:59 -0.516032 0.260944 0.373046 
2009-03-11 06:29:59 -0.456213 0.164710 0.910448 
2009-03-12 06:29:59 -0.799156 0.544132 0.862764 

을 실제로 패널 객체와 다른 문제가 있어요,하지만 난 다른 게시물에 사람들을 남겨 둘 것이다.

4

패널을 사용하고 싶지 않은 경우 약간의 재구성 fu를 고려해 볼 수도 있습니다 (실제로 원하는 API가 없기 때문에 문제를 해결할 수 있습니다). 그래도 거대한 데이터 세트에는 권장하지 않습니다. Panel을 사용하십시오.

In [30]: df = dftst.stack(0) 

In [31]: df['close_avg'] = pd.rolling_mean(df.close.unstack(), 5).stack() 

In [32]: df 
Out[32]: 
field       close  rate close_avg 
        ticker        
2009-03-01 06:29:59 AAPL -0.223042 0.554996  NaN 
        GOOG 0.060127 -0.333992  NaN 
        GS  0.117626 -1.256790  NaN 
2009-03-02 06:29:59 AAPL -0.513743 -0.402661  NaN 
        GOOG 0.059828 -0.125288  NaN 
        GS  -0.336196 -0.510595  NaN 
2009-03-03 06:29:59 AAPL 0.142202 -1.038470  NaN 
        GOOG -1.099251 -0.892581  NaN 
        GS  1.698086 0.885023  NaN 
2009-03-04 06:29:59 AAPL -1.125821 0.413005  NaN 
        GOOG 0.424290 1.106983  NaN 
        GS  0.047158 0.680714  NaN 
2009-03-05 06:29:59 AAPL 0.470050 1.845354 -0.250071 
        GOOG 0.132956 -0.488800 -0.084410 
        GS  0.129190 0.208077 0.331173 
2009-03-06 06:29:59 AAPL -0.087360 -2.102512 -0.222934 
        GOOG 0.165100 -0.134886 -0.063415 
        GS  0.167720 0.082480 0.341192 
2009-03-07 06:29:59 AAPL -0.768542 -0.176076 -0.273894 
        GOOG 0.417694 2.257074 0.008158 
        GS  -1.744730 -1.850185 0.059485 
2009-03-08 06:29:59 AAPL -0.297363 -0.633828 -0.361807 
        GOOG -1.096703 -0.572138 0.008667 
        GS  0.890016 -2.621563 -0.102129 
2009-03-09 06:29:59 AAPL 1.038579 0.053330 0.071073 
        GOOG -0.614050 0.607944 -0.199001 
        GS  -0.882848 0.596801 -0.288130 
2009-03-10 06:29:59 AAPL -0.255226 0.058178 -0.073982 
        GOOG 1.761861 1.841751 0.126780 
        GS  -0.549998 -1.551281 -0.423968 
2009-03-11 06:29:59 AAPL 0.413522 0.149089 0.026194 
        GOOG -2.964163 1.825312 -0.499072 
        GS  -0.373303 1.137001 -0.532173 
2009-03-12 06:29:59 AAPL -0.924776 1.238546 -0.005053 
        GOOG -0.985956 -0.906590 -0.779802 
        GS  -0.320400 1.239681 -0.247307 
1

이것은 10 년 전이지만 똑같은 문제가있었습니다.여기 당신이 찾고있는 것을하기위한 1 라인 방법입니다. pandas 0.18은 이제 소개가되어 조금씩 구르는 의미가 조금 다르지만 포인트를 얻습니다.

avg_close = dftst.xs('close', axis=1, level=1).rolling(5).mean() 
dftst[zip(avg_close.columns, ['avg_close']*len(avg_close.columns))] = avg_close 
+0

10 년의 세 번째! rolling_mean이 다른 답변에서 더 이상 작동하지 않습니까? (나는'zip' loke를 사용하는 것이 python3에서 작동하지 않을 것이라고 생각합니다. dftst [avg_close.columns, 'avg_close'] = avg_close' (또는 다른 방법)을 할 수 있다고 생각했을 것입니까? –

+0

@Andy Hayden 파이썬 3에 대한 zip은 약간 다르다. 당신은'list (zip (avg_close.columns, [ 'avg_close'] * len (avg_close.columns)))''를 사용할 것이다. rolling_mean은 팬더에서 감가 상각되어 조만간 작동하지 않을 것이다. 더 이상 –

+0

아, http://pandas.pydata.org/pandas-docs/version/0.18.1/whatsnew.html#window-functions-are-now-methods가 표시됩니다. –

관련 문제