GraphQL#

如果你想在实时的 Python 内核中尝试这个笔记本,请使用 mybinder:

https://mybinder.org/badge_logo.svg

vaex-graphql 是一个插件包,它通过 GraphQL 接口暴露一个 DataFrame。这使得可以轻松地使用标准查询语言将数据或聚合/统计或机器学习模型共享给前端或其他程序。

(使用 $ pip install vaex-graphql 安装,目前不支持 conda-forge)

[3]:
import vaex
df = vaex.datasets.titanic()
df
[3]:
# pclass survived name sex age sibsp parch ticket fare cabin embarked boat body home_dest
0 1 True 艾伦,伊丽莎白·沃尔顿小姐 女性29.0 0 0 24160 211.3375B5 S 2 nan 圣路易斯,密苏里州
1 1 True Allison, Master. Hudson Trevor 0.91671 2 113781 151.55 C22 C26S 11 nan 蒙特利尔, PQ / 切斯特维尔, ON
2 1 False 艾莉森,海伦·洛兰小姐 女性2.0 1 2 113781 151.55 C22 C26S 蒙特利尔,魁北克 / 切斯特维尔,安大略
3 1 False Allison, Mr. Hudson Joshua Creighton 30.0 1 2 113781 151.55 C22 C26S 135.0 蒙特利尔, PQ / 切斯特维尔, ON
4 1 False Allison, Mrs. Hudson J C (Bessie Waldo Daniels)女性25.0 1 2 113781 151.55 C22 C26S nan 蒙特利尔, PQ / 切斯特维尔, ON
... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
1,3043 False Zabour, Miss. Hileni 女性14.5 1 0 2665 14.4542 C 328.0
1,3053 False Zabour, Miss. Thamine 女性1 0 2665 14.4542 C
1,3063 False Zakarian, Mr. Mapriededer 26.5 0 0 2656 7.225 C 304.0
1,3073 False Zakarian, Mr. Ortin 27.0 0 0 2670 7.225 None C None nan None
1,3083 False Zimmerman, Mr. Leo 29.0 0 0 315082 7.875 S
[10]:
result = df.graphql.execute("""
    {
        df {
            min {
                age
                fare
            }
            mean {
                age
                fare
            }
            max {
                age
                fare
            }
            groupby {
                sex {
                   count
                   mean {
                       age
                   }
                }
            }
        }
    }
    """)
result.data
[10]:
OrderedDict([('df',
              OrderedDict([('min',
                            OrderedDict([('age', 0.1667), ('fare', 0.0)])),
                           ('mean',
                            OrderedDict([('age', 29.8811345124283),
                                         ('fare', 33.29547928134572)])),
                           ('max',
                            OrderedDict([('age', 80.0), ('fare', 512.3292)])),
                           ('groupby',
                            OrderedDict([('sex',
                                          OrderedDict([('count', [466, 843]),
                                                       ('mean',
                                                        OrderedDict([('age',
                                                                      [28.6870706185567,
                                                                       30.585232978723408])]))]))]))]))])

Pandas 支持#

导入vaex.graphql后,vaex还会安装一个pandas访问器,因此它也可以用于Pandas DataFrames。

[11]:
df_pandas = df.to_pandas_df()
[20]:
df_pandas.graphql.execute("""
    {
        df(where: {age: {_gt: 20}}) {
            row(offset: 3, limit: 2) {
                name
                survived
            }
        }
    }
    """
).data
[20]:
OrderedDict([('df',
              OrderedDict([('row',
                            [OrderedDict([('name', 'Anderson, Mr. Harry'),
                                          ('survived', True)]),
                             OrderedDict([('name',
                                           'Andrews, Miss. Kornelia Theodosia'),
                                          ('survived', True)])])]))])

服务器#

学习使用GraphQL语言/vaex接口的最简单方法是启动一个服务器,并使用GraphiQL图形界面、其自动完成功能和模式浏览器进行实践。

我们尽量保持与Hasura API的接近:https://docs.hasura.io/1.0/graphql/manual/api-reference/graphql-api/query.html

可以从命令行启动服务器:

$ python -m vaex.graphql myfile.hdf5

或者从Python中使用 df.graphql.serve

GraphiQL#

查看 mariobuikhuizen/ipygraphql 获取图形小部件,或访问 mybinder 尝试一个实时示例image

[ ]: