python代码无故停止的问题

时间:2018-12-07 16:02:43

标签: python algorithm csv execution

在处理大型CSV文件时,我遇到了Python代码问题。

基本上,该代码输入一个CSV文件,然后输出带有一些数学计算的另一个CSV文件。输入文件确实很大(大约300,000行)。问题是,当我运行代码时,Python将在一段时间后自动停止。当我按Ctrl + C时,代码再次开始运行。 (该代码大约需要7分钟才能运行)

我确定代码没有错,因为当CSV文件更小时,代码可以正常运行。仅当文件很大时,才会出现此问题。在整个执行过程中按Ctrl + C几次将正确生成输出文件。整个过程中也没有错误消息。

尽管文件很大,但它还不够大,以至于Python无法处理它。我正在使用Windows 10,Python 3.7.1,我的计算机RAM为16GB。运行代码时,CPU和内存使用率未达到最大值。

    import pandas as pd
    import numpy as np
    import black_scholes as bs
    from datetime import date
    import time
    import glob

    t0 = time.time()

    ## Initiate all the steps
    def start():

        global df,bs_list,errors
        global r

        files = glob.glob('./*.csv')
        print(files)
        for name in files:

            t0 = time.time()

            df = open_file(name[2:])

            print(name[2:])

            #df['DTE'] = df.apply(calc.time, axis=1)
            df['DTE'] = np.vectorize(calc.dte)(df['DataDate'],df['Expiration'])
            print('DTE column ... done')

            r = calc.fed_rate(df.loc[10]['DataDate'][:10])
            print('R calc ... done')

            bs_list,errors = [],[]
            #df['IV'] = df.apply(add.iv,axis=1)
            df['IV'] = np.vectorize(add.iv)                (df['Bid'],df['Ask'],df['Strike'],df['UnderlyingPrice'],df['DTE'],df['Type'])
            print('IV calc ... done')

            df['Delta'],df['Gamma'],df['Theta'],df['Vega'] = np.vectorize(add.greeks)(df['IV'],df['Bid'],df['Ask'],df['Strike'],df['UnderlyingPrice'],df['DTE'],df['Type'])

            create_file(name[2:-4]+'_edited.csv',df)
            print(name[2:-4]+'_edited.csv'+' ... Addition successful')

            t1 = time.time()
            total = t1-t0
            print(total)

    ## Open .csv file using pandas
    def open_file(filename):

        df = pd.read_csv(filename)
        df.columns = df.columns.str.replace(' ', '')
        return df

    def create_file(filename,df):

        df.to_csv(filename, encoding='utf-8', index=False)

    class calc:

        ## Calculate the DTE of all options
        def dte(DataDate,Expiration):

            start,end = DataDate[:10],Expiration
            start,end = start.split('/'),end.split('/')

            d0 = date(int(start[2]),int(start[0]),int(start[1]))
            d1 = date(int(end[2]),int(end[0]),int(end[1]))
            delta = d1 - d0

            return delta.days

        ## Finds the risk-free interest rate of that day
        def fed_rate(date):

            file = pd.read_csv('fed_rate.csv')
            date = date.split('/')
            date[0] = date[0].replace('0','')
            date[1] = date[1].replace('0','')

            for index, row in file.iterrows():
                fed_date = row['THE_DATE']
                fed_date = fed_date.split('/')
                if fed_date[2] == date[2] and fed_date[0] == date[0]:
                    return row['FEDFUNDS']

    class add:

        ## Calculate IV of each option
        def iv(bid,ask,strike,price,dte,c_p):

            try:
                bid,ask,strike,price,dte = float(bid),float(ask),float(strike),float(price),float(dte)

                if bid <= 0.1:
                    return 0
                elif ask <= 0.1:
                    return 0
                option_price = (bid+ask)/2

                bs_list.append([price,dte/365,strike,r/100,option_price,0])
                print(len(bs_list))
                if len(bs_list) == 100064 or len(bs_list) == 100065:
                    print(bs_list[-1])

                if c_p == 'call':
                    iv = bs.call.vol(price,dte/365,strike,r/100,option_price,0)
                elif c_p == 'put':
                    iv = bs.put.vol(price,dte/365,strike,r/100,option_price,0)
            except:
                try:
                    errors.append(['iv',price,dte/365,strike,r/100,option_price,0])
                except:
                    pass
                return 0

    return iv

## Add Greeks to file
        def greeks(iv,bid,ask,strike,price,dte,c_p):

            if iv == 0:
                return 0,0,0,0

            try:
                ## Delta
                if c_p == 'call':
                    delta = bs.greeks.delta(float(price),dte/365,float(strike),r/100,iv,0,'c')
                elif c_p == 'put':
                    delta = bs.greeks.delta(float(price),dte/365,float(strike),r/100,iv,0,'p')

                ## Gamma
                gamma = bs.greeks.gamma(float(price),dte/365,float(strike),r/100,iv,0)

                ## Theta
                if c_p == 'call':
                    theta = bs.greeks.theta(float(price),dte/365,float(strike),r/100,iv,0,'c')
                elif c_p == 'put':
                    theta = bs.greeks.theta(float(price),dte/365,float(strike),r/100,iv,0,'p')

                ## Vega
                vega = bs.greeks.vega(float(price),dte/365,float(strike),r/100,iv,0)
            except:
        errors.append(['greeks',float(price),dte/365,float(strike),r/100,iv,0])
                return 0

            return delta,gamma,theta,vega

任何想法这是什么问题?任何帮助将不胜感激。谢谢!

2 个答案:

答案 0 :(得分:0)

有时Windows似乎会停止长时间运行的程序的程序执行,以允许其他任务运行。不久前,我在C ++中也遇到过类似的事情(在Windows 10上也是如此),所以这似乎只是Windows的行为。

发现类似的行为here

答案 1 :(得分:0)

如果您使用的是Windows,则必须注意“快速编辑模式”。这样可以使您的终端在单击时将“暂停”。您可以使用 Ctrl + C 或与此相关的任何键来恢复。

您可以通过右键单击外壳程序的顶部栏将其关闭(适用于cmd和powershell),然后转到属性,然后取消选中“快速编辑模式”。如果默认情况下将其设置为 off 会很好,因为它是一项功能,如果不加注意的话,可以使他们濒临精神错乱。

这可能是(也可能不是)您的问题,因为显然无法再现此类系统问题,所以我无法验证。

尽管如此,您还是“快速编辑模式”的下一个受害者。

更多信息here