【问题标题】:Converting pandas dataframe to json is slow将 pandas 数据帧转换为 json 很慢
【发布时间】:2018-06-15 08:47:59
【问题描述】:

将 csv(50k 行)转换为 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}]}

【问题讨论】:

    标签: python json django pandas


    【解决方案1】:

    做某事的最快方法通常是避免这样做,所以也许您可以将生成的 json 保存到 app/static 目录中的 data.json 文件中,将当前代码移动到您执行的自定义管理命令中作为部署过程的一部分。

    自定义管理命令是可以使用./manage.py <yourcommandname> ... 从命令行执行的python 脚本。这记录在这里:https://docs.djangoproject.com/en/2.0/howto/custom-management-commands/

    在这种情况下,您命令的 handle 方法将负责将 csv 转换为 json(使用您当前视图中的代码)并将其存储到您的 app/static 文件夹中的 data.json 文件中。那么你的视图只需要json.load()这个data.json文件并提供它。

    那么您所要做的就是确保在您更新 csv 文件时调用此命令。如果您没有部署脚本,这可以手动完成(只是不要忘记在部署过程文档中记录它),或者在您的部署脚本中自动完成,以确保您不会有过时的数据。

    【讨论】:

    • 感谢您的指点。我不确定我是否理解您评论的这一部分:“......将您当前的代码移动到您在部署过程中执行的自定义管理命令”。请详细说明。
    • @schmoozed 您不确定的部分是什么? “将代码移动到自定义管理命令”或“作为部署过程的一部分执行”?
    • 让我试一试。而不是在呈现请求时传递 json,我可以存储它,然后从那里读取前端中的 java 脚本。这样会更快吗?
    • 非常感谢您的解释。赞成它,因为我也在寻找一种更快(或更好)的熊猫方式来生成 json。
    • @schmoozed 这个想法确实是为了避免一遍又一遍地重新解析同一个 csv 文件(因为它在你的 app/static 目录中,我认为这不是经常变化的东西 - 否则它不应该在 app 中/静止的)。它确实可以像任何其他静态文件一样由前端服务器直接提供。
    猜你喜欢
    • 2023-03-27
    • 2018-10-27
    • 1970-01-01
    • 2017-02-04
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多