csv 在Python中更改Mann Kendall检验的显著性水平

imzjd6km  于 2022-12-06  发布在  Python
关注(0)|答案(1)|浏览(170)

我需要计算大型水文数据集的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,在这种情况下它应该去哪里?我是一个初学者,所以任何提示都将不胜感激!

bxpogfeg

bxpogfeg1#

我想我们讨论的是pyMannKendall, version 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()

相关问题