我有一系列带有pandas数据帧的函数,清理数据然后将其发送到sqlite db。
以下函数正在创建错误:
def send_to_db(df, event_name):
print df.describe()
table_names = {
'Video Played': 'video_played',
'Item Information Click': 'item_info_click',
'Faved': 'faved',
'Add to Cart': 'add_to_cart',
'Tap to Replay': 'replay'
}
print table_names.get(event_name)
con = db.connect('/Users/metersky/code/mikmak/vid_score/test.db')
df.to_sql(table_names.get(event_name), con, flavor='sqlite', if_exists='append')
con.close()
我得到的错误是TypeError: 'NoneType' object is not iterable
这对我来说很奇怪,原因有两个:
1)print df.describe()
为我提供了正确的pandas输出,这意味着函数中该点的数据不是None
2)数据被发送到我验证的sqlite数据库。所以这意味着数据也不是None
。
为什么我收到此错误,我的数据何时变为None
?
回溯:
Traceback (most recent call last):
File "fetch_data.py", line 139, in <module>
df, event_name = send_to_db(df, event_name)
TypeError: 'NoneType' object is not iterable
这就是我调用函数的方式:
for event in event_types:
print event
df, event_name = get_data(start_date, end_date, event)
print "*********" + event_name + " data retrieved"
df, event_name = data_cleanse(df, event_name)
print "*********" + event_name + " data cleansed"
df, event_name = send_to_db(df, event_name)
print "*********" + event_name + " data sent to db"
答案 0 :(得分:6)
你不从你的函数中返回任何内容但是期待一个2项(df, event_name)
的元组:
当你打电话给你的职能时:
df, event_name = send_to_db(df, event_name)
你期望得到一个2项的元组。
但是,您的函数会隐式返回None
(,因为没有非空的return
语句)
您需要修改要添加的功能:
return df, event_name
更新:如果确实不需要您的功能返回值,那么请不要使用任何内容调用您的函数赋值语句的左侧。这意味着元组从函数的结果中解包。只需按照以下方式调用您的函数:
send_to_db(df, event_name)
请参阅:Python Packing and Unpacking和Tuples and Sequences,其中包含:
这足够恰当地称为序列解包并且适用于 右侧的任何序列。序列拆包需要 左边的变量列表具有相同数量的元素 序列的长度。请注意,实际上是多次分配 只是元组打包和序列解包的组合。