将pandas数据框转换成JSON很慢。

3

将包含5万行的csv文件转换为json格式,以便最终在Django模板中使用,速度非常慢。我想知道是否我转换的方法正确,或者有更好的方法。

csv文件的前几行如下:

tdate,lat,long,entity
3/6/2017,34.152568,-118.347831,x1
6/3/2015,34.069787,-118.384738,y1
1/1/2011,34.21377,-118.227904,x1
3/4/2013,33.81761,-118.070374,y1

我正在视图中阅读这个csv文件,并以以下方式渲染请求:

def index(request):     
    df = pd.read_csv('app/static/data.csv') 
    df.tdate=pd.to_datetime(df.tdate)
    df['Qrt'] = df.tdate.dt.quarter
    df['Yr'] = df.tdate.dt.year
    jzon=df.groupby('entity')[['lat','long','Qrt','Yr']].apply(lambda x: x.to_dict('records')).to_json(orient='columns')    
    return render(request, 'app/index.html', {'jzon': jzon})

{"x1":[{"lat":34.152568,"long":-118.347831,"Qrt":1.0,"Yr":2017.0},{"lat":34.21377,"long":-118.227904,"Qrt":1.0,"Yr":2011.0}],"y1":[{"lat":34.069787,"long":-118.384738,"Qrt":2.0,"Yr":2015.0},{"lat":33.81761,"long":-118.070374,"Qrt":1.0,"Yr":2013.0}]}
1个回答

2
通常最快的做法是避免去做它,因此您可以将生成的json保存到应用程序/静态目录中的data.json文件中,将当前代码移动到自定义管理命令中,在部署过程中执行该命令。
自定义管理命令是可以从命令行执行的Python脚本,使用./manage.py <yourcommandname> ...。这在文档中有说明:https://docs.djangoproject.com/en/2.0/howto/custom-management-commands/ 在这种情况下,您的命令的handle方法将负责将csv转换为json(使用当前在视图中的代码)并将其存储到应用程序/静态文件夹中的data.json文件中。然后,您的视图只需json.load()data.json文件并提供它。
然后,您需要确保每当更新csv文件时调用此命令。如果没有部署脚本,则可以手动完成此操作(只需不要忘记在部署过程文档中记录它),或者在部署脚本中自动化此操作,以确保您不会拥有陈旧的数据。

谢谢你的指引。我不确定我理解你评论中的这部分内容:“...将您当前的代码移动到一个自定义管理命令中,作为您部署过程的一部分执行”。请详细说明。 - schmoozed
@schmoozed 你不确定的部分是什么?是“将代码移动到自定义管理命令”还是“作为部署过程的一部分执行”? - bruno desthuilliers
让我试一下。不是在呈现请求时传递JSON,而是将其存储,然后前端的JavaScript从那里读取。这样会更快吗? - schmoozed
非常感谢您的解释。我也点赞了,因为我也在寻找更快(或更好)的Pandas方法来生成JSON。 - schmoozed
@schmoozed,确实的想法是避免反复解析相同的CSV文件(因为它在您的app/static目录中,我假设这不是经常更改的内容 - 否则它不应该在app/static中)。它确实可以像任何其他静态文件一样直接由前端服务器提供。 - bruno desthuilliers
由于你的数据看起来相当静态,我认为这是你可以选择的最佳方法。这与“pandas方式”无关。正如Bruno已经说过的 - 如果你不需要在每个请求上执行某些操作 - 只需避免它 - 这很容易避免。每当你的CSV文件发生变化时,你只需创建一次JSON - 非常简单明了。 - dahrens

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接