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。
我有使用测试数据的工作代码,见此处: (示例数据匹配我稍后将使用此脚本的输入类型和格式,包括日期作为附加有 '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。