对行业板块过去10年里,每年行业的涨幅的统计

假设获取的数据是从2010/01/01 — 2021/09/03的所有板块的日收盘价,需要统计每年的涨幅,就需要将时间单位从日改为年,然后要从中重新取出每年第一个交易日的和每年最后一个交易日的收盘价,这里resample()函数就非常便捷了。

import pymongo
import pandas as pd

# 连接数据库
client = pymongo.MongoClient(host='localhost', port=27017)
stock_db = client['industry_index']

# 从mongoDB数据库读取数据
tmp_db = stock_db['电力'].find()
tmp = pd.DataFrame(list(tmp_db)).set_index('trade_date').loc[:, ['close']].rename(columns={'close': '电力'})
# 用resample对数据重新取样,要把时间设置为datetime格式
tmp.index = pd.to_datetime(tmp.index)

pct = tmp.loc['2010-01-01':'2021-09-03', :]
# resample对数据按年重新取样,必须将时间传递给on或者level,或者直接将时间设置为索引,这样就不需要传递参数
'''1、df.resample('Y').first()'''
pct_close_first = pct.resample('Y').first()
'''2、df.resample('Y').last()'''
pct_close_last = pct.resample('Y').last()
'''3、同时设置多个参数的聚合值选取方式'''
pct_egg = pct.resample('Y').agg(['first', 'last'])

print(pct)
print(pct_close_first)
print(pct_close_last)
print(pct_egg)

我是把数据存在mongonDB数据库里,读取速度很快。没有聚合时的数据,如下:

dataframe不使用collect spark dataframe.resample_数据库

但是resample()聚合出来的数据有个问题,resample()函数,需要将时间设置为datetime格式,并且要将时间列传参给on或者level,如果将时间列设置为index索引列,就不需要传参了,我这里写了3种:

  • df.resample('Y').first() 取得每年第一个交易日的数据,获取的结果如下:

dataframe不使用collect spark dataframe.resample_数据库_02

日期是每年的最后一日,数据又确实是第一个交易日的数据,这个问题回头解决,不影响这次统计。

  • df.resample('Y').last() 取得每年最后一个交易日的数据,获取的结果如下:

dataframe不使用collect spark dataframe.resample_python_03

  •  df.resample('Y')[name].agg(['first', 'last'])这一个才是我这次真正要用的,agg()可以设置参数,选取第一个交易日和最后一个交易日的数据通过resamplie()聚合,结果如下:

dataframe不使用collect spark dataframe.resample_python_04

 获取了每年最后一天和每年第一天交易的收盘价数据,每年的涨幅就直接通过列计算就可以了,这是单个行业的,多个板块行业通过for循环,直接返回每个行业的10年涨幅,然后通过

df.join(tmp, how='outer')列拼接函数,就可以将所有行业的年涨幅统计在一个dataFrame上了。