public static void LoopCI(DataGridView dataGridView1, RichTextBox richTextBox1, string Cols, string Tail, string Statistics, double Significance) { //这个函数的目的是循环对所要求的变量进行参数估计 char[] separator = { ',' }; string[] AllCols = Cols.Split(separator); string result = ""; richTextBox1.AppendText("参数估计: "); richTextBox1.AppendText(Statistics); richTextBox1.AppendText("\r\n"); richTextBox1.AppendText("置信度: "); richTextBox1.AppendText(Significance.ToString()); richTextBox1.AppendText("\t"); richTextBox1.AppendText(Tail); richTextBox1.AppendText("\r\n"); richTextBox1.AppendText(Header); int ColNum = 0; foreach (string EachCol in AllCols) { if (Int32.TryParse(EachCol, out ColNum)) { string[] Numbers = Tabulation.ReadVector(MainForm.MainDT, ColNum - 1).ToArray(); result = CI(dataGridView1.Columns[ColNum - 1].Name, Numbers, Tail, Statistics, Significance); richTextBox1.AppendText(result); } } }
public static void MultiCorr(DataTable dt, int [] ColNums, RichTextBox richTextBox1) { StringBuilder Result = new StringBuilder(); //相关系数输出是一个矩阵,因此要有行名和列名 //例如: // 列1 列2 列3 //列1 1 0 0 //列2 0 1 0 //列3 0 1 1 //自身的相关系数一定是1 Result.Append(StrManipulation.PadLeftX(" ", ' ', 12)); Result.Append("\t"); foreach (int EachCol in ColNums) { Result.Append(StrManipulation.PadLeftX(dt.Columns[EachCol].ColumnName, ' ', 12)); Result.Append("\t"); } Result.Append("\r\n"); foreach (int EachCol in ColNums) { Result.Append(StrManipulation.PadLeftX(dt.Columns[EachCol].ColumnName, ' ', 12)); Result.Append("\t"); foreach (int EveryCol in ColNums) { if (EachCol == EveryCol) { Result.Append(StrManipulation.PadLeftX("1.000", ' ', 12)); Result.Append("\t"); } else { string[] NumberSeries1 = Tabulation.ReadVector(dt, EachCol).ToArray(); string[] NumberSeries2 = Tabulation.ReadVector(dt, EveryCol).ToArray(); Result.Append(StrManipulation.PadLeftX(MathV.NumberPolish(Corr(NumberSeries1, NumberSeries2).ToString()), ' ', 12)); Result.Append("\t"); } } Result.Append("\r\n"); } richTextBox1.AppendText(Result.ToString()); MainForm.S.richTextBox1.Select(); //让RichTextBox获得焦点 MainForm.S.richTextBox1.Select(MainForm.S.richTextBox1.TextLength, 0); //将插入符号置于文本结束处 MainForm.S.richTextBox1.ScrollToCaret(); }
private static string AddNums(ref string expression, List <string> VariableList, DataTable dt, ref List <int> BlackList) { VariableList = VariableList.Distinct().ToList(); int VarCount = VariableList.Count; StringBuilder Sequence = new StringBuilder(); string [][] Numbers = new string[VarCount][]; for (int i = 0; i < VarCount; i++) { Numbers[i] = Tabulation.ReadVector(dt, Convert.ToInt32(VariableList[i].Trim('x')) - 1).ToArray(); } int RowsCount = dt.Rows.Count; //List<int> BlackList = new List<int>(); double Temp = 0; int IsNaRow = 0; //IsNaRow = 0即该行无空格或错误,否则为1 int RealNumbers = 0; for (int i = 0; i < RowsCount; i++) { for (int j = 0; j < VarCount; j++) { if (double.TryParse(Numbers[j][i], out Temp)) { continue; } IsNaRow = 1; } if (IsNaRow == 1) { BlackList.Add(i); IsNaRow = 0; } else { RealNumbers++; } } StringBuilder AddNums = new StringBuilder(); int NumCount = 0; for (int i = 0; i < VarCount; i++) { Sequence.Append("double[] "); Sequence.Append(VariableList[i]); Sequence.Append(" = new double[]{"); AddNums.Clear(); NumCount = Numbers[i].Length; for (int j = 0; j < NumCount; j++) { if (BlackList.IndexOf(j) == -1) { AddNums.Append(Numbers[i][j]); AddNums.Append(","); } } Sequence.Append(AddNums.ToString().TrimEnd(',')); Sequence.Append("};"); expression = expression.Replace(VariableList[i], VariableList[i] + "[i]"); } Sequence.Append("int len = "); Sequence.Append(RealNumbers.ToString()); Sequence.Append(";"); return(Sequence.ToString()); }
private void button_Anova_Click(object sender, EventArgs e) { char[] separator = { ',' }; string[] AllCols = textBox_Cols.Text.Split(separator); int ColNum = 0; int Cols_count = 0; int Cols_length = AllCols.Length; //变量数 int[] Row_length = new int[Cols_length]; //每个变量长度 int Total_length = 0; //总单元数 string[][] Numbers = new string[Cols_length][]; foreach (string EachCol in AllCols) { if (Int32.TryParse(EachCol, out ColNum)) { Row_length[Cols_count] = 0; Numbers[Cols_count] = Tabulation.ReadVector(MainForm.MainDT, ColNum - 1).ToArray(); foreach (string value in Numbers[Cols_count]) { if (value != "" && value != null) { Row_length[Cols_count]++; } } Total_length += Row_length[Cols_count]; //MessageBox.Show("变量" + Cols_count.ToString()); //MessageBox.Show("变量长度" + Total_length.ToString()); } Cols_count++; } //计算开始 BigDecimal sum_all = 0; BigDecimal[] sum_col = new BigDecimal[Cols_length]; BigDecimal[] xjbar = new BigDecimal[Cols_length]; for (int i = 0; i < Cols_length; i++) { sum_col[i] = 0; foreach (BigDecimal value in Numbers[i]) { sum_all = sum_all + value; sum_col[i] = sum_col[i] + value; xjbar[i] = sum_col[i] / Row_length[i]; } } BigDecimal xbarbar = sum_all / Total_length; BigDecimal SST = 0; BigDecimal SSA = 0; BigDecimal SSW = 0; BigDecimal[] SSW_list = new BigDecimal[Cols_length]; for (int i = 0; i < Cols_length; i++) { SSW_list[i] = 0; foreach (BigDecimal var in Numbers[i]) { SST = SST + (var - xbarbar) * (var - xbarbar); SSW_list[i] = SSW_list[i] + (var - xjbar[i]) * (var - xjbar[i]); } SSA = SSA + Row_length[i] * (xjbar[i] - xbarbar) * (xjbar[i] - xbarbar); SSW = SSW + SSW_list[i]; } BigDecimal MSA = SSA / (Cols_length - 1); BigDecimal MSW = SSW / (Total_length - Cols_length); BigDecimal MST = SST / (Total_length - 1); BigDecimal Fvalue = MSA / MSW; BigDecimal Pvalue = Stat.FDIST(Convert.ToDouble(Fvalue.ToString()), Cols_length - 1, Total_length - 1); MainForm.S.richTextBox1.AppendText(StrManipulation.PadLeftX(StrManipulation.VariableNamePolish("方差分析"), ' ', 12)); MainForm.S.richTextBox1.AppendText("\r\n"); MainForm.S.richTextBox1.AppendText(StrManipulation.PadLeftX(StrManipulation.VariableNamePolish("变量名:"), ' ', 12)); MainForm.S.richTextBox1.AppendText("\t"); MainForm.S.richTextBox1.AppendText(textBox_VarNames.Text); MainForm.S.richTextBox1.AppendText("\r\n"); MainForm.S.richTextBox1.AppendText(StrManipulation.PadLeftX(StrManipulation.VariableNamePolish("F值:"), ' ', 12)); MainForm.S.richTextBox1.AppendText("\t"); MainForm.S.richTextBox1.AppendText(StrManipulation.PadLeftX(MathV.NumberPolish(Fvalue.ToString()), ' ', 12)); MainForm.S.richTextBox1.AppendText("\r\n"); MainForm.S.richTextBox1.AppendText(StrManipulation.PadLeftX(StrManipulation.VariableNamePolish("P值:"), ' ', 12)); MainForm.S.richTextBox1.AppendText("\t"); MainForm.S.richTextBox1.AppendText(StrManipulation.PadLeftX(MathV.NumberPolish(Pvalue.ToString()), ' ', 12)); MainForm.S.richTextBox1.AppendText("\r\n"); MainForm.S.richTextBox1.AppendText(Header); MainForm.S.richTextBox1.AppendText(StrManipulation.PadLeftX(StrManipulation.VariableNamePolish("组内"), ' ', 12)); MainForm.S.richTextBox1.AppendText("\t"); MainForm.S.richTextBox1.AppendText(StrManipulation.PadLeftX(MathV.NumberPolish((Cols_length - 1).ToString()), ' ', 12)); MainForm.S.richTextBox1.AppendText("\t"); MainForm.S.richTextBox1.AppendText(StrManipulation.PadLeftX(MathV.NumberPolish(SSA.ToString()), ' ', 12)); MainForm.S.richTextBox1.AppendText("\t"); MainForm.S.richTextBox1.AppendText(StrManipulation.PadLeftX(MathV.NumberPolish(MSA.ToString()), ' ', 12)); MainForm.S.richTextBox1.AppendText("\r\n"); MainForm.S.richTextBox1.AppendText(StrManipulation.PadLeftX(StrManipulation.VariableNamePolish("组间"), ' ', 12)); MainForm.S.richTextBox1.AppendText("\t"); MainForm.S.richTextBox1.AppendText(StrManipulation.PadLeftX(MathV.NumberPolish((Total_length - Cols_length).ToString()), ' ', 12)); MainForm.S.richTextBox1.AppendText("\t"); MainForm.S.richTextBox1.AppendText(StrManipulation.PadLeftX(MathV.NumberPolish(SSW.ToString()), ' ', 12)); MainForm.S.richTextBox1.AppendText("\t"); MainForm.S.richTextBox1.AppendText(StrManipulation.PadLeftX(MathV.NumberPolish(MSW.ToString()), ' ', 12)); MainForm.S.richTextBox1.AppendText("\r\n"); MainForm.S.richTextBox1.AppendText(StrManipulation.PadLeftX(StrManipulation.VariableNamePolish("总"), ' ', 12)); MainForm.S.richTextBox1.AppendText("\t"); MainForm.S.richTextBox1.AppendText(StrManipulation.PadLeftX(MathV.NumberPolish((Total_length - 1).ToString()), ' ', 12)); MainForm.S.richTextBox1.AppendText("\t"); MainForm.S.richTextBox1.AppendText(StrManipulation.PadLeftX(MathV.NumberPolish(SST.ToString()), ' ', 12)); MainForm.S.richTextBox1.AppendText("\t"); MainForm.S.richTextBox1.AppendText(StrManipulation.PadLeftX(MathV.NumberPolish(MST.ToString()), ' ', 12)); MainForm.S.richTextBox1.AppendText("\r\n"); }
public static string HypothesisTesting(DataTable MainDT, string ColName, string Statistics, string Operation, string Tail, double Significance, double NullHypothesis) { //假设检验 //Statistics为统计量,Operation为运算(>,<,=) //Tail为单尾双尾,这里内容为双侧、左单侧、右单侧 //Significance为显著性水平 int ColNum = Tabulation.FindCol(MainDT, ColName); string[] Numbers = Tabulation.ReadVector(MainDT, ColNum).ToArray(); StringBuilder Result = new StringBuilder(); Result.Append("假设检验: "); Result.Append(Statistics); Result.Append("\r\n"); Result.Append("显著性水平: "); Result.Append(Significance.ToString()); Result.Append("\t"); Result.Append(Tail); Result.Append("\r\n原假设: "); Result.Append(Statistics); Result.Append(" "); Result.Append(Operation); Result.Append(" "); Result.Append(NullHypothesis.ToString()); Result.Append("\r\n备择假设: "); Result.Append(Statistics); Result.Append(" "); if (Operation == "=") { Result.Append("<>"); } else if (Operation == "<=") { Result.Append(">"); } else { Result.Append("<"); } Result.Append(" "); Result.Append(NullHypothesis.ToString()); Result.Append("\r\n"); BigDecimal sum = 0; BigDecimal mean = 0; BigDecimal Variance = 0; BigDecimal Sd = 0; //Sd为标准差 int count = 0; BigDecimal sum2 = 0; //sum2用于计算数字的平方,方便计算方差 Double TempNum = 0; BigDecimal BigTemp = 0; //BigTemp用于记录BigDecimal类型的临时数据 double Threshold = 0; //Threshold为临界值 double PValue = 0; //Pvalue不用多解释了吧~ foreach (string Num in Numbers) { if (Double.TryParse(Num, out TempNum)) { sum += TempNum; sum2 += (BigDecimal)TempNum * (BigDecimal)TempNum; count++; } } //遍历了该列所有数字 if (Statistics == "均值") { if (count >= 30) { Result.Append(HTHeader_Ztest); } else { Result.Append(HTHeader_Ttest); } if (count <= 1) { return("样本数量过少,无法进行假设检验!\r\n"); } else { //开始计算均值和方差 //方差要乘以调整系数 mean = sum / count; Variance = (sum2 / count - mean * mean) * count / (count - 1); Result.Append(StrManipulation.PadLeftX(StrManipulation.VariableNamePolish(ColName), ' ', 12)); Result.Append("\t"); Result.Append(StrManipulation.PadLeftX(count.ToString(), ' ', 12)); Result.Append("\t"); Result.Append(StrManipulation.PadLeftX(MathV.NumberPolish(mean.ToString()), ' ', 12)); Result.Append("\t"); Result.Append(StrManipulation.PadLeftX(MathV.NumberPolish(MathV.Sqrt(Variance.ToString()).ToString()), ' ', 12)); Result.Append("\t"); if (count >= 30) { //大样本 //z检验 Sd = MathV.Sqrt(Variance.ToString()).ToString(); BigTemp = (mean - NullHypothesis) / (Sd / Math.Sqrt(count)); //BigTemp此时的值为z检验统计量 //样本数count无需大数开方,用普通方法开方即可 if (Tail == "双侧") { Threshold = NORMSINV(1 - Significance / 2); PValue = 2 * (1 - NORMDIST(Math.Abs(Convert.ToDouble(BigTemp.ToString())))); } else if (Tail == "左单侧") { Threshold = NORMSINV(Significance); PValue = 1 - NORMDIST(Math.Abs(Convert.ToDouble(BigTemp.ToString()))); } else if (Tail == "右单侧") { Threshold = NORMSINV(1 - Significance); PValue = 1 - NORMDIST(Math.Abs(Convert.ToDouble(BigTemp.ToString()))); } Result.Append(StrManipulation.PadLeftX(MathV.NumberPolish(BigTemp.ToString()), ' ', 12)); Result.Append("\t"); Result.Append(StrManipulation.PadLeftX(MathV.NumberPolish(Threshold.ToString()), ' ', 12)); Result.Append("\t"); Result.Append(StrManipulation.PadLeftX(MathV.NumberPolish(PValue.ToString()), ' ', 12)); Result.Append("\r\n"); if (PValue < Significance) { Result.Append("在"); Result.Append(Significance.ToString()); Result.Append("的显著性水平上拒绝原假设"); } else { Result.Append("在"); Result.Append(Significance.ToString()); Result.Append("的显著性水平上不拒绝原假设"); } } else { //小样本 //t检验 Sd = MathV.Sqrt(Variance.ToString()).ToString(); BigTemp = (mean - NullHypothesis) / (Sd / Math.Sqrt(count)); //BigTemp此时的值为z检验统计量 //样本数count无需大数开方,用普通方法开方即可 if (Tail == "双侧") { Threshold = TINV(Significance / 2 / 2, count - 1); //每个放进TINV的值都要除以2,这个bug之后会进行修复 PValue = TDIST(Math.Abs(Convert.ToDouble(BigTemp.ToString()) / 2), count - 1, 2); } else if (Tail == "左单侧") { Threshold = TINV(Significance / 2, count - 1); PValue = TDIST(Math.Abs(Convert.ToDouble(BigTemp.ToString()) / 2), count - 1, 1); } else if (Tail == "右单侧") { Threshold = TINV(Significance / 2, count - 1); PValue = TDIST(Math.Abs(Convert.ToDouble(BigTemp.ToString()) / 2), count - 1, 1); } Result.Append(StrManipulation.PadLeftX(MathV.NumberPolish(BigTemp.ToString()), ' ', 12)); Result.Append("\t"); Result.Append(StrManipulation.PadLeftX(MathV.NumberPolish(Threshold.ToString()), ' ', 12)); Result.Append("\t"); Result.Append(StrManipulation.PadLeftX(MathV.NumberPolish(PValue.ToString()), ' ', 12)); Result.Append("\r\n"); if (PValue < Significance) { Result.Append("在"); Result.Append(Significance.ToString()); Result.Append("的显著性水平上拒绝原假设"); } else { Result.Append("在"); Result.Append(Significance.ToString()); Result.Append("的显著性水平上不拒绝原假设"); } } Result.Append("\r\n"); return(Result.ToString()); } } else if (Statistics == "比率") { return("hhh"); } else { //方差 return("hhh"); } }
public static string QuickSummary(DataTable MainDT, int ColNum) { string ColName = MainDT.Columns[ColNum].ColumnName; List <string> Numbers = Tabulation.ReadVector(MainDT, ColNum); StringBuilder Result = new StringBuilder(); BigDecimal sum = 0; BigDecimal mean = 0; BigDecimal Variance = 0; int count = 0; BigDecimal max = 0; BigDecimal min = 0; BigDecimal sum2 = 0; Double TempNum = 0; //sum2用于计算数字的平方,方便计算方差 foreach (string Num in Numbers) { if (Double.TryParse(Num, out TempNum)) { sum += TempNum; sum2 += (BigDecimal)TempNum * (BigDecimal)TempNum; count++; if (count == 1) { max = TempNum; min = TempNum; } else { if (max < TempNum) { max = TempNum; } if (min > TempNum) { min = TempNum; } } } } if (count == 0) { //如果没有获取任何数字 return(""); } else if (count == 1) { //如果只有一个数字,可以计算均值,但是不可以计算标准差 mean = sum / count; Result.Append(StrManipulation.PadLeftX(StrManipulation.VariableNamePolish(ColName), ' ', 12)); Result.Append("\t"); Result.Append(StrManipulation.PadLeftX(count.ToString(), ' ', 12)); Result.Append("\t"); Result.Append(StrManipulation.PadLeftX(MathV.NumberPolish(mean.ToString()), ' ', 12)); Result.Append("\t"); Result.Append(StrManipulation.PadLeftX("NA", ' ', 12)); Result.Append("\t"); Result.Append(StrManipulation.PadLeftX(MathV.NumberPolish(min.ToString()), ' ', 12)); Result.Append("\t"); Result.Append(StrManipulation.PadLeftX(MathV.NumberPolish(max.ToString()), ' ', 12)); Result.Append("\r\n"); //Temp += Result; return(Result.ToString()); } else { //开始计算均值和方差 //方差要乘以调整系数 mean = sum / count; Variance = (sum2 / count - mean * mean) * count / (count - 1); Result.Append(StrManipulation.PadLeftX(StrManipulation.VariableNamePolish(ColName), ' ', 12)); Result.Append("\t"); Result.Append(StrManipulation.PadLeftX(count.ToString(), ' ', 12)); Result.Append("\t"); Result.Append(StrManipulation.PadLeftX(MathV.NumberPolish(mean.ToString()), ' ', 12)); Result.Append("\t"); Result.Append(StrManipulation.PadLeftX(MathV.NumberPolish(MathV.Sqrt(Variance.ToString()).ToString()), ' ', 12)); Result.Append("\t"); Result.Append(StrManipulation.PadLeftX(MathV.NumberPolish(min.ToString()), ' ', 12)); Result.Append("\t"); Result.Append(StrManipulation.PadLeftX(MathV.NumberPolish(max.ToString()), ' ', 12)); Result.Append("\r\n"); return(Result.ToString()); } }
private void button1_Click(object sender, EventArgs e) { StringBuilder Result = new StringBuilder(); int ColNum = 0; if (Int32.TryParse(texbox_dep.Text, out ColNum)) { string[] NumberSeries = Tabulation.ReadVector(MainForm.MainDT, ColNum - 1).ToArray(); int length = 0; int lag = 4; //自己给定lag的值 string[][] NumberCombine = new string[lag + 1][]; BigDecimal[] corr = new BigDecimal[lag]; BigDecimal sum_Qtest = 0; BigDecimal sum_LBtest = 0; foreach (string Num in NumberSeries) { if (Num != "" && Num != null) { length++; } } if (length < 8) { MessageBox.Show("数据量过少,建议使用灰色预测"); } else { for (int i = 0; i < lag + 1; i++) { NumberCombine[i] = new string[length - lag]; for (int j = 0; j < length - lag; j++) { NumberCombine[i][j] = NumberSeries[j + lag - i]; } try { corr[i - 1] = Stat.Corr(NumberCombine[i], NumberCombine[i - 1]); sum_Qtest += corr[i - 1] * corr[i - 1]; sum_LBtest += corr[i - 1] * corr[i - 1] / (BigDecimal)(length - i); } catch (Exception ex) { } } string[] output = Stat.TimeseriesTest(length, sum_Qtest, sum_LBtest, lag, corr); Result.Append(StrManipulation.PadLeftX("时间序列平稳性检验", ' ', 12)); Result.Append("\r\n"); Result.Append(StrManipulation.PadRightX("Q检验:", ' ', 12)); Result.Append("\r\n"); Result.Append(StrManipulation.PadLeftX("Q =", ' ', 12)); Result.Append("\t"); Result.Append(StrManipulation.PadLeftX(MathV.NumberPolish(output[lag]), ' ', 12)); Result.Append("\r\n"); Result.Append(StrManipulation.PadLeftX("Prob > Q =", ' ', 12)); Result.Append("\t"); Result.Append(StrManipulation.PadLeftX(MathV.NumberPolish(output[lag + 1]), ' ', 12)); Result.Append("\r\n"); Result.Append(StrManipulation.PadRightX("LB检验:", ' ', 12)); Result.Append("\r\n"); Result.Append(StrManipulation.PadLeftX("LB =", ' ', 12)); Result.Append("\t"); Result.Append(StrManipulation.PadLeftX(MathV.NumberPolish(output[lag + 2]), ' ', 12)); Result.Append("\r\n"); Result.Append(StrManipulation.PadLeftX("Prob > LB =", ' ', 12)); Result.Append("\t"); Result.Append(StrManipulation.PadLeftX(MathV.NumberPolish(output[lag + 3]), ' ', 12)); Result.Append("\r\n"); if (Convert.ToDouble(output[lag + 1]) <= 0.05 || Convert.ToDouble(output[lag + 3]) <= 0.05) { Result.Append(StrManipulation.PadRightX("在95%的显著性水平下认为序列非白噪声,观测值间显著相关。", ' ', 50)); Result.Append("\r\n"); } else { Result.Append(StrManipulation.PadRightX("在95%的显著性水平下认为序列为白噪声,观测值间相互独立。", ' ', 50)); Result.Append("\r\n"); } Result.Append("\r\n"); int period = 0; if (Int32.TryParse(textBox_period.Text, out period)) { BigDecimal[] AR1 = Stat.AR1(NumberSeries, length, corr, period); BigDecimal[] AR2 = Stat.AR2(NumberSeries, length, corr, period); BigDecimal[] plot_forecast = new BigDecimal[period]; if (AR1[period] <= AR2[period]) { Result.Append(StrManipulation.PadRightX("最佳预测模型:AR1", ' ', 12)); Result.Append("\r\n"); Result.Append(StrManipulation.PadLeftX("序号(预测)", ' ', 12)); Result.Append("\t"); for (int i = 0; i < period; i++) { Result.Append(StrManipulation.PadLeftX(i.ToString(), ' ', 12)); plot_forecast[i] = AR1[i]; Result.Append("\t"); } Result.Append("\r\n"); Result.Append(StrManipulation.PadLeftX("预测值", ' ', 12)); Result.Append("\t"); for (int i = 0; i < period; i++) { Result.Append(StrManipulation.PadLeftX(MathV.NumberPolish(AR1[i].ToString()), ' ', 12)); Result.Append("\t"); } } else { Result.Append(StrManipulation.PadRightX("最佳预测模型:AR2", ' ', 12)); Result.Append("\r\n"); Result.Append(StrManipulation.PadLeftX("序号(预测)", ' ', 12)); Result.Append("\t"); for (int i = 0; i < period; i++) { Result.Append(StrManipulation.PadLeftX(i.ToString(), ' ', 12)); plot_forecast[i] = AR2[i]; Result.Append("\t"); } Result.Append("\r\n"); Result.Append(StrManipulation.PadLeftX("预测值", ' ', 12)); Result.Append("\t"); for (int i = 0; i < period; i++) { Result.Append(StrManipulation.PadLeftX(MathV.NumberPolish(AR2[i].ToString()), ' ', 12)); Result.Append("\t"); } } Result.Append("\r\n"); Result.Append("\r\n"); MainForm.S.richTextBox1.AppendText(Result.ToString()); //MainForm.S.richTextBox1.Select();//让RichTextBox获得焦点 chart_timeseries.Series.Clear(); Series series = new Series("原数据"); Series series2 = new Series("预测数据"); //ChartArea area = chart_timeseries.ChartAreas.Add("chartArea"); //area.AxisX.MajorGrid.LineWidth = 0; series.Color = Color.MidnightBlue; series2.Color = Color.Maroon; if (length <= 50) { series.BorderWidth = 2; series2.BorderWidth = 2; } series.ChartType = SeriesChartType.Line; series2.ChartType = SeriesChartType.Line; for (int i = 0; i < length; i++) { series.Points.AddXY(i + 1, Convert.ToDouble(NumberSeries[i].ToString())); } series2.Points.AddXY(length, Convert.ToDouble(NumberSeries[length - 1].ToString())); for (int i = 0; i < period; i++) { series2.Points.AddXY(i + 1 + length, Convert.ToDouble(plot_forecast[i].ToString())); } chart_timeseries.Series.Add(series); chart_timeseries.Series.Add(series2); } else { MessageBox.Show("请输入预测期数"); } } } else { MessageBox.Show("无此列"); } }
private void button_chart_Click(object sender, EventArgs e) { StringBuilder Result = new StringBuilder(); int ColNum = 0; if (Int32.TryParse(texbox_dep.Text, out ColNum)) { string[] NumberSeries = Tabulation.ReadVector(MainForm.MainDT, ColNum - 1).ToArray(); int length = 0; foreach (string Num in NumberSeries) { if (Num != "" && Num != null) { length++; } } int period = 0; if (Int32.TryParse(textBox_period.Text, out period)) { BigDecimal[] cumsum = new BigDecimal[length]; for (int i = 0; i < length; i++) { cumsum[i] = 0; for (int j = 0; j <= i; j++) { cumsum[i] += NumberSeries[j]; } } BigDecimal[] C = new BigDecimal[length - 1]; for (int i = 0; i < length - 1; i++) { C[i] = 0 - (cumsum[i] + cumsum[i + 1]) / 2; } BigDecimal[,] D = new BigDecimal[length - 1, 1]; for (int i = 0; i < length - 1; i++) { D[i, 0] = NumberSeries[i + 1]; } BigDecimal[,] E = new BigDecimal[2, length - 1]; for (int i = 0; i < length - 1; i++) { E[1, i] = 1; E[0, i] = C[i]; } //BigNumber[,] c = MathV.MatTimes(MathV.MatTimes(MathV.MatInv(MathV.MatTimes(E, MathV.MatTrans(E)), 2), E), MathV.MatTrans(D)); BigDecimal[,] c = MathV.MatTimes(MathV.MatTimes(MathV.MatInv(MathV.MatTimes(E, MathV.MatTrans(E)), 2), E), D); BigDecimal a = c[0, 0]; BigDecimal b = c[1, 0]; BigDecimal t = b / a; BigDecimal[] F = new BigDecimal[length + period]; for (int i = 0; i < length + period; i++) { BigDecimal e1 = 2.718281828; F[i] = (NumberSeries[0] - t) / Math.Exp((i) * Convert.ToDouble(a.ToString())) + t; } BigDecimal[] G = new BigDecimal[length + period]; G[0] = NumberSeries[0]; for (int i = 1; i < length + period; i++) { G[i] = F[i] - F[i - 1]; } Result.Append(StrManipulation.PadRightX("灰色预测GM(1,1)模型", ' ', 12)); Result.Append("\r\n"); Result.Append(StrManipulation.PadLeftX("序号(所有)", ' ', 12)); Result.Append("\t"); for (int i = 0; i < period; i++) { Result.Append(StrManipulation.PadLeftX(i.ToString(), ' ', 12)); Result.Append("\t"); } Result.Append("\r\n"); Result.Append(StrManipulation.PadLeftX("预测值", ' ', 12)); Result.Append("\t"); for (int i = 0; i < period + length; i++) { Result.Append(StrManipulation.PadLeftX(MathV.NumberPolish(G[i].ToString()), ' ', 12)); Result.Append("\t"); } Result.Append("\r\n"); Result.Append("\r\n"); chart_timeseries.Series.Clear(); Series series3 = new Series("原数据(点)"); Series series4 = new Series("灰色预测数据"); series3.MarkerStyle = MarkerStyle.Circle; series3.MarkerSize = 6; series4.BorderWidth = 2; series3.Color = Color.MidnightBlue; series4.Color = Color.Maroon; series3.ChartType = SeriesChartType.Point; series4.ChartType = SeriesChartType.Line; for (int i = 0; i < length; i++) { series3.Points.AddXY(i + 1, Convert.ToDouble(NumberSeries[i].ToString())); } for (int i = 0; i < period + length; i++) { series4.Points.AddXY(i + 1, Convert.ToDouble(G[i].ToString())); } chart_timeseries.Series.Add(series3); chart_timeseries.Series.Add(series4); } else { MessageBox.Show("请输入预测期数"); } } else { MessageBox.Show("无此列"); } }
public static void NAProcess(DataGridView dataGridView1, string Cols, string type, RichTextBox richTextBox1, ComboBox comboBox_user_defined, TextBox textBox_user_defined) { char [] separator = { ',' }; string [] AllCols = Cols.Split(separator); List <int> ColsNeedRemove = new List <int>(); int NACount = 0; //计算缺失值数量 DataTable dt = dataGridView1.DataSource as DataTable; richTextBox1.AppendText("缺失值处理:\r\n"); richTextBox1.AppendText(" 处理方式: " + type + "\r\n"); richTextBox1.Select(); //让RichTextBox获得焦点 richTextBox1.Select(richTextBox1.TextLength, 0); //将插入符号置于文本结束处 richTextBox1.ScrollToCaret(); BigNumber Mean = 0; BigNumber Sum = 0; foreach (string Col in AllCols) { int StartCount = 0; //从第一个非空值开始计数 NACount = 0; Sum = 0; if (comboBox_user_defined.Text == "平均值") { string [] Numbers = Tabulation.ReadVector(MainForm.MainDT, Convert.ToInt32(Col) - 1).ToArray(); int NumCounts = 0; foreach (string Num in Numbers) { if (Tabulation.IsStrDouble(Num)) { Sum += Convert.ToDouble(Num); NumCounts++; } } Mean = Sum / NumCounts; } for (int i = dataGridView1.Rows.Count - 2; i >= 0; i--) { //倒着数,从后往前数 if (StartCount == 0 && dataGridView1.Rows[i].Cells[Convert.ToInt32(Col) - 1].Value.ToString().Trim() != "") { StartCount = 1; continue; } if (StartCount == 1 && dataGridView1.Rows[i].Cells[Convert.ToInt32(Col) - 1].Value.ToString().Trim() == "") { //遇到缺失值了 if (type == "计算缺失值个数") { NACount++; } else if (type == "删除整行") { NACount++; //dt.Rows.RemoveAt(i); ColsNeedRemove.Add(i); } else if (type == "替换为特定值") { if (comboBox_user_defined.Text == "平均值") { dataGridView1.Rows[i].Cells[Convert.ToInt32(Col) - 1].Value = Mean.ToString(); } else if (comboBox_user_defined.Text == "自定义值") { dataGridView1.Rows[i].Cells[Convert.ToInt32(Col) - 1].Value = textBox_user_defined.Text; } NACount++; } } } if (StartCount != 0) { richTextBox1.AppendText(" " + "第" + Col + "列" + "缺失值个数: " + NACount.ToString() + "\r\n"); richTextBox1.Select(); //让RichTextBox获得焦点 richTextBox1.Select(richTextBox1.TextLength, 0); //将插入符号置于文本结束处 richTextBox1.ScrollToCaret(); } } richTextBox1.AppendText("\r\n"); if (type == "删除整行") { ColsNeedRemove = ColsNeedRemove.Distinct().ToList(); ColsNeedRemove.Sort(); int [] SequenceRemove = ColsNeedRemove.ToArray(); for (int i = SequenceRemove.Length - 1; i >= 0; i--) { dt.Rows.RemoveAt(SequenceRemove[i]); } dataGridView1.DataSource = dt; } }
private void button1_Click(object sender, EventArgs e) { int ProvinceNum = 0; int VariableNum = 0; if (Int32.TryParse(texbox_province.Text, out ProvinceNum)) { if (Int32.TryParse(textBox_variable.Text, out VariableNum)) { string[] Province_name = Tabulation.ReadVector(MainForm.MainDT, ProvinceNum - 1).ToArray(); string[] Variable_data = Tabulation.ReadVector(MainForm.MainDT, VariableNum - 1).ToArray(); double[] data1 = new double[31]; string[] match = new string[] { "黑", "内", "新", "吉", "辽", "甘", "河北", "京", "山西", "津", "陕", "夏", "青", "山东", "藏", "河南", "苏", "安", "川", "湖北", "重", "上", "浙", "湖南", "江西", "云", "贵", "福", "广西", "海南", "广东" }; for (int i = 0; i < 31; i++) { for (int j = 0; j < 31; j++) { if (Province_name[j].IndexOf(match[i]) > -1) { data1[i] = Convert.ToDouble(Variable_data[j]); break; } } } string str2 = Environment.CurrentDirectory; DataTable dt = new DataTable(); DataTable dt_fill = new DataTable(); string coor_path = str2 + "\\coordinates_tiny.csv"; string coor_fill = str2 + "\\coordinates_tinyfill.csv"; char[] separators = new char[1]; separators[0] = ','; dt = Tabulation.LoadFromCSVFile(coor_path, separators); dt_fill = Tabulation.LoadFromCSVFile(coor_fill, separators); int[] X_fill = new int[dt_fill.Rows.Count]; int[] Y_fill = new int[dt_fill.Rows.Count]; int[] Num_count = new int[31]; //31个省的填充坐标点数 Num_count[0] = 5436; Num_count[1] = 18313; Num_count[2] = 35839; Num_count[3] = 37966; Num_count[4] = 39530; Num_count[5] = 43696; Num_count[6] = 45647; Num_count[7] = 45814; Num_count[8] = 47410; Num_count[9] = 47531; Num_count[10] = 49571; Num_count[11] = 50103; Num_count[12] = 57224; Num_count[13] = 58756; Num_count[14] = 70210; Num_count[15] = 71816; Num_count[16] = 72785; Num_count[17] = 74121; Num_count[18] = 78660; Num_count[19] = 80410; Num_count[20] = 81181; Num_count[21] = 81229; Num_count[22] = 82155; Num_count[23] = 84079; Num_count[24] = 85602; Num_count[25] = 89021; Num_count[26] = 90616; Num_count[27] = 91701; Num_count[28] = 93791; Num_count[29] = 94079; Num_count[30] = 95620; for (int i = 0; i < dt_fill.Rows.Count; i++) { //读取每个省的填充坐标数据 for (int j = 0; j < 31; j++) { if (j == 0) { if (i < Num_count[j]) { X_fill[i] = Convert.ToInt32(dt_fill.Rows[i][0]); // 经度 Y_fill[i] = Convert.ToInt32(dt_fill.Rows[i][1]); //纬度 } } else { if (i < Num_count[j] && i >= Num_count[j - 1]) { X_fill[i] = Convert.ToInt32(dt_fill.Rows[i][0]); // 经度 Y_fill[i] = Convert.ToInt32(dt_fill.Rows[i][1]); //纬度 //ID_coordinates[i] = Convert.ToDouble(dt.Rows[i][0]); } } } } //double[] data1 = new double[] {0.589967025780379,2.76640767785393,2.94486656044847,5.18774795087285,9.55568524078571,7.21217446706751,4.81608668665851,5.67326916712699,9.54321203609774,6.27015178543689,0.354135803190215,8.14711495872654,2.47480472823066,3.05263290782758,2.21504588700546,6.70140475318904,6.05666406518314,2.40509705776911,2.60405493113485,1.6725398082315,5.49355137602265,2.82091154095248,9.6588283411846,5.38501889047855,2.50490878854465,0.604765223162727,1.58887244642718,1.17203933984219,2.20719788025169,2.15731627156846,9.43471799430495}; //按照黑龙江 。。。。 的顺序排好的数 double[] data = new double[31]; data1.CopyTo(data, 0); double[] datarank = MathV.Sort(31, data1);//从小到大排序 this.chart1.Series.Clear(); int count_class = 4; double[] quan_value = new double[count_class + 1]; quan_value[0] = datarank[0]; quan_value[1] = datarank[7]; quan_value[2] = datarank[15]; quan_value[3] = datarank[23]; quan_value[4] = datarank[30]; for (int i = 0; i < count_class; i++) { Series series = new Series(); series.ChartType = SeriesChartType.FastPoint; this.chart1.Series.Add(series); } for (int i = 0; i < 4; i++) { Series series = new Series(); series.Name = "(" + MathV.round(quan_value[i].ToString(), 2, 0) + "," + MathV.round(quan_value[i + 1].ToString(), 2, 0) + ")"; series.ChartType = SeriesChartType.Column; this.chart1.Series.Add(series); } //台湾不能忘 Series series_taiwan = new Series(); series_taiwan.ChartType = SeriesChartType.FastPoint; //边界 this.chart1.Series.Add(series_taiwan); series_taiwan.MarkerStyle = MarkerStyle.Circle; series_taiwan.MarkerSize = 2; series_taiwan.IsVisibleInLegend = false; series_taiwan.Color = Color.FromArgb(6, 52, 156); if (comboBox_theme.Text == "蓝色") { this.chart1.Series[0].Color = Color.FromArgb(151, 182, 251); this.chart1.Series[1].Color = Color.FromArgb(78, 131, 248); this.chart1.Series[2].Color = Color.FromArgb(9, 71, 219); this.chart1.Series[3].Color = Color.FromArgb(6, 52, 156); this.chart1.Series[4].Color = Color.FromArgb(151, 182, 251); this.chart1.Series[5].Color = Color.FromArgb(78, 131, 248); this.chart1.Series[6].Color = Color.FromArgb(9, 71, 219); this.chart1.Series[7].Color = Color.FromArgb(6, 52, 156); series_taiwan.Color = Color.FromArgb(6, 52, 156); } else if (comboBox_theme.Text == "青色") { this.chart1.Series[0].Color = Color.FromArgb(128, 234, 248); this.chart1.Series[1].Color = Color.FromArgb(34, 217, 242); this.chart1.Series[2].Color = Color.FromArgb(12, 190, 214); this.chart1.Series[3].Color = Color.FromArgb(8, 119, 134); this.chart1.Series[4].Color = Color.FromArgb(128, 234, 248); this.chart1.Series[5].Color = Color.FromArgb(34, 217, 242); this.chart1.Series[6].Color = Color.FromArgb(12, 190, 214); this.chart1.Series[7].Color = Color.FromArgb(8, 119, 134); series_taiwan.Color = Color.FromArgb(8, 119, 134); } else if (comboBox_theme.Text == "绿色") { this.chart1.Series[0].Color = Color.FromArgb(122, 250, 146); this.chart1.Series[1].Color = Color.FromArgb(55, 247, 92); this.chart1.Series[2].Color = Color.FromArgb(9, 221, 49); this.chart1.Series[3].Color = Color.FromArgb(6, 144, 32); this.chart1.Series[4].Color = Color.FromArgb(122, 250, 146); this.chart1.Series[5].Color = Color.FromArgb(55, 247, 92); this.chart1.Series[6].Color = Color.FromArgb(9, 221, 49); this.chart1.Series[7].Color = Color.FromArgb(6, 144, 32); series_taiwan.Color = Color.FromArgb(6, 144, 32); } else if (comboBox_theme.Text == "红色") { this.chart1.Series[0].Color = Color.FromArgb(253, 149, 141); this.chart1.Series[1].Color = Color.FromArgb(251, 73, 59); this.chart1.Series[2].Color = Color.FromArgb(242, 21, 4); this.chart1.Series[3].Color = Color.FromArgb(196, 0, 0); this.chart1.Series[4].Color = Color.FromArgb(253, 149, 141); this.chart1.Series[5].Color = Color.FromArgb(251, 73, 59); this.chart1.Series[6].Color = Color.FromArgb(242, 21, 4); this.chart1.Series[7].Color = Color.FromArgb(196, 0, 0); series_taiwan.Color = Color.FromArgb(196, 0, 0); } for (int i = 0; i < 4; i++) { this.chart1.Series[i].MarkerStyle = MarkerStyle.Circle; this.chart1.Series[i].MarkerSize = 2; this.chart1.Series[i].IsVisibleInLegend = false; } Series series5 = new Series(); series5.ChartType = SeriesChartType.FastPoint; //边界 this.chart1.Series.Add(series5); series5.MarkerStyle = MarkerStyle.Square; series5.MarkerSize = 2; series5.IsVisibleInLegend = false; if (comboBox_boundary.Text == "无边界") { } else if (comboBox_boundary.Text == "白色") { series5.Color = Color.White; for (int i = 0; i < dt.Rows.Count - 168; i++) { series5.Points.AddXY(Convert.ToInt32(dt.Rows[i][1]), Convert.ToInt32(dt.Rows[i][2])); } } else { series5.Color = Color.Black; for (int i = 0; i < dt.Rows.Count - 168; i++) { series5.Points.AddXY(Convert.ToInt32(dt.Rows[i][1]), Convert.ToInt32(dt.Rows[i][2])); } } for (int i = 12504; i < 12672; i++) { series_taiwan.Points.AddXY(Convert.ToInt32(dt.Rows[i][1]), Convert.ToInt32(dt.Rows[i][2])); } for (int i = 0; i < 31; i++) { if (data[i] <= quan_value[1]) { if (i == 0) { for (int j = 0; j < Num_count[i]; j++) { //MessageBox.Show(X_fill[j].ToString()); this.chart1.Series[0].Points.AddXY(X_fill[j], Y_fill[j]); //添加对应数据点 } } else { for (int j = Num_count[i - 1]; j < Num_count[i]; j++) { this.chart1.Series[0].Points.AddXY(X_fill[j], Y_fill[j]); //添加对应数据点 } } } if (data[i] > quan_value[1] && data[i] <= quan_value[2]) { if (i == 0) { for (int j = 0; j < Num_count[i]; j++) { this.chart1.Series[1].Points.AddXY(X_fill[j], Y_fill[j]); //添加对应数据点 } } else { for (int j = Num_count[i - 1]; j < Num_count[i]; j++) { this.chart1.Series[1].Points.AddXY(X_fill[j], Y_fill[j]); //添加对应数据点 } } } if (data[i] > quan_value[2] && data[i] <= quan_value[3]) { if (i == 0) { for (int j = 0; j < Num_count[i]; j++) { this.chart1.Series[2].Points.AddXY(X_fill[j], Y_fill[j]); //添加对应数据点 } } else { for (int j = Num_count[i - 1]; j < Num_count[i]; j++) { this.chart1.Series[2].Points.AddXY(X_fill[j], Y_fill[j]); //添加对应数据点 } } } if (data[i] > quan_value[3]) { if (i == 0) { for (int j = 0; j < Num_count[i]; j++) { this.chart1.Series[3].Points.AddXY(X_fill[j], Y_fill[j]); //添加对应数据点 } } else { for (int j = Num_count[i - 1]; j < Num_count[i]; j++) { this.chart1.Series[3].Points.AddXY(X_fill[j], Y_fill[j]); //添加对应数据点 } } } } } } }