@@ -701,7 +701,7 @@ def parallel_coordinates_cli(
701
701
def compute_pca_raster_cli (
702
702
input_rasters : INPUT_FILES_ARGUMENT ,
703
703
output_raster : OUTPUT_FILE_OPTION ,
704
- number_of_components : int = typer . Option () ,
704
+ number_of_components : Optional [ int ] = None ,
705
705
# NOTE: Omitted scaler type selection here since the parameter might be deleted from PCA func
706
706
nodata_handling : Annotated [NodataHandling , typer .Option (case_sensitive = False )] = NodataHandling .remove ,
707
707
# NOTE: Omitted nodata parameter. Should use raster nodata.
@@ -715,27 +715,34 @@ def compute_pca_raster_cli(
715
715
stacked_array , profiles = read_and_stack_rasters (input_rasters , nodata_handling = "convert_to_nan" )
716
716
typer .echo ("Progress: 25%" )
717
717
718
- pca_array , variance_ratios = compute_pca (
718
+ transformed_data , principal_components , variances , variance_ratios = compute_pca (
719
719
data = stacked_array , number_of_components = number_of_components , nodata_handling = get_enum_values (nodata_handling )
720
720
)
721
721
722
722
# Fill np.nan with nodata before writing data to raster
723
- pca_array [ pca_array == np .nan ] = - 9999
723
+ transformed_data [ transformed_data == np .nan ] = - 9999
724
724
out_profile = profiles [0 ]
725
725
out_profile ["nodata" ] = - 9999
726
726
727
727
# Update nr of bands
728
- out_profile ["count" ] = number_of_components
728
+ out_profile ["count" ] = len ( variances )
729
729
730
730
# Create dictionary from the variance ratios array
731
- variances_ratios_dict = {}
732
- for i , variance_ratio in enumerate (variance_ratios ):
733
- name = "PC " + str (i ) + " explained variance"
734
- variances_ratios_dict [name ] = variance_ratio
735
- json_str = json .dumps (variances_ratios_dict )
731
+ # variances_ratios_dict = {}
732
+ # for i, variance_ratio in enumerate(variance_ratios):
733
+ # name = "PC " + str(i) + " explained variance"
734
+ # variances_ratios_dict[name] = variance_ratio
735
+ # json_str = json.dumps(variances_ratios_dict)
736
+
737
+ out_dict = {
738
+ "principal_components" : np .round (principal_components , 4 ).tolist (),
739
+ "explained_variances" : np .round (variances , 4 ).tolist (),
740
+ "explained_variance_ratios" : np .round (variance_ratios , 4 ).tolist (),
741
+ }
742
+ json_str = json .dumps (out_dict )
736
743
737
744
with rasterio .open (output_raster , "w" , ** out_profile ) as dst :
738
- dst .write (pca_array )
745
+ dst .write (transformed_data )
739
746
740
747
typer .echo ("Progress: 100%" )
741
748
@@ -748,7 +755,7 @@ def compute_pca_raster_cli(
748
755
def compute_pca_vector_cli (
749
756
input_vector : INPUT_FILE_OPTION ,
750
757
output_vector : OUTPUT_FILE_OPTION ,
751
- number_of_components : int = typer . Option () ,
758
+ number_of_components : Optional [ int ] = None ,
752
759
columns : Annotated [List [str ], typer .Option ()] = None ,
753
760
# NOTE: Omitted scaler type selection here since the parameter might be deleted from PCA func
754
761
nodata_handling : Annotated [NodataHandling , typer .Option (case_sensitive = False )] = NodataHandling .remove ,
@@ -762,7 +769,7 @@ def compute_pca_vector_cli(
762
769
gdf = gpd .read_file (input_vector )
763
770
typer .echo ("Progress: 25%" )
764
771
765
- pca_gdf , variance_ratios = compute_pca (
772
+ transformed_data , principal_components , variances , variance_ratios = compute_pca (
766
773
data = gdf ,
767
774
number_of_components = number_of_components ,
768
775
columns = columns ,
@@ -771,13 +778,20 @@ def compute_pca_vector_cli(
771
778
)
772
779
773
780
# Create dictionary from the variance ratios array
774
- variances_ratios_dict = {}
775
- for i , variance_ratio in enumerate (variance_ratios ):
776
- name = "PC " + str (i ) + " explained variance"
777
- variances_ratios_dict [name ] = variance_ratio
778
- json_str = json .dumps (variances_ratios_dict )
779
-
780
- pca_gdf .to_file (output_vector )
781
+ # variances_ratios_dict = {}
782
+ # for i, variance_ratio in enumerate(variance_ratios):
783
+ # name = "PC " + str(i) + " explained variance"
784
+ # variances_ratios_dict[name] = variance_ratio
785
+ # json_str = json.dumps(variances_ratios_dict)
786
+
787
+ out_dict = {
788
+ "principal_components" : np .round (principal_components , 4 ).tolist (),
789
+ "explained_variances" : np .round (variances , 4 ).tolist (),
790
+ "explained_variance_ratios" : np .round (variance_ratios , 4 ).tolist (),
791
+ }
792
+ json_str = json .dumps (out_dict )
793
+
794
+ transformed_data .to_file (output_vector )
781
795
typer .echo ("Progress: 100%" )
782
796
783
797
typer .echo (f"Results: { json_str } " )
0 commit comments