Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python、Postgres和具有空值的整数?_Python_Postgresql_Sqlalchemy - Fatal编程技术网

Python、Postgres和具有空值的整数?

Python、Postgres和具有空值的整数?,python,postgresql,sqlalchemy,Python,Postgresql,Sqlalchemy,所以我有一些相当稀疏的数据列,其中大多数值为空,但有时有一些整数值。在Python中,如果有一个空格,那么该列将被解释为一个浮点,并且每个数字的末尾都有一个.0 我尝试了两件事: 将所有列更改为文本,然后从所有内容中删除.0 用0填充空格,并使每列成为整数 剥离.0是一种每天花费大约2mil+行的时间,然后数据是文本格式的,这意味着我不能做快速求和之类的事情 填充空格似乎有些浪费,因为有些列实际上只有数百万个实际值。我的表在一个月内已经超过了80gigs 200列,但是在大约30列之后的许多列都

所以我有一些相当稀疏的数据列,其中大多数值为空,但有时有一些整数值。在Python中,如果有一个空格,那么该列将被解释为一个浮点,并且每个数字的末尾都有一个.0

我尝试了两件事:

将所有列更改为文本,然后从所有内容中删除.0 用0填充空格,并使每列成为整数 剥离.0是一种每天花费大约2mil+行的时间,然后数据是文本格式的,这意味着我不能做快速求和之类的事情

填充空格似乎有些浪费,因为有些列实际上只有数百万个实际值。我的表在一个月内已经超过了80gigs 200列,但是在大约30列之后的许多列都非常稀疏

什么样的postgres数据类型最适合这种情况?没有小数,因为列包含秒数,并且必须由应用程序预先四舍五入

编辑-以下是我目前正在做的事情,但这会增大尺寸,看起来很浪费:

def create_int(df, col):
    df[col].fillna(0, inplace=True)
    df[col] = df[col].astype(int)
如果我尝试在不填写0的情况下创建列astypeint,则会出现错误:

错误:无法将NA转换为整数

这是关于这个问题的链接


所以它使每个int都成为一个float。我应该把postgres中的数据类型改成数字还是什么?我不需要高精度,因为小数点后没有值

您可以利用使用POSTGRESQL 9.3或更高版本的事实,通过将数据转换为Python字典,然后使用JSON数据类型JSONB来实现穷人的稀疏行

以下Python代码片段以您所说的格式生成随机数据,将其转换为适当的json,并将其上载到带有JSONB列的PostgreSQL表中

import psycopg2
import json
import random

def row_factory(n=200, sparcity=0.1):
   return [random.randint(0, 2000) if random.random() < sparcity else None for i in range(n)]


def to_row(data):
    result = {}
    for i, element in enumerate(data):
        if element is not None: result[i] = element
    return result


def from_row(row, lenght=200):
    result = [None] * lenght
    for index, value in row.items():
        result[int(index)] = value
    return result


con = psycopg2.connect("postgresql://...")
cursor = con.cursor()
cursor.execute("CREATE TABLE numbers (values JSONB)")

def upload_data(rows=100):
    for i in range(rows):
        cursor.execute("INSERT INTO numbers VALUES(%s)", (json.dumps(to_row(row_factory(sparcity=0.5))),) )

upload_data()

# To retrieve the sum of all columns:

cursor.execute("""SELECT {} from numbers limit 10""".format(", ".join("sum(CAST(values->>'{}' as int))".format(i) for i in range(200))))
result = cursor.fetchall()

我花了一段时间才了解如何在Postgresql中对JSONB数据执行数字操作,如果您要从Python中使用它们,您可以使用上面的snippet from_row函数。但最后两行有一个Select操作,它对所有列执行求和操作—Select语句本身是使用Python字符串格式方法组装的—将Json值用作数字的关键是使用->>运算符选择它,然后将其转换为数字。sumCASTvalues->“0”作为int部分

这些为null表示不存在任何数据。例如,列可能是事件处于特定状态的秒数。由于状态从未出现,因此此列没有数据。如果我使用fillna方法,则会发生0秒。您从何处获取数据列?由于我在使用Pandas修改数据后使用Python加载数据,因此如果存在空值,我无法分配列astype int。Python创建一个浮点。如果列是整数类型,我无法将它们加载到数据库中,因为它会说1440.0之类的内容与预期的数据类型或类似的内容不匹配。您能创建一点吗?如果只使用浮点和int包装它,会发生什么情况?即使有大量数据,也应该能很快地将文本从浮点转换为int。