Karl_AlbrightC# pythonnet(1)_传感器数据清洗算法

简介: /// 读取CSV数据 /// </summary> /// <param name="filePath">文件路径</param> /// <returns>文件中数据集合,都是double类型</returns> static List<double[]> ReadCsvWithCsvHelper(string filePath) { using (var reader = new StreamReader(filePath)) using (var csv = new CsvReader(reader, Cultur

Python代码如下

import pandas as pd


# 读取数据

data = pd.read_csv('data_row.csv')


# 检查异常值

def detect_outliers(data):

   outliers = []

   for col in data.columns:

       q1 = data[col].quantile(0.25)

       q3 = data[col].quantile(0.75)

       iqr = q3 - q1

       lower_bound = q1 - 1.5 * iqr

       upper_bound = q3 + 1.5 * iqr

       outliers.extend(data[(data[col] < lower_bound) | (data[col] > upper_bound)].index)

   return list(set(outliers))


outliers = detect_outliers(data)

print("异常数据数量:", len(outliers))

# 处理异常值

data.drop(outliers, inplace=True)


# 保存清洗后的数据

data.to_csv('clean_data_row.csv', index=False)

下面我们修改成C#代码

创建控制台程序,Nuget安装 CsvHelper 和 pythonnet

public class Program

{

   const string PathToPythonDir = "D:\\Python311";

   const string DllOfPython = "python311.dll";


   static void Main(string[] args)

   {

       // 数据清洗

       CleanData();

   }

   /// <summary>

   /// 数据清洗

   /// </summary>

   static void CleanData()

   {

       var originDatas = ReadCsvWithCsvHelper("data_row.csv");


       var outliers = DetectOutliers(originDatas);


       var outlierHashset = new HashSet<int>(outliers);


       // 清洗过后的数据

       var cleanDatas = originDatas.Where((r, index) => !outlierHashset.Contains(index)).ToList();


       try

       {

           Runtime.PythonDLL = Path.Combine(PathToPythonDir, DllOfPython);


           PythonEngine.Initialize();

           using (Py.GIL())

           {

               dynamic pd = Py.Import("pandas");

               dynamic np = Py.Import("numpy");

               dynamic plt = Py.Import("matplotlib.pyplot");

               dynamic fft = Py.Import("scipy.fftpack");


               dynamic oData = np.array(originDatas.ToArray());

               int oDataLength = oData.__len__();

               dynamic data = np.array(cleanDatas.ToArray());

               int dataLength = data.__len__();


               // 绘制原始数据图和清洗后数据图

               plt.figure(figsize: new dynamic[] { 12, 6 });


               // 原始数据图

               plt.subplot(1, 2, 1);

               plt.plot(np.arange(oDataLength), oData);

               plt.title("Original Datas");


               // 清洗后数据图

               plt.subplot(1, 2, 2);

               plt.plot(np.arange(dataLength), data);

               plt.title("Clean Datas");


               // 布局调整,防止重叠

               plt.tight_layout();

               // 显示图表

               plt.show();

           }

       }

       catch (Exception e)

       {

           Console.WriteLine("报错了:" + e.Message + "\r\n" + e.StackTrace);

       }

   }


   /// <summary>

   /// 检测异快讯常值

   /// </summary>

   /// <param name="datas">原始数据集合</param>

   /// <returns>返回异常值在集合中的索引</returns>

   static List<int> DetectOutliers(List<double[]> datas)

   {

       List<int> outliers = new List<int>();

       var first = datas.First();

       for (int i = 0; i < first.Length; i++)

       {

           var values = datas.AsEnumerable().Select((row, index) => Tuple.Create(row[i], index)).ToArray();


           double q1 = Enumerable.OrderBy(values, x => x.Item1).ElementAt((int)(values.Length * 0.25)).Item1;

           double q3 = Enumerable.OrderBy(values, x => x.Item1).ElementAt((int)(values.Length * 0.75)).Item1;

           double iqr = q3 - q1;

           double lowerBound = q1 - 1.5 * iqr;

           double upperBound = q3 + 1.5 * iqr;


           outliers.AddRange(values.AsEnumerable()

               .Where(row => row.Item1 < lowerBound || row.Item1 > upperBound)

               .Select(row => row.Item2));

       }

       return outliers.Distinct().ToList();

   }



   /// <summary>

   /// 读取CSV数据

   /// </summary>

   /// <param name="filePath">文件路径</param>

   /// <returns>文件中数据集合,都是double类型</returns>

   static List<double[]> ReadCsvWithCsvHelper(string filePath)

   {

       using (var reader = new StreamReader(filePath))

       using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))

       {

           var result = new List<double[]>();

           // 如果你的CSV文件有标题行,可以调用ReadHeader来读取它们

           csv.Read();

           csv.ReadHeader();

           while (csv.Read())

           {

               result.Add(new double[] {

                   csv.GetField<double>(0),

                   csv.GetField<double>(1),

                   csv.GetField<double>(2),

               });

           }

           return result;

       }

   }

}

以下是运行后结果,左边是原始数据折线图,右边是清洗后数据折线图

相关文章
|
4月前
|
传感器 算法
基于无线传感器网络的MCKP-MMF算法matlab仿真
MCKP-MMF算法是一种启发式流量估计方法,用于寻找无线传感器网络的局部最优解。它从最小配置开始,逐步优化部分解,调整访问点的状态。算法处理访问点的动态影响半径,根据带宽需求调整,以避免拥塞。在MATLAB 2022a中进行了仿真,显示了访问点半径请求变化和代价函数随时间的演变。算法分两阶段:慢启动阶段识别瓶颈并重设半径,随后进入周期性调整阶段,追求最大最小公平性。
基于无线传感器网络的MCKP-MMF算法matlab仿真
|
4月前
|
传感器 算法
基于无线传感器网络的LC-DANSE波束形成算法matlab仿真
摘要: 此MATLAB程序对比了LC-DANSE与LCMV波束形成算法在无线传感器网络中的性能,基于SNR和MSE指标。测试在MATLAB 2022a环境下进行。核心代码涉及权重更新迭代,用于调整传感器节点权重以增强目标信号。LC-DANSE是分布式自适应算法,关注多约束条件下的噪声抑制;LCMV则是经典集中式算法,侧重单个期望信号方向。两者在不同场景下各有优势。程序结果显示SNR和MSE随迭代变化趋势,并保存结果数据。
|
传感器 存储 算法
【无人机】无人机平台的非移动 GPS 干扰器进行位置估计的多种传感器融合算法的性能分析(Matlab代码实现)
【无人机】无人机平台的非移动 GPS 干扰器进行位置估计的多种传感器融合算法的性能分析(Matlab代码实现)
133 0
|
传感器 机器学习/深度学习 算法
【WSN】移动传感器网络动态覆盖的分布式防拥塞算法matlab复现
【WSN】移动传感器网络动态覆盖的分布式防拥塞算法matlab复现
|
传感器 算法
改进花朵授粉算法的无线传感器网络部署优化(Matlab代码实现)
改进花朵授粉算法的无线传感器网络部署优化(Matlab代码实现)
|
传感器 算法 智能硬件
m基于GA遗传优化算法的三维室内红外传感器部署策略matlab仿真
m基于GA遗传优化算法的三维室内红外传感器部署策略matlab仿真
264 0
|
传感器 算法
m基于MOEA算法的无线传感器网络最优部署matlab仿真
m基于MOEA算法的无线传感器网络最优部署matlab仿真
160 0
|
传感器 弹性计算 算法
m基于负价环N算法的无线传感器网络性能matlab仿真
m基于负价环N算法的无线传感器网络性能matlab仿真
161 0
|
传感器 算法
基于虚拟力算法的WSN无线传感器网络覆盖优化matlab仿真
基于虚拟力算法的WSN无线传感器网络覆盖优化matlab仿真
261 0
|
25天前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。