在处理大型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
任何想法这是什么问题?任何帮助将不胜感激。谢谢!
答案 0 :(得分:0)
有时Windows似乎会停止长时间运行的程序的程序执行,以允许其他任务运行。不久前,我在C ++中也遇到过类似的事情(在Windows 10上也是如此),所以这似乎只是Windows的行为。
发现类似的行为here。
答案 1 :(得分:0)
如果您使用的是Windows,则必须注意“快速编辑模式”。这样可以使您的终端在单击时将“暂停”。您可以使用 Ctrl + C 或与此相关的任何键来恢复。
您可以通过右键单击外壳程序的顶部栏将其关闭(适用于cmd和powershell),然后转到属性,然后取消选中“快速编辑模式”。如果默认情况下将其设置为 off 会很好,因为它是一项功能,如果不加注意的话,可以使他们濒临精神错乱。
这可能是(也可能不是)您的问题,因为显然无法再现此类系统问题,所以我无法验证。
尽管如此,您还是“快速编辑模式”的下一个受害者。
更多信息here。