2017-02-23 4 views
1

이이에 대한 후속 질문 :팬더 날짜 인덱스 컬럼의 부품을 교체

: 여기
import pandas as pd 
from pandas_datareader import data, wb 
import numpy as np 
from datetime import date 

pd.set_option('expand_frame_repr', False) 

df = data.DataReader('GE', 'yahoo', date (2000, 1, 1), date (2000, 2, 1)) 
df['x'] = np.where (df['Open'] > df['High'].shift(-2), 1, np.nan) 
print (df.round(2)) 

# this section of code works perfectly for an integer based index....... 
ii = df[pd.notnull(df['x'])].index 
dd = np.diff(ii) 
jj = [ii[i] for i in range(1,len(ii)) if dd[i-1] > 2] 
jj = [ii[0]] + jj 

for ci in jj: 
    df.loc[ci:ci+2,'x'] = 1.0 
# end of section that works perfectly for an integer based index...... 

print (df.round(2)) 

내 전류 출력 : 여기 pandas replace only part of a column

내 현재의 입력

   Open High  Low Close Volume Adj Close x 
Date                 
2000-01-03 153.00 153.69 149.19 150.00 22069800  29.68 1.0 
2000-01-04 147.25 148.00 144.00 144.00 22121400  28.49 1.0 
2000-01-05 143.75 147.00 142.56 143.75 27292800  28.44 NaN 
2000-01-06 143.12 146.94 142.63 145.67 19873200  28.82 NaN 
2000-01-07 148.00 151.88 147.00 151.31 20141400  29.94 NaN 
2000-01-10 152.69 154.06 151.12 151.25 15226500  29.93 NaN 
2000-01-11 151.00 152.69 150.62 151.50 15123000  29.98 NaN 
2000-01-12 151.06 153.25 150.56 152.00 18342300  30.08 NaN 
2000-01-13 153.13 154.94 153.00 153.75 14953500  30.42 1.0 
2000-01-14 153.38 154.63 149.56 151.00 18480300  29.88 1.0 
2000-01-18 149.62 149.62 146.75 148.00 18296700  29.29 NaN 
2000-01-19 146.50 150.94 146.25 148.72 14849700  29.43 NaN 
2000-01-20 149.06 149.75 142.63 145.94 30759000  28.88 1.0 
2000-01-21 147.94 148.25 143.94 144.13 24005400  28.52 1.0 
2000-01-24 145.31 145.94 136.44 138.13 27116100  27.33 1.0 
2000-01-25 138.06 140.38 137.00 138.50 25387500  27.41 NaN 
2000-01-26 140.50 142.19 138.88 141.44 15856800  27.99 NaN 
2000-01-27 141.56 141.75 137.06 141.75 19243500  28.05 1.0 
2000-01-28 140.31 140.50 133.63 134.00 29846700  26.52 1.0 
2000-01-31 134.00 135.94 133.06 134.00 21782700  26.52 NaN 
2000-02-01 134.25 137.00 134.00 136.00 27339000  26.91 NaN 
Traceback (most recent call last): 
    File "C:\stocks\question4 for stack overflow.py", line 15, in <module> 
    jj = [ii[i] for i in range(1,len(ii)) if dd[i-1] > 2] 
    File "C:\stocks\question4 for stack overflow.py", line 15, in <listcomp> 
    jj = [ii[i] for i in range(1,len(ii)) if dd[i-1] > 2] 
TypeError: Cannot cast ufunc greater input from dtype('<m8[ns]') to dtype('<m8') with casting rule 'same_kind' 

내가하고 싶은 것은 'x'열을 세 개의 1이 아닌 행 집합으로 변경하는 것입니다. 원하는 출력은 다음과 같습니다.

   Open High  Low Close Volume Adj Close x 
Date                 
2000-01-03 153.00 153.69 149.19 150.00 22069800  29.68 1.0 
2000-01-04 147.25 148.00 144.00 144.00 22121400  28.49 1.0 
2000-01-05 143.75 147.00 142.56 143.75 27292800  28.44 1.0 
2000-01-06 143.12 146.94 142.63 145.67 19873200  28.82 NaN 
2000-01-07 148.00 151.88 147.00 151.31 20141400  29.94 NaN 
2000-01-10 152.69 154.06 151.12 151.25 15226500  29.93 NaN 
2000-01-11 151.00 152.69 150.62 151.50 15123000  29.98 NaN 
2000-01-12 151.06 153.25 150.56 152.00 18342300  30.08 NaN 
2000-01-13 153.13 154.94 153.00 153.75 14953500  30.42 1.0 
2000-01-14 153.38 154.63 149.56 151.00 18480300  29.88 1.0 
2000-01-18 149.62 149.62 146.75 148.00 18296700  29.29 1.0 
2000-01-19 146.50 150.94 146.25 148.72 14849700  29.43 NaN 
2000-01-20 149.06 149.75 142.63 145.94 30759000  28.88 1.0 
2000-01-21 147.94 148.25 143.94 144.13 24005400  28.52 1.0 
2000-01-24 145.31 145.94 136.44 138.13 27116100  27.33 1.0 
2000-01-25 138.06 140.38 137.00 138.50 25387500  27.41 NaN 
2000-01-26 140.50 142.19 138.88 141.44 15856800  27.99 NaN 
2000-01-27 141.56 141.75 137.06 141.75 19243500  28.05 1.0 
2000-01-28 140.31 140.50 133.63 134.00 29846700  26.52 1.0 
2000-01-31 134.00 135.94 133.06 134.00 21782700  26.52 1.0 
2000-02-01 134.25 137.00 134.00 136.00 27339000  26.91 NaN 

따라서 1 월 5 일, 18 및 31은 NaN에서 1.0으로 변경됩니다.

위에서 언급 한 것처럼 코드의 두 번째 부분은 정수 기반 인덱스에 대해 완벽하게 작동합니다. 그러나 dtype datetime64 [ns]의 datetime 인덱스를 사용하면 작동하지 않습니다. 이 코드가 작동하도록 (잘하면) 코드의 두 번째 부분을 약간 조정해야한다고 생각합니다. 사전에

감사합니다, 데이비드

-------------------------- 섹션을 따라 ------- -----------------------------

나와 함께 거기에 매달려 주셔서 감사합니다. 나는 그것의 간결함 때문에 최고 해결책으로 유지하는 것을 진짜로 시도하고있다. 범위 (1, LEN (Ⅱ))의 경우 DD에 [I]를 I위한

원래 출력 ... JJ = [Ⅱ : i는 상자에서 코드를 실행할 때, 여기에 출력되고 [I-1]> 2] ...

... A [CI : 정말 일어나고 그래서이 무엇인지 이해하려고 CI + 2] = 1.0 ...

   Open High  Low Close Volume Adj Close x ii dd jj jj desired 
Date                 
2000-01-03 153.00 153.69 149.19 150.00 22069800  29.68 1.0 1 
2000-01-04 147.25 148.00 144.00 144.00 22121400  28.49 1.0 1 
2000-01-05 143.75 147.00 142.56 143.75 27292800  28.44 1.0 2   x x 
2000-01-06 143.12 146.94 142.63 145.67 19873200  28.82 1.0 3 1 
2000-01-07 148.00 151.88 147.00 151.31 20141400  29.94 NaN 4 1 
2000-01-10 152.69 154.06 151.12 151.25 15226500  29.93 NaN 5 1 
2000-01-11 151.00 152.69 150.62 151.50 15123000  29.98 NaN 6 1 
2000-01-12 151.06 153.25 150.56 152.00 18342300  30.08 NaN 7 1 
2000-01-13 153.13 154.94 153.00 153.75 14953500  30.42 1.0 1 
2000-01-14 153.38 154.63 149.56 151.00 18480300  29.88 1.0 1 
2000-01-18 149.62 149.62 146.75 148.00 18296700  29.29 1.0 10 3 x x x 
2000-01-19 146.50 150.94 146.25 148.72 14849700  29.43 1.0 11 1 
2000-01-20 149.06 149.75 142.63 145.94 30759000  28.88 1.0 1 
2000-01-21 147.94 148.25 143.94 144.13 24005400  28.52 1.0 1 
2000-01-24 145.31 145.94 136.44 138.13 27116100  27.33 1.0 1 
2000-01-25 138.06 140.38 137.00 138.50 25387500  27.41 1.0 15 4 z z 
2000-01-26 140.50 142.19 138.88 141.44 15856800  27.99 1.0 16 1 
2000-01-27 141.56 141.75 137.06 141.75 19243500  28.05 1.0 1 
2000-01-28 140.31 140.50 133.63 134.00 29846700  26.52 1.0 1 
2000-01-31 134.00 135.94 133.06 134.00 21782700  26.52 1.0 19 3 x x x 
2000-02-01 134.25 137.00 134.00 136.00 27339000  26.91 1.0 20 1    

열 ii, dd, jj before, jj after 및 desired를 설정하십시오. 난에 입력 조정할 때 =

... JJ를 [범위 II [I]를 I (1, LEN (Ⅱ))의 경우 [DD I-1]> 2 ...

...

   Open High  Low Close Volume Adj Close x 
Date                 
2000-01-03 153.00 153.69 149.19 150.00 22069800  29.45 1.0 
2000-01-04 147.25 148.00 144.00 144.00 22121400  28.27 1.0 
2000-01-05 143.75 147.00 142.56 143.75 27292800  28.22 1.0 
2000-01-06 143.12 146.94 142.63 145.67 19873200  28.60 NaN 
2000-01-07 148.00 151.88 147.00 151.31 20141400  29.70 NaN 
2000-01-10 152.69 154.06 151.12 151.25 15226500  29.69 NaN 
2000-01-11 151.00 152.69 150.62 151.50 15123000  29.74 NaN 
2000-01-12 151.06 153.25 150.56 152.00 18342300  29.84 NaN 
2000-01-13 153.13 154.94 153.00 153.75 14953500  30.18 1.0 
2000-01-14 153.38 154.63 149.56 151.00 18480300  29.64 1.0 
2000-01-18 149.62 149.62 146.75 148.00 18296700  29.05 1.0 
2000-01-19 146.50 150.94 146.25 148.72 14849700  29.19 NaN 
2000-01-20 149.06 149.75 142.63 145.94 30759000  28.65 1.0 
2000-01-21 147.94 148.25 143.94 144.13 24005400  28.29 1.0 
2000-01-24 145.31 145.94 136.44 138.13 27116100  27.12 1.0 
2000-01-25 138.06 140.38 137.00 138.50 25387500  27.19 1.0 
2000-01-26 140.50 142.19 138.88 141.44 15856800  27.77 NaN 
2000-01-27 141.56 141.75 137.06 141.75 19243500  27.83 1.0 
2000-01-28 140.31 140.50 133.63 134.00 29846700  26.31 1.0 
2000-01-31 134.00 135.94 133.06 134.00 21782700  26.31 1.0 
2000-02-01 134.25 137.00 134.00 136.00 27339000  26.70 NaN 

유일한 문제는 np.diff이 값을주고 월 25과 같다 : CI : CI + 1] = 1.0 ... 여기

가 출력되고 4. 기존의 3 개 1 세트 만 남겨 두려면 4의 값을 건너 뛰는 코드가 필요합니다.

dd[dd == 4] = 1 

dd = [3 if x==4 else x for x in dd] 

는이와 JJ 항목을 수정하려고 : 내가 그것을 작동하지 않았다 이러한 두 가지 시도와 JJ 상태가되기 전에 DD를 수정하려고

JJ = [II를 [내가] 난에 대한 범위 (1, LEN (Ⅱ))의 경우 ((DD의 == 4) 또는 (DD에 [I-1]> 2))]

이 오류 메시지 제공

:

Traceback (most recent call last): 
    File "C:\stocks\question4 for stack overflow.py", line 109, in <module> 
    jj = [ii[i] for i in range(1,len(ii)) if ((dd == 4) or (dd[i-1] > 2))] 
    File "C:\stocks\question4 for stack overflow.py", line 109, in <listcomp> 
    jj = [ii[i] for i in range(1,len(ii)) if ((dd == 4) or (dd[i-1] > 2))] 
ValueError: The truth value of an array with more than one element is  ambiguous. Use a.any() or a.all() 

누구나 가지고를 어떤 아이디어?

+0

당신은'loc' 대신에 혼합 레이블/정수 기반 접근에 대해'ix'를 사용하거나 reset_index를 시도하고 변환을 수행하고 날짜로 set_index를 다시 시도하십시오 – Anzel

+0

코드 논리를 설명 할 수 있습니까? 너 뭐하려고? 왜 그 행에서 3 개의 연속 1이 필요한가요? – Parfait

+0

아빠 - 이것은 단지 하나의 예입니다. 그것의 뒤에 특별한 이유 없음. –

답변

-1

--------------------- 최종 답변/--- 글쎄, 파트 타임 노력과 수십 시간의 주 그러나 나는 그것을 마침내 얻었다! 나는이 코드가 무딘 도구라는 것을 알고 있지만 작동한다. 코드 줄이기 또는 속도 향상에 대한 제안 사항이 있으면 알려 주시기 바랍니다. - 볼 (3) 대신에 단지 1

   Open High  Low Close Volume Adj Close x x2 
Date                  
2000-01-03 153.00 153.69 149.19 150.00 22069800  29.45 NaN NaN 
2000-01-04 147.25 148.00 144.00 144.00 22121400  28.27 NaN NaN 
2000-01-05 143.75 147.00 142.56 143.75 27292800  28.22 1.0 1.0 
2000-01-06 143.12 146.94 142.63 145.67 19873200  28.60 1.0 2.0 
2000-01-07 148.00 151.88 147.00 151.31 20141400  29.70 1.0 3.0 
2000-01-10 152.69 154.06 151.12 151.25 15226500  29.69 1.0 1.0 
2000-01-11 151.00 152.69 150.62 151.50 15123000  29.74 1.0 2.0 
2000-01-12 151.06 153.25 150.56 152.00 18342300  29.84 1.0 3.0 
2000-01-13 153.13 154.94 153.00 153.75 14953500  30.18 NaN NaN 
2000-01-14 153.38 154.63 149.56 151.00 18480300  29.64 NaN NaN 
2000-01-18 149.62 149.62 146.75 148.00 18296700  29.05 1.0 1.0 
2000-01-19 146.50 150.94 146.25 148.72 14849700  29.19 1.0 2.0 
2000-01-20 149.06 149.75 142.63 145.94 30759000  28.65 NaN 3.0 
2000-01-21 147.94 148.25 143.94 144.13 24005400  28.29 NaN NaN 
2000-01-24 145.31 145.94 136.44 138.13 27116100  27.12 NaN NaN 
2000-01-25 138.06 140.38 137.00 138.50 25387500  27.19 1.0 1.0 
2000-01-26 140.50 142.19 138.88 141.44 15856800  27.77 NaN 2.0 
2000-01-27 141.56 141.75 137.06 141.75 19243500  27.83 NaN 3.0 
2000-01-28 140.31 140.50 133.63 134.00 29846700  26.31 NaN NaN 
2000-01-31 134.00 135.94 133.06 134.00 21782700  26.31 1.0 1.0 
2000-02-01 134.25 137.00 134.00 136.00 27339000  26.70 1.0 2.0 
2000-02-02 137.12 137.62 134.06 134.06 21820200  26.32 1.0 3.0 
2000-02-03 135.94 139.81 135.25 139.25 20232000  27.34 1.0 1.0 
2000-02-04 141.00 143.12 140.50 141.56 18167100  27.79 NaN 2.0 
2000-02-07 141.69 141.75 135.88 136.50 18285000  26.80 NaN 3.0 

i가 1을 표시하는 칼럼 (X2)의 값을 변경 여기

import pandas as pd 
from pandas_datareader import data, wb 
import numpy as np 
from datetime import date 

df = data.DataReader('GE', 'yahoo', date (2000, 1, 1), date (2000, 6, 1)) 
df['x'] = np.where (df['Open'] < df['High'].shift(-2), 1, np.nan) 
df['x2'] = df['x'] 

test = 0 

for i in np.nditer(df['x2'], op_flags=['readwrite']): 

    if test == 4: 
     test = 0 

    if test == 3: 
     i[...] = 3 
     test = 4 

    if test == 2: 
     i[...] = 2 
     test = 3 

    if (test == 1) & (i[...] == 1): 
     i[...] = 1 
     test = 2 

    if (test == 0) & (i[...] == 1): 
     i[...] = 1 
     test = 2 

    if (test == 0) & (i[...] == np.nan): 
     i[...] = np.nan 
     test = 1 

print (df.round(2)) 

이 섹션을 최종 출력된다 : 여기

최종 입력 새로운 시리즈가 오래된 시리즈의 끝에서 시작했을 때.

+0

-1을 이해하지 못하겠습니까 ... 설명해 주시겠습니까? –

1

는 인덱스에 의존하지 않는 경우 코드가 작동 것이다 : 나는 결과가 비록 찾고있는 정확하게 것을 확실하지 않다

#mod version 
a = np.array(df.x) 
ii = np.where(np.isnan(a))[0] 

dd = np.diff(ii) 
jj = [ii[i] for i in range(1,len(ii)) if dd[i-1] > 2] 
jj = [ii[0]] + jj 

for ci in jj: 
    a[ci:ci+2] = 1.0 
df.x = a 

...

코드 아래에서 특정 패턴을 검색 한 다음 을 다른 정의 된 패턴으로 바꿀 수 있습니다. 단점은 검색 패턴의 수에 따라 을 통해 전체 배열을 여러 번 반복한다는 것입니다. 은 데이터 크기에 따라 달라질 수도 있고 그렇지 않을 수도 있습니다.

'발견 된'패턴이 표시되며 결과가 중복되지 않도록 후속 검색 루프에 포함되지 않습니다. 검색은 우선 순위 방식으로 이루어집니다. 패턴의 요소를 조정하고 목록을 채워 규칙을 변경합니다.

나는

# search patterns in original data (zeros represent nans) 
p1 = [1., 1., 1.] 
p2 = [1., 0., 1.] 
p3 = [1., 1., 0.] 
p4 = [1., 0., 0.] 

# markers to 'set aside' found patterns (can be any list of floats > 1.0 
# for each, the same float for each fill makes it easy to see which 
# replacements were done where for testing...) 
f1 = [5., 5., 5.] 
f2 = [4., 4., 4.] 
f3 = [3., 3., 3.] 
f4 = [2., 2., 2.] 

patterns = [p1, p2, p3, p4] 
fills = [f1, f2, f3, f4] 

def fill_segments(a, test_patterns, fill_patterns): 
    # replace nans with zeros so fast numpy array_equal will work 
    nan_idx = np.where(np.isnan(a))[0] 
    np.put(a, nan_idx, 0.) 
    col_index = list(np.arange(a.size)) 
    # loop forward through sequence comparing segment patterns 
    for j in np.arange(len(test_patterns)): 
     this_pattern = test_patterns[j] 
     snip = len(this_pattern) 
     rng = col_index[:-snip + 1] 
     for i in rng: 
      seg = a[col_index[i: i + snip]] 
      if np.array_equal(seg, this_pattern): 
       # when a match is found, replace values in array segment 
       # with fill pattern 
       pattern_indexes = col_index[i: i + snip] 
       np.put(a, pattern_indexes, fill_patterns[j]) 
    # convert all fillers to ones 
    np.put(a, np.where(a > 1.)[0], 1.) 
    # convert zeros back to nans 
    np.put(a, np.where(a == 0.)[0], np.nan) 

    return a 

... 패턴이 출력이 previous question 있지만 가볍게 테스트되었습니다마다 원하는 생산하고 아래 규칙 실행 기능을 생각하고 열

df.x = fill_segments(np.array(df.x), patterns, fills) 

에게 df.x에 할당 입력 :

   Open High  Low Close Volume Adj Close x 
Date                 
2000-01-03 153.00 153.69 149.19 150.00 22069800 29.68  1.0 
2000-01-04 147.25 148.00 144.00 144.00 22121400 28.49  1.0 
2000-01-05 143.75 147.00 142.56 143.75 27292800 28.44  NaN 
2000-01-06 143.12 146.94 142.63 145.67 19873200 28.82  NaN 
2000-01-07 148.00 151.88 147.00 151.31 20141400 29.94  NaN 
2000-01-10 152.69 154.06 151.12 151.25 15226500 29.93  NaN 
2000-01-11 151.00 152.69 150.62 151.50 15123000 29.98  NaN 
2000-01-12 151.06 153.25 150.56 152.00 18342300 30.08  NaN 
2000-01-13 153.13 154.94 153.00 153.75 14953500 30.42  1.0 
2000-01-14 153.38 154.63 149.56 151.00 18480300 29.88  1.0 
2000-01-18 149.62 149.62 146.75 148.00 18296700 29.29  NaN 
2000-01-19 146.50 150.94 146.25 148.72 14849700 29.43  NaN 
2000-01-20 149.06 149.75 142.63 145.94 30759000 28.88  1.0 
2000-01-21 147.94 148.25 143.94 144.13 24005400 28.52  1.0 
2000-01-24 145.31 145.94 136.44 138.13 27116100 27.33  1.0 
2000-01-25 138.06 140.38 137.00 138.50 25387500 27.41  NaN 
2000-01-26 140.50 142.19 138.88 141.44 15856800 27.99  NaN 
2000-01-27 141.56 141.75 137.06 141.75 19243500 28.05  1.0 
2000-01-28 140.31 140.50 133.63 134.00 29846700 26.52  1.0 
2000-01-31 134.00 135.94 133.06 134.00 21782700 26.52  NaN 
2000-02-01 134.25 137.00 134.00 136.00 27339000 26.91  NaN 

출력 :

   Open High  Low Close Volume Adj Close x 
Date                 
2000-01-03 153.00 153.69 149.19 150.00 22069800 29.68  1.0 
2000-01-04 147.25 148.00 144.00 144.00 22121400 28.49  1.0 
2000-01-05 143.75 147.00 142.56 143.75 27292800 28.44  1.0 
2000-01-06 143.12 146.94 142.63 145.67 19873200 28.82  NaN 
2000-01-07 148.00 151.88 147.00 151.31 20141400 29.94  NaN 
2000-01-10 152.69 154.06 151.12 151.25 15226500 29.93  NaN 
2000-01-11 151.00 152.69 150.62 151.50 15123000 29.98  NaN 
2000-01-12 151.06 153.25 150.56 152.00 18342300 30.08  NaN 
2000-01-13 153.13 154.94 153.00 153.75 14953500 30.42  1.0 
2000-01-14 153.38 154.63 149.56 151.00 18480300 29.88  1.0 
2000-01-18 149.62 149.62 146.75 148.00 18296700 29.29  1.0 
2000-01-19 146.50 150.94 146.25 148.72 14849700 29.43  NaN 
2000-01-20 149.06 149.75 142.63 145.94 30759000 28.88  1.0 
2000-01-21 147.94 148.25 143.94 144.13 24005400 28.52  1.0 
2000-01-24 145.31 145.94 136.44 138.13 27116100 27.33  1.0 
2000-01-25 138.06 140.38 137.00 138.50 25387500 27.41  NaN 
2000-01-26 140.50 142.19 138.88 141.44 15856800 27.99  NaN 
2000-01-27 141.56 141.75 137.06 141.75 19243500 28.05  1.0 
2000-01-28 140.31 140.50 133.63 134.00 29846700 26.52  1.0 
2000-01-31 134.00 135.94 133.06 134.00 21782700 26.52  1.0 
2000-02-01 134.25 137.00 134.00 136.00 27339000 26.91  NaN