精华内容
下载资源
问答
  • 数据预处理:PySpark 的实现线性插值填充缺失值 1. Python 实现线性插值填充缺失值 实现函数为: def linear_insert(x1, y1, x2, y2, insert_x): if type(insert_x) == int: insert_x = [insert_x] k = (y2 - y1)...

    数据预处理:PySpark 的实现线性插值填充缺失值

    1. Python 实现线性插值填充缺失值

    实现函数为:

    def linear_insert(x1, y1, x2, y2, insert_x):
        if type(insert_x) == int:
            insert_x = [insert_x]
        k = (y2 - y1) / (x2 - x1)
        return [k * (x - x1) + y1 for x in insert_x]
    
    
    def fill_na_by_linear(lst):
        first_flag = False
        first_na = 0
        length = len(lst)
        for i in range(length):
            item = lst[i]
            if not first_flag:
                if item is None:
                    first_na = i
                    if first_na == 0:
                        # 第一个缺失值填充为 0
                        lst[0] = 0.0
                        continue
                    first_flag = True
            else:
                if item is not None:
                    first_flag = False
                    lst[first_na:i] = linear_insert(first_na - 1, lst[first_na - 1], i, lst[i], range(first_na, i))
    
        if first_flag:
            lst[first_na:] = linear_insert(first_na - 2, lst[first_na - 2], first_na - 1, lst[first_na - 1], range(first_na, length))
    
        return lst
    

    创建具有缺失值的序列:

    data = list(range(20))
    data[0:3] = [None] * 3
    data[10:16] = [None] * 6
    data[-1] = None
    print(data)
    

    输出结果如下:

    [None, None, None, 3, 4, 5, 6, 7, 8, 9, None, None, None, None, None, None, 16, 17, 18, None]
    

    填充缺失值:

    data_fill_na = fill_na_by_linear(data)
    print(data_fill_na)
    

    输出结果:

    [0.0, 1.0, 2.0, 3, 4, 5, 6, 7, 8, 9, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16, 17, 18, 19.0]
    

    2. PySpark 的实现

    创建 DataFrame:

    import pyspark
    
    spark = pyspark.sql.SparkSession.builder.getOrCreate()
    data = list(map(float, range(20)))
    data1 = data.copy()
    data[0:3] = [None] * 3
    data[10:16] = [None] * 6
    data[-1] = None
    df = spark.createDataFrame([[1, i, j] for i, j in zip(data1, data)], schema=['col1', 'col2', 'col3'])
    df.show()
    

    输出结果

    +----+----+----+
    |col1|col2|col3|
    +----+----+----+
    |   1| 0.0|null|
    |   1| 1.0|null|
    |   1| 2.0|null|
    |   1| 3.0| 3.0|
    |   1| 4.0| 4.0|
    |   1| 5.0| 5.0|
    |   1| 6.0| 6.0|
    |   1| 7.0| 7.0|
    |   1| 8.0| 8.0|
    |   1| 9.0| 9.0|
    |   1|10.0|null|
    |   1|11.0|null|
    |   1|12.0|null|
    |   1|13.0|null|
    |   1|14.0|null|
    |   1|15.0|null|
    |   1|16.0|16.0|
    |   1|17.0|17.0|
    |   1|18.0|18.0|
    |   1|19.0|null|
    +----+----+----+
    

    将 DataFrame 转为 RDD 可以实现按行操作,需要有一列分区窗口,代码如下:

    def fill_na_by_columns(df: pyspark.sql.DataFrame, fill_col):
        schema = df.schema
        columns = df.columns
        fill_idx = columns.index(fill_col)
    
        def fill(x):
            out = []
            lst = []
            for v in x:
                r = [i for i in v]
                lst.append(r[fill_idx])
                out.append(r)
    
            lst = fill_na_by_linear(lst)
            for i in range(len(lst)):
                out[i][fill_idx] = lst[i]
            return out
    
        def get_key(item):
            return item.col2
    
        rdd = df.rdd.groupBy(lambda x: x.col1).mapValues(list)
        rdd = rdd.mapValues(lambda x: sorted(x, key=get_key))   # 对 col2 的排序可以取消
        rdd = rdd.mapValues(fill).flatMapValues(lambda x: x)
        rdd = rdd.map(lambda v: v[1])
        df_out = spark.createDataFrame(rdd, schema=schema)
        return df_out
    
    
    data = fill_na_by_columns(df, 'col3')
    data.show()
    

    最后得到填充缺失值后的结果:

    +----+----+----+
    |col1|col2|col3|
    +----+----+----+
    |   1| 0.0| 0.0|
    |   1| 1.0| 1.0|
    |   1| 2.0| 2.0|
    |   1| 3.0| 3.0|
    |   1| 4.0| 4.0|
    |   1| 5.0| 5.0|
    |   1| 6.0| 6.0|
    |   1| 7.0| 7.0|
    |   1| 8.0| 8.0|
    |   1| 9.0| 9.0|
    |   1|10.0|10.0|
    |   1|11.0|11.0|
    |   1|12.0|12.0|
    |   1|13.0|13.0|
    |   1|14.0|14.0|
    |   1|15.0|15.0|
    |   1|16.0|16.0|
    |   1|17.0|17.0|
    |   1|18.0|18.0|
    |   1|19.0|19.0|
    +----+----+----+
    
    展开全文
  • 插值填充 插值是数值分析中一种方法。简而言之,就是借助于一个函数(线性或非线性),再根据已知数据去求解未知数据的值。插值在数据领域非常常见,它的好处在于,可以尽量去还原数据本身的样子。 我们可以通过 ...

    插值填充

    插值是数值分析中一种方法。简而言之,就是借助于一个函数(线性或非线性),再根据已知数据去求解未知数据的值。插值在数据领域非常常见,它的好处在于,可以尽量去还原数据本身的样子。

    我们可以通过 interpolate() 方法完成线性插值。当然,其他一些插值算法可以阅读官方文档了解。

    # 生成一个 DataFrame
    df = pd.DataFrame({'A': [1.1, 2.2, np.nan, 4.5, 5.7, 6.9],
                       'B': [.21, np.nan, np.nan, 3.1, 11.7, 13.2]})
    df
    

    输出结果:
    在这里插入图片描述
    对于上面存在的缺失值,如果通过前后值,或者平均值来填充是不太能反映出趋势的。这时候,插值最好使。我们用默认的线性插值试一试。

    df_interpolate=df.interpolate()
    df_interpolate
    

    输出结果:
    在这里插入图片描述
    下图展示了插值后的数据,明显看出插值结果符合数据的变化趋势。如果按照前后数据顺序填充,则无法做到这一点。

    在这里插入图片描述对于 interpolate() 支持的插值算法,也就是 method=。下面给出几条选择的建议:

    1.如果你的数据增长速率越来越快,可以选择 method='quadratic'二次插值。
    2.如果数据集呈现出累计分布的样子,推荐选择 method='pchip'。
    3.如果需要填补缺省值,以平滑绘图为目标,推荐选择 method='akima'。
    

    当然,最后提到的 method=‘akima’,需要你的环境中安装了 Scipy 库。除此之外,method=‘barycentric’ 和 method=‘pchip’ 同样也需要 Scipy 才能使用。

    展开全文
  • 主要思想为区域统计值代替空值进行插值

    Arcgis插值填充处理影像中的少量nodata值

    对于版本 8.x and 9.x:

    1. 在ArcMap中,导航至 ArcToolbox > Spatial Analyst Tools > Map Algebra(地图代数),打开Raster Calculator(栅格计算器)。
    2. 在Raster Calculator(栅格计算器)中,输入下面的语句:
      CON(isnull([raster]), FOCALMEAN([raster], rectangle,5,5), [raster])

    arcgis 10.0及以上的版本:

    1. 在ArcMap中,导航至 ArcToolbox > Spatial Analyst Tools > 地图代数,打开栅格计算器。
    2. 在栅格计算器中,输入下面的语句:
      Con(IsNull(“raster”), FocalStatistics(“raster”, NbrRectangle(5,5, “CELL”), “MEAN”), “raster”)
      FOCALMEAN中的长方形的尺寸可以被编辑以适应数据的需求。编辑"5,5"的值的大小可以改变长方形的尺寸。可能需要改成更大或者更小,这取决于数据。
      原理是利用邻域均值代替空缺值。

    可用的不同类型的邻域:
    NbrAnnulus,NbrCircle,NbrRectangle,NbrWedge, NbrIrregular,和NbrWeight。默认邻域是正方形NbrRectangle,其宽度和高度为3个单元格。

    要计算的统计类型:
    MEAN(平均值)—计算附近单元格的平均值(平均值)。
    MAJORITY —计算附近的单元格的多数(最常出现的值)。
    MAXIMUM —计算附近的像元的最大值(最大值)。
    MEDIAN —计算附近单元格的中位数。
    MINIMUM —计算附近的像元的最小值(最小值)。
    MINORITY-计算邻域中的单元格的少数(最少出现的值)。
    RANGE(范围)—计算附近单元格的范围(最大值与最小值之间的差)。
    STD —计算附近单元格的标准差。
    SUM —计算附近单元格的总和(所有值的总和)。
    VARIETY(变异度)—计算附近单元格的变异度(唯一值的数量)。
    默认的统计类型是MEAN。

    如果输入栅格为浮点,则只有MEAN,MAXIMUM,MINIMUM,RANGE,STD和SUM统计类型可用。

    参考链接:
    http://zhihu.esrichina.com.cn/question/9414?tdsourcetag=s_pctim_aiomsg
    https://desktop.arcgis.com/en/arcmap/10.3/tools/spatial-analyst-toolbox/focal-statistics.htm#GUID-7117A041-D6FE-4CC0-83E3-8335CEC37E35

    展开全文
  • pandas dataframe缺失值(np.nan)处理:识别缺失情况、删除、0值填补、均值填补、中位数填补、加缺失标签、插值填充详解及实例 isnull()、natna()、isna()、fillna()、dropna()、interpolate() 现实世界中的...

    pandas dataframe缺失值(np.nan)处理:识别缺失情况、删除、0值填补、均值填补、中位数填补、加缺失标签、插值填充详解及实例

     

    isnull()、natna()、isna()、fillna()、dropna()、interpolate()

     

    现实世界中的数据往往非常杂乱,未经处理的原始数据中某些属性数据缺失是经常出现的情况。另外,在做特征工程时经常会有些样本的某些特征无法求出。下面是几种处理数据中缺失值的主要方法。注意:隐藏的缺失值,这里要理解数据集内容的含义,比如在某些情况下,0代表缺失值。因为有些值为0的变量是无意义的,可以表示为缺失值。例如:身高、体重等。

    大家可能都有一个疑惑,为什么对很多人说XGB或者LGB对缺失值不敏感呢,当用缺失值的训练XGB时,算法不会报错,其实这个不能叫不敏感,而是算法本身自己有一套缺失值处理算法,比如XGB,它会把含有缺失值的数据分别分到左右两个子节点,然后计算着两种情况的损失,最后,选取较好的划分结果和对应的损失。

    代码实施:

     

    import pandas as pd
    impo
    展开全文
  • 机器学习数据预处理之缺失值:插值填充+lagrange插值+拉格朗日插值 garbage in, garbage out. 没有高质量的数据,就没有高质量的数据挖掘结果,数据值缺失是数据分析中经常遇到的问题之一。当缺失比例很小时,...
  • 机器学习数据预处理之缺失值:插值填充+多项式插值 garbage in, garbage out. 没有高质量的数据,就没有高质量的数据挖掘结果,数据值缺失是数据分析中经常遇到的问题之一。当缺失比例很小时,可直接对缺失...
  • pyhton_使用插值填充缺失值

    千次阅读 2019-12-30 22:12:33
    pyhton_使用插值填充缺失值 # 라이브러리를 임포트합니다. import pandas as pd import numpy as np ​ # 날짜를 만듭니다. time_index = pd.date_range("01/01/2010", periods=5, freq="M") ​ # 设置索引 ...
  • 我们对多边形的顶点赋予不同颜色,插值填充用来为各种光照 条件下的着色表面生成真实感显示。 下面的程序段将蓝色,红色,绿色分别赋给一个三角形的三个顶点。多边形填充就是在三个顶点间的颜色插值。 首先,还是...
  • 针对新图形技术条件下的纹理合成问题,提出一种纹理插值方法,可将源纹理图像自适应拉伸为不同尺寸的纹理图像并保持其清晰度不改变。首先,采用高维图像插值算法将源纹理裂变为目标纹理分辨率,作为中间过渡纹理;...
  • 这是一部分关于插值处理试验数据的程序,用于对实验数据比较分散采用二次样条曲线插值,进而将其数据点密化填充便于后续数据处理。
  • 这个简单的函数通过在调用 GRIDDATA 之前减少相关数据量(仅间隙邻居)来优化线性插值。 这导致计算速度非常快,速度现在将取决于间隙的数量,而较少取决于有效数据的数量(网格的大小)。 例子: z = 峰值(1000)...
  • matlab的缺失值处理---插值&自动填充

    千次阅读 2021-06-05 02:39:53
    缺失值处理中遇到一列数据有间断、连续缺失值,且局部满足线性性,因此决定采用线性插值.又因为数据有303个缺失值,为了方便希望插值能自动填入空缺值. 解决方案: 以下为matlab代码 %函数功能:对数据进行拟合插值,并...
  • 本代码是一个 Matlab 函数,它通过频域中的零填充提供时域中给定信号的插值。 该算法类似于 Matlab 命令“interpft”的算法。 为了说明函数的用法,给出了一个例子。 为方便起见,输入和输出参数在函数的开头给出。 ...
  • sql中插值法完成缺失数据的填充

    千次阅读 2009-09-13 23:17:00
    在我做的大气污染报表系统中,由于原始数据缺失,...缺失的数据采取插值填充,这一点早就确定下来,但在如何实现上却困扰很久。 将原始问题简化一下。比如有这样一组数据。ID so co1 1 0.1 0.1 2 0 0.2 3 
  • 学习拉格朗日插值法时,曾经参考第一篇文章https://blog.csdn.net/playgoon2/article/details/77051285做了一段算法代码, import pandas as pd import matplotlib.pyplot as plt from scipy.interpolate import la...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 18,248
精华内容 7,299
关键字:

插值填充