日期:2023-11-15
来源:玫瑰财经网
浏览:次
实现的功能是计算表中所有股票每日的未来(历史)20天的日涨跌幅(CHG_RATIO列)连乘、求和、求平均
数据库里的日期是交易日,实现成未来20个交易日的数据
方法一:根据条件遍历所有数据(缺点慢)
#读入数据import pandas as pdpd.set_option('display.float_format', lambda x: '%.2f' % x) # 2位小数df=pd.read_excel('股票行情(1).xlsx', parse_dates=["TD_DATE"])df=df.drop('Unnamed: 0',axis=1)df
根据每一行日期向后遍历30天,如果符合条件就计算连乘并写入对应行
lst1=[]for i in range(len(df)): print(df.loc[i,'SEC_SHORT_NAME_CN'],df.loc[i,'TD_DATE']) name1=df.loc[i,'SEC_SHORT_NAME_CN'] a=1 k=1 lst=[] dict={} while k<29: for j in range(len(df)): if name1==df.loc[j,'SEC_SHORT_NAME_CN'] and df.loc[j,'TD_DATE']==df.loc[i,'TD_DATE']+pd.Timedelta(days=k): #print(df.loc[j,'TD_DATE']) #print('a',a,'b',df.loc[j,'CHG_RATIO']) a*=df.loc[j,'CHG_RATIO'] lst.append(df.loc[j,'CHG_RATIO']) k+=1 print(lst) df.loc[i,'new']=a lst1.append(a)print(lst)print(lst1)
方法二:根据股票名称分组排序计算乘积
import pandas as pdpd.set_option('display.float_format', lambda x: '%.2f' % x) # 2位小数#将TD_DATE设置为日期类型df=pd.read_excel('股票行情.xlsx', parse_dates=["TD_DATE"])#True 升序(取未来数据),False降序(取历史数据)shengxu=Truedf.sort_values(by=["SEC_SHORT_NAME_CN",'TD_DATE'],ascending=shengxu,inplace=True,)#删除没用的列df=df.drop(['Unnamed: 0','Unnamed: 10','Unnamed: 11'],axis=1)#复制模板(空表)moban=df.copy()moban.drop(moban.index,inplace=True)df
对数据表按股票名"SEC_SHORT_NAME_CN"分组
df.groupby("SEC_SHORT_NAME_CN")
然后重置分组后的数据表
group.reset_index(inplace=True)
再进行排序切片取累计乘积最后一位
使用iat()-获取最后一个元素
cumsum(): 依次计算前1, 2, …, n 个数的和
cumprod(): 依次计算前1, 2, …, n 个数的乘积
cummax(): 依次找到前1, 2, …, n 个数的最大值
cummin(): 依次找到前1, 2, …, n 个数的最小值
group.loc[i,"new"]=group.loc[i:a-1 ,"CHG_RATIO"].cumprod().iat[-1]
import numpy as npimport pandas as pd# 1. 累计和与累计乘积x = pd.Series(range(1, 10))print("累计和:n", x.cumsum())print("累计乘积:n", x.cumprod())
核心代码
#遍历分组数据表for key,group in df.groupby("SEC_SHORT_NAME_CN"):#打印分组名称 #print(type(key))#打印分组表 #print(type(group))#重置表index group.reset_index(inplace=True) a=20#设置天数 #遍历分组后数据表 for i in range(len(group)): #选取等于20天的数据 if len(group.loc[i:a-1 ,"CHG_RATIO"]) ==20: #切片选取对应日期后20天数据计算乘积并取最后一位书写入表中 group.loc[i,"new"]=group.loc[i:a-1 ,"CHG_RATIO"].cumprod().iat[-1] #求和 group.loc[i,"qiuhe"]=group.loc[i:a-1 ,"CHG_RATIO"].sum() #求平均 group.loc[i,"pingjun"]=group.loc[i:a-1 ,"CHG_RATIO"].mean() #print(i,a,len(group.loc[i:a-1 ,"CHG_RATIO"])) a+=1#对处理后的表格进行合并 moban=pd.concat([moban,group])#保存处理后的数据表moban.to_csv("new.csv")
原来使用第一种方法,数据越多越慢,经过多次分析决定更改算法使用第二种方法效率提高很多!
500吨汽车吊作业性能表(汽车吊支腿反力及抗倾覆验算)
石碣镇汽车站(今天,石碣汽车客运站恢复运营)
招贤汽车站(9月14日起,莒县K601路增开大站快车)
北京福田汽车图片(自重不到两吨,详解福田领航S1小卡)
东风轻型汽车(“东风轻型车”横空出世 未来无人驾驶车将快递送到家门口)
周口市汽车东站(郑阜高速铁路上的主要客运站——周口东站)
Copyright (c) 2022 玫瑰财经网 版权所有
备案号:冀ICP备17019481号
玫瑰财经网发布此信息的目的在于传播更多信息,与本站立场无关。玫瑰财经网不保证该信息(包含但不限于文字、视频、音频、数据及图表)全部或者部分内容的准确性、真实性、完整性、有效性、及时性、原创性等。
相关信息并未经过本网站证实,不对您构成任何投资建议,据此操作,风险自担。