Нахождение максимального числа в нескольких фреймах данных Python - PullRequest
2 голосов
/ 17 февраля 2020

У меня есть более 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']

Мой вопрос: как мне найти 5 самых больших (и самых маленьких, потому что они могут быть отрицательными) столбцов pctdiff?

Я пробовал:

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

, но я получаю следующую ошибку: «объект с плавающей точкой не повторяется»

Ответы [ 2 ]

2 голосов
/ 17 февраля 2020

Это то, что вы имеете в виду?

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]
0 голосов
/ 17 февраля 2020

Просто, чтобы сделать код немного более чистым, и запустить все переменные, которые вы добавляете, в один для l oop вместо четырех

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 здесь , чтобы отсортировать pctdiff по абсолютному значению (преобразовать его в серию pandas, если объект является чем-то другим). Что-то вроде (если вы хотите сохранить его отсортированным)

...

for value in dic1.values():
    ...
    pctdiff = value['diff']/value['Prices']
    pctdiff = pctdiff.reindex(pctdiff.abs().sort_values().index)
    value['pctdiff']= pctdiff
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...