Pandas vs Linux Datascience

数据挖掘 数据挖掘 大数据 熊猫 linux
2021-09-25 16:53:08

我在我的大学加入了一个数据科学学习社区,我们正在使用 linux 终端命令和 awk 命令来练习从存储在 csv 文件中的大数据集中收集一些信息。单个文件中大约 7140596 列乘 29 行。

一个示例问题是:“2005 年航班的平均到达延误(以分钟为单位)是多少?” 我们必须将每一行的延迟值相加,然后除以总数或行数。

我知道可以在 Jupyter 笔记本中的 Pandas 中完成类似的数据操作,并且想知道每种方法的优缺点是什么。

谢谢!

2个回答

Pandas 数据框有更多高级函数集成到为您存储数据的基类中。

一些命令行工具对于有效地处理文本可能非常强大(尤其是 Perl),但我认为学习曲线非常陡峭,交互体验也不那么友好。一方面,简单地看一眼您的数据或创建一个有吸引力的图表并不容易。

虽然我承认我不是专业的 awk/sed 或 Perl 用户,但我很确定在这些工具/语言中执行此类假设计算(涉及数值数据和文本)会不太直观:

In [1]: import pandas as pd
In [2]: import numpy as np

# Create a DataFrame holding some data over a time range

In [3]: df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar',
                                  'foo', 'bar', 'foo', 'foo']*4,
                           'B' : ['one', 'one', 'two', 'three',
                                  'two', 'two', 'one', 'three']*4,
                           'C' : np.random.randn(32)},
                          index=pd.date_range('01.01.2018', periods=32))

In [4]: df.head()
Out[4]:
              A      B         C
2018-01-01  foo    one  0.965554
2018-01-02  bar    one  0.053814
2018-01-03  foo    two  1.075539
2018-01-04  bar  three -0.999941
2018-01-05  foo    two -1.940361

现在假设我们想要对行进行分组,因此我们在一个表中只有A包含列foo的行,而另一个表中只有包含的行foo

从这两个表中,我们只关心 column C我们想要计算 5 天时间范围内的移动平均线。移动平均线会NaN在开始时留下一些值,所以我们想放弃这些时间步长。

哦,我们想把它形象化!

In[5]: df.groupby('A')['C'].rolling(5).mean().dropna().plot(grid=True, legend=True)

从那一行代码中,我们得到:

不漂亮

上面还强调了 Python 环境中可用的其他强大和专业的包的丰富性——这里我numpy与 Pandas 一起使用。


对于操作文本文件,也许清理刮掉的文本和使用正则表达式解析大量文本,使用命令行选项之一可能会更快,但是一旦你想做任何数据科学,我真的建议使用一些专门的工具,例如 Pandas。

如果他们直接使用 bash 来浏览 CSV 文件,那么这将非常低效,并且随着数据库的增长会导致很长的查询时间。此外,当您想要进行非标准分析时,bash 很快就会变得非常复杂,因此您肯定希望使用 Python 而不是 bash。

我的建议:

  • 使用 Linux 作为您的操作系统
  • 设置数据库如 postgres http://postgresguide.com/setup/install.html
  • 构建一个抓取工具,将存储在 CSV 文件中的数据输入到 postgres 中的表中。
  • 根据您将要执行的查询为数据创建一些索引,以显着减少查询延迟。

然后,您可以使用 Python 使用以下命令查询 postgres 表。

import pandas as pd
import psycopg2

sql = "SELECT arrival_delay FROM table_name WHERE year = 2005"
conn = psycopg2.connect(**params)
df = pd.read_sql(sql, conn)