2016-04-11 29 views
2

Bisiklet kiralama ve hava durumu talepleriyle ilgili saatlik verilerim var. Her saat için ortalama talebi, iyi ve kötü hava koşullarıyla ayrı ayrı çizmek istiyorum. ŞimdiPiliç içinde bir deyim ile bin hesabını kullanmanın bir yolu var mı?

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)] 

: Ben belli bir saatte ben kiralama için hesaplamak toplam talebin olduğunu ne yaptığını (hesap havalarda içine almadan) belirli bir saatte ortalama talebini çizilen ve daha sonra saat toplam sayısına bölün

Aynı şeyi yapmak isterdim, fakat iyi hava ve kötü hava koşulları için ayrı ayrı. Kümülatif toplam kolaydı, bir 'if' cümlesi ekledim. İyi ve kötü hava saatlerini saymakla ne yapacağımı bilmiyorum. Toplamı gibi büyük bir döngü yapmaktan kaçınmayı tercih ederim ... bincount ile aynı şeyi yapan bir işlev var mı? Şunlar gibi bir şey:

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

Herhangi bir fikir?
PS. Belki bir kişi, bir döngü olmadan belirli bir saat için kiralamaları nasıl bilir? 2d histogram ile bir şey denedim, ama işe yaramadı.

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

cevap

2

np.bincount has a weights parameter Eğer saatlik bir bincount tarafından ağırlıklı almak için kullanabileceğiniz kiralama sayısı. Örneğin,

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

, sen for-loop değiştirebilirsiniz:

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

iyi/kötü hava işlemek için

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

ile maskelemek olabilir hour ve rentals Yalnızca geçerli olan verilerin alt kümesini seçmek için veriler:

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

sonra masked_hour ve masked_rentals ilgili hesaplama yapmak:

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. ] 
verir
1

Ben Numpy konusunda emin değilim ama standart kütüphane ile oldukça kolay yapabilirsiniz:

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)