【问题标题】:Finding the max of numbers in multiple DataFrames Python在多个 DataFrames Python 中查找最大数字
【发布时间】:2020-02-18 08:08:42
【问题描述】:

我有 1000 多个包含股票日期和价格的 .txt 文件,我已将它们转换为字典(文件名(股票行情)作为键,每个文件的数据作为数据框)。我用 .rolling 计算了移动平均线,然后找到了移动平均线和价格之间的百分比差异。因此,百分比差异是每个 DataFrame 自己的列。所有这些的代码如下所示:

filelist = os.listdir(r'Insert File Path')
filepath = r'Insert File Path'


dic1 = {}

for file in filelist:
    df = pd.read_csv(filepath + file,sep='\t')
dic1[file]= df

for value in dic1.values():
    value.rename(columns={value.columns[0]:'Dates',value.columns[1]:'Prices'},inplace=True)

for value in dic1.values():
    value['ma'] = value['Prices'].rolling(window=50).mean()

for value in dic1.values():
    value['diff'] = value['Prices'] - value['ma']

for value in dic1.values():
     value['pctdiff']= value['diff']/value['Prices']

我的问题是如何找到 pctdiff 列的前 5 个最大(和最小,因为它们可能是负数)?

我试过了:

for df in dic1.values():
    for num in df['pctdiff'].max():
        print(num.max())

但我收到以下错误:“'float' 对象不可迭代”

【问题讨论】:

标签: python python-3.x pandas numpy finance


【解决方案1】:

这是你的意思吗?

list_result = []
for key,value in dic1.items():
    value.rename(columns={value.columns[0]:'Dates',value.columns[1]:'Prices'},inplace=True)
    value['ma'] = value['Prices'].rolling(window=50).mean()
    value['diff'] = value['Prices'] - value['ma']
    value['pctdiff']= value['diff']/value['Prices']
    list_result.append([key,value['pctdiff'].max()])

list_result.sort(key = lambda x : x[1] )
highest_list = list_result[-5:]
smallest_list = list_result[:5]

【讨论】:

  • 这似乎可行,但我怎样才能找出字典中的值在哪里(或它们对应的股票)?谢谢
  • @dergky 我根据您的要求编辑帖子。但是,请注意,如果值相同(第 5 个 = 第 6 个),您将错过第 6 个值。为了改进,你需要创建一个函数来检查它。
  • 非常感谢!超级有帮助!请注意,在第 7 行,我将 df['pctdiff'] 更改为 value['pctdiff'] ,这似乎有效。它不适用于 df。
  • @dergky 是的,你是对的。对不起,我错了。我总是用 df 调用我的变量
【解决方案2】:

只是为了让代码更简洁,并运行所有变量,并在一个 for 循环中添加四个

filelist = os.listdir(r'Insert File Path')
filepath = r'Insert File Path'

dic1 = {}

for file in filelist:
    df = pd.read_csv(filepath + file,sep='\t')
dic1[file]= df

for value in dic1.values():
    value.rename(columns={value.columns[0]:'Dates',value.columns[1]:'Prices'},inplace=True)
    value['ma'] = value['Prices'].rolling(window=50).mean()
    value['diff'] = value['Prices'] - value['ma']
    value['pctdiff']= value['diff']/value['Prices']

然后使用@Edchum here 的答案按绝对值对pctdiff 进行排序(如果对象是其他对象,则将其转换为熊猫系列)。类似的东西(如果你想存储它排序)

...

for value in dic1.values():
    ...
    pctdiff = value['diff']/value['Prices']
    pctdiff = pctdiff.reindex(pctdiff.abs().sort_values().index)
    value['pctdiff']= pctdiff

【讨论】:

  • 感谢您帮助清理代码,但该解决方案似乎不起作用,它似乎只适用于字典中的一个值,而不是所有值(所有股票)。
猜你喜欢
  • 2017-04-12
  • 2021-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多