2017-07-21 14 views
0

パンダの価格統計は

は70倍の数として(時間をかけて散発的に変更することができ、リストの価格のセットを考えると...ループを反復処理する以外に、この問題にアプローチするパンダのデータフレームの道があるように持っています四半期ではなく、日付のみで、時間はありません)、価格の上昇と下降を含む、私は開始価格、終了価格、最大価格、最小価格、平均価格、および価格を四半期に45日間求めています。

list_prices = [ 
    {'product': 'prodA', 'price': 68.40, 'eff_date': '2016-12-01'}, 
    {'product': 'prodA', 'price': 69.50, 'eff_date': '2017-02-17'}, 
    {'product': 'prodB', 'price': 34.20, 'eff_date': '2015-10-18'}, 
    {'product': 'prodB', 'price': 32.55, 'eff_date': '2016-01-07'}, 
    {'product': 'prodC', 'price': 19.95, 'eff_date': '2017-03-01'}, 
    ] 

およびコンピューティング2017Q1ため、

quarter product start end min max  mean day45 
0 prodA 2017Q1 68.4 69.5 68.4 69.5 68.92556 68.4 
1 prodB 2017Q1 32.2 32.55 34.2 32.55  32.66 32.55 
2 prodC 2017Q1 NaN 19.95 19.95 19.95  19.95 NaN 

結果を時間で4つの四半期に計算されるので、結果は、端部を行インデックスとしてQTR及び開始、PRODの行列であり、MIN、MAX 、mean、mid

OHLCを使用したリサンプルは、日付が四半期の日付を超えている場合には機能しますが、適切な手法が見つからない場合があります。

だから、これに接近するためのパンダブルな方法はありますか?

答えて

0
df = pd.DataFrame(list_prices) 

# convert eff_date to datetime object 
df['eff_date'] = pd.to_datetime(df['eff_date']) 

# set eff_date as index. helps with grouping by quarter 
df.set_index('eff_date', inplace=True) 

def get_metrics(x): 

    # start of the quarter 
    start = x.iloc[0] 

    # end of the quarter 
    end = x.iloc[-1] 

    # middle of the quarter 
    mid_date_index = int(len(x)/2) 
    mid = x.iloc[mid_date_index] 

    max = x.max() 
    min = x.min() 
    mean = x.mean() 

    return pd.Series({'max': max, 'min': min, 'mean': mean, 'start': start, 'end': end, 'mid': mid}) 

# groupby product and quarter and get all the metrics 
df.groupby(['product', pd.TimeGrouper('Q')])['price'].apply(get_metrics).unstack()