我需要为大型水文数据集计算Mann-Kendall(4381个子流域的最大流量值(。每个子流域有70个最大值。我需要0.1的显著性水平,而不是默认的0.05。
以下是我的数据:
"sub" "max"
1 2.195
1 3.753
1 2.941
1 2.152
1 3.363
... ...
4381 0.532
4381 1.108
4381 0.977
4381 0.483
4381 0.435
这是我的剧本:
import pymannkendall as mk
import pandas as pd
from tqdm import tqdm
# naming input and output
in_fname = 'noyear.csv'
out_fname = 'mannkendall3.csv'
# reading csv file
print("reading from file...")
raw = pd.read_csv(in_fname, sep=';', header=0)
# naming columns and converting to strings
sub = raw['sub']
max = raw['max']
raw['sub'] = raw['sub'].astype(str)
# creating DataFrame
out_tbl = pd.DataFrame(data={'sub': sub, 'max': max})
# applying MK
df_mk=out_tbl.groupby(sub)['max'].agg(mk.original_test(alpha =0.1)).reset_index()
# creating csv with output
df_mk.to_csv(out_fname, index=False, sep=';')
当这样做时,我得到以下错误:
Traceback (most recent call last):
File "/Users/user/Desktop/PyCharmProject/mann-kendall3.py", line 24, in <module>
df_mk=out_tbl.groupby(sub)['max'].agg(mk.original_test(alpha = 0.1)).reset_index()
TypeError: original_test() missing 1 required positional argument: 'x_old'
x_old是什么?在这种情况下,它应该去哪里?我是一个初学者,所以任何提示都将不胜感激!
我想我们谈论的是pyMannKendall版本1.4.2
original_test
的文档行与实际代码略有出入。在help(mk.original_test)
返回的描述中,我们可以将x
视为输入参数:
Input:
x: a vector (list, numpy array or pandas series) data
alpha: significance level (0.05 default)
但是函数签名是def original_test(x_old, alpha = 0.05)
(请参阅github上的代码(。这里x_old
是输入向量,在doc中被称为x
。此参数是必需的,在调用函数时不能省略。因此,应用Mann-Kendall测试的线路可能需要更新如下:
# applying MK
df_mk = out_tbl.groupby(sub)['max'].agg(lambda x: mk.original_test(x, alpha=0.1)).reset_index()
或者我们可以使用partial
来产生一个新的函数,它将向量作为单个参数:
from functools import partial
df_mk = out_tbl.groupby(sub)['max'].agg(partial(mk.original_test, alpha=0.1)).reset_index()