python中count和sum怎么区分_python – 使用numpy和matplotlib的sum而不是count的直方图

我有一些数据,每行有两列.在我的情况下,工作提交时间和地区.

我已经使用了matplotlib的hist函数来生成一个图表,该图表在x轴上按天分箱,在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()

我现在想要一个图表,其时间在x轴上按天分组,并且在y轴上按bin区域求和.

到目前为止,我已经使用列表理解得出了这个:

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

所以它不使用Python列表.

有可能以某种方式爆炸sum_by [bin_index == i]所以我得到一个数组数组,长度为len(bin)?然后np.sum()将返回一个numpy数组.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值