使用芹菜分发数学处理

时间:2017-08-27 20:44:18

标签: json pandas multiprocessing celery task-queue

简介

嘿伙计们,我对芹菜和任务队列都非常陌生,所以我有一个可能相当天真的问题。

我想要一个相当大的.csv文件(转换为pandas DataFrame)并在所有列对上运行一个皮尔逊测试(统计数学函数)。在一个核心上需要大约9分钟到期,我们有数百个.csv文件!

所以我想在我们的3服务器集群的所有核心之间划分这个处理。到目前为止,这是我的代码的原型....

from celery import Celery
import numpy as np
import pandas as pd
import scipy.stats as stats
import itertools

app = Celery()

minute_CSV = pd.read_csv('./test_dataframe.csv')

cycle_length = 300
row_max = minute_CSV.shape[0]
r_vector_data = pd.DataFrame()

column_combinations = itertools.combinations(minute_CSV.filter(regex='FREQ').keys(),2)
xy_cols = list(column_combinations)

@app.task
def data_processing(minute_CSV, cycle_length, row_max, x, y):
    return np.array([stats.pearsonr(minute_CSV[x][c-cycle_length:c],
    minute_CSV[y][c-cycle_length:c])[0] for c in range(cycle_length,row_max)])

for i in range(0, len(xy_cols)):
    x = xy_cols[i][0]
    y = xy_cols[i][1]
    r_vector_data[x + ' to ' + y] = data_processing.delay(minute_CSV, cycle_length, row_max, x, y)

pd.DataFrame.to_csv(r_vector_data, processed_dataframe.csv)

当我运行此消息时,我收到此消息:

  

“[1200行x 870列]不是JSON可序列化的”

数学

pearson关联的工作方式如下:取300(在我的情况下)两列的连续行,运行相关并将结果存储在新的DataFrame(r_vector_data)中。这是针对行:(0..299),(1..300),(2..301),等等。

此外,此脚本仅考虑一个.csv文件,但稍后将进行修改:)。

关于从这里去哪里的想法?我如何使用芹菜来实现这一目标,因为我在文档中有点迷失。

谢谢!

1 个答案:

答案 0 :(得分:1)

您看到错误,因为Celery正在尝试JSON序列化minute_CSV。 默认情况下,Celery中的每条消息都使用JSON进行编码。 有关详细信息,请参阅http://docs.celeryproject.org/projects/kombu/en/latest/userguide/serialization.html

要限制数据传输,您可能只想将每次调用的相关行发送到data_processing任务。