首页 > 解决方案 > 将通用 pandas 数据框传递给 django REST API

问题描述

我目前正在使用 django 和 djangorestframework 库构建一个 REST API。我想制作一个接受 JSON 化版本的 pandas 数据帧的 POST,这样我就可以在数据帧上调用其他一些库函数并返回一些输出。

我知道如果我知道数据帧的表结构,那么有像django-rest-pandas这样的不错的库可以序列化并以 JSON 形式返回 pandas 数据帧,但我不确定如何接受它们作为函数的参数。

我目前的想法是将 JSON 作为字符串传递给基于函数的视图,然后从那里提取 JSON 并将其解析为 pandas 数据框。但是,我不知道这是否是最好的方法。我最大的复杂性是我事先不知道数据框的结构,所以我不确定如何将其合并到某个库可能能够解释的模型中(尽管我仍然对这样做的方法感兴趣,如果我确实知道结构)。

到目前为止,这是我的代码。

示例 POST 请求:

{
    "table": "{\"AAPL\":{\"1420156800000\":103.8639572404,\"1420416000000\":100.9379443592,\"1420502400000\":100.947444401,\"1420588800000\":102.3629506325,\"1420675200000\":106.2959679468},\"AMZN\":{\"1420156800000\":308.52,\"1420416000000\":302.19,\"1420502400000\":295.29,\"1420588800000\":298.42,\"1420675200000\":300.46},\"FB\":{\"1420156800000\":78.45,\"1420416000000\":77.19,\"1420502400000\":76.15,\"1420588800000\":76.15,\"1420675200000\":78.175},\"GOOG\":{\"1420156800000\":524.81,\"1420416000000\":513.87,\"1420502400000\":501.96,\"1420588800000\":501.1,\"1420675200000\":502.68},\"MSFT\":{\"1420156800000\":43.3443122802,\"1420416000000\":42.9410878182,\"1420502400000\":42.3153946875,\"1420588800000\":42.8530273035,\"1420675200000\":44.1136830927}}",
    "num_samples": 10
}

模型.py:

class EFObject(models.Model):
    table = models.TextField()
    num_samples = models.IntegerField()

序列化程序.py:

class EFObjectSerializer(serializers.ModelSerializer):
    class Meta:
        model = EFObject
        fields = ('table', 'num_samples')

视图.py:

from rest_framework.response import Response
from rest_framework.decorators import api_view
from lib.api.serializers import *
import lib.analytics.analytics as analytics
import json
import pandas as pd

@api_view(http_method_names=['POST'])
def find_ef(request):
    serializer = EFObjectSerializer(data=request.data)
    serializer.is_valid()
    output = serializer.validated_data['table']
    num_samples = serializer.validated_data['num_samples']
    table = pd.read_json(output) 
    result = analytics.find_ef(table, num_samples) # returns a dictionary
    return Response(result)

网址.py:

from django.conf.urls import include, url
from rest_framework import routers
from lib.api import views

router = routers.DefaultRouter()
router.register(r'users', views.UserViewSet)

# Wire up our API using automatic URL routing.
# Additionally, we include login URLs for the browsable API.
urlpatterns = [
    url(r'', include(router.urls)),
    url(r'api-auth/', include('rest_framework.urls', namespace='rest_framework')),
    url(r'ef', views.find_ef)
]

这行得通,但我的问题是我应该在 view.py 文件中真正做什么,因为这似乎不是获取数据帧的最佳方式(而且在之后正确转义数据帧的 JSON 字符串也很麻烦打电话table.to_json())。任何帮助,将不胜感激。

标签: pythondjangopandasdjango-rest-framework

解决方案


推荐阅读