import numpy as np
'''多变量单一时刻的随机相关抽样'''
class inner_copula():
''''''
'''初始化函数'''
def __init__(self, data):
''''''
'''复制data到self内以及长宽高生成'''
self.data = data # data n*24*F
self.data_shape=data.shape
self.H=self.data_shape [ 0 ] # 数据深度,有多少数据
self.L=self.data_shape [ 1 ] # 时间范围,
self.N=self.data_shape [ 2 ] # 变量个数
'''生成并拟合copula函数'''
def generate_copula(self):
self.copula_models = {}
'''如果变量数为2, 则采用Frank-copula函数'''
if self.N == 2:
from copulas.bivariate import Frank
for t in range(self.L):
'''对于每一时刻,构造copula函数并拟合函数'''
self.copula_models [ t ] = Frank()
self.copula_models [ t ].fit(self.data [ :, t, : ])
else:
'''如果变量数不为2, 则采用多变量高斯-copula函数'''
from copulas.multivariate import GaussianMultivariate
for t in range(self.L):
'''对于每一时刻,构造copula函数并拟合函数'''
self.copula_models [ t ] = GaussianMultivariate()
self.copula_models [ t ].fit(self.data[:, t, :])
'''copula抽样'''
def copula_sample(self):
''''''
'''初始化结果序列,是 变量数 x 时刻数 的矩阵'''
self.results = np.zeros((self.N, self.L))
for t in range(self.L):
self.results [:, t] = self.copula_models [ t ].sample(1)
return self.results
# 创建测试数据
data_shape = (9, 24, 2)
test_data = np.random.rand(*data_shape) # *用于解包元组
# 创建 Copula 类实例
copula_instance = inner_copula(test_data)
# 生成并拟合 Copula 函数
copula_instance.generate_copula()
# 进行 Copula 抽样
results = copula_instance.copula_sample()
# 打印抽样结果
print("Copula 抽样结果:")
print(results)
07-03
1637