【问题标题】:Python: Applying function to list of temsPython:将函数应用于项目列表
【发布时间】:2016-10-18 08:03:11
【问题描述】:

我有以下代码 sn-p 可以帮助我获取 Google 趋势数据(请参阅 https://github.com/GeneralMills/pytrends):

trend_payload = {'q': 'Dogs, Cats, Catfood, Dogfood','date': '01/2015 12m'}
trend = pytrend.trend(trend_payload)
df = pytrend.trend(trend_payload, return_type='dataframe')
df

由于此查询的缺点是 Google 趋势会根据查询的数据对所有数据进行规范化,因此我更喜欢将每个调用单独调用并将 df 链接在一起。我想过这样的功能:

queries = ['Cats', 'Dogs', 'Catfood','Dogfood']

function(queries)
    trend_payload = {'q': queries, 'date': '01/2015 12m'}
    trend = pytrend.trend(trend_payload)
    df = pytrend.trend(trend_payload, return_type='dataframe')

# then put every df of each query next to each other

我该怎么做?

【问题讨论】:

  • 我不确定我是否理解这个问题:你想使用 [function([query,]) for query in queries] 吗? (函数返回df)。
  • 是的,我想要一个应用于“查询”列表中每个项目的函数。结果应放入包含列表中每个项目的结果的数据框中。
  • 数据框是熊猫的数据框吗?在这种情况下,您可以利用 concat 函数来连接 df。

标签: python function pandas dataframe


【解决方案1】:

我会简单地将 DF 连接为 jimifiki has already proposed

df = pd.concat([pytrend.trend({'q': x, 'date': '01/2015 12m'},
                              return_type='dataframe')
                for x in queries], axis=1)

或在函数中:

def get_trends(queries, dt):
    return pd.concat([pytrend.trend({'q': x, 'date': dt},
                                    return_type='dataframe')
                      for x in queries], axis=1)

df = get_trends(queries, '01/2015 12m')

演示:

In [24]: df = get_trends(queries, '01/2015 12m')

In [25]: df
Out[25]:
            cats   dogs  catfood  dogfood
Date
2015-01-04  74.0   85.0     65.0     47.0
2015-01-11  74.0   84.0     60.0     52.0
2015-01-18  72.0   82.0     49.0     57.0
2015-01-25  69.0   78.0     45.0     37.0
2015-02-01  73.0   77.0     51.0     52.0
...          ...    ...      ...      ...
2015-11-29  83.0   80.0     47.0     49.0
2015-12-06  80.0   79.0     70.0     50.0
2015-12-13  83.0   84.0     67.0     49.0
2015-12-20  89.0   91.0     61.0     58.0
2015-12-27  90.0  100.0     58.0     45.0

[52 rows x 4 columns]

【讨论】:

  • 最后一个问题:
  • 我需要将查询锚定到另一个术语。即每个查询都有一个静态变量和另一个来自列表的变量。所以查询总是 pytrend.trend({'q': 'animals, x', 'date': '01/2015 12m'}, return_type='dataframe') for x in queries], axis=1)。我们也可以这样做吗?
  • @RPacker,所以animals - 是一个常数?
  • 是的。为了避免问题太长,我在这里打开它:stackoverflow.com/questions/40108906/…
  • @RPacker,我已经回答你了
【解决方案2】:

你可以这样做:

queries = ['Cats', 'Dogs', 'Catfood','Dogfood']

def function(queries):
    trend_payload = {'q': queries, 'date': '01/2015 12m'}
    trend = pytrend.trend(trend_payload)
    df = pytrend.trend(trend_payload, return_type='dataframe')
    return df 

list_of_df = [function([query,]) for query in queries] 

那么你必须concat列表中的数据框。

你可以更优雅地调用:

list_of_df = map(function, queries)

在这种情况下,您应该重写 function 以便它接受单个项目。 如果不想修改function,可以这样写:

list_of_df = map(lambda x: function([x,]), queries) 

【讨论】:

  • 应用最后一步时,它说:“list_of_df = map(lambda x: function([x,], queries) ^ SyntaxError: unexpected EOF while parsing”
  • 好的,缺少一个括号。但是现在:“list_of_df = map(lambda x: function([x,], queries)) --> TypeError: map() 必须至少有两个参数。”
  • map 将函数(第一个参数)应用于(第二个参数)的每个元素,并将它们放在一个列表中。由于您的函数将列表作为参数,因此您需要调整作为第一个参数传递的函数:lambda x: (function[x,]) 是一个接受 x 的函数,将其放入单个元素列表并将其传递给函数。
  • 很抱歉,当我调用 list_of_df 时,列表为空? "" 好消息是不再有例外。
  • 函数是否返回df?它应该。
猜你喜欢
  • 1970-01-01
  • 2019-08-28
  • 1970-01-01
  • 2017-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多