#python #excel #pandas #loops #csv
#python #excel #pandas #циклы #csv
Вопрос:
У меня есть CSV-файл с временным рядом из двух экономических переменных (начало строительства жилья и безработица). У меня есть список вычислений и сводка (текст), которая записывается с результатами вычислений (в основном, суммирующая в формате абзаца тенденции данных). Я хотел бы получить отзыв о том, как я получаю цикл for для просмотра каждой переменной в csv-файле, чтобы у меня была сводка по каждой переменной в качестве конечного результата.
Я попытался применить базовую логику цикла for, но я просто не уверен, что у меня неверно. Я просмотрел ряд примеров в stackoverflow, но, похоже, ничего не подходит, я уверен, что мне не хватает чего-то простого, но я не так давно использую python, поэтому просто не уверен на данный момент.
raw_data = pd.read_csv('C:/Users/J042666/Desktop/2019.03 HOUST and GDP.csv')
df = pd.DataFrame(raw_data)
for i in df:
freq = "monthly "
units = " million "
pos = 1
colname = df.columns[pos]
alltime = df.mean()
low = df.min()
maximum = df.max()
today = df.iloc[720]
one_year = df.iloc[709:721].mean()
two_year = df.iloc[697:721].mean()
five_year = df.iloc[661:721].mean()
one_year_vol = df.iloc[709:721].std()
two_year_vol = df.iloc[697:721].std()
five_year_vol = df.iloc[661:721].std()
today_vs_1 = ((today/one_year) -1)*100
today_vs_2 = ((today/two_year) -1)*100
today_vs_5 = ((today/five_year) -1)*100
rolling_1 = df.rolling(window=3).mean()
rolling_2 = df.rolling(window=6).mean()
rolling_3 = df.rolling(window=9).mean()
today_vs_1_rolling = ((today/rolling_1.iloc[720]) -1)*100
today_vs_2_rolling = ((today/rolling_2.iloc[720]) -1)*100
today_vs_3_rolling = ((today/rolling_3.iloc[720]) -1)*100
summary = ("The " str(freq) str(colname) " currently stands at " str(today) str(units) " which compares to the 1,2 and 5 year averages of " str(one_year) str(units) "," str(two_year) str(units) "," " and " str(five_year) str(units) " respectively. " " Based on the current " str(colname) " levels, that reflects a change of" str(today_vs_1) ", " str(today_vs_2) " and " str(today_vs_5) " respectively." " Since the metric began being tracked, the minimum, maximum and long run average total " str(low) str(units) ", " str(maximum) str(units) " and " str(alltime) str(units) " respectively. " "The 1, 2 and 5 year standard deviation for " str(colname) " totals " str(one_year_vol) str(units) " ," str(two_year_vol) str(units) " and" str(five_year_vol) str(units) " respectively." " Based on the current " str(colname) " levels compared to the 3, 6 and 9 month rolling averages, the current level reflects a change of " str(today_vs_1_rolling) ", " str(today_vs_2_rolling) " and " str(today_vs_3_rolling) " respectively.")
print(summary)
Как я описал выше, я надеюсь получить код, который выдает краткое изложение финансовых показателей, которые я вычисляю в цикле for для каждой переменной.
Комментарии:
1. Вы перебираете столбцы или строки? Пожалуйста, предоставьте небольшой воспроизводимый образец ваших данных.
2. столбцы. github.com/seang700/Economic-Data это ссылка на файл csv, который я использую.
3. Конечно,
raw_data
это уже фрейм данных? Я думаю,df = pd.DataFrame(raw_data)
строка избыточна4. спасибо erncyp, я посмотрю на упрощение.
Ответ №1:
Проблема в том, что вы выбираете весь фрейм данных, а не каждый столбец в отдельности; следовательно, анализ, который вы делали, был выполнен для обоих столбцов. Я также просто извлек значения, требуемые из ваших операций, вместо того, чтобы сохранять весь текст, распечатанный из Pandas.
Это должно сработать:
df = pd.read_csv('2019.03 HOUST and GDP.csv')
df = df.loc[:, ['Housing Starts', 'Unemployment Rate']]
for idx, col in enumerate(df.columns):
freq = "monthly "
units = " million "
colname = col
selectedCol = df.loc[:, [col]]
alltime = selectedCol.mean()[0]
low = selectedCol.min()[0]
maximum = selectedCol.max()[0]
today = selectedCol.iloc[720][0]
one_year = selectedCol.iloc[709:721].mean()[0]
two_year = selectedCol.iloc[697:721].mean()[0]
five_year = selectedCol.iloc[661:721].mean()[0]
one_year_vol = selectedCol.iloc[709:721].std()[0]
two_year_vol = selectedCol.iloc[697:721].std()[0]
five_year_vol = selectedCol.iloc[661:721].std()[0]
today_vs_1 = ((today/one_year) -1)*100
today_vs_2 = ((today/two_year) -1)*100
today_vs_5 = ((today/five_year) -1)*100
rolling_1 = selectedCol.rolling(window=3).mean()
rolling_2 = selectedCol.rolling(window=6).mean()
rolling_3 = selectedCol.rolling(window=9).mean()
today_vs_1_rolling = ((today/rolling_1.iloc[720]) -1)*100
today_vs_2_rolling = ((today/rolling_2.iloc[720]) -1)*100
today_vs_3_rolling = ((today/rolling_3.iloc[720]) -1)*100
summary = ("The " str(freq) str(colname) " currently stands at " str(today) str(units) " which compares to the 1,2 and 5 year averages of " str(one_year) str(units) "," str(two_year) str(units) "," " and " str(five_year) str(units) " respectively. " " Based on the current " str(colname) " levels, that reflects a change of" str(today_vs_1) ", " str(today_vs_2) " and " str(today_vs_5) " respectively." " Since the metric began being tracked, the minimum, maximum and long run average total " str(low) str(units) ", " str(maximum) str(units) " and " str(alltime) str(units) " respectively. " "The 1, 2 and 5 year standard deviation for " str(colname) " totals " str(one_year_vol) str(units) " ," str(two_year_vol) str(units) " and" str(five_year_vol) str(units) " respectively." " Based on the current " str(colname) " levels compared to the 3, 6 and 9 month rolling averages, the current level reflects a change of " str(today_vs_1_rolling[0]) ", " str(today_vs_2_rolling[0]) " and " str(today_vs_3_rolling[0]) " respectively.")
print(summary)
Комментарии:
1. Спасибо, Tabbakhh …. очень быстрый ответ. Я подключил это и получаю сообщение об ошибке следующего содержания: «индекс выходит за пределы»…. Это потому, что вычисления извлекают неправильные показатели из df?
2. @seang700- Я скачал ваш csv-файл и протестировал код, и все работало нормально. Я предполагаю, что csv отформатирован неправильно, и соответствующим образом отредактирую свой ответ, и, надеюсь, это сработает.
3. @seang700 — Нет проблем, попробуйте недавно отредактированный ответ.
4. @seang700 — Без проблем! Пожалуйста, выберите мой ответ в качестве правильного для этого поста 🙂