我在python中喋喋不休...
我有一个函数,当我输入日期时,它会返回一个包含30个价格(每行一个)和索引30个名称的列。
[in] getPrice('14/07/2015')
[out]
apple 10
pear 20
orange 12
banana 23
etc...
水果的数量是相同的。 我想要做的是,循环这个功能,以获得一个大的文件与我在列表中的所有日子的这些水果的价格。 使用ZIP功能我真的不明白它是如何工作的,并且使用追加功能它不会“拉链”#39;价格,意味着它每次重新创建索引等。 任何的想法? 我有一个列表,其中包含我所有的日期,索引一直都是一样的,没有其他水果可用或消失。
它可能看起来像什么
Def Alltogether():
Alltogether = []
x = HistoricalDates
For _ in Historicaldates :
k = getPrice....
然后我阻止......
我最终想要像
这样的东西print Alltogether
[out]
apple 10 40 60 20 ...
pear 20 20 20 20 ...
orange 12 13 14 29 ...
banana 23 14 41 54 ...
etc...
我正在使用熊猫数据帧。
非常感谢!
答案 0 :(得分:0)
这可能会通过更改您获取数据的格式来简化,但这里有一个示例可以帮助您顺利完成。我完全不采用拉链方法,而是采用更多的Pandas方式。为了测试,我创建了一个虚函数来返回一组固定产品的随机价格:
import pandas as pd
def getPrice(date):
return pd.Series(np.random.randn(5), index=['apple', 'pear', 'orange', 'nanner', 'etc...'])
然后我们可以创建一个带有一些日期的pandas数据框:
df = pd.DataFrame( pd.date_range('1/1/2017', periods=3, freq='D') )
df.columns=['MyDate'] # name the date column
这给了我们一个简单的df,包含3个日期:
MyDate
0 2017-01-01
1 2017-01-02
2 2017-01-03
虽然迭代行比某些应用函数稍微不那么惯用,但我认为它非常易读且易于理解,只需迭代日期,获取价格,然后将它们推送到新数据框并命名列与日期相同。鉴于你的问题,我怀疑这是你想要的输出。
outputDF = pd.DataFrame() ## dump results into this df
for index, row in df.iterrows(): #iterate through every row of the date df
outputDF[row.MyDate] = getPrice(row.MyDate) #shove values into output
这给了我们一个漂亮的df:
2017-01-01 2017-01-02 2017-01-03
apple 0.150646 0.209668 0.398204
pear 0.131142 0.046473 -0.261545
orange 0.822508 0.456384 -0.774957
nanner -0.996102 -0.260049 -0.558503
etc... 0.622459 -0.173556 -0.681957
根据您对处理日期无效的情况的评论,有几种方法可以解决这个问题。如果getPrice()
函数在向其传递错误日期时会引发错误,则可以使用try/except
:
try:
getPrice(date)
except:
# do something else... return nulls maybe?
如果错误的日期不会抛出错误,而是返回空值或空列表,那么只需在调用getPrice()
之后但在将其放入数据帧之前检查该条件。
答案 1 :(得分:0)
这是你有什么问题吗?只需使用' *'将列表列表传递给zip()。这是一个例子:
L1=['L1-i1','L1-i2', 'L1-i3', 'L1-i4']
L2=['L2-i1','L2-i2', 'L2-i3', 'L2-i4']
L3=['L3-i1','L3-i2', 'L3-i3', 'L3-i4']
Lalltogether = [L1, L2, L3]
# in Python 3 you should use list() for zip():
print( list(zip( *Lalltogether )) )
print( list(zip( L1, L2, L3 )) )
给出:
[('L1-i1', 'L2-i1', 'L3-i1'), ('L1-i2', 'L2-i2', 'L3-i2'), ('L1-i3', 'L2-i3', 'L3-i3'), ('L1-i4', 'L2-i4', 'L3-i4')]
有关' *'的更多信息看到 Python - use list as function parameters