python - 将通用 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()
)。任何帮助,将不胜感激。
解决方案
推荐阅读
- angular - RXJS 和 typescript:有条件地使用服务器和客户端代码执行工作
- c# - 如何在 ASP.NET Core 中为 React SPA 自定义身份控制器?
- java - 获取与文件 java 关联的应用程序
- spring-boot - Spring Boot application.properties 无法从另一个属性文件中获取值
- node.js - 多个 node_modules 目录
- mysql - 一个字段中有多个 SQL 引号?
- javascript - 对 Firebase 存储数据进行排序 (Vue)
- javascript - JavaScript 从 discord.js 库中导出 Attachment() 类
- flutter - 无法使用 SharedPreferences 进行简单保存 - 我错过了什么?
- html - 如何在我们的网站中显示/嵌入带有特定主题标签的社交媒体结果帖子?