ndarray 在工作脚本上不是 JSON 可序列化类型错误 (Tableau Prep - TabPy)

ndarray is not JSON serializable TypeError on working script (Tableau Prep - TabPy)

我有使用测试数据的工作代码,见此处: (示例数据匹配我稍后将使用此脚本的输入类型和格式,包括日期作为附加有 'Z' 的字符串)

    from sklearn import linear_model
    import pandas as pd
    import numpy as np
     
     
    d = {'Start Sunday of FW': ['2022-03-02Z', '2022-03-03Z', '2022-03-04Z', '2022-03-05Z', '2022-03-06Z', '2022-03-01Z',
                  '2022-03-02Z', '2022-03-03Z', '2022-03-04Z', '2022-03-05Z', '2022-03-06Z', '2022-03-01Z'],
         'Store': [1111, 1111, 1111, 1111, 1111, 1111, 2222, 2222, 2222, 2222, 2222, 2222],
         'Sales': [3163, 4298, 2498, 4356, 4056, 3931, 3163, 4298, 2498, 4356, 4056, 1]}
     
    df = pd.DataFrame(data=d)
     
    def get_coef(input):
         def model1(df):
              y = df[['Sales']].values
              x = df[['Start Sunday of FW']].values
              return np.squeeze(linear_model.LinearRegression().fit(x,y).coef_)
     
         cnames = {'Store': 'Store', 0: 'Coef'}
     
         def prep_input(df):
              df['Start Sunday of FW'] = df['Start Sunday of FW'].astype('string').str.rstrip('Z').astype('datetime64[ns]')
              return df
     
         return pd.DataFrame(prep_input(input).groupby('Store').apply(model1)).reset_index().rename(columns=cnames)
     
    print(get_coef(df))

此代码 运行 本身没问题。

我已经安装了Tableau Prep and TabPy, and set it up correctly per instructions.

当我尝试从 Prep 运行 下面 代码块中的版本时,Prep 流程失败并且出现错误:

```2022-04-06,13:08:58 [ERROR] (base_handler.py:base_handler:115): Responding with status=500, message="Error processing script", info="TypeError : Object of type ndarray is not JSON serializable"```

如果我改为 print() get_coef() 中的当前 return 行,return 改为 input,并删除 get_output_schema 函数:return 打印正确,输出确实在实时预览中流向 Tableau Prep, 但是 错误仍然出现并且流程仍然无法正常工作,这莫名其妙。

    from sklearn import linear_model
    import pandas as pd
    import numpy as np
     
    def get_coef(input):
         def model1(df):
              y = df[['Sales']].values
              x = df[['Start Sunday of FW']].values
              return np.squeeze(linear_model.LinearRegression().fit(x,y).coef_)
     
         cnames = {'Store': 'Store', 0: 'Coef'}
     
         def prep_input(df):
              df['Start Sunday of FW'] = df['Start Sunday of FW'].astype('string').str.rstrip('Z').astype('datetime64[ns]')
              return df
     
         return pd.DataFrame(prep_input(input).groupby('Store').apply(model1)).reset_index().rename(columns=cnames)
     
    def get_output_schema():
         return pd.DataFrame({
              'Store' : prep_string(),
              'Coef' : prep_decimal()
         })

有人可以帮助我理解这个问题吗?我对 JSON 序列化一无所知,所以像 this 这样的帖子对我帮助不大;我什至无法评估相关性。

result = pd.DataFrame(prep_input(input).groupby('Store').apply(model1)).reset_index().rename(columns=cnames)
     result['Coef'] = result['Coef'].astype('double')

     return result

Coef 是 dtype 对象,TabPy 需要 double。