Passing Data frame from python.Net

21 views Asked by At
 public AnovaTestResult KruskalWallisWithDunnDynamic(Parameter parameter)
    {
        using (Py.GIL())
        {
            dynamic np = Py.Import("numpy");
            dynamic scipyStats = Py.Import("scipy.stats");
            dynamic statsmodels = Py.Import("statsmodels.sandbox.stats.multicomp");
            dynamic scikit_posthocs = Py.Import("scikit_posthocs");
            dynamic pandas = Py.Import("pandas");

            var groupsData = parameter.GroupedParameterValues.Values;
            var groupLabelsPair = parameter.GroupedParameterValues.Keys;

            var pyGroupsData = new PyList();


            
            foreach (List<double> groupData in groupsData)
            {

                var pyGroupData = new PyList();
                foreach (double value in groupData)
                {
                    pyGroupData.Append(value.ToPython());
                }
                pyGroupsData.Append(pyGroupData);
            }

            

            PyTuple pyGroupsDataTuple = new PyTuple(pyGroupsData.ToArray());
            dynamic groupLabels = parameter.GroupedParameterValues.Keys.ToList().ToPython();


           



            List<double> allValues = new List<double>();
            List<double> allGroupLabels = new List<double>();

            foreach (var kvp in parameter.GroupedParameterValues)
            {
                double groupLabel = kvp.Key;
                List<double> groupValues = kvp.Value;

                allGroupLabels.AddRange(Enumerable.Repeat(groupLabel, groupValues.Count));
                allValues.AddRange(groupValues);
            }




            dynamic data_dict = new PyDict();
            foreach (var kvp in parameter.GroupedParameterValues)
            {
                string key = kvp.Key.ToString();
                List<double> svalues = kvp.Value;
                var pyGroupData = new PyList();
                foreach (double value in svalues)
                {
                    pyGroupData.Append(value.ToPython());
                }

                data_dict[key] = pyGroupData;
            }


            




            dynamic data = np.array(allValues.ToArray());
            dynamic groupLabelsCombined = np.array(allGroupLabels.ToArray());



            dynamic df = pandas.DataFrame(data, groupLabelsCombined);
            //

            string pythonScript = @"

result_kw = scipyStats.kruskal(*groups_data) dunn_result = scikit_posthocs.posthoc_dunn(df , val_col=data, group_col=group_labels_combined) ";

            dynamic locals = new PyDict();
            dynamic globals = new PyDict();

            globals["scipyStats"] = scipyStats;
            globals["statsmodels"] = statsmodels;
            globals["groups_data"] = pyGroupsDataTuple;
            globals["group_labels"] = groupLabels;
            globals["np"] = np;
            globals["df"] = df;
            globals["scikit_posthocs"] = scikit_posthocs;

            globals["data"] = data;
            globals["group_labels_combined"] = groupLabelsCombined;



            PythonEngine.Exec(pythonScript, locals, globals);

            dynamic kwResult = globals["result_kw"];
            dynamic result = globals["dunn_result"];
            



            
            // Create a pandas DataFrame
            
            //dynamic dunnResult = globals["dunn_result"];

            double hValue = kwResult[0].As<double>();
            double pValueKruskalWallis = kwResult[1].As<double>();

            if (pValueKruskalWallis < 0.05)
            {
                parameter.ISFAnovaSig = true;
            }

            string pValueString = pValueKruskalWallis <= 0.001 ? "<0.001" : pValueKruskalWallis.ToString("0.000");

            dynamic pValuesDunn = result; 

            List<string[]> pairwisecomparisons = new List<string[]>();
            int k = 0;
            for (int i = 0; i < groupsData.Count; i++)
            {
                for (int j = i + 1; j < groupsData.Count; j++)
                {
                    string labelA = parameter.GroupedParameterValues.Keys.ElementAt(i).ToString();
                    string labelB = parameter.GroupedParameterValues.Keys.ElementAt(j).ToString();
                    double pAdjValue = Math.Round(pValuesDunn[k].As<double>(), 3);
                    string pAdjString = pAdjValue <= 0.001 ? "<0.001" : pAdjValue.ToString("0.000");
                    MessageBox.Show(pAdjString);
                    string comparison = $"{labelA} vs {labelB}";
                    pairwisecomparisons.Add(new string[] { comparison, pAdjString });

                    parameter.FPairwise.Add(pAdjString);
                    k++;
                }
            }

            return new AnovaTestResult
            {
                TestValue = hValue.ToString("0.000"),
                PValue = pValueString,
                PairwiseComparisons = pairwisecomparisons
            };
        }
    }

i am constructing data frame but getting this error Python.Runtime.PythonException: 'The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()' any thoughts? here is my dataframe 0 1.0 7.0 1.0 7.0 1.0 7.0 1.0 9.0 1.0 9.0 .. ... 3.0 7.0 3.0 7.0 3.0 7.0 3.0 7.0 3.0 7.0

[84 rows x 1 columns]

0

There are 0 answers