我希望将 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 新手,我想了解:
C
和 D
。我是否必须创建一个包含单个 datetime.datetime
实例的列表,并将其乘以其他列的长度?name
可能与 names
重复。 Polars 如何应对?您可以首先查看 https://docs.pola.rs/py-polars/html/reference/api/polars.from_numpy.html 和 https://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"))
。