我在我的大学加入了一个数据科学学习社区,我们正在使用 linux 终端命令和 awk 命令来练习从存储在 csv 文件中的大数据集中收集一些信息。单个文件中大约 7140596 列乘 29 行。
一个示例问题是:“2005 年航班的平均到达延误(以分钟为单位)是多少?” 我们必须将每一行的延迟值相加,然后除以总数或行数。
我知道可以在 Jupyter 笔记本中的 Pandas 中完成类似的数据操作,并且想知道每种方法的优缺点是什么。
谢谢!
我在我的大学加入了一个数据科学学习社区,我们正在使用 linux 终端命令和 awk 命令来练习从存储在 csv 文件中的大数据集中收集一些信息。单个文件中大约 7140596 列乘 29 行。
一个示例问题是:“2005 年航班的平均到达延误(以分钟为单位)是多少?” 我们必须将每一行的延迟值相加,然后除以总数或行数。
我知道可以在 Jupyter 笔记本中的 Pandas 中完成类似的数据操作,并且想知道每种方法的优缺点是什么。
谢谢!
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。
我的建议:
然后,您可以使用 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)