2016-04-11 6 views
2

私は自転車のレンタルや天気の需要について毎時のデータを持っています。良い天気と悪天候とを別々に、毎時の平均需要をプロットしたいと思います。今bincountをpythonの節に使用する方法はありますか?

hour_count = np.bincount(hour) 
for i in range(number_of_observations): 
    hour_sums[hour[i]] = hour_sums[hour[i]] + rentals[i] 

av_rentals = [x/y for x,y in zip(hour_sums,hour_count)] 

:私は与えられた時間で、私はレンタルのための計算総需要だった何をしたか(アカウントの天候を考慮せずに)与えられた時間での平均需要をプロットして、時間の合計数で割る

私は同じことをしたいと思いますが、良い天気と悪天候のために別々にします。累積合計は簡単でした。私は 'if'節を追加しました。私は良い天気と悪い天気の時間を数えることと何をすべきかわかりません。私は合計のような大きなループを避けることを好むでしょう... bincountと同じことをするが、節を持つ関数は?次のようなもの:

good_weather_hour_count = np.bincount(hour, weather == 1 or weather == 2) 


PS。おそらく誰かがループなしで所定の時間レンタルを合計する方法を知っていますか?私は2Dヒストグラムで何かを試しましたが、うまくいきませんでした。

label_sums = np.histogram2d(hour, rentals, bins=24)[0] 

答えて

2

np.bincount has a weights parameterで重み付けレンタル数。良い/悪い天気を処理するために、あなたはhourrentalsを隠すことができ

hour_sums = np.bincount(hour, weights=rentals, minlength=24) 

for i in range(number_of_observations): 
    hour_sums[hour[i]] = hour_sums[hour[i]] + rentals[i] 

:例えば、このよう

In [39]: np.bincount([1,2,3,1], weights=[20,10,40,10]) 
Out[39]: array([ 0., 30., 10., 40.]) 

、あなたはfor-loopを置き換えることができます適用するデータのサブセットのみを選択するデータ:

mask = (weather == w) 
masked_hour = hour[mask] 
masked_rentals = rentals[mask] 

その後masked_hourmasked_rentals上で計算を実行します。

import numpy as np 

np.random.seed(2016) 
N = 2 
hour = np.tile(np.arange(24), N) 
rentals = np.random.randint(10, size=(len(hour),)) 
# say, weather=1 means good weather, 2 means bad weather 
weather = np.random.randint(1, 3, size=(len(hour),)) 

average_rentals = dict() 
for kind, w in zip(['good', 'bad', 'all'], [1, 2, None]): 
    if w is None: 
     mask = slice(None) 
    else: 
     mask = (weather == w) 
    masked_hour = hour[mask] 
    masked_rentals = rentals[mask] 
    total_rentals = np.bincount(masked_hour, weights=masked_rentals, minlength=24) 
    total_hours = np.bincount(masked_hour, minlength=24) 
    average_rentals[kind] = (total_rentals/total_hours) 

for kind, result in average_rentals.items(): 
    print('\n{}: {}'.format(kind, result)) 

利回り

bad: [ 4. 6. 2. 5.5 nan 4. 4. 8. nan 3. nan 2.5 4. nan 9. 
    nan 3. 5.5 8. nan 8. 5. 9. 4. ] 

good: [ 3. nan 4. nan 8. 4. nan 7. 5.5 2. 4. nan nan 0.5 9. 
    0.5 nan nan 5. 7. 1. 7. 8. 0. ] 

all: [ 3.5 6. 3. 5.5 8. 4. 4. 7.5 5.5 2.5 4. 2.5 4. 0.5 9. 
    0.5 3. 5.5 6.5 7. 4.5 6. 8.5 2. ] 
1

私はnumpyのわからないんだけど、あなたは、標準ライブラリとかなり簡単にこれを行うことができます:あなたは時間のbincountを取るために使用することができます

from collections import Counter, defaultdict 

weather_counts = defaultdict(Counter) 

times = [ 
    {'time': '1:00 AM', 'weather': 1}, 
    {'time': '2:00 AM', 'weather': 2}, 
    {'time': '5:00 PM', 'weather': 2}, 
    {'time': '3:00 AM', 'weather': 1}, 
    {'time': '1:00 AM', 'weather': 1}, 
] 

rentals = [ 
    1, 
    2, 
    5, 
    3, 
    3, 
] 

for times, rental_count in zip(times, rentals): 
    weather_counts[times['weather']][times['time']] += rental_count 

import pprint; pprint.pprint(weather_counts) 
関連する問題