在 django Rest 框架中对 pandas DataFrame 进行重复操作

Akh*_*_IN 3 python django rest pandas django-rest-framework

场景:我正在处理djangodjango rest framework中的数据pandas dataframe

在前端,有一些函数可以应用于相同的数据。用户可以应用第一个函数,然后数据集将根据应用的函数而变化,然后用户可以应用另一个函数,依此类推。

在后端。我让所有功能井井有条。循环它并给出响应。我的问题是,我每次都在执行从第一个函数到最后一个函数的整个过程,这使得我的过程变慢。

有没有一种好方法来保留状态并仅处理最后一个函数。??

Kri*_*ati 5

你有几种方法可以实现这一目标

1. 通过使用与服务器的持久连接。

您可以使用django-channels之类的东西来创建开放连接。这样,您就可以拥有与连接关联的数据框实例并对其进行更改。

示例代码

class DataframeWebsocketHandler(WebsocketConsumer):
    def connect(self):
        self.accept()
        self.df = pandas.DataFrame(data=d) # your own implementation here.

        # send your initial data
        self.send(text_data=json.dumps({
            'data': self.df
        }))

    def disconnect(self, close_code):
        pass

    def receive(self, text_data):
        text_data_json = json.loads(text_data)

        # you will receive actions to perform here 
        # all actions you take on self.df will persist until websocket is closed
        operation = text_data_json['operation']
        perform_operation(self.df,operation)

        # send changed data to the client
        self.send(text_data=json.dumps({
            'data': self.df
        }))
Run Code Online (Sandbox Code Playgroud)

2.通过使用pkl和django缓存

您可以将当前修改的数据帧存储到 pickle 中并将其存储在缓存中。您可以稍后在要求修改时加载它。

示例代码

from django.core.cache import cache
# ... your code
def new_dataframe_page(request):
    # ... your code
    df = pandas.DataFrame(data=d)
    cache.put(some_inst_specific_key,pickle.dumps(df),3000)
    request.session.put('dframe_cache',some_inst_specific_key)

def update_dataframe(request):
    # ... your code
    cache_key == request.session.get("dframe_cache")
    df = None
    if cache_key && cache.get(cache_key) is not None:
        df = pickle.loads(cache.get(cache_key))
    else:
        # generate new cache normally and store it to session just like above 
        df = generate_dataframe(request)

    # perform your current action on dataframe
    cache.put(cache_key,pickle.dumps(df))

    # return your modified dataframe.
Run Code Online (Sandbox Code Playgroud)

3.(最简单且不推荐)具有全局变量:

维护一个存储各种状态的全局映射变量,当用户要求修改时,直接使用该全局映射中的变量。这种方法很简单,也不那么复杂。但不幸的是这在生产环境中不起作用。为了服务 django,您通常运行多个 django 实例,并且每个实例都有自己的运行时。例如,如果您正在运行 15 个 django 实例,那么所有 15 个实例都将具有单独的全局变量,其中一个实例的任何更改都不会反映在其他实例中。