python - Numpy और maplotlib का उपयोग करते हुए गणना के बजाय योग का हिस्टोग्राम



matplotlib sum (1)

दोनों Matplotlib hist समारोह और NumPy histogram समारोह एक weights वैकल्पिक खोजशब्द तर्क है। मुझे लगता है कि आपके पहले कोड में बदलने के लिए केवल प्रासंगिक लाइनें दिखना चाहिए:

ax[0].hist(qtime[jobs['charge_rate']==1], weights=area[jobs['charge_rate']==1],
           bins=bins, label='Normal', color='b')
ax[1].hist(qtime[jobs['charge_rate']==3], weights=area[jobs['charge_rate']==3],
           bins=bins, label='Express', color='g')

मेरे पास कुछ डेटा प्रति पंक्ति दो स्तंभ हैं मेरे मामले में नौकरी सबमिशन समय और क्षेत्र।

मैंने एक्स अक्ष पर दिन से बनी हुई समय के साथ एक ग्राफ का निर्माण करने के लिए matplotlib के हिस्ट फंक्शन का इस्तेमाल किया है, और प्रति दिन y अक्ष पर गिनती की है:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
import datetime as dt

def timestamp_to_mpl(timestamp):
    return mpl.dates.date2num(dt.datetime.fromtimestamp(timestamp))

nci_file_name = 'out/nci.csv'
jobs = np.genfromtxt(nci_file_name, dtype=int, delimiter=',', names=True, usecols(1,2,3,4,5))

fig, ax = plt.subplots(2, 1, sharex=True)
vect_timestamp_to_mpl = np.vectorize(timestamp_to_mpl)
qtime = vect_timestamp_to_mpl(jobs['queued_time'])
start_date = dt.datetime(2013, 1, 1)
end_date = dt.datetime(2013, 4, 1)
bins = mpl.dates.drange(start_date, end_date, dt.timedelta(days=1))
ax[0].hist(qtime[jobs['charge_rate']==1], bins=bins, label='Normal', color='b')
ax[1].hist(qtime[jobs['charge_rate']==3], bins=bins, label='Express', color='g')
ax[0].grid(True)
ax[1].grid(True)
fig.suptitle('NCI Workload Submission Daily Rate')
ax[0].set_title('Normal Queue')
ax[1].set_title('Express Queue')
ax[1].xaxis.set_major_locator(mpl.dates.AutoDateLocator())
ax[1].xaxis.set_major_formatter(mpl.dates.AutoDateFormatter(ax[1].xaxis.get_major_locator()))
ax[1].set_xlim(mpl.dates.date2num(start_date), mpl.dates.date2num(end_date))
plt.setp(ax[1].xaxis.get_majorticklabels(), rotation=25, ha='right')
ax[1].set_xlabel('Date')
ax[0].set_ylabel('Jobs per Day')
ax[1].set_ylabel('Jobs per Day')
fig.savefig('out/figs/nci_sub_rate_day_sub.png')
plt.show()

अब मैं एक्स अक्ष पर दिन से बंधा हुआ समय के साथ एक ग्राफ चाहता हूं और y अक्ष पर बिन क्षेत्र के द्वारा अभिव्यक्त किया गया है।

अब तक मैं इस सूची में एक सुगम समझ के साथ आया हूं:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
import datetime as dt

def timestamp_to_mpl(timestamp):
    return mpl.dates.date2num(dt.datetime.fromtimestamp(timestamp))

def binsum(bin_by, sum_by, bins):
    bin_index = np.digitize(bin_by, bins)
    sums = [np.sum(sum_by[bin_index==i]) for i in range(len(bins))]
    return sums

fig, ax = plt.subplots(2, 1, sharex=True)
vect_timestamp_to_mpl = np.vectorize(timestamp_to_mpl)
qtime = vect_timestamp_to_mpl(jobs['queued_time'])
area = jobs['run_time'] * jobs['req_procs']
start_date = dt.datetime(2013, 1, 1)
end_date = dt.datetime(2013, 4, 1)
delta = dt.timedelta(days=1)
bins = mpl.dates.drange(start_date, end_date, delta)
sums_norm = binsum(qtime[jobs['charge_rate']==1], area[jobs['charge_rate']==1], bins)
sums_expr = binsum(qtime[jobs['charge_rate']==3], area[jobs['charge_rate']==3], bins)
ax[0].bar(bins, sums_norm, width=1.0, label='Normal', color='b')
ax[1].bar(bins, sums_expr, width=1.0, label='Express', color='g')
ax[0].grid(True)
ax[1].grid(True)
fig.suptitle('NCI Workload Area Daily Rate')
ax[0].set_title('Normal Queue')
ax[1].set_title('Express Queue')
ax[1].xaxis.set_major_locator(mpl.dates.AutoDateLocator())
ax[1].xaxis.set_major_formatter(mpl.dates.AutoDateFormatter(ax[1].xaxis.get_major_locator()))
ax[1].set_xlim(mpl.dates.date2num(start_date), mpl.dates.date2num(end_date))
plt.setp(ax[1].xaxis.get_majorticklabels(), rotation=25, ha='right')
ax[1].set_xlabel('Date')
ax[0].set_ylabel('Area per Day')
ax[1].set_ylabel('Area per Day')
fig.savefig('out/figs/nci_area_day_sub.png')
plt.show()

मैं अभी भी NumPy में नया हूँ और जानना चाहूंगा कि क्या मैं सुधार कर सकता हूं:

def binsum(bin_by, sum_by, bins):
    bin_index = np.digitize(bin_by, bins)
    sums = [np.sum(sum_by[bin_index==i]) for i in range(len(bins))]
    return sums

तो यह पायथन सूचियों का उपयोग नहीं करता है।

क्या किसी तरह विस्फोट संभव है sum_by[bin_index==i] तो मुझे सरणी की सरणी मिलती है, लंबाई len(bins) ? तब np.sum() एक numpy array वापस करेगा।





histogram