2014-10-22 3 views
1

저는 팬더 (그리고 파이썬 ...과 프로그래밍)에 비교적 익숙하며 몬테카를로 시뮬레이션을 시도하고 있습니다.하지만 합리적인 양의 솔루션을 찾을 수는 없습니다 시간팬더 데이터 프레임을 사용한 무작위 샘플링

데이터는 제품

Date   Product_A  Product_B  Product_C  Product_D  ... Product_XX 
01/01/2014   1000   300   70   34500  ...   780 
02/01/2014   400   400   70   20  ...   10 
03/01/2014   1110   400   1170   60  ...   50 
04/01/2014   20   320    0   71300  ...   10 
     ... 
15/10/2014   1000   300   70   34500  ...   5000 

당 하루 매출이있다 "YTDSales"라는 데이터 프레임에 저장하고 제가하고 싶은 나머지 사용하는 것으로, 다양한 시나리오를 시뮬레이션 할 수 있습니다 그 해 (10 월 15 일에서 연말) 각 제품이 가지고있는 과거 분포. 표시되는 데이터 예를 들어 나는 내가 무슨 짓을했는지하는이 솔루션은 작동 다음

# creates range of "future dates" 
last_historical = YTDSales.index.max() 
year_end = dt.datetime(2014,12,30) 
DatesEOY = pd.date_range(start=last_historical,end=year_end).shift(1) 

# function that obtains a random sales number per product, between max and min 
f = lambda x:np.random.randint(x.min(),x.max()) 

# create all the "future" dates and fill it with the output of f 
for i in DatesEOY: 
    YTDSales.loc[i]=YTDSales.apply(f) 

이지만, 약 3 소요 20 (1100)

사이에 판매를 올해의 나머지 부분을 채우기 위해 같은 것 초, 1000 회 반복을 계획한다면 많이 필요합니다 ... 반복하지 않을 방법이 있습니까?

감사

답변

0

는 한 번에 필요한 크기의 샘플을 얻을 수 np.random.randintsize 옵션을 사용합니다. 내가 고려할 하나의 접근법은 다음과 같습니다.

  1. 원래 DataFrame에서 인덱스 DatesEOY의 값, 열이있는 새로운 배열로해야하는 공간, 모든 NaN의 값을 할당합니다. 그런 다음 원본 데이터에 연결합니다.

  2. 이제 각 임의 샘플의 길이를 알고 있으므로 numpy.random.randint에 여분의 size 키워드를 사용하여 루핑 대신 열 단위로 모두 샘플링 할 수 있습니다.

  3. 이 배치 샘플링으로 데이터를 덮어 씁니다. 나는 새로운 "자리"하나 예전를 연결하여, 완전히 새로운 DataFrame을 선택, 길을 따라

    new_df = pandas.DataFrame(index=DatesEOY, columns=YTDSales.columns) 
    
    num_to_sample = len(new_df) 
    
    f = lambda x: np.random.randint(x[1].min(), x[1].max(), num_to_sample) 
    
    output = pandas.concat([YTDSales, new_df], axis=0) 
    
    output[len(YTDSales):] = np.asarray(map(f, YTDSales.iteritems())).T 
    

    :

다음은이 같이 볼 수 있었다거야. 이것은 대용량 데이터의 경우 비효율적 일 수 있습니다.

for-loop 솔루션에서했던 것처럼 접근 방식이 setting with enlargement입니다.

나는 인덱스의 일괄 처리를 한 번에 "확대"하는 방법을 찾기에 충분히 길지 않았습니다. 그러나 이것을 알아 내면 인덱스 값이 DatesEOY 인 모든 NaN 값을 가진 원본 데이터 프레임을 "확대"한 다음 output을 가져 오는 대신 YTDSales에 함수를 적용하면됩니다.

관련 문제