鱼C论坛

 找回密码
 立即注册
查看: 1389|回复: 1

大数据代码优化求指导

[复制链接]
发表于 2020-9-9 14:13:33 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 flywalt 于 2020-9-9 14:14 编辑

import numpy as np
import pandas as pd
import math
import datetime
  
valdf=pd.read_csv('C:/Users/htlh/Documents/PRIVATE/实验室/定价分析/test.csv')
valdf=valdf.set_index('remain',drop=True)

origindf=pd.read_csv('C:/Users/htlh/Documents/PRIVATE/实验室/定价分析/test3.csv')
origindf=origindf.set_index('code',drop=True)

zdf=pd.DataFrame(columns=origindf.columns,index=origindf.index)
remaindf=pd.DataFrame(columns=origindf.columns,index=origindf.index)
  
def get_val(date,remain): # get valuation
     remain1=math.floor(remain*100)/100
     remain2=math.ceil(remain*100)/100
     y1=valdf.loc[remain1,date]
     y2=valdf.loc[remain2,date]
     val=(remain-remain1)/0.01*(y2-y1)+y1
     return val
  
def days(str1,str2):
     date1=datetime.datetime.strptime(str1[0:10],"%Y-%m-%d") #get days(remain)
     date2=datetime.datetime.strptime(str2[0:10],"%Y-%m-%d")
     num=(date1-date2).days/365
     return num
  
count=0#进度统计   
for i in origindf.index:
     exercise=origindf.loc[i,'exercise']
     for j in origindf.columns[1:]:
         if pd.isnull(origindf.loc[i,j]): #跳过空值
             continue
         remain=days(exercise,j)     #当前日期-到期/行权日=剩余期限
         remaindf.loc[i,j]=remain
         zdf.loc[i,j]=float(origindf.loc[i,j])-get_val(j,remain) #求差
     count+=1#进度统计
     print(count/len(origindf.index))
  
大致是这样的函数,其中test1的样式如下
remain    2016/1/4    2016/1/5    2016/1/6    2016/1/7    2016/1/8
0    2.2488    2.2518    2.2338    2.2198    2.2118
0.01    2.5134    2.5124    2.4843    2.4578    2.4064
0.02    2.7779    2.7729    2.7349    2.6959    2.6009
0.03    2.7696    2.7661    2.7311    2.6961    2.6011
0.04    2.7613    2.7593    2.7273    2.6963    2.6013
0.05    2.7467    2.7452    2.721    2.6963    2.6014
0.06    2.7322    2.7312    2.7146    2.6963    2.6015
0.07    2.7176    2.7171    2.7083    2.6964    2.6017
0.08    2.703    2.703    2.702    2.6964    2.6018
0.09    2.7034    2.7034    2.7023    2.6966    2.6048
0.1    2.7038    2.7037    2.7025    2.6969    2.6077
0.11    2.7053    2.7049    2.7033    2.6977    2.6154
0.12    2.7067    2.706    2.704    2.6986    2.6231
0.13    2.7082    2.7072    2.7048    2.6994    2.6308
0.14    2.7097    2.7083    2.7055    2.7003    2.6385
  
test3的样式如下
code    exercise    2016/1/4    2016/1/5    2016/1/6    2016/1/7    2016/1/8    2016/1/11    2016/1/12    2016/1/13
167246.SH    2022/7/22                        3.5035    3.4179    3.3838
167282.SH    2023/7/21                    2.7691    2.7742    2.6709    2.6438
167260.SH    2023/7/22                        4.5035    4.4179    4.3838
114784.SZ    2022/7/21                    3.343    3.3271    3.2579    3.1995
102001408.IB    2023/7/23                        4.3787    4.3097    4.2306
167286.SH    2023/7/23                        5.4579    5.3884    5.3303
102001405.IB    2023/7/23                2.8623    2.7976    2.7916    2.7005    2.6806
102001404.IB    2023/7/23                3.4623    3.4249    3.4034    3.3175    3.3039
102001402.IB    2023/7/23                3.7877    3.7167    3.7022    3.6165    3.582
041659001.IB    2017/1/7                    5.4727    5.4558    5.3862    5.3287
011699006.IB    2016/10/2                2.9077    2.8419    2.7977    2.7126    2.7
011699002.IB    2016/10/2                3.1123    3.0564    3.0394    2.95    2.9409
011699004.IB    2016/10/1            3.1213    3.0771    3.0114    2.9938    2.9083    2.8907
041662001.IB    2017/1/5            3.618    3.5885    3.5376    3.5223    3.4519    3.3948
011699005.IB    2016/8/22            6.3755    6.3143    6.2502    6.2681    6.1798    6.1379
011699003.IB    2016/8/3                3.3939    3.3295    3.3187    3.2292    3.1852
  
  
刚学会pandas,写的这个for循环真的效率捉鸡,完整数据20000*15000,估计能跑10小时。。。查了一下说把for替换成ndarray的运算效率会大幅提升,但是还不知道该怎么写,求指导,谢谢~~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-9-10 00:33:54 | 显示全部楼层
经过一天的钻研搞明白了一些思路,但是有了个新问题
现在正在用apply,比如我想df.apply(def)
这个def是我定义的包含(x,y)两个参数(或者用lambda表达也行),但是在对df应用apply的时候,x不是对应每一列么,怎么才能引用出来y呢?而且我想要引用的y恰好是这一列的列标题
例如:
               exercise  2016-01-04  ...  2016-01-19  2016-01-20
code                                ...                        
167246.SH          2.0    8.550685  ...    8.509589    8.506849
167282.SH          2.0    9.547945  ...    9.506849    9.504110
167260.SH          2.0    9.550685  ...    9.509589    9.506849
114784.SZ          2.0    8.547945  ...    8.506849    8.504110
102001408.IB       2.0    9.553425  ...    9.512329    9.509589
167286.SH          2.0    9.553425  ...    9.512329    9.509589
102001405.IB       2.0    9.553425  ...    9.512329    9.509589
102001404.IB       2.0    9.553425  ...    9.512329    9.509589
102001402.IB       2.0    9.553425  ...    9.512329    9.509589
041659001.IB       2.0    3.010959  ...    2.969863    2.967123
011699006.IB       2.0    2.745205  ...    2.704110    2.701370
011699002.IB       2.0    2.745205  ...    2.704110    2.701370
011699004.IB       2.0    2.742466  ...    2.701370    2.698630
041662001.IB       2.0    3.005479  ...    2.964384    2.961644
011699005.IB       2.0    2.632877  ...    2.591781    2.589041
011699003.IB       2.0    2.580822  ...    2.539726    2.536986
  
我就想把每一列的数值和对应的日期一起丢进apply里面运算,请问有什么办法实现么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-18 18:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表