如何在Polars中连接从numpy ndarray和datetime.datetime创建的多个lazyframe

问题描述 投票:0回答:1

我希望将 pandas 代码的这段代码转换为 Polars 代码以学习 Polars 并看看我是否可以从速度性能中受益:

df_list = []
for datum in data:
    df = pd.DataFrame()
    temp_data = datum.data # list of tuples of numpy ndarray
    df["A"] = temp_data[1].ravel().astype(np.float32)
    df["B"] = temp_data[2].ravel().astype(np.float32)
    df["C"] = datum.analDate # datetime.datetime
    df["D"] = datum.validDate.replace(hour=int(datum.validityTime/100))
    for name in names:
        df[name] = temp_data[0].ravel().astype(np.float32)  
    df_list.append(df)          
df = pd.concat(df_list)
df['E'] = df['C'].dt.hour

我的想法是我有许多自定义二进制格式的文件。使用自定义阅读器阅读它们后,我可以访问其中一些字段,它们是 numpy ndarray 或 datetime.datetime。我希望迭代这些文件并将它们保存到一个列表中,最后将它们懒惰地连接在一起。

作为 Polars 新手,我想了解:

  1. 从该内存创建 Polars 日期框的最佳方法,如果可能的话,无需复制数据。
  2. 如何应对“广播”。例如,考虑列
    C
    D
    。我是否必须创建一个包含单个
    datetime.datetime
    实例的列表,并将其乘以其他列的长度?
  3. 如何处理重复的列名。例如,
    name
    可能与
    names
    重复。 Polars 如何应对?
pandas numpy concatenation python-polars lazyframe
1个回答
0
投票

您可以首先查看 https://docs.pola.rs/py-polars/html/reference/api/polars.from_numpy.htmlhttps://docs.pola.rs/py-polars/ html/reference/dataframe/api/polars.DataFrame.lazy.html.

对于您的示例,我可以给您一些可以尝试的片段。

import polars as pl
import numpy as np

df_list = []
for datum in data:
    temp_data = datum.data
    df = pl.DataFrame(
        {
            "A": pl.from_numpy(temp_data[1].ravel().astype(np.float32)),
            "B": pl.from_numpy(temp_data[2].ravel().astype(np.float32)),
            "C": pl.datetime(pl.from_numpy(temp_data[0].ravel().astype(np.int64))),
            "D": pl.datetime(pl.from_numpy(np.array([datum.validDate.replace(hour=int(datum.validityTime/100))], dtype=np.int64))),
        }
    )
    for name in names:
        df[name] = pl.from_numpy(temp_data[0].ravel().astype(np.float32))

    df_list.append(df)

您可能需要根据您拥有的确切数据进行一些调试,我只是根据您上面写的内容进行猜测。

如果您可以提供一些您正在读取并尝试连接的数据的示例,那就太好了。

然后您可以尝试使用

df = pl.lazy.concat(df_list)
连接日期。

您可以尝试使用小时方法来广播日期时间

df = df.with_column(pl.col("C").hour().alias("E"))

© www.soinside.com 2019 - 2024. All rights reserved.