按月汇总股票成交量并绘图:代码返回零值问题求助
解决每月股票成交量求和的问题
嘿,我看你这代码的问题很明显——用错np.searchsorted的用法啦!你现在把分割位置直接传到成交量数组的searchsorted里,逻辑完全搞反了,才会导致求和结果全是0。咱们一步步来修正:
先搞懂核心问题
你原代码里的volumeYears=np.searchsorted(sp_volume, yearsplits)是完全错误的:np.searchsorted的作用是在目标有序数组中,找到待插入值的位置,你现在把年份的分割索引(比如几百、几千的整数)放到成交量数组里找位置,而成交量数值通常远大于这些索引值,所以所有插入位置都是0,自然求和全为0。
正确的实现方法
方法1:用Numpy修正你的现有代码
假设你的years是对应每条成交量数据的年份序列,sp_volume是日成交量数组,dates是交易日的datetime64数组,我们可以用np.split配合分割位置来分组求和:
年度求和修正
yearList = [j for j in range(2001,2020)] yearsplits = np.searchsorted(years, yearList) # 按年份分割成交量数组,手动加上起始位置0和数组末尾 volume_year_splits = np.split(sp_volume, [0] + yearsplits + [len(sp_volume)]) # 遍历分片,对应2000到2019年 for idx, volume in enumerate(volume_year_splits[:-1]): # 去掉最后一个空分片 print(" {}: {:12.0f}".format(2000 + idx, volume.sum()))
月度求和修正
months = dates.astype('datetime64[M]').astype(int) months -= months[0] # 从0开始对应2000年1月 # 计算2000-2019年所有月份的分割位置(共20年=240个月) monthsplits = np.searchsorted(months, range(1, 20*12 + 1)) # 分割成交量数组 volume_month_splits = np.split(sp_volume, monthsplits) # 遍历每个月度分片,格式化输出 for idx, volume in enumerate(volume_month_splits): year = 2000 + idx // 12 month = idx % 12 + 1 print("{}年{}月: {:12.0f}".format(year, month, volume.sum()))
方法2:用Pandas更高效(推荐)
如果数据量不是特别大,用Pandas处理时间分组会更直观,几乎不会出错:
import pandas as pd # 把日期和成交量转换成DataFrame df = pd.DataFrame({ 'date': dates, 'volume': sp_volume }) # 设置日期为索引,方便按时间聚合 df.set_index('date', inplace=True) # 按月份求和,直接用resample方法 monthly_volume = df.resample('M')['volume'].sum() # 筛选2000年1月到2019年12月的数据 monthly_volume = monthly_volume.loc['2000-01':'2019-12'] # 打印结果 print(monthly_volume)
内容的提问来源于stack exchange,提问作者cpatton2
相关产品推荐
相关产品推荐

