In [0]:
# pyspark读取数据
# inferSchema=True:自动推断schema
# header=True:读取数据时,将第一行作为表头
# mode='DROPMALFORMED':将不符合schema的行删除
df = spark.read.csv('/Volumes/workspace/usahousing/usahousing/USA_Housing.csv', inferSchema=True, header=True, mode='DROPMALFORMED')
display(df.limit(2))
| Avg. Area Income | Avg. Area House Age | Avg. Area Number of Rooms | Avg. Area Number of Bedrooms | Area Population | Price | Address |
|---|---|---|---|---|---|---|
| 79545.45857431678 | 5.682861321615587 | 7.009188142792237 | 4.09 | 23086.800502686456 | 1059033.5578701235 | 208 Michael Ferry Apt. 674 |
| 79248.64245482568 | 6.0028998082752425 | 6.730821019094919 | 3.09 | 40173.07217364482 | 1505890.91484695 | 188 Johnson Views Suite 079 |
In [0]:
# 将DataFrame的column name进行标准化处理
# 我们将空格、短横线和斜线替换成下划线
# 只保留字母、数字和下划线
def sanitize_column_name(name):
"""Drops unwanted characters from column names.
We replace spaces, dashes and slashes with underscores.
and only keep alphanumeric characters.
"""
answer = name
for i, j in ((" ", "_"), ("-", "_"), ("/", "_"), ("&", "and")):
answer = answer.replace(i, j)
return "".join([
char
for char in answer
if char.isalpha() or char.isdigit() or char == "_"])
# df.toDF(): 返回一个列名已更新的新 DataFrame
df = df.toDF(*[sanitize_column_name(col) for col in df.columns])
In [0]:
# 将Avg_Area_Income和Avg_Area_House_Age两列从string类型转换为double类型
from pyspark.sql.types import DoubleType
df = df.withColumn("Avg_Area_Income", df["Avg_Area_Income"].cast(DoubleType()))
df = df.withColumn("Avg_Area_House_Age", df["Avg_Area_House_Age"].cast(DoubleType()))
df.printSchema()
root |-- Avg_Area_Income: double (nullable = true) |-- Avg_Area_House_Age: double (nullable = true) |-- Avg_Area_Number_of_Rooms: double (nullable = true) |-- Avg_Area_Number_of_Bedrooms: double (nullable = true) |-- Area_Population: double (nullable = true) |-- Price: double (nullable = true) |-- Address: string (nullable = true)
In [0]:
# 清洗数据
df = df.dropna()
USAhousing = df
from pyspark.ml.feature import RFormula
from pyspark.ml.regression import LinearRegression
from pyspark.ml.evaluation import RegressionEvaluator
from pyspark.ml import Pipeline, Model
In [0]:
# 将数据分成训练数据和测试数据
# train_data 和 test_data 分别占总数据的 60% 和 40%
train_data, test_data = df.randomSplit([0.6, 0.4], 24)
x_cols = list(set(USAhousing.columns) - {'Price', 'Address'})
formula = "{} ~ {}".format("Price", " + ".join(x_cols))
print("formula: {}".format(formula))
# RFormula will automatically assemble the columns into a vector.
pipeline = Pipeline(
stages=[
RFormula(formula=formula, featuresCol='features'),
LinearRegression(labelCol='Price')
]
)
fitted_model = pipeline.fit(train_data)
fitted_model
formula: Price ~ Avg_Area_Number_of_Bedrooms + Avg_Area_Income + Avg_Area_Number_of_Rooms + Area_Population + Avg_Area_House_Age
Downloading artifacts: 0%| | 0/55 [00:00<?, ?it/s]
Uploading artifacts: 0%| | 0/4 [00:00<?, ?it/s]
Out[0]:
PipelineModel_a2622311ac77
In [0]:
# 使用训练好的模型对测试数据进行预测
d = fitted_model.transform(test_data)
display(d.limit(2))
| Avg_Area_Income | Avg_Area_House_Age | Avg_Area_Number_of_Rooms | Avg_Area_Number_of_Bedrooms | Area_Population | Price | Address | features | label | prediction |
|---|---|---|---|---|---|---|---|---|---|
| 35454.714659475445 | 6.855708363901107 | 6.018646502679608 | 4.5 | 59636.40255302499 | 1077805.577726322 | Unit 4700 Box 1880 | Map(vectorType -> dense, length -> 5, values -> List(4.5, 35454.714659475445, 6.018646502679608, 59636.40255302499, 6.855708363901107)) | 1077805.577726322 | 905856.8198512727 |
| 35797.323121548245 | 5.544221046634432 | 7.795138241804151 | 5.0 | 24844.200190072384 | 299863.0401311839 | 645 Mary Radial | Map(vectorType -> dense, length -> 5, values -> List(5.0, 35797.323121548245, 7.795138241804151, 24844.200190072384, 5.544221046634432)) | 299863.0401311839 | 382459.18199658114 |
In [0]:
# 从pipeline中检索拟合好的模型
lm = fitted_model.stages[-1]
# model coefficient, intercept
print("Coefficients: {}".format(lm.coefficients))
print("Intercept: {}".format(lm.intercept))
print(f"R^2 fit metric {lm.summary.r2}")
Coefficients: [1998.606677232051,21.502388556887606,120617.74657879196,15.23501171427518,164683.75900259122] Intercept: -2629038.655070738 R^2 fit metric 0.916680702340295
In [0]:
# 线性回归模型,使用交叉验证进行网格搜索
# 定义RFormula公式,用于将Price作为标签列,其他列作为特征列
formula = "{} ~ {}".format("Price", " + ".join(x_cols))
print("formula: {}".format(formula))
rformula = RFormula(formula=formula)
lr = LinearRegression(labelCol = 'Price')
pipeline = Pipeline(stages=[rformula, lr])
formula: Price ~ Avg_Area_Number_of_Bedrooms + Avg_Area_Income + Avg_Area_Number_of_Rooms + Area_Population + Avg_Area_House_Age
In [0]:
from pyspark.ml.tuning import ParamGridBuilder
# Define parameter grid
# 在params中有三个参数组合,分别是alpha=0.0, alpha=0.5, alpha=1.0
# LinearRegression 线性回归模型
params = ParamGridBuilder() \
.addGrid(lr.elasticNetParam, [0.0, 0.5, 1.0]) \
.build()
# 创建一个回归评估器,用于评估模型在测试数据上的性能
evaluator = RegressionEvaluator() \
.setMetricName("r2") \
.setPredictionCol("prediction") \
.setLabelCol("label")
In [0]:
from pyspark.ml.tuning import CrossValidator
# Run CrossValidator (no data folds)
# 创建一个交叉验证器,用于选择最佳模型
# 交叉验证器将数据集分成训练集和测试集,并在训练集上训练模型,然后在测试集上评估模型的性能
# 交叉验证器会尝试所有可能的参数组合,并选择在测试集上性能最好的参数组合
# 交叉验证器使用r2作为评估指标
# 这里将数据集分成3个折叠,每个折叠用于一次训练和一次测试
cv = CrossValidator() \
.setEstimator(pipeline) \
.setEvaluator(evaluator) \
.setEstimatorParamMaps(params)
fitted_grid = cv.fit(train_data)
Downloading artifacts: 0%| | 0/85 [00:00<?, ?it/s]
Uploading artifacts: 0%| | 0/4 [00:00<?, ?it/s]
Downloading artifacts: 0%| | 0/55 [00:00<?, ?it/s]
Uploading artifacts: 0%| | 0/4 [00:00<?, ?it/s]
In [0]:
import numpy as np
# 简单模型总结
# 导入 numpy 库,用于数值计算
# 获取拟合网格中模型的数量
num_models = len(fitted_grid.getEstimatorParamMaps())
# 打印模型的数量
print("Number of models in fitted grid: {}".format(num_models))
# 打印模型评估指标的平均值
print(f"Model metrics are: {fitted_grid.avgMetrics}")
Number of models in fitted grid: 3 Model metrics are: [0.9161690215115436, 0.9161690215115436, 0.9161690215115436]
In [0]:
# 简单模型总结
# 从拟合好的网格中获取最佳模型
# fitted_grid.bestModel 返回的是一个 PipelineModel 对象,
# 它包含了最佳的 RFormula 模型和线性回归模型
# fitted_grid.bestModel.stages 返回的是一个列表,包含了 Pipeline 中的所有模型
# fitted_grid.bestModel.stages[1] 返回的是 Pipeline 中的第二个模型,也就是线性回归模型
model = fitted_grid.bestModel.stages[1]
print("Coefficients: {}".format(model.coefficients))
print("Intercept: {}".format(model.intercept))
print(f"R^2 fit metric {model.summary.r2}")
Coefficients: [1998.606677232051,21.502388556887606,120617.74657879196,15.23501171427518,164683.75900259122] Intercept: -2629038.655070738 R^2 fit metric 0.916680702340295
## 使用 k 折交叉验证进行网格搜索
- 与上述相同,但在数据的 k 个子集上进行测试
- CrossValidator 计算通过在 k 个不同的数据集对上拟合 Estimator 而产生的 k 个模型的平均评估指标
- 最后,它使用最佳参数和整个数据集重新拟合 Estimator(管道)
In [0]:
# Run CrossValidator (k=3)
# 创建一个交叉验证器,用于选择最佳模型
# 交叉验证器将数据集分成训练集和测试集,并在训练集上训练模型,然后在测试集上评估模型的性能
# 交叉验证器会尝试所有可能的参数组合,并选择在测试集上性能最好的参数组合
# 交叉验证器使用r2作为评估指标
# 这里将数据集分成3个折叠,每个折叠用于一次训练和一次测试
number_of_folders = 3
cv = CrossValidator() \
.setEstimator(pipeline) \
.setEvaluator(evaluator) \
.setEstimatorParamMaps(params) \
.setNumFolds(number_of_folders)
fitted_grid = cv.fit(train_data)
Downloading artifacts: 0%| | 0/85 [00:00<?, ?it/s]
Uploading artifacts: 0%| | 0/4 [00:00<?, ?it/s]
Downloading artifacts: 0%| | 0/55 [00:00<?, ?it/s]
Uploading artifacts: 0%| | 0/4 [00:00<?, ?it/s]
In [0]:
# 简单模型总结
# 导入 numpy 库,用于数值计算
# 获取拟合网格中模型的数量
import numpy as np
num_models = len(fitted_grid.getEstimatorParamMaps())
print("Number of models in fitted grid: {}".format(num_models))
print(f"Model metrics are: {fitted_grid.avgMetrics}")
Number of models in fitted grid: 3 Model metrics are: [0.9161690215115436, 0.9161690215115436, 0.9161690215115436]
In [0]:
# summary of regression model
model = fitted_grid.bestModel.stages[1]
print("Coefficients: {}".format(model.coefficients))
print("Intercept: {}".format(model.intercept))
print(f"R^2 fit metric {model.summary.r2}")
Coefficients: [1998.606677232051,21.502388556887606,120617.74657879196,15.23501171427518,164683.75900259122] Intercept: -2629038.655070738 R^2 fit metric 0.916680702340295
In [0]:
# 交叉验证器,用于选择最佳模型
# 交叉验证器将数据集分成训练集和测试集,并在训练集上训练模型,然后在测试集上评估模型的性能
# 交叉验证器会尝试所有可能的参数组合,并选择在测试集上性能最好的参数组合
# 交叉验证器使用r2作为评估指标
# 这里将数据集分成6个折叠,每个折叠用于一次训练和一次测试
number_of_folders = 6
cv = CrossValidator() \
.setEstimator(pipeline) \
.setEvaluator(evaluator) \
.setEstimatorParamMaps(params) \
.setNumFolds(number_of_folders)
fitted_grid = cv.fit(train_data)
Downloading artifacts: 0%| | 0/85 [00:00<?, ?it/s]
Uploading artifacts: 0%| | 0/4 [00:00<?, ?it/s]
Downloading artifacts: 0%| | 0/55 [00:00<?, ?it/s]
Uploading artifacts: 0%| | 0/4 [00:00<?, ?it/s]
In [0]:
import numpy as np
# 获取拟合网格中模型的数量
num_models = len(fitted_grid.getEstimatorParamMaps())
print("Number of models in fitted grid: {}".format(num_models))
print(f"Model metrics are: {fitted_grid.avgMetrics}")
Number of models in fitted grid: 3 Model metrics are: [0.916199039014269, 0.916199039014269, 0.916199039014269]
In [0]:
# Cross validate with multiple models
from pyspark.ml.feature import RFormula
from pyspark.ml.regression import LinearRegression, DecisionTreeRegressor, GeneralizedLinearRegression, GeneralizedLinearRegressionModel
from pyspark.ml import Pipeline, Model
from pyspark.ml.evaluation import RegressionEvaluator
from pyspark.ml.tuning import ParamGridBuilder, CrossValidator
In [0]:
# 交叉验证多个模型
# 指定模型、它们的参数和通用管道
# 通用管道对象
formula = "{} ~ {}".format("Price", " + ".join(x_cols))
print("Formula: {}".format(formula))
r_formula = RFormula(formula=formula)
pipeline = Pipeline(stages=[])
basePipeline = [rformula]
param_grid = []
lr = LinearRegression()
param_grid += ParamGridBuilder() \
.baseOn({pipeline.stages: basePipeline + [lr]}) \
.addGrid(lr.regParam, [0.1, 0.3, 0.8]) \
.build()
dt = DecisionTreeRegressor()
param_grid += ParamGridBuilder() \
.baseOn({pipeline.stages: basePipeline + [dt]}) \
.addGrid(dt.minInstancesPerNode, [1, 5]) \
.build()
glr = GeneralizedLinearRegression()
param_grid += ParamGridBuilder() \
.baseOn({pipeline.stages: basePipeline + [glr]}) \
.addGrid(glr.regParam, [0, 0.8]) \
.build()
param_grid
Formula: Price ~ Avg_Area_Number_of_Bedrooms + Avg_Area_Income + Avg_Area_Number_of_Rooms + Area_Population + Avg_Area_House_Age
Out[0]:
[{Param(parent='Pipeline_2034d933a6a9', name='stages', doc='a list of pipeline stages'): [RFormula_8806986a86ec,
LinearRegression_08c1a4c12b7f],
Param(parent='LinearRegression_08c1a4c12b7f', name='regParam', doc='regularization parameter (>= 0).'): 0.1},
{Param(parent='Pipeline_2034d933a6a9', name='stages', doc='a list of pipeline stages'): [RFormula_8806986a86ec,
LinearRegression_08c1a4c12b7f],
Param(parent='LinearRegression_08c1a4c12b7f', name='regParam', doc='regularization parameter (>= 0).'): 0.3},
{Param(parent='Pipeline_2034d933a6a9', name='stages', doc='a list of pipeline stages'): [RFormula_8806986a86ec,
LinearRegression_08c1a4c12b7f],
Param(parent='LinearRegression_08c1a4c12b7f', name='regParam', doc='regularization parameter (>= 0).'): 0.8},
{Param(parent='Pipeline_2034d933a6a9', name='stages', doc='a list of pipeline stages'): [RFormula_8806986a86ec,
DecisionTreeRegressor_efd8fdf43c37],
Param(parent='DecisionTreeRegressor_efd8fdf43c37', name='minInstancesPerNode', doc='Minimum number of instances each child must have after split. If a split causes the left or right child to have fewer than minInstancesPerNode, the split will be discarded as invalid. Should be >= 1.'): 1},
{Param(parent='Pipeline_2034d933a6a9', name='stages', doc='a list of pipeline stages'): [RFormula_8806986a86ec,
DecisionTreeRegressor_efd8fdf43c37],
Param(parent='DecisionTreeRegressor_efd8fdf43c37', name='minInstancesPerNode', doc='Minimum number of instances each child must have after split. If a split causes the left or right child to have fewer than minInstancesPerNode, the split will be discarded as invalid. Should be >= 1.'): 5},
{Param(parent='Pipeline_2034d933a6a9', name='stages', doc='a list of pipeline stages'): [RFormula_8806986a86ec,
GeneralizedLinearRegression_8db3068d3f46],
Param(parent='GeneralizedLinearRegression_8db3068d3f46', name='regParam', doc='regularization parameter (>= 0).'): 0.0},
{Param(parent='Pipeline_2034d933a6a9', name='stages', doc='a list of pipeline stages'): [RFormula_8806986a86ec,
GeneralizedLinearRegression_8db3068d3f46],
Param(parent='GeneralizedLinearRegression_8db3068d3f46', name='regParam', doc='regularization parameter (>= 0).'): 0.8}]
In [0]:
# Specify the common (regression) model evaluator
evaluator = RegressionEvaluator() \
.setMetricName("r2") \
.setLabelCol("label") \
.setPredictionCol("prediction")
# run crossvalidator (k=3)
number_of_folders = 3
cv = CrossValidator() \
.setEstimator(pipeline) \
.setEvaluator(evaluator) \
.setEstimatorParamMaps(param_grid) \
.setNumFolds(number_of_folders)
fitted_grid = cv.fit(train_data)
In [0]:
# 简单模型总结
# 导入 numpy 库,用于数值计算
# 获取拟合网格中模型的数量
import numpy as np
num_models = len(fitted_grid.getEstimatorParamMaps())
print("Number of models in fitted grid: {}".format(num_models))
print(f"Model metrics are: {fitted_grid.avgMetrics}")
Number of models in fitted grid: 7 Model metrics are: [0.9161690222133184, 0.9161690236163919, 0.916169027121294, 0.6519340361458211, 0.6529787791031572, 0.9161690215115436, 0.916169027121294]
In [0]:
import re
from pyspark.ml.tuning import CrossValidatorModel
def paramGrid_model_name(model):
params = [v for v in model.values() if type(v) is not list]
name = [v[-1] for v in model.values() if type(v) is list][0]
name = re.match(r'([a-zA-Z]*)', str(name)).groups()[0]
return f"{name}{params}"
def cv_metrics(cv: CrossValidatorModel):
measures = zip(cv.avgMetrics, [paramGrid_model_name(m) for m in cv.getEstimatorParamMaps()])
metrics, model_names = zip(*measures)
return metrics, model_names
# 从拟合好的网格中获取所有模型的评估指标和名称
metrics, model_names = cv_metrics(fitted_grid)
metric_name = fitted_grid.getEvaluator().getMetricName()
In [0]:
# 模型指标比较图
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_context("notebook")
sns.set_style('white')
sns.set_palette('bright')
def add_metric_labels(metrics):
for i in range(len(metrics)):
plt.text(i, metrics[i], f"{metrics[i]:.3f}", ha='center', va='bottom')
pdf = pd.DataFrame(zip(metrics, model_names), columns=['r2', 'model'])
sns.barplot(data=pdf, x='model', y='r2').set(title="Model Metrics")
plt.xticks(rotation=45)
add_metric_labels(metrics)
In [0]:
model = fitted_grid.bestModel.stages[1]
if isinstance(model, GeneralizedLinearRegressionModel):
# 如果模型是广义线性回归模型,则直接打印模型的 summary(包含详细统计信息)
print(model.summary)
else:
# 否则,打印模型的系数、截距和 R^2 拟合优度
print("Coefficients: {}".format(model.coefficients))
print("Intercept: {}".format(model.intercept))
print(f"R^2 fit metric {model.summary.r2}")
Coefficients: [1998.7406281513245,21.502338835170594,120617.38723836852,15.234976572111597,164683.38385046888] Intercept: -2629029.7626482025 R^2 fit metric 0.9166807023352761
In [0]:
# 使用交叉验证选择的最佳模型对测试数据进行预测
# fitted_grid.bestModel 返回的是一个 PipelineModel 对象,
# 它包含了最佳的 RFormula 模型和线性回归模型
# 使用 fitted_grid.bestModel.transform() 方法对测试数据进行预测
predictions = fitted_grid.bestModel.transform(test_data)
display(predictions.select("label", "prediction"))
| label | prediction |
|---|---|
| 1077805.577726322 | 905857.7217549165 |
| 299863.0401311839 | 382461.210155827 |
| 599504.0192866956 | 450579.3222529907 |
| 899609.3001428025 | 760635.9607011373 |
| 723750.0652577134 | 578777.0801798133 |
| 968411.6243946048 | 842346.5123654515 |
| 401148.5687913792 | 489702.4953861884 |
| 539483.3966111792 | 498151.31364190625 |
| 529282.0843920948 | 492255.5311492714 |
| 152071.87474956046 | 224352.27808677126 |
| 798639.6541779223 | 873972.9143344644 |
| 509499.588996669 | 579349.8334724922 |
| 664465.3309873971 | 665907.1230268287 |
| 560598.5384309639 | 580069.651997698 |
| 494742.5435776913 | 463103.0388433356 |
| 319495.66759175994 | 475360.491742461 |
| 1073355.783703826 | 997068.619075343 |
| 862865.8153196024 | 792958.200356191 |
| 852703.2636757497 | 899070.0560973356 |
| 1078016.9396491002 | 1125023.9679705012 |
| 1054606.9845532854 | 904411.2984304121 |
| 809486.7099279496 | 893943.1397758 |
| 747933.4869386142 | 827518.5119610061 |
| 324981.9929926853 | 483642.168372151 |
| 624482.7635866479 | 714422.7040581186 |
| 786430.8996307264 | 819072.0543287611 |
| 920540.6539499458 | 930085.5051769968 |
| 1344406.9301585502 | 1207680.752889615 |
| 959625.5301771795 | 931452.8310015076 |
| 497579.4465868728 | 525086.5568316998 |
| 900851.1631095213 | 929393.3493556743 |
| 852590.3528209794 | 744039.8788878946 |
| 802048.4455314139 | 845147.4308651472 |
| 541953.9056802422 | 596619.4873849619 |
| 896944.2442711681 | 1040887.2171885697 |
| 923830.33486809 | 698322.8158854521 |
| 615055.6757921792 | 776798.7696506479 |
| 961354.287727855 | 1045074.3039248711 |
| 1108406.7859168318 | 934876.0998357511 |
| 867714.3838490517 | 681711.3081251266 |
| 576356.0318820125 | 493129.94786171755 |
| 300464.0986827323 | 312124.34152681706 |
| 378466.4201839389 | 547632.1298307637 |
| 792146.0760039431 | 790228.1746332161 |
| 615144.898641351 | 780055.4840218327 |
| 882057.1705928424 | 794162.396794477 |
| 853750.6529487937 | 840771.4808010673 |
| 864132.0330832003 | 965117.2680421206 |
| 718874.679765292 | 590243.0834978092 |
| 710269.2139681028 | 753096.7071534749 |
| 885661.5908366481 | 824418.953640359 |
| 456019.171216889 | 559170.1139169754 |
| 774674.0566597179 | 654671.5618288661 |
| 671661.7134409613 | 560017.9706135257 |
| 566896.2123271407 | 587742.1836591074 |
| 1012269.8201046892 | 1004116.6582593797 |
| 762144.9261238109 | 772080.5335629471 |
| 646198.2245230615 | 664362.5128415697 |
| 884015.2270688239 | 929879.6386953611 |
| 970044.6656400692 | 1030501.8954870123 |
| 668183.5098529167 | 511427.73730342556 |
| 1035125.8566511944 | 1179582.2568395184 |
| 1354973.5534951242 | 1333360.1148526021 |
| 589352.3954068222 | 762491.6849481538 |
| 702321.7523214206 | 753900.3389015459 |
| 963934.0130108644 | 801014.3252757574 |
| 1082486.679285127 | 1066608.5249923165 |
| 581200.0967346437 | 639153.0061503984 |
| 1209445.2203735302 | 1131446.8035558308 |
| 1057838.4934225385 | 1174399.6424386865 |
| 617157.9102965128 | 488265.17242421024 |
| 735952.1688894632 | 762416.9764078693 |
| 753930.5825393641 | 916792.2067041025 |
| 1244630.997600002 | 1235688.640629136 |
| 585440.4314477128 | 673038.3982542446 |
| 773996.476231782 | 784032.660765125 |
| 573434.664234319 | 775510.8889864814 |
| 725040.8959547429 | 685907.583558362 |
| 1014513.2095314314 | 1070521.470774752 |
| 1211110.0840824863 | 1106671.585348918 |
| 549976.1455595789 | 512372.6889687702 |
| 668255.4804327786 | 500538.3052444868 |
| 967868.51456034 | 1004473.7569937278 |
| 542596.9895250229 | 656947.2339569861 |
| 1080624.4971657207 | 1065323.0288580032 |
| 975384.1814220176 | 1098114.2562855007 |
| 927978.9092449584 | 1013437.5715308385 |
| 454055.65585268044 | 423532.780682629 |
| 757943.2228205727 | 806650.1209215429 |
| 283208.13218687923 | 350231.27719695633 |
| 1389047.5577764665 | 1372889.8651169105 |
| 892039.4034522664 | 1063754.0460159942 |
| 1352096.0506802993 | 1386981.528655333 |
| 1218509.1453244926 | 1170952.1316619576 |
| 828127.0276465778 | 916079.1975067635 |
| 497368.0367931192 | 506068.2055761302 |
| 1168588.0313207726 | 1146209.316298122 |
| 940138.9613987308 | 887025.2879198687 |
| 555811.4067429452 | 757717.0622053631 |
| 873241.9885742475 | 767567.4544518813 |
| 534305.1323349292 | 611694.0504732188 |
| 390948.4499941545 | 505978.50523186615 |
| 942093.9244773956 | 1053272.7712265807 |
| 1286477.3958779026 | 1059995.0194930504 |
| 612938.7144827124 | 630277.6306834249 |
| 829128.6568381399 | 685670.4187395177 |
| 743393.3473414255 | 814257.8565637791 |
| 872595.0930335799 | 907269.84581273 |
| 1107692.0033501994 | 832720.9212871217 |
| 1131533.5554094613 | 1029238.6080153217 |
| 658644.6170003233 | 521062.0157369999 |
| 211017.97049475575 | 471654.6838751002 |
| 988123.7553400169 | 1122526.20332258 |
| 426100.4805486336 | 510479.4742671605 |
| 913587.0974474044 | 1006205.7511925818 |
| 287307.583688923 | 253871.5606247834 |
| 686644.610408734 | 630843.7933544209 |
| 1220987.0020716093 | 1031510.6579631562 |
| 385678.1666731234 | 396642.9738725908 |
| 774009.5475941251 | 858028.8808309245 |
| 1170892.9796549894 | 1091689.5793701792 |
| 794075.861502829 | 952849.4065394704 |
| 549167.9398554484 | 702808.7846083236 |
| 945981.5296322837 | 958436.6097235233 |
| 979568.628541252 | 1034975.9098684839 |
| 1472539.958266267 | 1420925.7818659572 |
| 817938.7774108642 | 877767.6794343651 |
| 334485.1931043381 | 259234.16985801235 |
| 1116193.292966236 | 1312298.3327156934 |
| 1285923.734211907 | 1339624.8877161788 |
| 832475.189015321 | 789985.7378650042 |
| 1255202.1098387921 | 1148224.250500144 |
| 730739.4189500834 | 727673.1220210101 |
| 1086072.0710614217 | 1030655.2645698893 |
| 1012262.7116594331 | 871543.1656844746 |
| 1052185.1759533966 | 1138883.3386341566 |
| 961727.46838822 | 775698.6364942654 |
| 674657.9106630747 | 764184.8181887618 |
| 912585.6211692464 | 1076239.7035852442 |
| 876763.5840599823 | 940088.8341164333 |
| 1107077.912966575 | 1131643.175189137 |
| 404976.365896227 | 474650.947982057 |
| 1154270.48491612 | 1113171.0826701121 |
| 527749.4038647808 | 592336.4867481021 |
| 1137446.993396963 | 1158918.2845669198 |
| 308199.89116387354 | 433398.814344062 |
| 1128403.366059227 | 1044166.7842295547 |
| 1371527.3270118241 | 1318752.924153661 |
| 658646.1847265189 | 840612.3190000155 |
| 1253648.3243637006 | 1132991.634613406 |
| 907462.4512020181 | 866238.5534919328 |
| 578309.0861866743 | 772572.6192210969 |
| 1237224.8587518162 | 1186923.416254722 |
| 885796.2795967467 | 926012.4968295544 |
| 479500.5568108269 | 620795.765551345 |
| 728402.000075194 | 824158.6177604385 |
| 685123.139313775 | 552052.136398261 |
| 1186357.179044665 | 1225759.6079171547 |
| 772310.2278261484 | 784645.23498883 |
| 1174949.860790675 | 1100680.298227685 |
| 1062666.3663835817 | 1073515.7309834664 |
| 1218635.851406522 | 1041381.3600363615 |
| 847155.0413472857 | 997106.2169049396 |
| 1176437.9189888744 | 1153651.7433665162 |
| 1112314.302911407 | 1101176.0163470902 |
| 430088.25071462436 | 561553.3870646958 |
| 1222887.1208418093 | 1259488.5434108004 |
| 1279945.5101680192 | 1381299.692210006 |
| 508951.5668799004 | 548561.5145411962 |
| 685503.9902718081 | 745698.6163431066 |
| 1411217.4928510934 | 1305546.933904416 |
| 524712.7660674525 | 527833.2346843309 |
| 725830.6020326181 | 837755.8958994704 |
| 945614.5659127636 | 918821.5447417228 |
| 577168.2739439054 | 865538.2741086544 |
| 1311432.388111685 | 1180896.5358315124 |
| 553077.2126120757 | 626677.5105835791 |
| 1451658.8772407244 | 1443978.2745617623 |
| 879356.366048286 | 992165.0578733259 |
| 860346.470698685 | 817745.0407394976 |
| 953261.9162022916 | 843947.5973336874 |
| 266298.8811183604 | 329817.0157609419 |
| 955689.5329258528 | 1116708.4427657882 |
| 1178600.6477851174 | 1046736.7059808038 |
| 1300389.3508202112 | 1252192.3210812863 |
| 628870.345640628 | 486978.9714214979 |
| 679922.2521497933 | 740883.2435666486 |
| 706135.1446389129 | 544530.0286632134 |
| 1409943.302994841 | 1302481.584925115 |
| 914378.3344281595 | 770395.8882545596 |
| 1394900.984583555 | 1411719.6071992265 |
| 814240.281598352 | 877572.3053372898 |
| 768541.9161245954 | 834722.6049724943 |
| 1372969.3107494302 | 1498539.485284763 |
| 1208843.2767307777 | 1230230.0296893823 |
| 1598736.4001647802 | 1439202.7344580335 |
| 1454681.9367671097 | 1284083.7358841007 |
| 803270.1278367852 | 780735.4204821261 |
| 817377.3110222428 | 763264.135277119 |
| 1094069.7981215387 | 1189095.2515460635 |
| 705444.1167909042 | 856236.7796625295 |
| 1248130.5205878613 | 1140266.3632161557 |
| 911901.1553498644 | 911243.2205115701 |
| 1355362.955587261 | 1332517.4245235184 |
| 714822.5871702337 | 794506.0809464143 |
| 1048135.7541761531 | 993138.1140685049 |
| 1198725.4871449017 | 1353745.9259199873 |
| 1194083.2472498536 | 1222225.2843505084 |
| 831168.833673851 | 777464.727341943 |
| 776125.597113738 | 826329.4444072582 |
| 738030.6498645385 | 790465.0727433525 |
| 1071279.210244544 | 1234171.4429152175 |
| 288708.9121479006 | 396597.1860731989 |
| 650939.2066718516 | 690537.8699000962 |
| 1350283.9965166692 | 1388479.0373552833 |
| 1202452.7282114923 | 1053694.7427687282 |
| 734562.104533648 | 789598.6549636987 |
| 840208.7430414602 | 910398.9556439086 |
| 796389.4379566306 | 714634.5464360099 |
| 1230097.450945007 | 1236149.4998232843 |
| 583016.7918965971 | 568479.8104038057 |
| 1090788.9812340653 | 1073766.7843816113 |
| 647982.6536393018 | 840016.3521086122 |
| 624244.9443876417 | 826289.3876212188 |
| 1042243.7312719524 | 1014066.5767430337 |
| 565937.200553177 | 627982.5990957809 |
| 1130221.2976257126 | 1271423.4657237385 |
| 1155801.2529854416 | 1046074.7905298444 |
| 1366980.9098808763 | 1212800.621275377 |
| 675489.7526839289 | 731765.5044331136 |
| 1099351.353851397 | 1202167.8669258016 |
| 1466605.7737989684 | 1341034.076946531 |
| 1398979.2487082446 | 1327650.887157205 |
| 1318231.4182852104 | 1406671.2492875229 |
| 1193482.5030929646 | 1254826.7506954134 |
| 994517.045335133 | 1158206.5006203316 |
| 1366988.2351681623 | 1421423.2859668555 |
| 1355022.282566689 | 1352451.6699535367 |
| 1102641.11402327 | 977867.1850368939 |
| 1200764.8442004516 | 1284660.981646486 |
| 693566.7572719983 | 622540.3521056972 |
| 1051567.9457782458 | 950606.3818102628 |
| 809057.4586058989 | 725297.9107160578 |
| 1113647.870372066 | 1079896.8575799926 |
| 903665.2036911576 | 917849.2599850255 |
| 1247645.409710813 | 1218305.7937994814 |
| 1308465.2400430096 | 1132160.979383185 |
| 781213.0669276181 | 784928.3702196144 |
| 919963.0085832879 | 919287.5270270007 |
| 1494241.2261904366 | 1561948.936967746 |
| 1262017.792059947 | 1143820.071569886 |
| 714166.3978061128 | 609839.8597315284 |
| 989263.23661234 | 932343.3609821321 |
| 1120943.3385906045 | 1062352.9611648466 |
| 1034539.8306178992 | 1004748.6977966521 |
| 1143672.8254142758 | 1071110.8024588586 |
| 962551.0371401922 | 1050098.8783714017 |
| 1409762.1194903015 | 1485265.1539810044 |
| 1397564.1562824405 | 1397313.440508416 |
| 984311.774539692 | 965426.7512445129 |
| 962501.9015215624 | 852492.0817686445 |
| 854812.2579554294 | 816319.6529729948 |
| 1269811.089152703 | 1076608.2345124357 |
| 592512.4283228129 | 762499.2093216144 |
| 748322.708245135 | 852785.6901688152 |
| 1148749.9333118591 | 1180568.516965602 |
| 696467.1699379117 | 538466.5253002322 |
| 1000216.8576741072 | 949427.0099754459 |
| 790802.8010348069 | 716810.3406128068 |
| 1290324.6486199498 | 1389713.6472274726 |
| 603714.7885821962 | 681694.3263997477 |
| 729641.7408744311 | 693054.6547133904 |
| 1048639.7894974465 | 1089662.7461104807 |
| 742858.6356339195 | 824849.6604806851 |
| 1127637.5573666021 | 1033329.0482190135 |
| 1317160.4026229358 | 1129037.7861198764 |
| 866666.0553738795 | 965766.6507591587 |
| 836235.0305323859 | 771290.1962769628 |
| 774491.653288187 | 749556.8553514802 |
| 1076334.1025455322 | 928650.7519563674 |
| 1231452.1888837516 | 1288165.43610053 |
| 1146637.543843481 | 1153936.9642678066 |
| 393639.07395721273 | 564449.8282799674 |
| 1407291.850814192 | 1631241.8361125411 |
| 834268.3429210644 | 947639.8398207505 |
| 783565.1025001407 | 748295.9434734383 |
| 1127082.1989417674 | 1035910.4457318326 |
| 1453974.5059508719 | 1471578.9286865164 |
| 1239309.9147099557 | 1170866.9870189163 |
| 828497.0670960692 | 975022.8475220711 |
| 1208458.2463001548 | 1075987.3342275913 |
| 1278618.6203141354 | 1231247.0346587943 |
| 716771.0057488753 | 898666.9588805651 |
| 886536.4283747243 | 712951.6043452909 |
| 1233965.837378124 | 1227144.293081014 |
| 1176655.0853813165 | 1089943.1107004392 |
| 1430051.0884878961 | 1233938.5592040215 |
| 646248.1833677717 | 671645.715985043 |
| 1380715.3150239568 | 1270015.7534595523 |
| 1120894.8041941738 | 1108684.2513867365 |
| 852099.4640268538 | 913942.4161475394 |
| 704375.8684056341 | 755370.2408691444 |
| 1059431.4512633595 | 1015675.8757889867 |
| 1414286.7224241218 | 1350771.3180475193 |
| 934111.6355005292 | 968428.3864539862 |
| 1061222.5368688365 | 1021769.3977436922 |
| 634218.4408284404 | 536780.5152674424 |
| 1096938.4279098415 | 969564.4339073487 |
| 759360.6547692231 | 680127.4575254703 |
| 1591188.3484872938 | 1435911.5518007488 |
| 1046818.06975883 | 1058096.6592821437 |
| 1015233.032262996 | 1091961.4673636546 |
| 1111360.3028116906 | 1085995.2959097656 |
| 1197069.26419774 | 1093732.8243221631 |
| 1285933.4084066823 | 1303156.4613554627 |
| 1189069.1046909408 | 1206940.5260432488 |
| 846052.911198368 | 767900.2172392756 |
| 578593.5339451779 | 677211.3355183769 |
| 1108022.2823716998 | 1206149.3895727987 |
| 816058.2238053272 | 794720.2730445843 |
| 1137224.5754304302 | 1110810.7259043786 |
| 880682.3019910126 | 911873.3913278035 |
| 1180325.4987802666 | 1176995.6235827673 |
| 952533.5781735645 | 905956.5121243633 |
| 762130.4622501581 | 804525.2530681952 |
| 619087.6936175337 | 722310.8526596469 |
| 1155513.1752000046 | 1257841.5425018696 |
| 1246246.8277597644 | 1193359.5519445217 |
| 755292.1143602777 | 1013466.2395758638 |
| 1150438.9494932448 | 1069001.2044136678 |
| 1058269.0185703223 | 1007905.9411556758 |
| 880084.7004478722 | 848093.3600452836 |
| 850977.0123103865 | 988349.1292921971 |
| 420122.99953232025 | 248290.01822414668 |
| 1367641.27038369 | 1271657.791613128 |
| 1251430.920318619 | 1037216.1920258752 |
| 502553.05218755367 | 535226.6882847026 |
| 868435.2750090398 | 789428.298157718 |
| 1150877.735443249 | 1074499.2489886237 |
| 965074.8047437824 | 960989.5249779522 |
| 1638632.150720546 | 1447077.0226103803 |
| 1098518.1336854908 | 1123591.9777747127 |
| 1055484.373480787 | 920869.2653165101 |
| 1841495.5078848747 | 1651048.7232419709 |
| 568977.0727690812 | 614440.4815941453 |
| 762208.9847574959 | 885866.56194143 |
| 496359.97079138213 | 549336.8565138178 |
| 1375951.0644420423 | 1353527.9902805495 |
| 1340074.6529811826 | 1310268.8114281502 |
| 820250.3894658082 | 799025.7556224847 |
| 1227401.538986844 | 1102827.9600097272 |
| 636506.0005989884 | 728487.0445337621 |
| 721974.551474637 | 788888.1798582273 |
| 1079158.6528522586 | 1220557.5920161144 |
| 696040.1299034554 | 785997.3212494506 |
| 1159207.0846165894 | 1038724.5997137204 |
| 1652845.980628764 | 1569686.800572468 |
| 956435.2633348468 | 1025245.1948325136 |
| 1496729.5357664232 | 1358120.0100760646 |
| 1159699.9657200286 | 1200668.1630648286 |
| 1237246.1448766096 | 1355501.481290712 |
| 992622.769267206 | 997881.0063257776 |
| 1308983.632164077 | 1364769.773906997 |
| 534077.4554759212 | 645605.8214377048 |
| 685922.3851784463 | 837238.7196447882 |
| 1029439.2338632896 | 1125522.4773512534 |
| 1205962.994953347 | 1161935.7240485572 |
| 1361872.2910159142 | 1393636.4010136714 |
| 1401767.9042517585 | 1326207.7945141247 |
| 783818.6820390386 | 795210.462446636 |
| 635419.3652163026 | 713609.0303210001 |
| 1238708.7597381796 | 1181387.988884679 |
| 916140.2212497431 | 982765.5855871364 |
| 313651.5032332925 | 528516.1212901031 |
| 552279.2140466532 | 507610.6077913372 |
| 962081.4199995695 | 1047613.0502252323 |
| 592397.7261389504 | 545962.8210819429 |
| 957283.65635498 | 1028695.8363968562 |
| 1232004.8298347492 | 1396163.6594393752 |
| 742016.0551722904 | 596326.8152839774 |
| 818289.7642087417 | 833043.1762133166 |
| 470008.13822756393 | 508141.2344297292 |
| 1200653.345481142 | 1236065.8564832858 |
| 893541.4569496352 | 1184741.397026373 |
| 788427.8399198116 | 845568.057570863 |
| 440585.029390805 | 422418.17028356856 |
| 839453.2926376425 | 883465.7275176765 |
| 1191340.825875469 | 1282748.3770634239 |
| 561703.7697294904 | 723710.0728383847 |
| 1296146.938859657 | 1368225.6184563981 |
| 786559.0248508396 | 730255.635094949 |
| 774073.561854088 | 851175.1107518827 |
| 745996.3305840503 | 790837.1483632899 |
| 1427832.120659103 | 1385517.4734523324 |
| 566848.7320986082 | 598472.8634153842 |
| 936234.3475902014 | 792928.9758020551 |
| 1196687.6867665495 | 1265595.4898738102 |
| 1209571.0724135821 | 1137173.8929220415 |
| 897291.1153231284 | 914092.2382243299 |
| 614700.7371485097 | 697259.7505183318 |
| 1321008.5934856627 | 1329488.4970795037 |
| 1026505.8205659143 | 1073045.2284154273 |
| 1384965.6541746578 | 1270114.4931836314 |
| 851633.9109410639 | 739943.6482060095 |
| 1039380.7224796106 | 833344.7360874056 |
| 1114901.9726230132 | 1044867.6608742396 |
| 920498.9373832784 | 1050894.286565429 |
| 1428797.3718951428 | 1400293.014365646 |
| 592223.2631006419 | 799046.1917666807 |
| 985283.8815578348 | 1054632.284272355 |
| 1320897.0134556554 | 1309225.2875642218 |
| 607873.7727559933 | 781146.1962926164 |
| 1063743.4241658195 | 940046.9380916283 |
| 829794.8232933849 | 995155.2507163691 |
| 980049.3901359151 | 940033.992446153 |
| 1325294.1210921824 | 1236675.0037438902 |
| 1281777.5811675105 | 1352980.512998526 |
| 1242111.4283369773 | 1200382.0172763942 |
| 842235.8033529122 | 814689.6401144466 |
| 697656.5924360289 | 990140.170785212 |
| 990893.1600715704 | 952921.5676067672 |
| 874497.2654803138 | 822140.5687129903 |
| 724993.8892416583 | 703513.2223042552 |
| 1136448.408760456 | 1235192.3725420781 |
| 737202.457611395 | 806278.843615225 |
| 1475349.5520184026 | 1297138.492772086 |
| 712228.4243027219 | 739914.8973801257 |
| 914136.519775298 | 724425.0352186402 |
| 1273554.2778351835 | 1133487.9537007879 |
| 992566.6232646884 | 974166.154883232 |
| 1389773.8734894216 | 1238070.9232926425 |
| 606863.1414738953 | 594007.5497888909 |
| 1364306.7686809986 | 1310621.8444445697 |
| 1005089.8939753319 | 887696.7422942077 |
| 934744.0334904651 | 934696.8969382159 |
| 616738.2083315281 | 626064.9426276078 |
| 1675523.36662169 | 1592392.2966824723 |
| 1223915.2526177592 | 1124809.4249948598 |
| 849008.7046985144 | 802259.7896045218 |
| 799124.8491575408 | 813617.4409235381 |
| 795082.8101752147 | 848350.73522043 |
| 1022781.1707429123 | 1123944.1892916788 |
| 1198313.5980997651 | 1319624.0684502833 |
| 943485.047267782 | 852753.9066991773 |
| 947355.9700864508 | 1011202.6426450871 |
| 869026.5819988098 | 855561.4687112411 |
| 1164968.8766317505 | 1088747.481255944 |
| 1156329.2740497622 | 980927.8211769373 |
| 1170169.2592077085 | 1114158.0755165215 |
| 1117741.7573242227 | 1205484.1100912984 |
| 1433493.802219979 | 1480303.7494403129 |
| 1112286.046385043 | 927499.1691621444 |
| 482689.70337566634 | 685442.40707774 |
| 1069238.4997052513 | 1175299.33697156 |
| 1178846.0658152937 | 1215187.197926843 |
| 939139.0293389644 | 1037763.2797424789 |
| 671343.9417927802 | 733029.901383521 |
| 1127873.5774725412 | 1053100.8731053085 |
| 1184462.319944161 | 1199981.1878386685 |
| 929247.5995364 | 1077873.0135117238 |
| 971099.4753986859 | 911412.8534415248 |
| 1279681.154396593 | 1297811.5063460781 |
| 627733.7433863797 | 710200.808505096 |
| 1321743.1661741682 | 1150538.2100791768 |
| 745586.5735088169 | 948849.2926050196 |
| 927677.4223195151 | 946527.2191392025 |
| 959416.4366620412 | 1197863.4508971921 |
| 938171.3555536494 | 971698.5294517521 |
| 1056225.6856011886 | 1101419.7068086984 |
| 814784.2457280058 | 929378.4500109255 |
| 716316.4881444586 | 870361.9448002265 |
| 987434.7498393513 | 1023900.5660654744 |
| 437146.0203506594 | 674407.3459708588 |
| 1353488.41646297 | 1222167.972387637 |
| 804453.869783905 | 794796.3893446974 |
| 1739761.372611396 | 1664269.8418694614 |
| 777144.2542493446 | 872466.5282563958 |
| 1168760.4276857057 | 1226544.0162460185 |
| 855667.1793027757 | 1042767.3802427854 |
| 631656.4745826736 | 680276.2069024132 |
| 729990.0243899535 | 769016.6050279117 |
| 1132662.2153922748 | 967683.1689118375 |
| 1019880.6530541871 | 995712.9439233765 |
| 1450122.715015601 | 1378030.5664760699 |
| 1023205.0409895576 | 1082303.8539848104 |
| 744450.2293097175 | 836689.97458601 |
| 729989.3499281745 | 809616.3210268752 |
| 1591934.1903279137 | 1554321.0688064462 |
| 369433.3549647921 | 598276.9278453332 |
| 1070720.058487742 | 1267077.5368013745 |
| 1473540.7599385441 | 1458704.5411193236 |
| 678721.8842424268 | 615101.4866774599 |
| 720059.8348080008 | 801539.4319240339 |
| 785399.1395370425 | 827047.1786269359 |
| 1559997.1510714702 | 1401696.806724355 |
| 1419345.6073025845 | 1373461.448767378 |
| 1147908.5287110873 | 952579.3929157597 |
| 980141.2191076673 | 1049258.5079587637 |
| 1338424.7883671494 | 1236179.892132883 |
| 1445731.6259433646 | 1343085.6027365774 |
| 912422.1464209495 | 986024.9441233184 |
| 842086.673327905 | 819616.2033889 |
| 1327811.34262042 | 1319836.638871708 |
| 1426545.9673390274 | 1238495.9228213485 |
| 1014450.6537930905 | 992971.1107387501 |
| 1184614.087024015 | 1197455.5293772817 |
| 1271752.4319501128 | 1385932.2426101812 |
| 857934.5477662288 | 985277.8140644245 |
| 1381430.630188794 | 1315424.4411885259 |
| 1625508.0131062374 | 1567672.6586798355 |
| 1194191.8785113744 | 1087080.3284879075 |
| 1325860.533421939 | 1176599.8452954972 |
| 1560693.0982718563 | 1621417.318842032 |
| 1202050.5842604076 | 1199414.0611691694 |
| 1144641.8194544462 | 1066532.1190356337 |
| 1328658.9110723843 | 1328970.7985489755 |
| 708045.5749205473 | 773200.4972748416 |
| 849656.9231925056 | 750136.7822087458 |
| 1169050.984825398 | 1078171.9027009453 |
| 1044999.3428528216 | 991238.648170589 |
| 808373.7030161206 | 919451.7038302314 |
| 1166336.2592978398 | 1072705.074333834 |
| 1377430.072170325 | 1391705.8461686661 |
| 1054856.0326670024 | 1074757.0142344297 |
| 1230391.468297335 | 1184597.9969870672 |
| 975385.5554017648 | 880637.2736585191 |
| 974805.9937128816 | 769337.1653345348 |
| 714706.4288537387 | 798145.2304615858 |
| 1253370.1489213388 | 1186374.558968672 |
| 528485.2467305964 | 489285.4356710748 |
| 1200125.4471192514 | 1147126.492548386 |
| 1128895.1249507668 | 909915.4823739599 |
| 1197740.916766395 | 1297352.286601794 |
| 1151189.6422095394 | 1109010.8355457727 |
| 1536899.0833184824 | 1515171.462682915 |
| 1031046.3654266484 | 1104844.4331551911 |
| 1040607.3120545676 | 1144879.1717425776 |
| 1011477.61428122 | 1113202.875711985 |
| 549947.2482470637 | 650978.5186270108 |
| 1454834.9824772594 | 1397520.2635718212 |
| 1197929.7431864964 | 1089645.8547224207 |
| 1399662.5844672613 | 1248716.2562452233 |
| 1432012.8709221852 | 1268849.565903726 |
| 916717.6046638169 | 850719.0965749226 |
| 1393100.4226061562 | 1352089.7351276083 |
| 1017722.997568472 | 870992.9956932445 |
| 873048.3196423554 | 823850.3279265766 |
| 1280431.5736478446 | 1288606.1680212296 |
| 1104109.0350293606 | 1191298.6611960395 |
| 1504664.2808396954 | 1490122.9602132859 |
| 1197307.146008132 | 1146230.4642968983 |
| 908616.4826240856 | 756205.4895877349 |
| 1290755.036070184 | 1225365.9799761237 |
| 1033155.3294570051 | 1111638.2922763317 |
| 1375771.1290372743 | 1425448.7000430007 |
| 1019127.7329514013 | 1096319.3203939828 |
| 1142264.2476784117 | 1232001.6997954585 |
| 685355.4168064342 | 655031.0887157149 |
| 1124396.2490127091 | 1014772.420132345 |
| 945057.3183830888 | 935163.1028807131 |
| 984349.6141548756 | 1125781.4599292725 |
| 1107067.804259093 | 1102620.6417044522 |
| 823941.922058669 | 929787.1420864677 |
| 1086181.7530789468 | 1070932.617471967 |
| 768301.8020259616 | 633202.35567358 |
| 972417.8089132756 | 1045149.7921189233 |
| 1212276.3574996628 | 1274292.2224089783 |
| 727366.947448545 | 501464.14280142216 |
| 1363319.8464196029 | 1454459.715847996 |
| 758886.6887614839 | 706296.5663487022 |
| 716344.6279481957 | 800430.0597257749 |
| 1029855.7140241184 | 872180.9068571888 |
| 1409977.1310957712 | 1361389.7718455736 |
| 1523915.1446841708 | 1551400.475987637 |
| 1343484.7267360713 | 1311948.5379609624 |
| 972670.8133224328 | 1097544.0032958793 |
| 1295918.333133723 | 1294061.4002897055 |
| 1204939.9039192782 | 1241985.2430363009 |
| 877822.6628716969 | 991516.1358275558 |
| 813807.6997244997 | 904108.2839250709 |
| 1277780.5122094348 | 1286787.9428508612 |
| 1020041.7474392444 | 888680.0655112127 |
| 1122563.8194987655 | 1032023.2381570535 |
| 1161995.7281770946 | 1201522.7613592711 |
| 1153871.4695016337 | 942704.8748191912 |
| 896937.6577995939 | 830455.8130233698 |
| 1191968.5200498789 | 1213021.4489972228 |
| 1025461.1344276337 | 1177052.0728857345 |
| 1306367.8106375176 | 1250842.317574222 |
| 1272337.503505837 | 1379022.5557490904 |
| 1095391.7986012585 | 1119648.2751522497 |
| 739027.6758369291 | 828800.1326503265 |
| 1369753.2817485817 | 1232422.4134007706 |
| 1178553.6161792604 | 1245506.0355174812 |
| 1007478.7484311544 | 1070923.742318863 |
| 1285157.8695856398 | 1280126.9679068387 |
| 1410331.8251379866 | 1527392.3156152824 |
| 1026126.5838267674 | 1048300.7964176531 |
| 1024973.1952142385 | 865556.0273872698 |
| 639471.7361335896 | 667371.3528016298 |
| 1253359.9540054663 | 1330039.7007417125 |
| 1584167.8513026515 | 1404375.1900859443 |
| 1261491.4253835727 | 1224942.9029253623 |
| 1011909.6944313495 | 1007284.0657265182 |
| 814378.4821120476 | 805347.2531833379 |
| 556839.6371323885 | 635538.9978234568 |
| 1158171.72512284 | 1006971.6638926025 |
| 1447250.9990249784 | 1323066.3967166538 |
| 735660.455803421 | 820304.8923661094 |
| 608794.2466921951 | 751994.3338695527 |
| 1365945.0827829945 | 1385890.4767785915 |
| 925394.135004886 | 800995.1004156009 |
| 1496724.3806064818 | 1645751.7560509313 |
| 930011.5708874031 | 1074553.0729885865 |
| 1153435.0923530154 | 1183788.7083961577 |
| 1085494.8201108652 | 1140993.8463739795 |
| 1305127.336002346 | 1141296.1222557556 |
| 1169166.9894781034 | 1284572.469060243 |
| 727866.5251679078 | 616088.2154225511 |
| 1084011.704468987 | 1004926.1973407026 |
| 1440106.8638914619 | 1267157.672696515 |
| 1453663.2517569226 | 1536812.995618343 |
| 1143377.601699577 | 986636.1053759712 |
| 1442632.5412265589 | 1399797.9592770399 |
| 1479063.2137821943 | 1390673.0325383325 |
| 983534.15000672 | 955300.5301144882 |
| 1292643.5202523577 | 1304583.5076019992 |
| 1172514.722473985 | 1077653.4492010465 |
| 1181663.4835711485 | 1128979.1378357243 |
| 1565151.54520208 | 1494997.0019247592 |
| 1260616.8066294468 | 1119912.3513037306 |
| 1076438.9751434857 | 1013389.8988162726 |
| 1025701.5949167036 | 970949.7301867935 |
| 1400498.2675747594 | 1485469.376596244 |
| 1030729.5831522895 | 1018712.6411432368 |
| 832559.7975509297 | 944848.9560431312 |
| 1369582.5824914402 | 1283716.5838952558 |
| 1307173.871509329 | 1133169.6803268725 |
| 1195601.9623484935 | 1161459.6362088388 |
| 1302933.2475692779 | 1391687.291785874 |
| 1204400.6157420955 | 1282445.6257460094 |
| 1019425.9367578316 | 1137336.3589925957 |
| 1257376.1736885186 | 1289892.1129793865 |
| 943575.1306955819 | 1095726.6501419344 |
| 1146532.4547405615 | 1052431.4097950705 |
| 944032.477262609 | 1081143.7024032562 |
| 907530.175313622 | 883078.725964243 |
| 979282.7630677487 | 1168238.720895784 |
| 1175781.4175700566 | 1140533.6339400834 |
| 1249461.5616007491 | 1315524.9946291144 |
| 1684537.9611563762 | 1649410.5170127237 |
| 864702.9339482344 | 854298.7951094904 |
| 1124463.0404031896 | 1135764.0304525201 |
| 933306.2877207608 | 884928.2438375726 |
| 1462608.6960220553 | 1400910.18567556 |
| 1008712.5750731864 | 1058366.1551441145 |
| 1332669.2347985206 | 1242754.5186008462 |
| 1042144.2309165346 | 1059076.9068703959 |
| 954154.2068994228 | 1154858.5695509822 |
| 1032346.8698248024 | 1150312.742071597 |
| 1046627.052185562 | 1113266.0116603076 |
| 1558572.2432714645 | 1496187.7371601416 |
| 972079.5875536922 | 1096310.4445818868 |
| 1226586.921412926 | 1217571.463599734 |
| 853084.1522068826 | 939011.0924215228 |
| 1747244.8633075694 | 1729622.5547978105 |
| 433247.15658337076 | 580374.9456366086 |
| 1049632.1806835157 | 1151481.1690748958 |
| 800146.2260609316 | 787663.2133700438 |
| 1193253.801043337 | 1028313.7031475441 |
| 917610.888395342 | 1107099.8564292914 |
| 1388530.1566836066 | 1363849.221339425 |
| 1667560.879303713 | 1707292.003000494 |
| 1252391.1798421678 | 1190897.3333718837 |
| 1003905.0595460527 | 1005681.6147620114 |
| 1011331.1636193402 | 1051221.2153741987 |
| 1599860.079583913 | 1551654.7884458192 |
| 1366727.6626961108 | 1266543.555613446 |
| 1184799.2714969371 | 1021530.1390886428 |
| 1194709.6278581591 | 1152041.2485881965 |
| 1289008.216604162 | 1311157.628262659 |
| 1152269.4307673892 | 1067527.800958184 |
| 1185743.8241796806 | 1358967.9950075168 |
| 1309397.0494290392 | 1467870.7660667873 |
| 1041896.8510574887 | 1052604.4400415556 |
| 1158742.8299392913 | 1132747.4127845406 |
| 1277744.7389113496 | 1171339.4389392543 |
| 985749.787356535 | 974594.3187550073 |
| 1372878.5343937918 | 1323374.9564002175 |
| 1267714.1492267174 | 1333242.421498728 |
| 1545864.1664834968 | 1560183.582175313 |
| 642646.4389558511 | 594356.6035692161 |
| 1233484.4765780976 | 1198407.7134323246 |
| 922514.0879743272 | 935844.0464065778 |
| 1185935.6413659677 | 1120304.2141068336 |
| 1586312.1579576717 | 1665250.1686344203 |
| 949072.2495954648 | 1074893.389349218 |
| 1165240.1780106246 | 1275906.2746595796 |
| 1206020.384558566 | 1240767.834079761 |
| 1484653.884070311 | 1485149.0089478632 |
| 941950.5794564657 | 789078.1967892428 |
| 1232466.3997601648 | 1201173.4957446363 |
| 1095879.4433997157 | 901232.3001008951 |
| 1772390.553273201 | 1794245.1901020687 |
| 520217.89299136034 | 623085.5295067602 |
| 1126137.681408579 | 1104105.9020147454 |
| 1110931.8257023671 | 1049514.8509138827 |
| 1113570.8518884848 | 1135234.5410576789 |
| 1204103.0865989951 | 1249270.7156894007 |
| 1055548.6757761142 | 1026375.6302916626 |
| 606191.8669228128 | 709781.12413564 |
| 1548962.888217382 | 1529717.6414794233 |
| 1069827.806639154 | 1164856.5820963858 |
| 1197437.3440681112 | 1004369.2872061627 |
| 1191261.8686796485 | 1070766.6795706707 |
| 1236874.809187995 | 1396626.2307216981 |
| 718887.2315009277 | 735275.2813708386 |
| 1453108.7938176685 | 1320696.364027237 |
| 1048302.4087843634 | 1118384.3061133851 |
| 685775.5980289889 | 781882.820494323 |
| 1278991.6886996122 | 1304989.4333834639 |
| 1427202.2785615397 | 1364999.460964878 |
| 491907.79437121906 | 630161.2904731538 |
| 1548322.5007091828 | 1449393.1009493354 |
| 758570.797192593 | 1006035.8344603186 |
| 1535781.3940854766 | 1431095.295272653 |
| 815593.7638087127 | 775926.5269752024 |
| 805433.7396581171 | 751422.5659948229 |
| 1226067.3141602448 | 1113055.0547909187 |
| 1346379.9849433708 | 1316378.9992660498 |
| 664298.9713057821 | 710650.5437273039 |
| 862407.8170122284 | 822912.1475031972 |
| 730043.6450595969 | 645529.2383485152 |
| 1145804.269286555 | 1085139.779880534 |
| 1167119.1088366588 | 1216499.7216937775 |
| 1619829.095720185 | 1454675.4617882716 |
| 1427108.5011545552 | 1472063.6754518528 |
| 1105990.6937738706 | 1110759.464919638 |
| 1115080.6543461238 | 1193955.3716524397 |
| 839426.1221799824 | 806987.0876085889 |
| 1200060.6620374115 | 1121794.5775846378 |
| 1337472.0851516859 | 1465851.9246738767 |
| 1153135.2202940069 | 1247819.424678804 |
| 1204598.0374631258 | 1352598.3590069027 |
| 1227167.407601847 | 1109147.1874139733 |
| 1296467.9936411472 | 1380043.750183159 |
| 673225.1118895164 | 791236.7464335519 |
| 1151233.0954609385 | 1043107.0379681755 |
| 1381272.8805665972 | 1275171.3962852992 |
| 1447181.8263121648 | 1323382.8769784416 |
| 1279160.9875854698 | 1289042.3617466553 |
| 1190867.4373649121 | 1247775.5269285971 |
| 899186.156938855 | 977938.6579233631 |
| 1009831.1347769842 | 809484.9753809012 |
| 1037147.4674024236 | 1034688.7373350202 |
| 1004041.4348393113 | 811470.2984307986 |
| 1287903.352195353 | 1156735.7300791545 |
| 1085101.3240057079 | 1132305.3467055918 |
| 1129613.0100203287 | 1143833.0556006096 |
| 1135613.4318414165 | 1155257.915264259 |
| 1272180.196538667 | 1125728.4936930467 |
| 622449.6452289193 | 644604.927284074 |
| 1245785.0509590923 | 1064541.0949953487 |
| 1443228.2882428241 | 1524120.1410996881 |
| 1167421.7390277584 | 1217588.4243942774 |
| 1180091.4978196998 | 1126624.528769602 |
| 779106.0224899127 | 724858.2000962985 |
| 923246.8620740193 | 1009469.2833244475 |
| 1177289.88620479 | 1109719.2573547834 |
| 1148416.90958571 | 1188525.211061723 |
| 1069292.3268591478 | 1182826.0359148616 |
| 1495384.0036687853 | 1510013.1736796475 |
| 1389763.8215262156 | 1266058.9122069464 |
| 767784.6304433151 | 811498.2929540747 |
| 1168993.7588005515 | 1169925.378678054 |
| 1578136.165302621 | 1509060.920890274 |
| 1534889.8534666563 | 1662773.784093055 |
| 1262232.32130769 | 1316895.5016211132 |
| 1269486.3372270886 | 1244214.5215534153 |
| 926880.8505513169 | 938850.1025723573 |
| 717825.3596950844 | 875104.0879646186 |
| 963531.915230982 | 975694.9481806974 |
| 729688.5926317396 | 840499.6759487232 |
| 1047689.2657463626 | 1031419.6901947283 |
| 1130677.4658439818 | 1192741.0443031932 |
| 1357575.8516151062 | 1463881.613711724 |
| 924346.1648024169 | 1076022.0235328865 |
| 1108204.5868627557 | 1139743.9382797102 |
| 1614667.5279239863 | 1609930.4498600084 |
| 954732.9038402882 | 1027460.414248751 |
| 1184527.3743972029 | 1215726.7163761863 |
| 1265927.359738196 | 1441036.6586380177 |
| 980983.2109523584 | 1137973.125259302 |
| 554253.0540102996 | 760230.9588312558 |
| 991398.8218655173 | 981487.6852361662 |
| 1630952.883556368 | 1449719.0623719017 |
| 911071.8335530659 | 1079965.1878279815 |
| 1238396.412062526 | 1352993.0274222651 |
| 1468738.7548690382 | 1286757.000637685 |
| 1004471.6608776528 | 992503.915281008 |
| 1582765.592476812 | 1639067.2694958234 |
| 1440736.5832582822 | 1322827.5360944443 |
| 856261.615200036 | 847434.5162328994 |
| 1412626.5187417814 | 1350746.826872168 |
| 1127248.610233683 | 1265849.0366661903 |
| 1393897.3902198137 | 1424619.065258346 |
| 864446.7942204889 | 857779.2347182296 |
| 798073.946177208 | 854769.5690358272 |
| 1016526.5937435456 | 1030523.4564326443 |
| 821859.065727853 | 734487.7872019713 |
| 1522143.6413856596 | 1409281.3413431342 |
| 944979.0094316949 | 940550.0805320209 |
| 1298980.8289499965 | 1308816.637552233 |
| 1385400.4556730608 | 1474041.5298614018 |
| 642809.9667434745 | 801185.4338855706 |
| 1444701.3279198643 | 1405932.967691111 |
| 986285.3818561401 | 1035801.5970689873 |
| 762167.2533312994 | 768783.8442786653 |
| 1040376.9951696122 | 991835.604585798 |
| 1029354.4948558316 | 1095746.576749432 |
| 1474379.4400821466 | 1351647.4347646465 |
| 1155752.7447402594 | 1184304.5127788386 |
| 1234531.6005033446 | 1149871.9827740104 |
| 1111085.0168910609 | 934166.343750786 |
| 945551.14893088 | 769737.2754798504 |
| 1497377.180867295 | 1490158.8832034105 |
| 1318597.714778656 | 1237956.9029880925 |
| 1244916.547543288 | 1318256.8721174384 |
| 1384478.3045482538 | 1313326.5369834444 |
| 1322782.7602694822 | 1421239.04591212 |
| 1378269.5728225105 | 1302325.2276125802 |
| 1372549.7824922143 | 1250706.029195013 |
| 1301089.7115082329 | 1310712.210449739 |
| 579585.6980204432 | 657343.6723522055 |
| 1467910.5694426084 | 1493137.187042559 |
| 1009769.0775382696 | 967094.9475348857 |
| 1242114.1008793542 | 1137626.935100461 |
| 901881.7426862385 | 786046.0986668998 |
| 930493.33131078 | 890240.676627731 |
| 1309985.8867940793 | 1426676.6508492427 |
| 1045704.7003284559 | 1311951.541917651 |
| 796666.1224321837 | 691015.7766246707 |
| 1051519.065766143 | 1026897.2307619685 |
| 1255576.272954358 | 1068269.469509183 |
| 906011.3853235616 | 1127404.3895330247 |
| 1149524.698591107 | 1125779.8670683592 |
| 626085.9330046533 | 667266.6095797154 |
| 1217061.2536475826 | 1137383.9169365717 |
| 1360908.3196200058 | 1311196.1955455723 |
| 1168444.88222469 | 1282055.6536308527 |
| 729781.569559095 | 840956.7551592416 |
| 1820189.5328040929 | 1736566.0012840861 |
| 873509.1895266719 | 1006136.1973859118 |
| 1417047.627110665 | 1219081.410592217 |
| 758262.6121106534 | 750165.655616317 |
| 1321037.4136147692 | 1138372.2118209032 |
| 960083.9968510192 | 926200.5570275337 |
| 1702406.0389352096 | 1606359.7052839966 |
| 1417158.537395579 | 1492465.0289731175 |
| 839194.0689419047 | 689136.302640182 |
| 1362239.0535402829 | 1302281.9288055464 |
| 1373048.09902299 | 1144996.4968939219 |
| 1088222.4209022115 | 809405.7792491564 |
| 1381117.7013514298 | 1484027.8479492897 |
| 1714266.2737553422 | 1697832.4893719023 |
| 1361521.9829376258 | 1265923.77921863 |
| 1660975.1714736663 | 1704795.0473477654 |
| 1687998.9329604746 | 1495366.6182349627 |
| 1168574.665599605 | 1130846.0273020999 |
| 1530294.5773399263 | 1401889.1575734043 |
| 1063630.927500455 | 1131086.0870185113 |
| 1406435.8062174402 | 1254115.9203496338 |
| 1206393.1814995254 | 1301787.3451435561 |
| 1502447.916728789 | 1722593.0340341013 |
| 1394637.6499772295 | 1436233.8324858886 |
| 1103352.6009398182 | 1103133.4432465043 |
| 1251688.6157028743 | 1257659.5689670704 |
| 1111108.5012185795 | 1121040.0840725056 |
| 792449.5430652391 | 878079.6770991762 |
| 1218011.060787834 | 1273053.4884719043 |
| 1256599.1787555614 | 1206141.4685808318 |
| 914325.029151274 | 858238.9403620875 |
| 821598.9851950513 | 860854.1087759654 |
| 1222412.019854086 | 1326636.763785867 |
| 881443.9247264569 | 942960.6392926876 |
| 1109059.053626801 | 1165907.0830361228 |
| 1034180.9492611092 | 1091217.5702869906 |
| 1102943.3514449215 | 972138.4941715025 |
| 1214986.885715444 | 1216022.8890055488 |
| 1440897.4124288629 | 1413415.694114481 |
| 1134397.7577153658 | 1158121.8743459824 |
| 1118165.8661723498 | 1102094.5376149537 |
| 1375215.0615939235 | 1484068.6131472439 |
| 997618.6797694248 | 882051.2498139832 |
| 1674680.74073848 | 1555325.7455454255 |
| 949892.5313701816 | 925820.4653137038 |
| 1468752.6574269752 | 1348402.9441114399 |
| 1328572.1905050843 | 1388393.655268442 |
| 1109559.8516026712 | 1138441.714231735 |
| 1481146.950498894 | 1400175.625500251 |
| 924728.537366032 | 877382.3070372553 |
| 1160246.7296611143 | 1132443.9309693235 |
| 1245400.955310805 | 1212009.182309276 |
| 1714445.1746365826 | 1609460.4310125988 |
| 1175190.6729764738 | 1102218.0850256477 |
| 1129798.3727253522 | 1253056.5543233533 |
| 1433260.2277418757 | 1468067.016656388 |
| 1413729.7574052191 | 1268362.983904256 |
| 1041237.8173865615 | 1134638.6281142836 |
| 1058517.809925588 | 1066745.649985637 |
| 864899.4849738175 | 828365.2575971051 |
| 1613037.5089371018 | 1629017.821150029 |
| 1366854.2405065321 | 1435158.3001885866 |
| 1053815.0969096147 | 1125074.9501688615 |
| 863448.392442468 | 828747.3529195413 |
| 1641226.5842989285 | 1590372.267068251 |
| 968082.1645233814 | 928410.9740476739 |
| 1300265.2104154662 | 1331159.7802325338 |
| 807916.3134010027 | 837350.7583420468 |
| 1096052.8677200165 | 1101291.3625990883 |
| 1074263.3172363585 | 1220368.5254776343 |
| 1150658.59516312 | 1225165.5084261107 |
| 973096.358177584 | 851091.9291759431 |
| 1238938.2905319994 | 1161469.7512826584 |
| 1688279.3081102488 | 1550277.1290128976 |
| 1071109.9165850952 | 1089352.0822324003 |
| 1244631.5193582582 | 1231494.6946885404 |
| 670063.0223057014 | 813057.6301534646 |
| 976649.0166086609 | 1004644.7492058179 |
| 1550931.0678444891 | 1422041.287634198 |
| 949879.9338885004 | 1040159.2716770298 |
| 1467849.817834562 | 1475311.0903927065 |
| 1267443.3976117743 | 1206772.894042184 |
| 880851.0551992012 | 901534.9255967895 |
| 1535781.9598291912 | 1449920.4017890585 |
| 1494101.444719538 | 1440549.4758872464 |
| 1998368.740697701 | 1875273.6041229898 |
| 1229702.9483640657 | 1383244.646439842 |
| 1323959.799106813 | 1267409.8366395663 |
| 1527691.7006808666 | 1397786.4579615388 |
| 1760734.6903640141 | 1488585.9699235866 |
| 1053338.5923717965 | 974515.7559454893 |
| 1343394.6343089922 | 1312236.9193653902 |
| 1222041.015832907 | 1314782.0111143198 |
| 1057347.1660527764 | 1001977.8390810173 |
| 1557914.8897784243 | 1500700.3834062568 |
| 1028966.3679292719 | 1077659.3499803334 |
| 962747.1638994686 | 926283.6081900559 |
| 1164209.6193771295 | 1210802.675733503 |
| 879511.1964474785 | 878373.4763675258 |
| 857697.1254910927 | 855615.0706291371 |
| 1341870.353786446 | 1282958.8057338842 |
| 843650.8278900945 | 830177.5699678287 |
| 1273120.2588270574 | 1345972.5042994344 |
| 1482123.6246868188 | 1422619.7288952176 |
| 810751.7250413778 | 888089.1203715303 |
| 1043483.9151320348 | 948490.2085766662 |
| 1513223.534863405 | 1502268.2823159788 |
| 1564252.5257374863 | 1549734.489650935 |
| 911202.1683461091 | 933101.1292296085 |
| 823864.3877373383 | 852881.4781133649 |
| 1198656.8724076871 | 1264872.5117520872 |
| 1252416.6912618277 | 1210754.30773889 |
| 1059870.9648322463 | 952491.8804383506 |
| 1048969.4932738757 | 1084614.4500266504 |
| 522638.99887346 | 616713.2117418391 |
| 1255736.4085876248 | 1232505.2630860498 |
| 1076032.5535246094 | 982502.9704781258 |
| 837540.1697407691 | 924250.4951713947 |
| 1446983.542276461 | 1275639.9822202595 |
| 1368134.9976821383 | 1196543.8168984787 |
| 1445804.8316514797 | 1425288.9535339046 |
| 1214941.7617265822 | 1212755.7051149863 |
| 1427890.046491724 | 1424926.0288333856 |
| 943309.4486039542 | 1039216.0335276187 |
| 1213382.2226364696 | 1282281.7923279144 |
| 1608726.680546448 | 1516323.3729102854 |
| 1294647.589167185 | 1432114.3393752463 |
| 974599.9587641745 | 949977.6791919288 |
| 1210496.6250449277 | 1252571.7193882968 |
| 1270869.783171925 | 1291178.402955711 |
| 846055.7174491595 | 915542.1650637113 |
| 1490718.334949335 | 1616395.1521689836 |
| 1742566.0060480188 | 1615199.0100850547 |
| 1706291.9905593214 | 1461132.4196026567 |
| 1312093.3611953666 | 1438655.864854307 |
| 866328.1313278642 | 994157.4076171434 |
| 1400609.034078121 | 1297428.172654143 |
| 812858.3569510883 | 941758.7755600824 |
| 1274983.6480731445 | 1341417.9265382285 |
| 1100152.0877663638 | 1294565.5453525442 |
| 1660678.0350868388 | 1717525.8322766414 |
| 1451930.6312860253 | 1382808.706483543 |
| 760876.0221585269 | 509067.85289323656 |
| 1810158.4867088557 | 1761400.4462983292 |
| 1203089.9890176977 | 1241108.666502621 |
| 1159953.5929204985 | 1203116.8338658088 |
| 1123991.977280772 | 1145524.0721393353 |
| 1186688.505938349 | 1005650.3814904066 |
| 1202987.8293471357 | 1135015.6720189792 |
| 1289082.3630250026 | 1122168.8857414876 |
| 1085103.002972052 | 1180670.2774534058 |
| 961311.7291737748 | 887356.067177311 |
| 1279464.6466970122 | 1242091.2093406995 |
| 842296.2673297737 | 920276.5886251773 |
| 1234837.2060070026 | 1337027.7859704606 |
| 1797621.220436095 | 1720795.579271596 |
| 1117011.1061847066 | 1221301.6131123267 |
| 1373022.2444161566 | 1383679.2579802102 |
| 1557794.0212722572 | 1500446.251281944 |
| 1747911.4958528914 | 1798905.5284058992 |
| 895441.022143891 | 832421.0271751247 |
| 1478823.6472742946 | 1355299.09688999 |
| 1347578.5303379195 | 1361932.6454565036 |
| 663128.8400534061 | 731888.0661590309 |
| 1343537.1784667335 | 1249804.4836258646 |
| 1521141.3453009825 | 1471412.4602260897 |
| 1084945.3996676442 | 990394.960448728 |
| 1116351.7534385773 | 960207.7909628171 |
| 1331656.4939736011 | 1346645.4911249774 |
| 869924.0584222449 | 951443.5156126851 |
| 1624842.1237797844 | 1636900.3691297546 |
| 1153029.6157198593 | 1139343.5471691303 |
| 1300362.0280723723 | 1467970.9951003958 |
| 1125696.862367818 | 1016726.1935512917 |
| 1518169.4438087675 | 1333810.3595254817 |
| 893919.0388163759 | 1104244.7691429588 |
| 1485677.0638068074 | 1532289.4901279304 |
| 898281.9024826281 | 901677.7484284402 |
| 1099959.6390124753 | 1121041.6183585264 |
| 840682.6088766105 | 945497.6464544274 |
| 1033290.9749004892 | 1118740.1716991793 |
| 1530124.0163168954 | 1534471.4941413319 |
| 1206931.6504526157 | 1117407.3372774152 |
| 1109260.8543058815 | 1072151.648185825 |
| 1321257.2505720856 | 1268465.2873658668 |
| 1702526.0563464884 | 1454301.0113710887 |
| 1140918.805465924 | 1074010.5238871686 |
| 1095597.9438335 | 1210256.5746679697 |
| 1446756.8627614232 | 1360795.033696996 |
| 1084255.6782722834 | 779032.2843943811 |
| 1282339.3498764976 | 1064496.131604801 |
| 1066040.788657332 | 1160728.3480412299 |
| 1677612.4421426 | 1502471.2310868981 |
| 1481940.7615078837 | 1391216.766692319 |
| 1318058.0633455634 | 1404397.7439067923 |
| 1457022.6303982614 | 1458755.2967011696 |
| 1412881.7839693178 | 1331070.481135123 |
| 1757395.7872397113 | 1743364.5305919927 |
| 1220276.5513435022 | 1194407.0153163099 |
| 1072253.833655116 | 1133178.9851969858 |
| 1077813.592994645 | 1129969.9864225676 |
| 1259733.6438110752 | 1256092.75718292 |
| 1107159.7806059057 | 1266109.506283916 |
| 1162469.8869158158 | 1075616.7552921497 |
| 1425632.5419741997 | 1448236.4854428028 |
| 1259163.0652436588 | 1186529.4296713588 |
| 1181877.1832375266 | 1179723.9106690278 |
| 1130537.9927497513 | 1071849.845110532 |
| 1313304.5877362723 | 1220164.991543308 |
| 1280669.8734660477 | 1283774.2973670545 |
| 1400104.8707602615 | 1331128.6527527664 |
| 1507331.2882072204 | 1580761.3677359624 |
| 1392083.817875569 | 1568790.4574814169 |
| 682632.8048559022 | 865943.1055412879 |
| 733299.7945489064 | 791771.5632077153 |
| 714142.2406539195 | 704253.5292579285 |
| 1023965.4034107302 | 1013284.0664141849 |
| 1156786.0838810971 | 1261380.2538794535 |
| 1154126.215688569 | 1192860.6960170749 |
| 1330929.4721535884 | 1396817.5389325432 |
| 1537335.8971195896 | 1653984.5178657845 |
| 1738788.3818940688 | 1731044.5203081062 |
| 694472.1081139629 | 815579.16997841 |
| 1170204.3390991166 | 1178826.6930987816 |
| 1180989.3240263457 | 1258372.2325461735 |
| 2235294.7182697523 | 2117357.849784543 |
| 660364.9813358303 | 692563.198067571 |
| 1384802.464205422 | 1317420.414206339 |
| 1527492.3438923082 | 1432486.1983669018 |
| 1343162.6366221448 | 1384719.483988619 |
| 995137.2023937795 | 1058300.900481794 |
| 879062.5907073612 | 900499.5604007323 |
| 1565931.1916819147 | 1579061.950516019 |
| 1059262.0393685936 | 994094.5013645636 |
| 1509962.021776979 | 1502961.3852814217 |
| 1299673.741995338 | 1286378.9031137181 |
| 984010.7052899195 | 883689.2965707192 |
| 1514349.692197701 | 1512032.3243607422 |
| 1396241.1981041243 | 1366093.1809237623 |
| 800628.7470270158 | 964229.7445072411 |
| 1737759.0500294531 | 1735966.7557347054 |
| 1381830.779029103 | 1466871.8759404332 |
| 1473680.6037391997 | 1329099.6569175227 |
| 1106149.6856573927 | 1160192.6862747055 |
| 1296645.374940565 | 1231967.5869796677 |
| 717273.185257682 | 853203.726812901 |
| 1698219.757464694 | 1674109.2270953003 |
| 1059113.7212754686 | 1150141.4703240138 |
| 1212939.953517593 | 1181064.0102058453 |
| 1148508.0252525522 | 1393503.2049549608 |
| 1104701.2344207321 | 1044379.6660785656 |
| 1070318.8148959314 | 938227.2578504686 |
| 1433614.966745886 | 1405764.270174338 |
| 1268703.8107933956 | 1253042.0418245937 |
| 1138748.9643436885 | 1176606.0747251753 |
| 1018173.7030639506 | 1117661.4006298785 |
| 1152798.578967208 | 1119932.3704956137 |
| 578396.2214702787 | 542682.4705105876 |
| 1789607.5261398887 | 1760688.9753802083 |
| 1277380.5286085252 | 1156347.5271694842 |
| 1681340.6350211625 | 1662269.3816860514 |
| 1246270.009685807 | 1407473.094322363 |
| 1114957.596869497 | 1051799.5909945518 |
| 839629.5121744731 | 888769.5089500216 |
| 1446597.122057405 | 1362785.0513787046 |
| 1197515.4542248368 | 1232575.9913608562 |
| 726883.8689485132 | 791159.4395892816 |
| 1463003.0558812625 | 1412877.220363387 |
| 1599634.4650367943 | 1435637.8699328331 |
| 1411266.4112796998 | 1406644.9625469763 |
| 1028964.4739347702 | 1118698.1415921012 |
| 956241.9912803004 | 962159.9499510294 |
| 1389287.4738699936 | 1301761.2780572781 |
| 1358526.7412621249 | 1289841.878977986 |
| 1326946.7250139457 | 1185630.1571597927 |
| 1429951.80389933 | 1411864.6974056638 |
| 1391159.433681266 | 1470683.6245235028 |
| 1352547.6933606023 | 1355112.1806233982 |
| 951243.854076582 | 994985.3412754699 |
| 1261715.4616659957 | 1239297.52369788 |
| 1580951.578568522 | 1511409.2813066142 |
| 1379386.3829330024 | 1267870.6576911202 |
| 1270963.5632637104 | 1334558.3254499868 |
| 1675557.2712307854 | 1799232.74837609 |
| 1398760.046508387 | 1233973.530277728 |
| 1075675.1076300805 | 1159508.0734889074 |
| 765505.3475276389 | 826435.6324583092 |
| 1535564.5520297578 | 1409041.99679258 |
| 1453597.5066767503 | 1194901.9042757219 |
| 1217021.518740754 | 1371310.9847266558 |
| 1210400.1269547315 | 1231420.7310595037 |
| 1308017.3142391795 | 1215654.4539298122 |
| 1244955.4607115337 | 1276822.554399733 |
| 1288122.6243460544 | 1025156.6311508231 |
| 1555497.5463886634 | 1394512.9947019652 |
| 1423296.118000431 | 1456778.6864896608 |
| 1222701.0121116524 | 1351502.8405922484 |
| 993725.2171881605 | 1051362.935471905 |
| 1520263.7556412728 | 1463999.4004774159 |
| 1741052.959622036 | 1757013.682375216 |
| 1012545.4916159144 | 985829.0605758312 |
| 1342997.6449288395 | 1241388.8166285334 |
| 1525601.7913737406 | 1319174.493800248 |
| 868694.0736998019 | 920015.4420964546 |
| 1131618.9133648446 | 1015050.5471460186 |
| 1172619.5970591358 | 1121766.5155420885 |
| 1280588.3418971745 | 1297452.8445774196 |
| 1712282.2593634182 | 1616966.6021996057 |
| 1385978.9841198327 | 1310049.2797646578 |
| 1249223.8310440492 | 1363879.715390577 |
| 1110525.988673923 | 1227112.5986903254 |
| 1387701.1110529576 | 1322782.6693331655 |
| 1489574.1370137818 | 1409958.9335543625 |
| 1209964.35233124 | 1259031.358319141 |
| 1352917.1768613977 | 1489629.8870741515 |
| 1541746.2905590518 | 1460406.5736325704 |
| 1655466.7358265226 | 1532224.6150021846 |
| 1499153.0808398786 | 1309858.6762433113 |
| 1480328.3454733538 | 1389538.5662279916 |
| 732244.1580695552 | 779506.6396280122 |
| 1360787.8712115514 | 1389226.2807439165 |
| 850593.3376577138 | 1055954.9172459366 |
| 1354077.498237712 | 1383514.6948916768 |
| 976540.0985009592 | 1049756.5275031258 |
| 1459540.1330420503 | 1448135.28884653 |
| 1673538.1686839648 | 1673559.3535208954 |
| 1599478.9856644769 | 1548742.4500882071 |
| 684049.9193111222 | 876578.8422081121 |
| 965136.3385167391 | 1160136.541331077 |
| 1421135.814954099 | 1403813.3390501384 |
| 1273868.0636587085 | 1122032.9841225813 |
| 1779858.2742529134 | 1662298.228200797 |
| 1246485.1835210805 | 1201810.3872565813 |
| 1237902.8200737466 | 1121504.5844244035 |
| 994654.4094247869 | 952665.5310807172 |
| 799191.0381356808 | 841460.2953564031 |
| 1210184.01761757 | 1335188.98631929 |
| 1044017.4316455174 | 1191497.1631234623 |
| 1405933.0186992486 | 1409620.7165844222 |
| 1392313.7261295563 | 1391269.1646250142 |
| 973299.8617887149 | 1007986.0968800257 |
| 1417403.3118605698 | 1320568.8910535444 |
| 1321888.2682999729 | 1360302.990745563 |
| 1548598.7545692646 | 1519397.2720301007 |
| 1524586.7872167008 | 1354353.3217112408 |
| 1215608.5310559657 | 1203370.7073141043 |
| 952912.2012461232 | 1125394.002533793 |
| 885709.7642844076 | 930857.310947401 |
| 1214334.973151577 | 1170398.4868249618 |
| 1195986.2988348743 | 1438586.5531192152 |
| 1137059.188484319 | 1277510.3920486323 |
| 1049661.038846639 | 1183036.9050002513 |
| 1547888.6330481975 | 1416176.8494368033 |
| 1383565.6961895288 | 1278628.3597821118 |
| 1214262.6992737171 | 1257904.2445133035 |
| 865816.6759261268 | 1015935.9901762498 |
| 1024907.9401935096 | 924829.9802102786 |
| 1162854.5519412763 | 1321551.1115060947 |
| 934610.3953348844 | 1012920.4036508705 |
| 1379456.0307108702 | 1317939.0828797836 |
| 1357250.5712569577 | 1410767.080959376 |
| 1260241.3960622712 | 1250993.6312635397 |
| 1367142.71669501 | 1352767.2390467995 |
| 1355556.9536497223 | 1369847.1061542765 |
| 1613414.2330507296 | 1583859.5071139997 |
| 1640185.798296818 | 1566869.063328336 |
| 886124.7256403731 | 921116.9863703805 |
| 1441956.2019363926 | 1387191.6094236593 |
| 1187113.8261807007 | 1213599.3598722275 |
| 1280910.189933004 | 1277616.2476954698 |
| 1077754.2259621231 | 1065055.1729057003 |
| 1434240.3558561043 | 1476248.6591315758 |
| 1952622.401731699 | 1791674.5843947157 |
| 1092701.392243675 | 1225631.6574756955 |
| 1375497.9729216115 | 1408824.3310162975 |
| 1101826.3145402991 | 988424.2784737824 |
| 997448.7280769936 | 943420.5417655539 |
| 1350459.1155681738 | 1537291.6042916668 |
| 1455691.796506957 | 1335040.639974048 |
| 1563083.336016557 | 1608789.482506685 |
| 751324.1387490695 | 857541.5546759642 |
| 1308231.769411766 | 1369249.922264683 |
| 1346049.6558665014 | 1412124.1900373297 |
| 1730662.3929334427 | 1643032.0233858768 |
| 1920527.529755651 | 1814392.4259317396 |
| 1061517.7094538829 | 1116119.2044746294 |
| 1752967.6049068572 | 1657613.5684889127 |
| 1398353.590664104 | 1203289.6830739593 |
| 1124042.9480980486 | 1126083.9819665886 |
| 1501303.964140751 | 1618933.8435041225 |
| 1062105.3081273877 | 1008967.9130956247 |
| 1235501.486170372 | 1077672.087533399 |
| 1430813.4128906224 | 1250892.5705736177 |
| 803689.1519380857 | 1032641.9055743627 |
| 1447325.6396977373 | 1508560.7491160086 |
| 1460758.6262644362 | 1544230.3601438073 |
| 1308508.1189828415 | 1259185.9189442853 |
| 1372806.6163663396 | 1294811.182915037 |
| 1314245.8199973232 | 1410799.9870655048 |
| 742449.3106376197 | 773789.5071448656 |
| 1574279.8139775426 | 1625922.1140428446 |
| 1256469.641595803 | 1266992.4477409916 |
| 1055930.2244413726 | 1095361.7386656296 |
| 1584213.95748502 | 1431144.754913372 |
| 1500472.8272215403 | 1509973.396394311 |
| 1475734.2174397272 | 1635912.7591463951 |
| 1101341.1944382847 | 1186298.489763599 |
| 1035976.952869708 | 1059785.2697554948 |
| 1403219.370573444 | 1448739.9030793188 |
| 1049672.2486072308 | 1165123.1051625134 |
| 1289201.390733304 | 1322632.497879704 |
| 1188255.081499023 | 1127620.2151665366 |
| 1203850.1042760182 | 1186743.5972191496 |
| 1135079.3452920208 | 1283412.6681429786 |
| 1361828.8480482409 | 1342399.1866554837 |
| 1289042.121469333 | 1330937.4035059982 |
| 1085534.178573738 | 1230807.456886774 |
| 859078.6477175562 | 1022576.429747717 |
| 1903533.0843493931 | 1840560.424094149 |
| 1072914.996442404 | 1123905.2767439494 |
| 1049981.3515831316 | 1106625.793738584 |
| 1399812.6127342365 | 1432945.391229128 |
| 1063069.916425088 | 1189728.465805362 |
| 1371640.9317114232 | 1409913.4886008366 |
| 1462899.0314555492 | 1534129.0964760683 |
| 1270047.528129398 | 1355024.4703934318 |
| 995849.7751098222 | 1231373.6204595221 |
| 1336134.485882136 | 1447355.8242278858 |
| 1134055.4030579363 | 1357289.3148014736 |
| 1157189.4377037785 | 990076.2436666256 |
| 1169653.821377547 | 1335372.741898593 |
| 1930805.946694563 | 1892431.8445104798 |
| 1270390.2484683357 | 1350372.6500099436 |
| 1251757.1930129784 | 1089099.445811517 |
| 1206250.647750387 | 1222054.0088301874 |
| 1411054.3169406827 | 1183635.375335461 |
| 995813.2160648316 | 974458.450381855 |
| 1110114.2203447744 | 1214869.619919986 |
| 1039517.5335082016 | 974401.0113084242 |
| 1208761.0558371514 | 1290319.6518305028 |
| 1273067.036027562 | 1357639.735748915 |
| 1629983.8467032425 | 1681689.4931265777 |
| 1650770.9296813272 | 1543230.3432907215 |
| 1127174.7125458177 | 1028861.614910732 |
| 1085943.0760246022 | 1085224.1346929455 |
| 985866.0316492678 | 1094685.618184805 |
| 1625166.648489528 | 1544867.4046496474 |
| 1094792.0032017026 | 1228674.934036056 |
| 1692308.5897661059 | 1600264.7507576318 |
| 1723424.6715387627 | 1624947.6223984798 |
| 1202574.3530388088 | 1122413.6250320808 |
| 1014430.1205663059 | 1074965.0329685942 |
| 1607161.6371450324 | 1595748.9185726615 |
| 1479758.3175267638 | 1588527.6096233092 |
| 1212899.2186562715 | 1297587.1400887906 |
| 1123386.5312002872 | 1243781.9770315965 |
| 1304511.899068566 | 1428703.2835228932 |
| 1584615.57383898 | 1629119.3338822061 |
| 699222.836143786 | 793227.3900209726 |
| 1554986.694877213 | 1552809.8009708882 |
| 1806231.4517589563 | 1663905.9825991616 |
| 1629345.786532865 | 1519750.7454401702 |
| 1420858.8235858218 | 1281710.1208010279 |
| 1160397.8217300235 | 1151029.3003767082 |
| 998773.9972584788 | 1106015.287304629 |
| 1626592.991061007 | 1609062.6674830643 |
| 1813857.826361287 | 1735012.217845941 |
| 1335848.3322776183 | 1384291.442774992 |
| 1243501.6508387062 | 1320867.4632689143 |
| 1442372.0436041143 | 1530026.6725305617 |
| 1394970.5985855695 | 1387802.4459325839 |
| 1726364.3979780802 | 1751579.592041473 |
| 1434144.2608724642 | 1483365.5639644135 |
| 1222689.5233795908 | 1327045.6114660841 |
| 1062095.467626749 | 1122929.4806373343 |
| 1170705.1662407718 | 1181500.4898134521 |
| 1293461.7978863874 | 1304471.7606849466 |
| 1481946.194076499 | 1580237.5827510292 |
| 1727006.9506782219 | 1873490.114464988 |
| 1367130.3482271421 | 1410431.9651538092 |
| 1269293.2087360441 | 1266237.7881421312 |
| 960918.6584475788 | 1036838.1654457459 |
| 1464710.2063623553 | 1359786.9721347317 |
| 1270928.0343699888 | 1233342.8634423725 |
| 1638094.5378479657 | 1552252.9109785617 |
| 948788.2757094484 | 994734.5487001846 |
| 987447.7774857914 | 1030665.1059994344 |
| 679627.5955772134 | 852634.022228587 |
| 1434803.0613081781 | 1298720.661739925 |
| 1190213.5129050135 | 1392267.7652026769 |
| 1507035.8737133096 | 1441430.8014132958 |
| 1344869.279706492 | 1437452.2850194 |
| 1280199.2946554031 | 1306442.1918488657 |
| 1348883.321478542 | 1350986.33607593 |
| 1411756.6186345469 | 1494487.6138664242 |
| 1415647.553437237 | 1538604.8485574853 |
| 1492521.8665181694 | 1396014.1901939427 |
| 1306674.6599511993 | 1238954.5651915097 |
| 1439714.2805609994 | 1219257.6681901566 |
| 1172385.8977045629 | 1152739.116069362 |
| 1244881.3632416883 | 1443416.1275080657 |
| 1291759.392660681 | 1253317.0011893958 |
| 1748864.714526891 | 1690260.8663586862 |
| 1291331.5184858206 | 1303600.064574772 |
| 1537897.1181187208 | 1572493.5912899505 |
| 1462360.60087787 | 1584554.8125484595 |
| 1377939.7745081235 | 1331607.3415076584 |
| 1161232.6574620141 | 1163204.166778442 |
| 1394518.4154676315 | 1468034.8613624112 |
| 1288069.226448916 | 1174442.1127915555 |
| 1796245.8079055634 | 1697686.0244313888 |
| 1316129.3090572685 | 1392657.0576508623 |
| 1100093.909275263 | 1087264.3038905384 |
| 1341722.8359691473 | 1434850.46862055 |
| 1049007.0166559054 | 921649.8467333405 |
| 1506651.1565735163 | 1538870.0207580808 |
| 1347234.0930270965 | 1359458.4225477185 |
| 1388218.5294499428 | 1346259.8890243229 |
| 984421.2252794616 | 1111970.239730727 |
| 1260814.4318730172 | 1184537.0659936937 |
| 1492095.1431974396 | 1491962.7708038404 |
| 1039332.667386882 | 865224.6612681826 |
| 1629573.8859278488 | 1490117.7790054325 |
| 1521730.791403271 | 1428657.7418744238 |
| 1386351.1453039348 | 1429869.8924460108 |
| 1368106.873217715 | 1290749.8487601872 |
| 1496210.2158534296 | 1479427.7699068007 |
| 1587585.4847117497 | 1657776.38568943 |
| 1640359.1392295447 | 1514312.1080257846 |
| 1190442.1227402529 | 1177060.2202590173 |
| 1153470.4397478565 | 1170510.1025795368 |
| 1447492.964395294 | 1544235.556115056 |
| 1176111.78829563 | 1150038.1677775611 |
| 1515005.3841638013 | 1554402.5591586106 |
| 1111307.064545113 | 913629.9988296432 |
| 1409892.0897761208 | 1503496.6891943435 |
| 1259665.602981643 | 1263582.783143174 |
| 1288426.6939028532 | 1338849.7129283445 |
| 1376346.358964895 | 1410552.8089673813 |
| 1537765.6605684941 | 1792686.8699873667 |
| 1696977.6628325956 | 1738551.5700947652 |
| 1251873.6242326582 | 1152361.8147412133 |
| 1235144.0963772624 | 1206017.2321929 |
| 766078.3707692815 | 887650.9712332152 |
| 1306288.622680067 | 1198044.1160272136 |
| 1710966.0356305088 | 1733395.0238416037 |
| 1453327.9163335168 | 1524977.8927519568 |
| 1021122.0523475123 | 1227462.6316856118 |
| 1423125.5412697704 | 1325482.1374203167 |
| 1165990.6036967745 | 1003760.2378087114 |
| 1354928.9500961443 | 1506963.3481339165 |
| 1642844.648635587 | 1541371.8484839285 |
| 1109586.4111945236 | 1168646.121822672 |
| 1361230.1212351571 | 1523225.5382218552 |
| 1455107.4511125274 | 1371172.0447690524 |
| 1574211.648913064 | 1616628.5728428103 |
| 861657.3994253613 | 821521.8999039559 |
| 1912825.285217769 | 1751873.032783078 |
| 1536992.8656720358 | 1454339.0319204135 |
| 1513846.5947077826 | 1320531.9551115618 |
| 1525533.406625511 | 1391626.144969365 |
| 1295099.436777126 | 1347157.2872116547 |
| 1819900.6366437143 | 1881856.5998425167 |
| 1363086.9045325571 | 1415829.7707650256 |
| 1463367.8208253654 | 1290813.1849929066 |
| 1653232.5510850863 | 1566570.9779977687 |
| 1168627.6508344968 | 1169580.9088598294 |
| 1680788.286557635 | 1611877.7497260496 |
| 1356691.3872020654 | 1485932.9779201937 |
| 1434575.1099082837 | 1405685.5273090224 |
| 1194594.988366492 | 1130436.9497760474 |
| 1234636.45181904 | 1245843.3211270864 |
| 1596180.5684365204 | 1573425.1170600327 |
| 1574181.7317531754 | 1381203.9920206591 |
| 1003266.8762352669 | 1079472.641312697 |
| 1121023.4370105471 | 1268495.3725271178 |
| 1337973.7320159741 | 1362925.1763465065 |
| 944186.159068424 | 1002526.4508435256 |
| 966620.5141106972 | 1138544.9950269973 |
| 1418977.8285825343 | 1457459.2140564825 |
| 790721.3677899047 | 961721.2697906811 |
| 1194515.3380966587 | 1313819.137997923 |
| 1426695.6863993006 | 1342607.8752123183 |
| 852982.5643785995 | 885060.4742804896 |
| 1713351.3941515046 | 1562151.4410505597 |
| 1270297.5449310536 | 1339972.6907270597 |
| 1279279.7998179044 | 1186869.40702454 |
| 1039794.7674478192 | 1021059.8761346405 |
| 1020842.5313524116 | 1106278.2138733673 |
| 1368670.2992131882 | 1326544.0522564868 |
| 1365081.1775398466 | 1281291.4712785464 |
| 1324470.4414750012 | 1237085.6744865412 |
| 1138609.172936965 | 1154490.996663623 |
| 1604207.6842766178 | 1416383.054948349 |
| 1518319.640704069 | 1517028.9907287671 |
| 1306056.5654300188 | 1210382.829307877 |
| 720080.2320528892 | 715659.1956185196 |
| 1428212.0343628554 | 1422148.7166539421 |
| 1648246.7742056048 | 1573640.571694687 |
| 1199193.8313295112 | 1275496.9206860312 |
| 1245053.4325274914 | 1344603.7240891382 |
| 635530.8448860593 | 622059.4854165884 |
| 962591.6565767031 | 891728.7409251304 |
| 1396082.3520452469 | 1273009.6502698343 |
| 1065679.1208029888 | 1048230.3465432371 |
| 1956438.6514352525 | 1748209.1446810272 |
| 1399892.255685736 | 1317355.4221611307 |
| 1174779.1577615559 | 1275672.6694800258 |
| 1637335.3027885682 | 1526172.9968129275 |
| 1549031.093041703 | 1525506.3275622404 |
| 1084408.439953593 | 1046123.896130262 |
| 978103.6192464159 | 971315.655715731 |
| 1250494.7397056855 | 1259768.8930549198 |
| 1541127.3435162457 | 1526084.743397322 |
| 1168919.40079419 | 1259914.0992989107 |
| 1816217.0069766769 | 1709960.320521296 |
| 1126450.4261744465 | 1112772.6072076214 |
| 1004124.9090759716 | 839938.8145001838 |
| 1516419.7207188457 | 1545499.4660975635 |
| 1287030.9316908938 | 1413693.0733436327 |
| 1351007.0408580992 | 1356337.0626472007 |
| 1123765.3462531995 | 1067800.8800270339 |
| 1249417.896552621 | 1240827.9594831988 |
| 1844929.155576244 | 1527687.7452601758 |
| 1061785.5833805124 | 1073159.6604388212 |
| 1119992.6188354518 | 1222460.1297569424 |
| 1281537.3681660516 | 1241414.8472490953 |
| 1603627.937749694 | 1476958.3583176075 |
| 1887529.3766351675 | 1716501.3749777526 |
| 1535844.8961570102 | 1569539.5123709394 |
| 1553592.9799469227 | 1443184.3019938231 |
| 1709667.1888454657 | 1710604.3317055525 |
| 1614373.9639831057 | 1690971.7866773764 |
| 1023162.9529066277 | 1105449.062617164 |
| 1587357.9464305846 | 1509444.4323655074 |
| 1268134.9292279815 | 1383727.0635404172 |
| 1181338.1609886792 | 1093092.1375125987 |
| 1373512.3017761726 | 1120652.5933660474 |
| 1765281.0932294582 | 1492002.2835938204 |
| 1152145.9120119002 | 1241185.2792857005 |
| 1199618.942666095 | 1120172.4967475021 |
| 1423025.1014632925 | 1364539.5063357404 |
| 2108376.165803347 | 2126481.0520968987 |
| 1636906.2883778496 | 1617532.0641430328 |
| 1166558.3735827007 | 1361918.3281743387 |
| 1231511.931157747 | 1226714.2387678572 |
| 1716323.348128052 | 1825659.1154871108 |
| 890887.6807315941 | 905346.259681744 |
| 1378937.877384443 | 1443257.3828564552 |
| 1742938.7760231788 | 1818477.2691919273 |
| 1560746.8656891368 | 1605720.3754763016 |
| 1412501.2455075418 | 1508894.4199197735 |
| 1327961.0982193248 | 1260341.9072778109 |
| 1103206.75496809 | 1151150.99039653 |
| 1623100.839875627 | 1563929.5917164665 |
| 1418723.656984229 | 1390590.104319665 |
| 1657667.3321639488 | 1499841.6585816308 |
| 1659100.1242863662 | 1505792.325373691 |
| 1640646.6698351519 | 1701515.5662158253 |
| 1402146.87334661 | 1324625.664257782 |
| 1967384.7778210603 | 1899582.5007639807 |
| 1102259.5385569 | 1233151.1066043642 |
| 1498640.5506503703 | 1427078.4629757311 |
| 1235226.477832707 | 1261331.329233712 |
| 1114667.2494865104 | 1191954.3612752142 |
| 1592768.2418269338 | 1600069.6408756953 |
| 1592210.175923131 | 1624476.1645669844 |
| 1448573.8446779854 | 1324356.220481155 |
| 1762214.6795818857 | 1710497.3526677946 |
| 1068856.226748253 | 1135852.1857184814 |
| 1220001.3342399488 | 1159658.372342884 |
| 1415349.6496679639 | 1357629.8640534026 |
| 1113856.5433985677 | 1095283.6052892366 |
| 1574919.9063463008 | 1538363.2287243106 |
| 1663473.1208282846 | 1520749.9057704736 |
| 1450996.0381792902 | 1472406.693865838 |
| 1388782.8874013543 | 1333566.1838001003 |
| 1308243.922235843 | 1364374.2905112184 |
| 1530848.0941090384 | 1406533.8451268543 |
| 1183014.5086739515 | 1305647.977286465 |
| 1337966.9267592845 | 1155952.3515146095 |
| 1379169.4487306818 | 1353687.4801676068 |
| 1047452.5080813532 | 1127056.0653057587 |
| 1370830.3885978821 | 1369725.5262108035 |
| 1534479.906564421 | 1355801.2436539782 |
| 1499356.1199718774 | 1484790.3476854875 |
| 1240864.1544719306 | 1284025.9469536962 |
| 1321388.619330872 | 1404954.887419141 |
| 1236308.2799445027 | 1040287.2588963988 |
| 1036277.0624632969 | 1056825.6532362378 |
| 1686562.1685733919 | 1584840.6074404716 |
| 1695706.1315254318 | 1627760.3923927452 |
| 1702090.6352886 | 1726936.2322457815 |
| 1375736.9565806843 | 1320332.4036921682 |
| 1057252.5826211006 | 1140673.86841466 |
| 1405505.2437013972 | 1316962.4425126538 |
| 1518478.0327260853 | 1424160.798084612 |
| 1754770.5902068643 | 1716111.5903406153 |
| 1634781.273826886 | 1491799.9257040983 |
| 834185.5784090377 | 853605.8520856639 |
| 1590804.0443750557 | 1560165.971874474 |
| 1361841.9517155087 | 1407689.1466394868 |
| 1282365.4620236778 | 1499756.6544998926 |
| 1471784.0051760625 | 1518564.2544295308 |
| 1491838.4944434685 | 1512729.1268101716 |
| 1567745.8067451175 | 1489276.9910199968 |
| 1765809.432066297 | 1707683.9216776323 |
| 1484688.2340335343 | 1513381.5852591298 |
| 1558758.7958587606 | 1664644.4171342412 |
| 1641873.966286834 | 1549548.085463407 |
| 1457672.90568856 | 1488583.5574356648 |
| 1220133.3583303108 | 1362367.4011113378 |
| 1521745.663006273 | 1560245.593221541 |
| 1371298.4246050415 | 1506497.4986085212 |
| 1880178.647341969 | 1870156.9798388379 |
| 1456486.292963147 | 1380047.3882708992 |
| 988746.4205867315 | 908986.8405837119 |
| 1553459.3644835525 | 1611683.8226998542 |
| 1618721.1384298413 | 1580859.896010776 |
| 1432756.5170942058 | 1433469.6322164508 |
| 1522954.9389269138 | 1600294.1523875417 |
| 1299126.82985549 | 1249466.5195293599 |
| 1022342.573636082 | 1101864.4268704536 |
| 1480674.798825141 | 1594310.7560748924 |
| 1558547.577837524 | 1641650.0754594123 |
| 1935831.0390568047 | 1886873.3622018443 |
| 1392685.2850780766 | 1473998.634727695 |
| 1928728.7915559376 | 1949180.137872925 |
| 1378399.109063904 | 1562633.4823614345 |
| 1517152.5846254574 | 1430572.0093705337 |
| 1257101.592892312 | 1357044.1101700044 |
| 1132146.3204353235 | 1103742.496210055 |
| 1626125.1656497952 | 1651850.46943744 |
| 1388596.243304004 | 1426876.3276733174 |
| 1532845.7231194603 | 1567316.6390749337 |
| 1412619.7099471306 | 1324212.4488487244 |
| 1522099.830788929 | 1544085.6259235512 |
| 1748782.8086400446 | 1694682.5542242927 |
| 1359978.159938887 | 1326544.7477197591 |
| 1578141.0531342432 | 1514884.3979464406 |
| 1104115.6927835557 | 1230315.7651875895 |
| 1554634.9946986004 | 1553343.086400243 |
| 1080170.9068579979 | 1146107.6253422145 |
| 1810782.4134547503 | 1703473.0867432738 |
| 1214689.183704473 | 1298296.1573622846 |
| 1718876.794818775 | 1791995.3279297063 |
| 1436995.2004509894 | 1334865.2176085073 |
| 828120.9549888151 | 993080.1870070486 |
| 2059301.3434198145 | 1988310.7475135662 |
| 1824987.7062517556 | 1752852.0894664042 |
| 1522083.944153087 | 1616685.2037755027 |
| 1206539.6659618984 | 1236829.1113624694 |
| 978312.7484191257 | 1203445.1146061746 |
| 1529830.3684547062 | 1514184.4133892069 |
| 1417275.667232232 | 1298012.387929094 |
| 1767399.2899479496 | 1845292.684626908 |
| 1315666.8739232162 | 1216340.7743597203 |
| 1528900.8563697478 | 1544183.043541771 |
| 1584439.7128321175 | 1591261.6735113347 |
| 1727592.6372201012 | 1716301.3116648523 |
| 1813856.3141206938 | 1812301.0550475717 |
| 1554301.938081737 | 1640887.2062857263 |
| 1622837.3530338 | 1537366.475588691 |
| 1353635.4103963177 | 1407944.4843516 |
| 1642164.2161155469 | 1447135.7542318986 |
| 962069.0020449392 | 1115100.8976874738 |
| 1203623.8408419904 | 1357252.9643184822 |
| 1212440.289762945 | 1219374.4048287054 |
| 936553.7042681208 | 961833.4095117394 |
| 1453312.4679297975 | 1415254.1179110021 |
| 1025417.8875194944 | 1128445.8907592422 |
| 1587622.6412385597 | 1556596.0364964 |
| 1093344.5765039409 | 1065476.452712452 |
| 1469237.20519252 | 1513494.3736094353 |
| 1637649.904770942 | 1774852.039631716 |
| 1721005.4195045803 | 1799757.6028008359 |
| 1506656.8260229118 | 1442506.8219333086 |
| 1635151.1855657238 | 1378798.3450342463 |
| 1290043.3666144887 | 1348511.1099262163 |
| 1228362.746896066 | 1203658.2917777891 |
| 1102516.5838414284 | 1183273.0233491356 |
| 1419158.9590479657 | 1402474.0835414631 |
| 1107031.2463494784 | 1042235.7601170251 |
| 1535152.0737169122 | 1712920.3103077803 |
| 1829101.5494831984 | 1780034.5208318075 |
| 1091479.5601322306 | 1144511.8796251323 |
| 1137069.30717901 | 1331972.4966515973 |
| 1455554.8290921585 | 1540732.3158133319 |
| 1246218.3100606224 | 1281386.4694791576 |
| 1641739.5180614428 | 1599595.0034498489 |
| 1241386.7369789924 | 1292509.4712678115 |
| 1009854.70493643 | 1049493.8196241166 |
| 1598593.732667399 | 1498716.3800691823 |
| 1664147.6390704403 | 1746206.952126814 |
| 1278204.7815629141 | 1299192.1266400772 |
| 1649156.6076317346 | 1501922.1053063618 |
| 1322010.0566819045 | 1221331.3476950373 |
| 985059.3058065887 | 1015263.7719784025 |
| 1064854.308940125 | 1064565.8626965252 |
| 1517666.854519622 | 1425511.841139752 |
| 1386306.1033946618 | 1344676.9925738587 |
| 1185616.3400142193 | 1305151.0780481105 |
| 1126042.4049714077 | 1264223.0405676495 |
| 1309938.7671516752 | 1301750.692002778 |
| 1240754.932046382 | 1239099.2060157442 |
| 1399909.0486968765 | 1555183.678004892 |
| 1657363.0570933966 | 1638147.3115957687 |
| 1246830.1884286287 | 1246562.4108705842 |
| 1535262.4407904241 | 1536087.375853295 |
| 1224186.6959259962 | 1172430.2225876758 |
| 1517141.622824528 | 1473630.5832627364 |
| 1390251.419934081 | 1285045.8683514292 |
| 1639099.377623702 | 1748064.0642025825 |
| 1448081.2511719759 | 1334464.0133835599 |
| 1539129.363811181 | 1438322.809887718 |
| 1003701.0495827476 | 1010108.1525645838 |
| 1519415.3527275834 | 1375360.371692976 |
| 1838503.9942718488 | 1757908.2860256517 |
| 1822987.8197245803 | 1860654.9996169806 |
| 1843720.6478657 | 1721645.4871845758 |
| 990725.6517571051 | 1103956.7280341568 |
| 1075596.5865851988 | 1101600.0429917574 |
| 975921.8633596771 | 1095223.2620145394 |
| 1491145.2404770597 | 1590043.530402164 |
| 1004430.3243619605 | 1055499.4134941064 |
| 1884385.6495086171 | 1716204.368225433 |
| 1930802.9189611124 | 1812702.0346542057 |
| 1729392.2041672813 | 1623216.4132517055 |
| 1292592.392096719 | 1327396.8179890825 |
| 1582605.5351026566 | 1629135.025556378 |
| 1142113.3841484515 | 1132054.102589856 |
| 1491153.0301284252 | 1404835.8837752854 |
| 1216888.0202770547 | 1222455.4338777177 |
| 1546957.2264619076 | 1477688.755170918 |
| 1676070.94296519 | 1734018.4716242095 |
| 1418310.0848390271 | 1289758.574780827 |
| 1277112.116945467 | 1189402.972900846 |
| 1492965.7334657512 | 1529836.1734500406 |
| 1573936.5644777215 | 1567440.0482935281 |
| 1221823.704469835 | 1161907.6571631818 |
| 923444.1447612592 | 992626.4385883803 |
| 1245947.1023549838 | 1308142.1577985962 |
| 1287784.3040333614 | 1309807.4169271877 |
| 1222726.5643610677 | 1307123.9464494674 |
| 1248741.8646745014 | 1119249.8470588424 |
| 1566567.883138695 | 1640870.4206426935 |
| 1384328.1221885916 | 1369454.5946941245 |
| 1536208.366135118 | 1414487.0433050282 |
| 1555320.5000011197 | 1542914.0456590606 |
| 1283401.789251874 | 1227145.9320257562 |
| 1440246.3298730918 | 1337985.489779496 |
| 1081150.1254838074 | 1162990.6164335678 |
| 1456969.5768219475 | 1625432.5427946784 |
| 1560270.4852099754 | 1461316.765861073 |
| 1550702.478402551 | 1607203.1510998355 |
| 1085218.858707077 | 1250538.9946139911 |
| 1398466.6278241158 | 1476313.854191138 |
| 1276471.5809718044 | 1321115.39849857 |
| 1598159.2269511032 | 1608505.6426381944 |
| 1592664.7003937657 | 1736837.6181577127 |
| 1214320.5743640615 | 1152994.1488909503 |
| 1248845.2090319684 | 1453803.7882920774 |
| 1339254.7267992808 | 1297528.9849137291 |
| 1241182.8349670342 | 1137181.458826391 |
| 1914072.9477881358 | 1726104.9241763605 |
| 1005843.916993128 | 862451.6262604827 |
| 1120851.5194199637 | 1047097.3203886435 |
| 1084013.7849062877 | 1105614.752457418 |
| 1201785.6666717983 | 1320629.3673813264 |
| 1369186.0702979171 | 1359529.5690354453 |
| 1621035.9027174718 | 1767158.8605842479 |
| 1261761.2309397706 | 1388605.8488978725 |
| 1476392.5507553308 | 1347312.432427926 |
| 1770616.9299354246 | 1684524.013125646 |
| 1490539.0581097947 | 1591086.688990987 |
| 1046030.1142282495 | 1172190.0612436072 |
| 1172188.1935091391 | 1324666.2765898881 |
| 1314770.4699493768 | 1330694.3489463073 |
| 1428247.074184676 | 1433060.6661745724 |
| 1231157.2551474404 | 1361458.5820246409 |
| 1380215.5152247495 | 1393689.9722249825 |
| 1510996.4352668852 | 1537368.2492732638 |
| 1656785.4477005391 | 1818168.6788913533 |
| 1378863.6883772104 | 1485861.8698657467 |
| 1860358.468312067 | 1849698.0430386076 |
| 965318.6957876944 | 906033.6415168243 |
| 1380070.450117897 | 1346583.085864258 |
| 1262552.685917803 | 1293771.7890494969 |
| 1626321.3209583594 | 1755896.1215432743 |
| 1425366.413433149 | 1495078.0230842498 |
| 1457230.6462415596 | 1469435.8815075103 |
| 1546408.558413639 | 1617282.6014587749 |
| 1141916.5254388948 | 1087389.4590739626 |
| 1795093.0340089437 | 1757199.1455994518 |
| 1924561.807179873 | 2014143.8268212778 |
| 1196064.3299441882 | 1100627.6513045924 |
| 1295014.6182810178 | 1396862.639104568 |
| 1491811.661122951 | 1546941.848707872 |
| 1377447.3485206584 | 1374217.046597893 |
| 1360100.7192439777 | 1289359.2570328526 |
| 1420648.2808698171 | 1467781.2522651982 |
| 1553854.434199959 | 1635048.1388462493 |
| 1753820.6224521047 | 1937247.9448209489 |
| 1556786.6001947748 | 1522236.9180547143 |
| 1696086.1681042681 | 1766684.5762698138 |
| 1614916.4686238212 | 1562045.7956538857 |
| 1441312.1682690796 | 1621968.1829564832 |
| 1617405.4247335158 | 1564134.7088349103 |
| 1958064.7420605398 | 1838909.7022258686 |
| 1196996.6810854594 | 1234953.482519236 |
| 1970419.0541530403 | 2086792.319884533 |
| 957806.0026795019 | 983199.6936077191 |
| 1318681.0401821504 | 1359509.4162058528 |
| 2084883.7904024213 | 1975825.5125908758 |
| 1693384.8030654874 | 1670160.8287664847 |
| 1562950.321919383 | 1405993.4435541886 |
| 1603342.6692674868 | 1412911.0303266682 |
| 1650269.179842912 | 1642272.114947332 |
| 1276987.4919659288 | 1214625.6939918217 |
| 1406437.6853738874 | 1453389.2954357332 |
| 1223261.46230481 | 1111908.7224308047 |
| 1535946.643113821 | 1408639.1995456126 |
| 1130844.0293626525 | 1293185.515887795 |
| 1439028.5209890238 | 1419860.3928355142 |
| 1462989.4908213743 | 1368348.2365172291 |
| 1644242.0241495387 | 1633269.4321863484 |
| 1383651.8270781066 | 1246915.0059089526 |
| 1910585.0524316991 | 1857683.6921985121 |
| 1661435.4795672083 | 1787172.0366538735 |
| 1273308.7102709205 | 1113575.1120493454 |
| 1578319.8904850134 | 1508667.7209129771 |
| 1260826.637997184 | 1255808.471882559 |
| 1046191.1649369913 | 1144973.693078543 |
| 1770372.1753440457 | 1675447.7656860417 |
| 1812209.1366168254 | 1832210.7260590754 |
| 1566740.127921427 | 1476980.108519712 |
| 867444.7048681058 | 1074215.180542583 |
| 1573105.9811449796 | 1648738.542638705 |
| 1443842.022648748 | 1366567.6745067732 |
| 1177744.9730926359 | 1358593.700848612 |
| 1838092.102498864 | 1676126.4584647315 |
| 1319478.28736545 | 1275555.46373587 |
| 1246791.0287114407 | 1255176.8195105838 |
| 1349989.646728484 | 1508569.113530335 |
| 1851575.8675786168 | 1877234.4359445777 |
| 1730103.133132334 | 1737277.2052982477 |
| 1189981.4023509473 | 1263745.9695143756 |
| 1656401.8371527654 | 1584944.1613707738 |
| 1626941.7878663803 | 1497317.3280438608 |
| 1787324.5057527546 | 1839962.2545173801 |
| 1659170.5127753727 | 1739209.7540128846 |
| 1182887.9973213521 | 1228997.028947513 |
| 1768705.125279147 | 1661583.6993503189 |
| 1641055.9390446388 | 1615925.0028348211 |
| 1969256.9330158925 | 1993352.3070652885 |
| 1822438.4199048413 | 1839723.5365185086 |
| 1454749.8065940437 | 1506997.373242388 |
| 1153233.2406400938 | 1217954.0890334048 |
| 1523136.4847209472 | 1502550.4885696382 |
| 1538903.9925451411 | 1687437.2988729598 |
| 1791307.2410970302 | 1815163.597750282 |
| 1788829.235051204 | 1682250.3236752255 |
| 1432252.081073976 | 1410354.285142195 |
| 1653381.3129239974 | 1540095.7665236588 |
| 1455325.999509544 | 1511393.6927268123 |
| 1573288.8176012859 | 1469366.4365734858 |
| 1593331.7087101643 | 1678568.638991396 |
| 1650342.1306428087 | 1767906.1577494768 |
| 1622827.2978436681 | 1466877.6265509701 |
| 1166750.3128596384 | 1186084.993982749 |
| 954114.5439535476 | 895872.3879767852 |
| 1224792.356950685 | 1228569.155180695 |
| 1228879.8670132514 | 1256544.6020417674 |
| 1317467.5820226492 | 1350820.0774726127 |
| 1311654.2628987662 | 1300338.219411048 |
| 1358983.4704786798 | 1310978.274573734 |
| 1940225.907504852 | 1725360.3779088715 |
| 1495012.9648340766 | 1422268.2381222178 |
| 1250144.0124389715 | 1345857.0266541587 |
| 1478028.1739926587 | 1446135.9050504742 |
| 1630434.8406869494 | 1584659.0510528786 |
| 1654965.295712076 | 1712060.3889177935 |
| 1530172.524842183 | 1570413.43386167 |
| 1556256.437468461 | 1535437.7264874051 |
| 1504026.2696593627 | 1453463.5828914773 |
| 1529281.840119341 | 1370920.3548174715 |
| 1788515.8176129346 | 1811078.7795361793 |
| 1065656.0234758626 | 1287685.924140165 |
| 2017174.9894226263 | 1776550.53305854 |
| 1541186.2541089894 | 1496657.084618771 |
| 1689690.754265426 | 1644585.6830045031 |
| 1232872.356171418 | 1161106.6640570262 |
| 1329800.0461904877 | 1328331.0788525972 |
| 845890.2405129139 | 972115.8594177873 |
| 1630438.8542301457 | 1389678.1959715574 |
| 1125692.507295288 | 1239116.6604942288 |
| 1823498.406876208 | 1921325.3267970905 |
| 1401560.9170354677 | 1384056.7936268458 |
| 1446978.8599043884 | 1561916.9484741478 |
| 1712929.6543371202 | 1772844.1772568794 |
| 1326481.6746851509 | 1563883.8968491335 |
| 1902118.6992036744 | 1808441.099156946 |
| 2130761.9996576803 | 2093901.9504311997 |
| 1151006.077527774 | 1305280.3293346493 |
| 1957891.588351542 | 1753797.0408798242 |
| 1483848.1693759758 | 1458319.3024963601 |
| 1196204.8862624606 | 1195870.8863633932 |
| 1890789.1767706247 | 1912683.3104675058 |
| 1599911.3675648347 | 1670386.8863369497 |
| 1461511.881271546 | 1540415.2638441804 |
| 1571781.593335204 | 1593727.1298392573 |
| 1459342.8867985625 | 1480986.1109773251 |
| 1410814.9846924148 | 1342956.3325152015 |
| 1476989.1835039519 | 1544647.3167039044 |
| 1387987.8030244834 | 1380958.167112913 |
| 1489540.134903209 | 1477104.6398556968 |
| 2005037.3066792216 | 2072646.6608533394 |
| 2294647.78381303 | 2244067.504267592 |
| 2185480.090688329 | 2049371.4308389444 |
| 1699952.8144478828 | 1557847.3177530644 |
| 1409439.0637651668 | 1498265.4480087492 |
| 1485418.1022610776 | 1666603.6358298268 |
| 1458422.8106991698 | 1440026.086146546 |
| 1689512.1795895589 | 1567195.054546874 |
| 1267433.9085794506 | 1185781.4659106648 |
| 1584317.752692729 | 1567760.1751934094 |
| 1451739.624652712 | 1267499.5423167613 |
| 1183884.005068762 | 1318373.490360009 |
| 1770681.1324528973 | 1773992.7220420642 |
| 1794014.297854993 | 1560625.7519008336 |
| 1476386.9962728296 | 1435296.012429236 |
| 1588549.5007319287 | 1691688.159808199 |
| 1317167.713293261 | 1313681.7720021228 |
| 1569600.445635948 | 1551762.9599420289 |
| 1303542.2825080787 | 1628680.742679691 |
| 1742922.6397711881 | 1623864.7500966107 |
| 1642051.8317058694 | 1544502.8997386517 |
| 2330289.700683439 | 2268382.255403579 |
| 1735416.9213924294 | 1875273.10557363 |
| 1620949.4369105955 | 1560494.32652517 |
| 1796009.5040461638 | 1666114.4380031666 |
| 1164615.9678425193 | 1129000.2236725236 |
| 1458009.2105256943 | 1351396.8194712778 |
| 1619721.7162305776 | 1477341.7514588404 |
| 1409033.070887529 | 1453396.191812805 |
| 1581865.5587473263 | 1504003.0981820263 |
| 1777009.712149775 | 1787644.9078897508 |
| 1877941.9714230741 | 1923008.2773280833 |
| 1641101.5190131576 | 1578412.9325109608 |
| 1570583.3403398057 | 1771126.0211051414 |
| 1551094.8149781222 | 1592617.5317832874 |
| 1587122.3687081682 | 1588543.1291123275 |
| 1430796.7625697944 | 1551416.4866741942 |
| 1480888.8042321615 | 1443558.565969536 |
| 1739893.5550495968 | 1645512.5684583643 |
| 1685967.6482156422 | 1471707.3290171148 |
| 1784057.8431598432 | 1681103.9556783568 |
| 1921028.5698855328 | 2003871.207851706 |
| 1558639.8810308038 | 1569430.1995234462 |
| 1718625.9452745786 | 1781502.1916542817 |
| 1154917.3936116383 | 1246056.922524089 |
| 1414286.724494317 | 1505185.7217529546 |
| 1437983.8247179326 | 1537497.642643035 |
| 1273629.1243166476 | 1463892.7078892472 |
| 1134273.424521429 | 1204919.2121853428 |
| 1329007.2034481543 | 1368098.0624905406 |
| 1211442.9407654293 | 1101763.1771893385 |
| 855423.9840217031 | 917728.4289651215 |
| 1363106.125282448 | 1343120.7009272128 |
| 1381536.933945742 | 1509177.240525586 |
| 1380602.5555813394 | 1296491.3413092163 |
| 1444572.9714972137 | 1555719.5458229003 |
| 2009937.702628427 | 2049076.7833333192 |
| 2031338.3469761028 | 1978156.853075278 |
| 1603075.2366169537 | 1565886.7521545514 |
| 1975538.4157534216 | 1756977.5385309048 |
| 2152959.4089430883 | 2184512.7854810776 |
| 1591203.4900597422 | 1547831.9043532321 |
| 1381417.2495046626 | 1531813.3841167507 |
| 1754866.3954783296 | 1725066.8392855497 |
| 1833208.5791579715 | 1789621.546601897 |
| 1509968.9845722434 | 1576879.8478146922 |
| 1749820.0141306592 | 1866457.7308937367 |
| 1827899.1856764853 | 1871540.1956597017 |
| 1437053.5572016188 | 1334063.1803910122 |
| 1532533.6109384932 | 1578102.2146284292 |
| 1385749.141348653 | 1476261.3717745761 |
| 1336743.3833950302 | 1331584.9045160739 |
| 1616505.3541296385 | 1611385.990256331 |
| 1543913.4325132673 | 1489921.7614128422 |
| 1668670.6558120956 | 1730528.803825899 |
| 1306207.1106829576 | 1259498.0909533426 |
| 1794214.424742461 | 1738886.678991245 |
| 1578766.049959129 | 1457613.360683565 |
| 1662494.7355443896 | 1741589.2682916308 |
| 1801916.3455730726 | 1873388.6443247525 |
| 1675062.8906871276 | 1615257.7032664455 |
| 1799455.4060927469 | 1815776.7491771337 |
| 1404435.504618393 | 1498457.3572949371 |
| 1552915.1644898625 | 1505547.85235123 |
| 1442674.1845522542 | 1417129.2342266901 |
| 1322439.1075564742 | 1343737.7651605476 |
| 2249122.541335193 | 2176468.2439735783 |
| 910099.6440482037 | 1067184.358310631 |
| 1545672.11658555 | 1502422.073584951 |
| 1143621.3602567858 | 1278327.6179973707 |
| 1599851.8945084098 | 1695193.2635664279 |
| 2016910.7397073263 | 1978888.3366223415 |
| 2030910.6153455232 | 1976269.9415363586 |
| 1455556.4656425468 | 1582137.9109921083 |
| 1795428.7743897976 | 1766569.9423206886 |
| 1734239.1383592025 | 1663937.5963660134 |
| 2096954.0406756613 | 2136744.044825644 |
| 1495518.62392568 | 1214422.715210244 |
| 1753967.4765968325 | 1693011.6904988252 |
| 1778411.664830746 | 1638887.7150634788 |
| 1578146.3399339588 | 1495588.4348787833 |
| 1739628.3826696554 | 1763865.3301841728 |
| 1698198.7513699988 | 1581835.229116695 |
| 1501482.219941262 | 1587639.9642715259 |
| 1898668.843714463 | 1905165.2317529907 |
| 2049146.6298961397 | 1855820.236484399 |
| 1939603.1309040168 | 1872826.076337793 |
| 1636559.2406042619 | 1538046.1246754774 |
| 2138713.943340635 | 2143121.964898102 |
| 1454699.2314104706 | 1396018.1896457192 |
| 1294278.1178850965 | 1319651.458045661 |
| 1961846.9052189463 | 1782647.1956525482 |
| 1788285.2389932962 | 1803770.1308897594 |
| 1557075.4223108292 | 1622572.8281961363 |
| 1591383.7352199997 | 1706367.0607510963 |
| 1955253.711458321 | 2026590.208421357 |
| 1660295.795958334 | 1588509.9119743267 |
| 1842065.9527530887 | 1813243.608485571 |
| 1419536.2589499224 | 1425226.3658138793 |
| 1524106.964721467 | 1550233.0576284975 |
| 2096977.790185921 | 2075705.4536997452 |
| 1528987.3248816102 | 1552757.0148513885 |
| 1397943.5134157222 | 1517385.9300933923 |
| 1869886.3052624038 | 1798545.5121226395 |
| 1205212.2919847157 | 1221621.1190695302 |
| 1907859.0589315055 | 1828327.4627559353 |
| 1433006.6454214437 | 1473802.0819278397 |
| 2033546.7845739897 | 2020753.7255111113 |
| 1629049.623519236 | 1669075.1884640092 |
| 1852338.4692459644 | 1794386.0435329732 |
| 1340909.7986568718 | 1404846.6052138195 |
| 1222020.821335913 | 1380492.1332933628 |
| 1273518.7367614836 | 1284709.3049673783 |
| 1421715.4153436075 | 1387237.0488583795 |
| 1534156.311080115 | 1592892.7008112678 |
| 1930143.831202199 | 2017845.541299888 |
| 1575680.036970013 | 1461355.3070467082 |
| 1647278.684983665 | 1574714.7941408716 |
| 1712388.8725183057 | 1656141.341347267 |
| 1487997.8786633243 | 1359879.2142915213 |
| 1746086.988928609 | 1775185.8384370692 |
| 1442079.0573133938 | 1486759.76259168 |
| 1842736.2471745291 | 1895229.2376090614 |
| 2190338.6106485426 | 2013828.024828921 |
| 1737981.5298355946 | 1750971.8395461272 |
| 1296636.271092107 | 1396068.6648764126 |
| 1810561.174576195 | 1731511.979036742 |
| 1792254.8180047118 | 1967165.1622805884 |
| 1305219.5213491023 | 1266925.7579382774 |
| 1566471.008325363 | 1672328.503859859 |
| 2092949.8613406112 | 2116513.9559267676 |
| 1609581.8042977294 | 1635754.1962271128 |
| 1596440.1139360054 | 1892819.859490388 |
| 1508856.4243147469 | 1624157.9168980522 |
| 1628878.093809486 | 1606594.3055953393 |
| 1872191.5481572843 | 1721314.7073658323 |
| 1416408.249920881 | 1461062.9079599637 |
| 1636996.0736033912 | 1463232.8022285663 |
| 2173808.627715738 | 2001006.4877878623 |
| 1708102.1023987215 | 1646117.5201075813 |
| 2180065.597738638 | 2248080.496482797 |
| 2197436.8754965314 | 2091047.7236702004 |
| 1876497.2688775952 | 1824033.4334195405 |
| 2081869.2835028644 | 1982562.1321329372 |
| 2186194.7925734245 | 2164220.300062618 |
| 1714055.8368001159 | 1679225.5361041287 |
| 1813996.9333129846 | 1727991.095973719 |
| 2106510.862818944 | 2117558.6452341974 |
| 1967637.286822351 | 1996119.2632592097 |
| 1986811.1701954126 | 1951004.0747093838 |
| 1902814.5267963281 | 1827514.7766946899 |
| 2220799.0691561657 | 2104586.6788763925 |
| 1731437.4159947769 | 1797788.8131493004 |
| 1053966.4254339284 | 1274984.070585235 |
| 1899948.0591423784 | 1732224.525429096 |
| 1808341.4656667341 | 1807419.986856441 |
| 1642478.735656444 | 1739800.4120310517 |
| 1969194.1242238204 | 1849831.9549281998 |
| 1917583.9986181413 | 1963335.6979208784 |
| 2275455.305532437 | 2224628.1451242007 |
| 2219724.161793017 | 2057112.6450782456 |
In [0]:
# 评估最佳模型在测试数据上的性能
# 使用 RegressionEvaluator 评估模型在测试数据上的性能
# RegressionEvaluator 使用 r2 作为评估指标
# 这里使用测试数据 predictions 作为输入数据
r2 = RegressionEvaluator(labelCol='label', predictionCol='prediction', metricName='r2')
r2 = r2.evaluate(predictions)
print(f"R^2 fit metric {r2}")
R^2 fit metric 0.9199146361186678
In [0]:
# 实际值与预测值对比图
pdf = predictions.toPandas()
sns.lmplot(data=pdf, x='Price', y='prediction', line_kws={'color': 'red'}, height=5, aspect=1).set(title="Actual vs Predicted")
Out[0]:
<seaborn.axisgrid.FacetGrid at 0x7fbe6b9d3800>
## CrossValidator 简化了模型比较
- 在数据折叠上运行和测试,以减少模型过度拟合
- 运行模型参数
- 运行多个模型,使用管道作为参数
PySpark Classification¶
In [0]:
%sh
#wget https://raw.githubusercontent.com/nsethi31/Kaggle-Data-Credit-Card-Fraud-Detection/master/creditcard.csv
# credit card fraud detection
# 数据集包含2013年9月欧洲持卡人通过信用卡进行的交易。
# 此数据集显示两天内发生的交易,其中284,807笔交易中有492笔被标记为欺诈。
# 数据集是高度不平衡的,正类(欺诈)占所有交易的0.172%。
# 它只包含作为PCA转换结果的数字输入变量。
# 由于保密问题,未提供有关原始特征和更多背景信息的特征。
# 特征V1、V2、… V28是PCA获得的主要成分,唯一没有通过PCA转换的特征是“时间和“金额”。
# 特征“时间”包含每个事务与数据集中第一个事务之间经过的秒数。
# 特征“金额”是交易金额,此特征可用于示例依赖型成本敏感学习。
# 特征“类”是响应变量,如果出现欺诈则取值1,否则取值0。
In [0]:
# 读取数据
df = spark.read.csv('/FileStore/tables/creditcard.csv', inferSchema=True, header=True, mode='DROPMALFORMED')
display(df.limit(2))
cc_fraud = df
| Time | V1 | V2 | V3 | V4 | V5 | V6 | V7 | V8 | V9 | V10 | V11 | V12 | V13 | V14 | V15 | V16 | V17 | V18 | V19 | V20 | V21 | V22 | V23 | V24 | V25 | V26 | V27 | V28 | Amount | Class |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0.0 | -1.359807134 | -0.072781173 | 2.536346738 | 1.378155224 | -0.33832077 | 0.462387778 | 0.239598554 | 0.098697901 | 0.36378697 | 0.090794172 | -0.551599533 | -0.617800856 | -0.991389847 | -0.311169354 | 1.468176972 | -0.470400525 | 0.207971242 | 0.02579058 | 0.40399296 | 0.251412098 | -0.018306778 | 0.277837576 | -0.11047391 | 0.066928075 | 0.128539358 | -0.189114844 | 0.133558377 | -0.021053053 | 149.62 | 0 |
| 0.0 | 1.191857111 | 0.266150712 | 0.166480113 | 0.448154078 | 0.060017649 | -0.082360809 | -0.078802983 | 0.085101655 | -0.255425128 | -0.166974414 | 1.612726661 | 1.065235311 | 0.489095016 | -0.143772296 | 0.635558093 | 0.463917041 | -0.114804663 | -0.18336127 | -0.145783041 | -0.069083135 | -0.225775248 | -0.638671953 | 0.101288021 | -0.339846476 | 0.167170404 | 0.125894532 | -0.008983099 | 0.014724169 | 2.69 | 0 |
In [0]:
# 信用卡欺诈检测
# 导入必要的库
# RFormula: 用于将数据转换为 Spark MLlib 可以使用的格式
# LogisticRegression: 逻辑回归模型,用于二分类问题
# Pipeline: 用于将多个 Spark MLlib 步骤组合成一个工作流
# Model: 用于存储训练好的模型
from pyspark.ml.feature import RFormula
from pyspark.ml.classification import LogisticRegression
from pyspark.ml import Pipeline, Model
train_data, test_data = cc_fraud.randomSplit([0.6, 0.4], seed=24)
x_cols = list(set(cc_fraud.columns) - {'Class', 'Time', 'weight'})
formula='Class ~ ' + ' + '.join(x_cols)
print("Formula: {}".format(formula))
pipeline = Pipeline(stages=[
RFormula(formula=formula, featuresCol='features'),
LogisticRegression()])
fitted_pipeline = pipeline.fit(train_data)
Formula: Class ~ V12 + V3 + V16 + V10 + V25 + V15 + V5 + V22 + V14 + V19 + Amount + V9 + V7 + V6 + V18 + V28 + V11 + V21 + V20 + V4 + V8 + V13 + V1 + V23 + V17 + V2 + V26 + V24 + V27
Downloading artifacts: 0%| | 0/55 [00:00<?, ?it/s]
Uploading artifacts: 0%| | 0/4 [00:00<?, ?it/s]
In [0]:
# 逻辑回归模型总结
# 从pipeline中检索拟合好的模型
lm = fitted_pipeline.stages[1]
# training summary
print(lm.summary)
print(lm.summary.accuracy)
<pyspark.ml.classification.BinaryLogisticRegressionTrainingSummary object at 0x7f38a4c540e0> 0.9992459976503183
In [0]:
# 分类模型总结
def classification_model_summary(lm, formula, columns):
print("Classification model summary")
print(f"Equation\n\t{formula}\n")
trainingSummary = lm.summary
accuracy = trainingSummary.accuracy
falsePositiveRate = trainingSummary.weightedFalsePositiveRate
truePositiveRate = trainingSummary.weightedTruePositiveRate
fMeasure = trainingSummary.weightedFMeasure()
precision = trainingSummary.weightedPrecision
recall = trainingSummary.weightedRecall
print(f"Accuracy: {accuracy:.2f} FPR: {falsePositiveRate:.2f} TPR: {truePositiveRate:.2f}")
print(f"F-measure: {fMeasure:.2f} Precision: {precision:.2f} Recall: {recall:.2f}")
print(f"{'Labels':>20}")
print(" "+''.join([f"{l:>10}" for l in lm.summary.labels]))
print("F-measure"+''.join([f"{l:>10.3f}" for l in lm.summary.fMeasureByLabel()]))
print("Precision"+''.join([f"{l:>10.3f}" for l in lm.summary.precisionByLabel]))
print("Recall "+''.join([f"{l:>10.3f}" for l in lm.summary.recallByLabel]))
classification_model_summary(lm, formula, x_cols)
Classification model summary
Equation
Class ~ V12 + V3 + V16 + V10 + V25 + V15 + V5 + V22 + V14 + V19 + Amount + V9 + V7 + V6 + V18 + V28 + V11 + V21 + V20 + V4 + V8 + V13 + V1 + V23 + V17 + V2 + V26 + V24 + V27
Accuracy: 1.00 FPR: 0.37 TPR: 1.00
F-measure: 1.00 Precision: 1.00 Recall: 1.00
Labels
0.0 1.0
F-measure 1.000 0.738
Precision 0.999 0.897
Recall 1.000 0.628
In [0]:
# BinaryClassificationMetrics: 用于计算二分类指标
import matplotlib.pyplot as plt
from sklearn.metrics import roc_curve
import seaborn as sns
from pyspark.mllib.evaluation import BinaryClassificationMetrics
roc_data = lm.summary.roc.select('FPR', 'TPR').toPandas()
plt.figure(figsize=(5,5))
p = sns.lineplot(data=roc_data, x='FPR', y='TPR', linewidth=2)
p.set(xlabel='False Positive Rate', ylabel='True Positive Rate')
p.set(title="ROC Curve")
l1 = p.lines[0]
x1 = l1.get_xydata()[:,0]
y1 = l1.get_xydata()[:,1]
p.fill_between(x1, y1, color="lightblue", alpha=0.3)
plt.plot([0,1], [0,1], linestyle=(0, (5,5)), linewidth=2)
Out[0]:
[<matplotlib.lines.Line2D at 0x7f388054a300>]
In [0]:
# 使用训练好的模型对训练数据进行预测
predictions = fitted_pipeline.transform(train_data)
# training: Area under precision recall curve (binary classification)
from pyspark.mllib.evaluation import BinaryClassificationMetrics
import matplotlib.pyplot as plt
pr_data = lm.summary.pr.select('recall', 'precision').toPandas()
plt.figure(figsize=(5,5))
p = sns.lineplot(data=pr_data, x='recall', y='precision', linewidth=2)
metrics = BinaryClassificationMetrics(predictions.select('label', 'prediction').rdd.map(tuple))
p.set(title=f"Precision-recall {metrics.areaUnderPR:.3f}")
l1 = p.lines[0]
x1 = l1.get_xydata()[:,0]
y1 = l1.get_xydata()[:,1]
p.fill_between(x1, y1, color="lightblue", alpha=0.3)
plt.plot([0,1], [0,1], linestyle=(0, (5,5)), linewidth=2)
/databricks/spark/python/pyspark/sql/context.py:165: FutureWarning: Deprecated in 3.0.0. Use SparkSession.builder.getOrCreate() instead. warnings.warn(
Out[0]:
[<matplotlib.lines.Line2D at 0x7f387c918b90>]
In [0]:
# Training Confusion matrix
from pyspark.mllib.evaluation import MulticlassMetrics
import pandas as pd
import numpy as np
# 使用 MulticlassMetrics 计算混淆矩阵
# MulticlassMetrics 用于多分类问题的评估
# 混淆矩阵是一个 N x N 的矩阵,其中 N 是类别的数量
# 混淆矩阵的第 i 行第 j 列的值表示真实类别为 i,预测类别为 j 的样本数量
# 这里使用训练数据 predictions 作为输入数据
metrics = MulticlassMetrics(predictions.select('label', 'prediction').rdd.map(tuple))
# 将混淆矩阵转换为 numpy 数组
# metrics.confusionMatrix() 返回的是一个 Matrix 对象,需要使用 toArray() 方法将其转换为 numpy 数组
# 混淆矩阵是一个 N x N 的矩阵,其中 N 是类别的数量
# 混淆矩阵的第 i 行第 j 列的值表示真实类别为 i,预测类别为 j 的样本数量
confusion_matrix = metrics.confusionMatrix().toArray()
cnf_matrix = pd.DataFrame(confusion_matrix)
plt.figure(figsize=(5,5))
sns.heatmap(cnf_matrix/np.sum(cnf_matrix), annot=True, cmap='RdBu', fmt='.2%', annot_kws={'fontsize': 10})
p.set(xlabel='Predicted', ylabel='Actual', title="Confusion matrix")
/databricks/spark/python/pyspark/sql/context.py:165: FutureWarning: Deprecated in 3.0.0. Use SparkSession.builder.getOrCreate() instead. warnings.warn(
Out[0]:
[Text(0.5, 24.0, 'Predicted'), Text(24.0, 0.5, 'Actual'), Text(0.5, 1.0, 'Confusion matrix')]
In [ ]:
# 使用训练好的模型对测试数据进行预测
# fitted_pipeline.transform(test_data) 方法将测试数据转换为预测数据
# 返回的 predictions 是一个 DataFrame 对象,包含了测试数据和预测结果
# predictions 包含了原始的测试数据,以及新增的 prediction 列,表示模型的预测结果
# predictions 包含了原始的测试数据,以及新增的 probability 列,表示模型预测为每个类别的概率
# predictions 包含了原始的测试数据,以及新增的 rawPrediction 列,表示模型预测的原始输出
predictions = fitted_pipeline.transform(test_data)
from pyspark.mllib.evaluation import MulticlassMetrics
def classification_metrics_summary(predictions, label='label', prediction='prediction'):
"""
Multi-class classification summary from prediction data
"""
labels = [row['label'] for row in predictions.select(label).distinct().collect()]
metrics = MulticlassMetrics(predictions.select(label, prediction).rdd.map(tuple))
print(f"Classification metrics summary")
if len(labels) == 2:
bin_metrics = BinaryClassificationMetrics(predictions.select(label, prediction).rdd.map(tuple))
areaUnderPR = bin_metrics.areaUnderPR
areaUnderROC = bin_metrics.areaUnderROC
print(f"Area under PR: {areaUnderPR}\t Area under ROC: {areaUnderROC}")
accuracy = metrics.accuracy
falsePositiveRate = metrics.weightedFalsePositiveRate
truePositiveRate = metrics.weightedTruePositiveRate
fMeasure = metrics.weightedFMeasure()
precision = metrics.weightedPrecision
recall = metrics.weightedRecall
print(f"Accuracy: {accuracy:.2f} FPR: {falsePositiveRate:.2f} TPR: {truePositiveRate:.2f}")
print(f"F-measure: {fMeasure:.2f} Precision: {precision:.2f} Recall: {recall:.2f}")
print(f"{'Labels':>20}")
print(" "+''.join([f"{l:>10}" for l in labels]))
print("Precision"+''.join([f"{l:>10.3f}" for l in [metrics.precision(label) for label in labels]]))
print("Recall "+''.join([f"{l:>10.3f}" for l in [metrics.recall(label) for label in labels]]))
return metrics.confusionMatrix().toArray()
In [0]:
# 获得预测结果
confusion_matrix = classification_metrics_summary(predictions)
/databricks/spark/python/pyspark/sql/context.py:165: FutureWarning: Deprecated in 3.0.0. Use SparkSession.builder.getOrCreate() instead. warnings.warn(
Classification metrics summary
Area under PR: 0.590936209296225 Area under ROC: 0.9321066479080778
Accuracy: 1.00 FPR: 0.13 TPR: 1.00
F-measure: 1.00 Precision: 1.00 Recall: 1.00
Labels
0.0 1.0
Precision 1.000 0.634
Recall 0.999 0.865
In [0]:
# 绘制testing混淆矩阵图
cnf_matirx = pd.DataFrame(confusion_matrix)
plt.figure(figsize=(5,5))
sns.heatmap(cnf_matrix/np.sum(cnf_matrix), annot=True, cmap='RdBu', fmt='.2%', annot_kws={'fontsize': 10})
p.set(xlabel='Predicted', ylabel='Actual', title="Confusion matrix")
Out[0]:
[Text(0.5, 24.0, 'Predicted'), Text(24.0, 0.5, 'Actual'), Text(0.5, 1.0, 'Confusion matrix')]
In [0]:
# multiple class classification
# wget https://raw.githubusercontent.com/daines-analytics/tabular-data-projects/master/r-classification-faulty-steel-plates/faults.csv
# 缺陷数据集
# 该数据集包含有关钢板缺陷的信息。
# 共有7种不同类型的缺陷:
# Pastry, Z_Scratch, K_Scatch, Stains, Dirtiness, Bumps, Other_Faults
# 该数据集包含1941个实例和34个属性。
# 属性包括:
# X_Minimum, X_Maximum, Y_Minimum, Y_Maximum, Pixels_Area, X_Perimeter, Y_Perimeter, Sum_of_Luminosity, Minimum_of_Luminosity, Maximum_of_Luminosity, Length_of_Conveyer, TypeOfSteel_A300, TypeOfSteel_A400, Steel_Plate_Thickness, Edges_Index, Empty_Index, Square_Index, Outside_X_Index, Edges_X_Index, Edges_Y_Index, Outside_Global_Index, LogOfAreas, Log_X_Index, Orientation_Index, Luminosity_Index, SigmoidOfAreas, Pastry, Z_Scratch, K_Scatch, Stains, Dirtiness, Bumps, Other_Faults
In [0]:
# 读取数据
df = spark.read.csv('/FileStore/tables/faults.csv', inferSchema=True, header=True, mode='DROPMALFORMED')
display(df.limit(2))
| X_Minimum | X_Maximum | Y_Minimum | Y_Maximum | Pixels_Areas | X_Perimeter | Y_Perimeter | Sum_of_Luminosity | Minimum_of_Luminosity | Maximum_of_Luminosity | Length_of_Conveyer | TypeOfSteel_A300 | TypeOfSteel_A400 | Steel_Plate_Thickness | Edges_Index | Empty_Index | Square_Index | Outside_X_Index | Edges_X_Index | Edges_Y_Index | Outside_Global_Index | LogOfAreas | Log_X_Index | Log_Y_Index | Orientation_Index | Luminosity_Index | SigmoidOfAreas | Pastry | Z_Scratch | K_Scatch | Stains | Dirtiness | Bumps | Other_Faults |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 42 | 50 | 270900 | 270944 | 267 | 17 | 44 | 24220 | 76 | 108 | 1687 | 1 | 0 | 80 | 0.0498 | 0.2415 | 0.1818 | 0.0047 | 0.4706 | 1.0 | 1.0 | 2.4265 | 0.9031 | 1.6435 | 0.8182 | -0.2913 | 0.5822 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
| 645 | 651 | 2538079 | 2538108 | 108 | 10 | 30 | 11397 | 84 | 123 | 1687 | 1 | 0 | 80 | 0.7647 | 0.3793 | 0.2069 | 0.0036 | 0.6 | 0.9667 | 1.0 | 2.0334 | 0.7782 | 1.4624 | 0.7931 | -0.1756 | 0.2984 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
In [0]:
# categories in one column (fault)
# 将多个类别列合并为一个列(fault)
import pyspark.sql.functions as F
dff = df.withColumn('fault',
F.when(df.Pastry>0, 'Pastry') \
.when(df.Z_Scratch>0, 'Z_Scratch') \
.when(df.K_Scatch>0, 'K_Scatch') \
.when(df.Stains>0, 'Stains') \
.when(df.Dirtiness>0, 'Dirtiness') \
.when(df.Bumps>0, 'Bumps') \
.otherwise('Other_Fault'))
dff = dff.drop('Pastry').drop('Z_Scratch').drop('K_Scatch').drop('Stains').drop('Dirtiness').drop('Bumps').drop('Other_Faults')
display(dff.limit(2))
| X_Minimum | X_Maximum | Y_Minimum | Y_Maximum | Pixels_Areas | X_Perimeter | Y_Perimeter | Sum_of_Luminosity | Minimum_of_Luminosity | Maximum_of_Luminosity | Length_of_Conveyer | TypeOfSteel_A300 | TypeOfSteel_A400 | Steel_Plate_Thickness | Edges_Index | Empty_Index | Square_Index | Outside_X_Index | Edges_X_Index | Edges_Y_Index | Outside_Global_Index | LogOfAreas | Log_X_Index | Log_Y_Index | Orientation_Index | Luminosity_Index | SigmoidOfAreas | Other_Faults | fault |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 42 | 50 | 270900 | 270944 | 267 | 17 | 44 | 24220 | 76 | 108 | 1687 | 1 | 0 | 80 | 0.0498 | 0.2415 | 0.1818 | 0.0047 | 0.4706 | 1.0 | 1.0 | 2.4265 | 0.9031 | 1.6435 | 0.8182 | -0.2913 | 0.5822 | 0 | Pastry |
| 645 | 651 | 2538079 | 2538108 | 108 | 10 | 30 | 11397 | 84 | 123 | 1687 | 1 | 0 | 80 | 0.7647 | 0.3793 | 0.2069 | 0.0036 | 0.6 | 0.9667 | 1.0 | 2.0334 | 0.7782 | 1.4624 | 0.7931 | -0.1756 | 0.2984 | 0 | Pastry |
In [0]:
# 多个类别的分类
# 缺陷数据集
# 准备数据,将数据集分成训练数据和测试数据
# RFormula: 用于将数据转换为 Spark MLlib 可以使用的格式
# LogisticRegression: 逻辑回归模型,用于多分类问题
# Pipeline: 用于将多个 Spark MLlib 步骤组合成一个工作流
# Model: 用于存储训练好的模型
faults = dff
from pyspark.ml.feature import RFormula
from pyspark.ml.classification import LogisticRegression
from pyspark.ml import Pipeline, Model
train_data, test_data = faults.randomSplit([0.6, 0.4], seed=24)
x_cols = list(set(faults.columns) - {'fault'})
formula = "{} ~ {}".format('fault', ' + '.join(x_cols))
print("Formula: {}".format(formula))
pipeline = Pipeline(stages=[
RFormula(formula=formula),
LogisticRegression()
])
fitted_model = pipeline.fit(train_data)
Formula: fault ~ Maximum_of_Luminosity + Other_Faults + Square_Index + Pixels_Areas + X_Maximum + Outside_Global_Index + TypeOfSteel_A300 + SigmoidOfAreas + Outside_X_Index + Log_X_Index + X_Perimeter + Length_of_Conveyer + Orientation_Index + Y_Minimum + Sum_of_Luminosity + X_Minimum + Minimum_of_Luminosity + Y_Perimeter + Edges_Index + Steel_Plate_Thickness + Log_Y_Index + Edges_X_Index + Empty_Index + LogOfAreas + Y_Maximum + Edges_Y_Index + TypeOfSteel_A400 + Luminosity_Index
Downloading artifacts: 0%| | 0/65 [00:00<?, ?it/s]
Uploading artifacts: 0%| | 0/4 [00:00<?, ?it/s]
In [0]:
# 从pipeline中检索拟合好的模型
# fitted_model.stages 返回的是一个列表,包含了 Pipeline 中的所有模型
# fitted_model.stages[1] 返回的是 Pipeline 中的第二个模型,也就是逻辑回归模型
lm = fitted_model.stages[1]
Training vs testing¶
In [0]:
# 分类模型总结
classification_model_summary(lm, formula, x_cols)
Classification model summary
Equation
fault ~ Maximum_of_Luminosity + Other_Faults + Square_Index + Pixels_Areas + X_Maximum + Outside_Global_Index + TypeOfSteel_A300 + SigmoidOfAreas + Outside_X_Index + Log_X_Index + X_Perimeter + Length_of_Conveyer + Orientation_Index + Y_Minimum + Sum_of_Luminosity + X_Minimum + Minimum_of_Luminosity + Y_Perimeter + Edges_Index + Steel_Plate_Thickness + Log_Y_Index + Edges_X_Index + Empty_Index + LogOfAreas + Y_Maximum + Edges_Y_Index + TypeOfSteel_A400 + Luminosity_Index
Accuracy: 0.94 FPR: 0.01 TPR: 0.94
F-measure: 0.94 Precision: 0.94 Recall: 0.94
Labels
0.0 1.0 2.0 3.0 4.0 5.0 6.0
F-measure 1.000 0.884 0.983 0.886 0.768 1.000 0.831
Precision 1.000 0.878 0.978 0.878 0.797 1.000 0.844
Recall 1.000 0.889 0.987 0.894 0.741 1.000 0.818
In [0]:
# training values
predictions = fitted_model.transform(train_data)
# training: confusion matrix
from pyspark.mllib.evaluation import MulticlassMetrics
import pandas as pd
import numpy as np
metrics = MulticlassMetrics(predictions.select('label', 'prediction').rdd.map(tuple))
confusion_matrix = metrics.confusionMatrix().toArray()
cnf_matrix = pd.DataFrame(confusion_matrix)
plt.figure(figsize=(10,7))
sns.heatmap(cnf_matrix/np.sum(cnf_matrix), annot=True, cmap='RdBu', fmt='.2%', annot_kws={'fontsize': 10})
p.set(xlabel='Predicted', ylabel='Actual', title="Confusion matrix")
/databricks/spark/python/pyspark/sql/context.py:165: FutureWarning: Deprecated in 3.0.0. Use SparkSession.builder.getOrCreate() instead. warnings.warn(
Out[0]:
[Text(0.5, 24.000000000000007, 'Predicted'), Text(24.000000000000007, 0.5, 'Actual'), Text(0.5, 1.0, 'Confusion matrix')]
In [0]:
# testing summary
predictions = fitted_model.transform(test_data)
# model fit with test data
confusion_matrix = classification_metrics_summary(predictions)
/databricks/spark/python/pyspark/sql/context.py:165: FutureWarning: Deprecated in 3.0.0. Use SparkSession.builder.getOrCreate() instead. warnings.warn(
Classification metrics summary
Accuracy: 0.90 FPR: 0.02 TPR: 0.90
F-measure: 0.90 Precision: 0.90 Recall: 0.90
Labels
0.0 1.0 4.0 3.0 2.0 6.0 5.0
Precision 0.993 0.807 0.685 0.870 0.969 0.591 0.917
Recall 1.000 0.823 0.704 0.859 0.908 0.765 0.917
In [0]:
# testing: confusion matrix
cnf_matrix = pd.DataFrame(confusion_matrix)
plt.figure(figsize=(10,7))
p = sns.heatmap(cnf_matrix/np.sum(cnf_matrix), annot=True, cmap='RdBu', fmt='.2%', annot_kws={'fontsize': 10})
p.set(xlabel='Predicted', ylabel='Actual', title="Confusion matrix")
Out[0]:
[Text(0.5, 47.7222222222222, 'Predicted'), Text(95.72222222222221, 0.5, 'Actual'), Text(0.5, 1.0, 'Confusion matrix')]
In [0]:
# testing summary
predictions = fitted_model.transform(test_data)
confusion_matrix = classification_metrics_summary(predictions)
/databricks/spark/python/pyspark/sql/context.py:165: FutureWarning: Deprecated in 3.0.0. Use SparkSession.builder.getOrCreate() instead. warnings.warn(
Classification metrics summary
Accuracy: 0.90 FPR: 0.02 TPR: 0.90
F-measure: 0.90 Precision: 0.90 Recall: 0.90
Labels
0.0 1.0 4.0 3.0 2.0 6.0 5.0
Precision 0.993 0.807 0.685 0.870 0.969 0.591 0.917
Recall 1.000 0.823 0.704 0.859 0.908 0.765 0.917
Databricks PySpark vs PySpark¶
- Databricks PySpark ≠ 纯开源 PySpark。Databricks Runtime(DBR)在开源 Spark 之上加了很多“魔法”和预装生态(Delta Lake、dbutils、Auto Loader、MLflow 集成、云存储连接器、Hive/UC 配置等)。
- 将这个课件的代码直接拿到本地 PySpark 运行,会报错请纠正。
- 本地PySpark环境搭建(https://kdding.github.io/books/data_analysis_slides/pyspark.html%EF%BC%89
- 该任务的第一个代码块内容如后一页课件所示
In [ ]:
import psutil
import platform
import os
env_name = os.environ.get('CONDA_DEFAULT_ENV')
print("当前 conda 环境名:", env_name)
print(platform.system()) # 操作系统名称
print(platform.release()) # 操作系统版本
print(platform.machine()) # 计算机架构
print(platform.processor()) # 处理器类型
# CPU 信息
print(psutil.cpu_count()) # CPU 核数
print(psutil.cpu_freq()) # CPU 频率
# 内存信息
print(psutil.virtual_memory()) # 内存总量、可用内存、已用内存等