如何将 Timer 与 returns 数据帧的函数一起使用?
How to use Timer with a function that returns a dataframe?
我想每 n 分钟查询一个 API 并将响应解析为数据帧。但是,我在尝试这样做时遇到 TypeError:
TypeError: 'DataFrame' object is not callable
我试过:
- 运行一个函数,returns一个get请求
- 运行 将上面的 returns 转换为 pandas dataframe
的函数
在#1 中,我得到“'dict' 对象不可调用”。
在#2 中,我得到“'DataFrame not callable'”错误(如上所示)。
如果我改为打印函数的结果,两者都可以正常工作 但是 我需要对结果进行计算,因此需要返回数据帧响应。
看来我遗漏了一些明显的东西。谁能解释一下?
参考:
from threading import Timer, Thread
def run_alert(time):
t = Timer(time, print_query_results(*args))
t.start()
编辑#1:
DataFrame 对象是来自 API 的响应,格式为 10x3 table:
import numpy as np
import pandas as pd
from pandas.io.json import json_normalize
medium source pageviews
0 DIRECT (not set) xxx
1 ORGANIC google xxx
2 ORGANIC yahoo xxx
4 ORGANIC bing xxx
* * * *
编辑#2:
def print_query_results(ids, metrics, dimensions, filters, sort):
#get results from request
results = run_query(ids, metrics, dimensions, filters, sort)
#convert json into dataframe
cols = json_normalize(results['columnHeaders'])['name']
rows = json_normalize(results, 'rows')
cols_names = []
for name in cols:
cols_names.append(name.split(":")[1])
df = pd.DataFrame(rows)
df.columns = [cols_names]
df.rename(columns = {'pageviews':'pageviews'+" "+strftime('%I:%M %p')}, inplace=True)
df = df.convert_objects(convert_numeric=True)
return df
就像我在评论中所说的那样(确实应该有适当的标签甚至 import
语句来准确显示 Timer/DataFrame 是什么),您的 threading.Timer 对象需要一些可调用的东西 -这样当时间过去时,它可以使用该计算块启动一个线程。
当你传递 Timer
print_query_results(*args)
时,函数 print_query_results
在传递给 Timer
之前由解释器求值,所以你得到一个 dict
或 DataFrame
或函数返回的任何内容 - 而不是函数。解决此问题的一种方法是
t = Timer(time, lambda: print_query_results(*args))
除了这种解决方法之外,我们看不到您的程序的足够多的内容来提出建议,但在这些类型不匹配的情况下,通常存在一个潜在的概念问题,值得进行一些重构。
我想每 n 分钟查询一个 API 并将响应解析为数据帧。但是,我在尝试这样做时遇到 TypeError:
TypeError: 'DataFrame' object is not callable
我试过:
- 运行一个函数,returns一个get请求
- 运行 将上面的 returns 转换为 pandas dataframe 的函数
在#1 中,我得到“'dict' 对象不可调用”。
在#2 中,我得到“'DataFrame not callable'”错误(如上所示)。
如果我改为打印函数的结果,两者都可以正常工作 但是 我需要对结果进行计算,因此需要返回数据帧响应。
看来我遗漏了一些明显的东西。谁能解释一下?
参考:
from threading import Timer, Thread
def run_alert(time):
t = Timer(time, print_query_results(*args))
t.start()
编辑#1:
DataFrame 对象是来自 API 的响应,格式为 10x3 table:
import numpy as np
import pandas as pd
from pandas.io.json import json_normalize
medium source pageviews
0 DIRECT (not set) xxx
1 ORGANIC google xxx
2 ORGANIC yahoo xxx
4 ORGANIC bing xxx
* * * *
编辑#2:
def print_query_results(ids, metrics, dimensions, filters, sort):
#get results from request
results = run_query(ids, metrics, dimensions, filters, sort)
#convert json into dataframe
cols = json_normalize(results['columnHeaders'])['name']
rows = json_normalize(results, 'rows')
cols_names = []
for name in cols:
cols_names.append(name.split(":")[1])
df = pd.DataFrame(rows)
df.columns = [cols_names]
df.rename(columns = {'pageviews':'pageviews'+" "+strftime('%I:%M %p')}, inplace=True)
df = df.convert_objects(convert_numeric=True)
return df
就像我在评论中所说的那样(确实应该有适当的标签甚至 import
语句来准确显示 Timer/DataFrame 是什么),您的 threading.Timer 对象需要一些可调用的东西 -这样当时间过去时,它可以使用该计算块启动一个线程。
当你传递 Timer
print_query_results(*args)
时,函数 print_query_results
在传递给 Timer
之前由解释器求值,所以你得到一个 dict
或 DataFrame
或函数返回的任何内容 - 而不是函数。解决此问题的一种方法是
t = Timer(time, lambda: print_query_results(*args))
除了这种解决方法之外,我们看不到您的程序的足够多的内容来提出建议,但在这些类型不匹配的情况下,通常存在一个潜在的概念问题,值得进行一些重构。