Нужна помощь в доработке кода для запуска цикла for для суммирования экономических переменных из файла csv?

#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 — Без проблем! Пожалуйста, выберите мой ответ в качестве правильного для этого поста 🙂