超越 Numpy 和 Pandas:释放鲜为人知的 Python 库的潜力

2023年08月22日 由 camellia 发表 283 0

Python 是世界上最常用的编程语言之一,为开发人员提供了广泛的库。


无论如何,当涉及到数据操作和科学计算时,我们通常会想到诸如 、 或 等。NumpyPandasSciPy


在本文中,我们将介绍你可能感兴趣的3个 Python 库。


1.Dask



Dask是一个灵活的并行计算库,支持大规模数据处理的分布式计算和并行性。


那么,我们为什么要使用Dask呢? 就像他们在网站上说的:

Python已经发展成为数据分析和通用编程领域的主导语言。 这种增长是由NumPy、pand熊猫和scikit-learn等计算库推动的。 然而,这些软件包的设计并不能扩展到单台计算机之外。 开发Dask的目的是在数据集超出内存时,将这些软件包和周围的生态系统原生地扩展到多核机器和分布式集群。

所以,正如他们所说,Dask的常见用途之一是:

Dask DataFrame用于通常需要panda的情况,通常是由于数据大小或计算速度导致panda失败时:

-处理大型数据集,即使这些数据集不适合内存
-通过使用多个内核加速长时间计算
-在大型数据集上进行分布式计算,使用标准的panda操作(如groupby、join和时间序列计算)

因此,当我们需要处理Pandas巨大的数据帧时,Dask是一个很好的选择。 这是因为Dask:

允许用户在笔记本电脑上操作100 GB以上的数据集,或在工作站上操作1 TB以上的数据集

这是一个相当令人印象深刻的结果。

引擎盖下发生的事情是:

Dask DataFrames协调沿索引排列的许多Panda DataFrames/Series。Dask DataFrame按行进行分区,根据索引值对行进行分组以提高效率。这些熊猫对象可能存在于磁盘或其他机器上。

所以,我们有这样的东西:

2.1

Dask 的一些功能

    首先,我们需要安装 Dask。我们可以通过以下方式或类似方式做到这一点:pipconda
    $ pip install dask[complete]
    or
    $ conda install dask

    功能一:打开CSV文件

    Dask的第一个功能是如何打开CSV。我们可以这样做:
    import dask.dataframe as dd

    # Load a large CSV file using Dask
    df_dask = dd.read_csv('my_very_large_dataset.csv')

    # Perform operations on the Dask DataFrame
    mean_value_dask = df_dask['column_name'].mean().compute()
    因此,正如我们在代码中看到的,我们使用 Dask 的方式与 Pandas 非常相似。特别是:

    1.我们使用的方法与 Pandas 完全相同 read_csv()


    2.我们截取一列,就像在Pandas 中一样。事实上,如果我们有一个名为 Pandas 的数据框,我们会这样拦截一列: .dfdf['column_name']


    3.我们将该方法应用于类似于 Pandas 的截获列,但这里我们还需要添加该方法。 mean()compute()


    此外,即使打开CSV文件的方法与Pandas相同,在引擎盖下,Dask毫不费力地处理超过单台机器内存容量的大型数据集。

    这意味着我们看不到任何实际的区别,除了在 Pandas 中无法打开大型数据框,但在 Dask 中可以。

    功能二:扩展机器学习工作流

    我们还可以使用 Dask 创建具有大量样本的分类数据集。然后,我们可以将其拆分为训练集和测试集,使用 ML 模型拟合训练集,并计算测试集的预测。

    我们可以这样做:

    import dask_ml.datasets as dask_datasets
    from dask_ml.linear_model import LogisticRegression
    from dask_ml.model_selection import train_test_split

    # Load a classification dataset using Dask
    X, y = dask_datasets.make_classification(n_samples=100000, chunks=1000)

    # Split the data into train and test sets
    X_train, X_test, y_train, y_test = train_test_split(X, y)

    # Train a logistic regression model in parallel
    model = LogisticRegression()
    model.fit(X_train, y_train)

    # Predict on the test set
    y_pred = model.predict(X_test).compute()

    这个例子强调了 Dask 即使在机器学习问题的情况下也能通过跨多个内核分配计算来处理大型数据集的能力。


    特别是,我们可以用该方法为分类案例创建一个“Dask 数据集”,我们可以指定样本和块的数量(甚至非常大!) dask_datasets.make_classification()


    与以前类似,预测是使用该方法获得的。compute()

    NOTE:

    in this case, you may need to intsall the module dask_ml.

    You can do it like so:

    $ pip install dask_ml


    功能三:高效的图像处理


    Dask 利用的并行处理功能也可以应用于图像。


    特别是,我们可以打开多个图像,调整它们的大小,并保存它们的大小。我们可以这样做:

    import dask.array as da
    import dask_image.imread
    from PIL import Image

    # Load a collection of images using Dask
    images = dask_image.imread.imread('image*.jpg')

    # Resize the images in parallel
    resized_images = da.stack([da.resize(image, (300, 300)) for image in images])

    # Compute the result
    result = resized_images.compute()

    # Save the resized images
    for i, image in enumerate(result):
    resized_image = Image.fromarray(image)
    resized_image.save(f'resized_image_{i}.jpg')

    所以,这是过程:


    1.我们使用该方法打开当前文件夹(或您可以指定的文件夹中)中的所有“.jpg”图像。dask_image.imread.imread("image*.jpg")


    2.我们使用方法中的列表理解将它们全部调整为 300x300 的大小。da.stack()


    3.我们用这种方法计算结果,就像我们以前所做的那样。compute()


    4.我们使用 for 循环保存所有调整大小的图像。


    2. SymPy

     

    如果你需要进行数学计算和计算,并且想坚持使用Python,你可以尝试Sympy。


    根据他们在网站上所写的内容,SymPy是:


    用于符号数学的 Python 库。它旨在成为一个功能齐全的计算机代数系统(CAS),同时保持代码尽可能简单,以便易于理解和扩展。SymPy完全是用Python编写的。


    但是为什么要使用SymPy呢?他们建议:


    SymPy是

    -自由:在BSD许可下,SymPy是自由的,无论是言论上还是消费上。

    -基于Python:SymPy完全用Python编写,并使用Python作为其语言。

    -轻量级:SymPy只依赖于mpmath,这是一个用于任意浮点运算的纯Python库,使其易于使用。

    -库:除了用作交互式工具外,SymPy还可以嵌入到其他应用程序中,并使用自定义函数进行扩展。


    所以,它基本上具备了Python爱好者所喜爱的所有特性!


    现在,让我们来看看它的一些功能。


    SymPy的一些功能

     

    首先,我们需要安装它:

    $ pip install sympy
    PAY ATTENTION:

    if you write $ pip install simpy you'll install another (completely

    different!) library.

    So, the second letter is a "y", not an "i".

    

    功能一:求解代数方程


    如果我们需要求解一个代数方程,我们可以像这样使用 SymPy:

    from sympy import symbols, Eq, solve

    # Define the symbols
    x, y = symbols('x y')

    # Define the equation
    equation = Eq(x**2 + y**2, 25)

    # Solve the equation
    solutions = solve(equation, (x, y))

    # Print solution
    print(solutions)


    >>>


    [(-sqrt(25 - y**2), y), (sqrt(25 - y**2), y)]

    所以,这就是过程:


    1.我们用方法定义方程的符号。symbols()


    2.我们用方法写代数方程。Eq


    3.我们用方法求解方程。solve()


    4.当我在大学时,我使用不同的工具来解决这些问题,我不得不说,正如我们所看到的,SymPy非常易读和用户友好。


    但是,确实:它是一个Python库,所以有什么不同呢?


    特点二:计算导数


    计算导数是我们在数学上可能需要的另一项任务,在分析数据时有很多原因。通常,我们可能出于任何原因需要计算,而SymPpy确实简化了此过程。事实上,我们可以这样做:

    from sympy import symbols, diff

    # Define the symbol
    x = symbols('x')

    # Define the function
    f = x**3 + 2*x**2 + 3*x + 4

    # Calculate the derivative
    derivative = diff(f, x)

    # Print derivative
    print(derivative)

    >>>

    3*x**2 + 4*x + 3

    因此,正如我们所看到的,该过程非常简单且可解释:


    1.我们定义我们派生的函数的符号。symbols()


    2.我们定义函数。


    3.我们通过指定函数和我们正在计算导数的符号来计算导数(这是一个绝对导数,但在具有和变量的函数的情况下,我们甚至可以执行偏导数)。diff()xy


    如果我们测试它,我们会看到结果在2或3秒内到达。所以,它也很快。


    特点三:计算积分


    当然,如果SymPy可以计算导数,它也可以计算积分。

    from sympy import symbols, integrate, sin

    # Define the symbol
    x = symbols('x')

    # Perform symbolic integration
    integral = integrate(sin(x), x)

    # Print integral
    print(integral)

    >>>

    -cos(x)

    所以,这里我们使用方法,指定要集成的函数和集成的变量。integrate()


    3. Xarray 


    Xarray 是一个 Python 库,它扩展了 NumPy 的特性和功能,使我们能够使用标记的数组和数据集。


    正如他们在网站上所说,事实上:


    Xarray 使在 Python 中使用标记的多维数组变得简单、高效和有趣!


    还有:


    Xarray 在原始的类似 NumPy 的多维数组之上引入了维度、坐标和属性形式的标签,从而提供更直观、更简洁、更不容易出错的开发人员体验。


    换句话说,它通过向数组维度添加标签或坐标来扩展 NumPy 数组的功能。这些标签提供元数据,并支持对多维数据进行更高级的分析和操作。


    例如,在 NumPy 中,使用基于整数的索引访问数组。


    相反,在 Xarray 中,每个维度都可以有一个与之关联的标签,从而更容易理解和根据有意义的名称操作数据。


    例如,我们可以在 Xarray 中使用 ,而不是使用 访问数据,其中 、 和 是维度标签。arr[0, 1, 2]arr.sel(x=0, y=1, z=2)xyz


    这使得代码更具可读性!


    那么,让我们看看Xarray的一些功能。


    Xarray 的一些功能


    像往常一样,首先要安装它:

    $ pip install xarray

    功能一:使用标记坐标

    假设我们要创建一些与温度相关的数据,并且希望使用纬度和经度等坐标来标记这些数据。我们可以这样做:
    import xarray as xr
    import numpy as np

    # Create temperature data
    temperature = np.random.rand(100, 100) * 20 + 10

    # Create coordinate arrays for latitude and longitude
    latitudes = np.linspace(-90, 90, 100)
    longitudes = np.linspace(-180, 180, 100)

    # Create an Xarray data array with labeled coordinates
    da = xr.DataArray(
    temperature,
    dims=['latitude', 'longitude'],
    coords={'latitude': latitudes, 'longitude': longitudes}
    )

    # Access data using labeled coordinates
    subset = da.sel(latitude=slice(-45, 45), longitude=slice(-90, 0))

    如果我们打印它们,我们会得到:

    # Print data
    print(subset)

    >>>

    array([[13.45064786, 29.15218061, 14.77363206, ..., 12.00262833,
    16.42712411, 15.61353963],
    [23.47498117, 20.25554247, 14.44056286, ..., 19.04096482,
    15.60398491, 24.69535367],
    [25.48971105, 20.64944534, 21.2263141 , ..., 25.80933737,
    16.72629302, 29.48307134],
    ...,
    [10.19615833, 17.106716 , 10.79594252, ..., 29.6897709 ,
    20.68549602, 29.4015482 ],
    [26.54253304, 14.21939699, 11.085207 , ..., 15.56702191,
    19.64285595, 18.03809074],
    [26.50676351, 15.21217526, 23.63645069, ..., 17.22512125,
    13.96942377, 13.93766583]])
    Coordinates:
    * latitude (latitude) float64 -44.55 -42.73 -40.91 ... 40.91 42.73 44.55
    * longitude (longitude) float64 -89.09 -85.45 -81.82 ... -9.091 -5.455 -1.818

    因此,让我们逐步查看该过程:


    1.我们已将温度值创建为 NumPy 数组。


    2.我们已将纬度和纵向值定义为 NumPy 数组。


    3.我们使用方法将所有数据存储在 Xarray 数组中。DataArray()


    4.我们选择了纬度和经度的子集,该方法为子集选择所需的值。sel()


    结果也很容易阅读,因此标签在很多情况下真的很有帮助。


    功能二:处理缺失数据


    假设我们正在收集与一年中的温度相关的数据。我们想知道数组中是否有一些空值。以下是我们这样做的方法:

    import xarray as xr
    import numpy as np
    import pandas as pd

    # Create temperature data with missing values
    temperature = np.random.rand(365, 50, 50) * 20 + 10
    temperature[0:10, :, :] = np.nan # Set the first 10 days as missing values

    # Create time, latitude, and longitude coordinate arrays
    times = pd.date_range('2023-01-01', periods=365, freq='D')
    latitudes = np.linspace(-90, 90, 50)
    longitudes = np.linspace(-180, 180, 50)

    # Create an Xarray data array with missing values
    da = xr.DataArray(
    temperature,
    dims=['time', 'latitude', 'longitude'],
    coords={'time': times, 'latitude': latitudes, 'longitude': longitudes}
    )

    # Count the number of missing values along the time dimension
    missing_count = da.isnull().sum(dim='time')

    # Print missing values
    print(missing_count)

    >>>


    array([[10, 10, 10, ..., 10, 10, 10],
    [10, 10, 10, ..., 10, 10, 10],
    [10, 10, 10, ..., 10, 10, 10],
    ...,
    [10, 10, 10, ..., 10, 10, 10],
    [10, 10, 10, ..., 10, 10, 10],
    [10, 10, 10, ..., 10, 10, 10]])
    Coordinates:
    * latitude (latitude) float64 -90.0 -86.33 -82.65 ... 82.65 86.33 90.0
    * longitude (longitude) float64 -180.0 -172.7 -165.3 ... 165.3 172.7 180.0

    因此,我们得到我们有 10 个空值。


    此外,如果我们仔细查看代码,我们可以看到我们可以将 Pandas 的方法应用于 Xarray,例如 ,在本例中,它计算缺失值的总数。isnull.sum()


    功能三:处理和分析多维数据


    当我们有可能标记我们的数组时,处理和分析多维数据的诱惑很大。那么,为什么不尝试一下呢?


    例如,假设我们仍在收集与某些纬度和经度的温度相关的数据。


    我们可能需要计算平均值、最大值和中位数温度。我们可以这样做:

    import xarray as xr
    import numpy as np
    import pandas as pd

    # Create synthetic temperature data
    temperature = np.random.rand(365, 50, 50) * 20 + 10

    # Create time, latitude, and longitude coordinate arrays
    times = pd.date_range('2023-01-01', periods=365, freq='D')
    latitudes = np.linspace(-90, 90, 50)
    longitudes = np.linspace(-180, 180, 50)

    # Create an Xarray dataset
    ds = xr.Dataset(
    {
    'temperature': (['time', 'latitude', 'longitude'], temperature),
    },
    coords={
    'time': times,
    'latitude': latitudes,
    'longitude': longitudes,
    }
    )

    # Perform statistical analysis on the temperature data
    mean_temperature = ds['temperature'].mean(dim='time')
    max_temperature = ds['temperature'].max(dim='time')
    min_temperature = ds['temperature'].min(dim='time')

    # Print values
    print(f"mean temperature:\n {mean_temperature}\n")
    print(f"max temperature:\n {max_temperature}\n")
    print(f"min temperature:\n {min_temperature}\n")


    >>>

    mean temperature:

    array([[19.99931701, 20.36395016, 20.04110699, ..., 19.98811842,
    20.08895803, 19.86064693],
    [19.84016491, 19.87077812, 20.27445405, ..., 19.8071972 ,
    19.62665953, 19.58231185],
    [19.63911165, 19.62051976, 19.61247548, ..., 19.85043831,
    20.13086891, 19.80267099],
    ...,
    [20.18590514, 20.05931149, 20.17133483, ..., 20.52858247,
    19.83882433, 20.66808513],
    [19.56455575, 19.90091128, 20.32566232, ..., 19.88689221,
    19.78811145, 19.91205212],
    [19.82268297, 20.14242279, 19.60842148, ..., 19.68290006,
    20.00327294, 19.68955107]])
    Coordinates:
    * latitude (latitude) float64 -90.0 -86.33 -82.65 ... 82.65 86.33 90.0
    * longitude (longitude) float64 -180.0 -172.7 -165.3 ... 165.3 172.7 180.0

    max temperature:

    array([[29.98465531, 29.97609171, 29.96821276, ..., 29.86639343,
    29.95069558, 29.98807808],
    [29.91802049, 29.92870312, 29.87625447, ..., 29.92519055,
    29.9964299 , 29.99792388],
    [29.96647016, 29.7934891 , 29.89731136, ..., 29.99174546,
    29.97267052, 29.96058079],
    ...,
    [29.91699117, 29.98920555, 29.83798369, ..., 29.90271746,
    29.93747041, 29.97244906],
    [29.99171911, 29.99051943, 29.92706773, ..., 29.90578739,
    29.99433847, 29.94506567],
    [29.99438621, 29.98798699, 29.97664488, ..., 29.98669576,
    29.91296382, 29.93100249]])
    Coordinates:
    * latitude (latitude) float64 -90.0 -86.33 -82.65 ... 82.65 86.33 90.0
    * longitude (longitude) float64 -180.0 -172.7 -165.3 ... 165.3 172.7 180.0

    min temperature:

    array([[10.0326431 , 10.07666029, 10.02795524, ..., 10.17215336,
    10.00264909, 10.05387097],
    [10.00355858, 10.00610942, 10.02567816, ..., 10.29100316,
    10.00861792, 10.16955806],
    [10.01636216, 10.02856619, 10.00389027, ..., 10.0929342 ,
    10.01504103, 10.06219179],
    ...,
    [10.00477003, 10.0303088 , 10.04494723, ..., 10.05720692,
    10.122994 , 10.04947012],
    [10.00422182, 10.0211205 , 10.00183528, ..., 10.03818058,
    10.02632697, 10.06722953],
    [10.10994581, 10.12445222, 10.03002468, ..., 10.06937041,
    10.04924046, 10.00645499]])
    Coordinates:
    * latitude (latitude) float64 -90.0 -86.33 -82.65 ... 82.65 86.33 90.0
    * longitude (longitude) float64 -180.0 -172.7 -165.3 ... 165.3 172.7 180.0

    我们也以清晰可读的方式获得了我们想要的东西。


    再一次,和以前一样,为了计算温度的最大、最小和平均值,我们使用了应用于数组的 Pandas 函数。


    结论

     

    在本文中,我们展示了三个用于科学计算和计算的库。


    虽然 SymPy 可以替代其他工具和软件,让我们可以使用 Python 代码来计算数学计算,但 Dask 和 Xarray 扩展了其他库的功能,帮助我们应对其他最著名的 Python 库在数据分析和操作方面可能存在困难的情况。



    文章来源:https://www.kdnuggets.com/2023/08/beyond-numpy-pandas-unlocking-potential-lesserknown-python-libraries.html
    欢迎关注ATYUN官方公众号
    商务合作及内容投稿请联系邮箱:bd@atyun.com
    评论 登录
    热门职位
    Maluuba
    20000~40000/月
    Cisco
    25000~30000/月 深圳市
    PilotAILabs
    30000~60000/年 深圳市
    写评论取消
    回复取消