Как импортировать файлы, используя цикл for с именами путей в словаре в Python? - PullRequest
0 голосов
/ 18 января 2019

Я хочу создать словарь, содержащий всю информацию, необходимую для импорта файлов, разбора дат и т. Д. Затем я хочу использовать цикл for для импорта всех этих файлов. Но после окончания цикла for у меня остается только последний набор данных в словаре. Как будто это перезаписывает их.

Я запускаю файл в папке пути, так что это не проблема.

Я попытался создать новый словарь, в который я добавляю каждый импорт, но это усложняет задачу на будущее, когда мне нужно сослаться на них. Я хочу их как отдельные кадры данных в проводнике переменных.

Вот код:

import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.ticker import AutoMinorLocator # for time series visualisation
# Import data
#PATH = r"C:\Users\sherv\OneDrive\Documents\GitHub\Python-Projects\Research Project\Data"    
data = {"google":["multiTimeline.csv", "Month"], 
    "RDPI":  ["RealDisposableIncome-2004-1_Present-Mon-US(Grab-30-11-18).csv", "DATE"], 
    "CPI":   ["CPI.csv", "DATE"],
    "GDP":   ["GDP.csv", "DATE"], 
    "UE":    ["Unemployment_2004_Present_US(Grab-5-12-18).csv", "DATE"], 
    "SP500": ["S&P500.csv", "Date"], 
    "IR":    ["InterestRate_2004-1-1_Present_US(Grab-5-12-18).csv", "DATE"], 
    "PPI":   ["PPIACO.csv", "DATE"],
    "PMI":   ["ISM-MAN_PMI.csv", "Date"]}

for dataset in data.keys():
    dataset = pd.read_csv("%s" %(data[dataset][0]), index_col="%s" %(data[dataset][1]), parse_dates=["%s" %(data[dataset][1])])
    dataset = dataset.loc["2004-01-01":"2018-09-01"]
# Visualise
minor_locator = AutoMinorLocator(12)
# Investigating overall trendSS
def google_v_X(Data_col, yName, title):
    fig, ax1 = plt.subplots()
    google["Top5"].plot(ax=ax1,color='b').xaxis.set_minor_locator(minor_locator)
    ax1.set_xlabel('Date')
    ax1.set_ylabel('google (%)', color='b')
    ax1.tick_params('y', colors='b')
    plt.grid()
    ax2 = ax1.twinx()
    Data_col.plot(ax=ax2,color='r')
    ax2.set_ylabel('%s' %(yName), color='r')
    ax2.tick_params('%s' %(yName), colors='r')
    plt.title("Google vs %s trends" %(title))
# Google-CPI
google_v_X(CPI["CPI"], "CPI 1982-1985=100 (%)", "CPI")
# Google-RDPI
google_v_X(RDPI["DSPIC96"], "RDPI ($)", "RDPI")
# Google-GDP
google_v_X(GDP["GDP"], "GDP (B$)", "GDP")    
# Google-UE
google_v_X(UE["Value"], "Unemployed persons", "Unemployment")
# Google-SP500
google_v_X(SP500["Close"], "SP500", "SP500")
# Google-PPI
google_v_X(PPI["PPI"], "PPI")
# Google-PMI
google_v_X(PMI["PMI"], "PMI", "PMI")
# Google-IR
google_v_X(IR["FEDFUNDS"], "Fed Funds Rate (%)", "Interest Rate")

Я также попытался создать функцию для чтения и анализа, а затем использовать ее в цикле, например:

def importdata(key, path ,parseCol):
    key = pd.read_csv("%s" %(path), index_col="%s" %(parseCol), parse_dates=["%s" %(parseCol)])
    key = key.loc["2004-01-01":"2018-09-01"]
for dataset in data.keys():
    importdata(dataset, data[dataset][0], data[dataset][0])

Но я получаю ошибку, потому что он не распознает путь как строку и говорит, что он не определен.

Как я могу заставить их не перезаписывать друг друга или как я могу заставить python распознавать входные данные функции как строку? Любая помощь приветствуется, спасибо

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Воспроизводимый пример (однако вы должны быть очень осторожны с использованием "exec"):

# Generating data
import os
import pandas as pd
os.chdir(r'C:\Windows\Temp')
df1 = pd.DataFrame([['a',1],['b',2]], index=[0,1], columns=['col1','col2'])
df2 = pd.DataFrame([['c',3],['d',4]], index=[2,3], columns=['col1','col2'])

# Exporting data
df1.to_csv('df1.csv', index_label='Month')
df2.to_csv('df2.csv', index_label='DATE')

# Definition of Loading metadata
loading_metadata = {
    'df1_loaded':['df1.csv','Month'],
    'df2_loaded':['df2.csv','DATE'],
}

# Importing with accordance to loading_metadata (caution for indentation)
for dataset in loading_metadata.keys():
    print(dataset, loading_metadata[dataset][0], loading_metadata[dataset][1])
    exec(
"""
{0} = pd.read_csv('{1}', index_col='{2}').rename_axis('')
""".format(dataset, loading_metadata[dataset][0], loading_metadata[dataset][1])
)

Экспортированные данные (df1.csv):

Month,col1,col2
0,a,1
1,b,2

Экспортированные данные (df2.csv):

DATE,col1,col2
2,c,3
3,d,4

Загруженные данные:

df1_loaded
    col1    col2
0   a   1
1   b   2

df2_loaded
    col1    col2
2   c   3
3   d   4
0 голосов
/ 18 января 2019

Цикл for ссылается на одну и ту же переменную набора данных, поэтому каждый раз при выполнении цикла переменная заменяется новым импортированным набором данных. Вам нужно где-то хранить результат, будь то новая переменная каждый раз или в словаре. Попробуйте что-то вроде этого:

googleObj = None
RDPIObj = None
CPIObj = None

data = {"google":[googleObj, "multiTimeline.csv", "Month"], 
    "RDPI":  [RDPIObj,"RealDisposableIncome-2004-1_Present-Mon-US(Grab-30-11-18).csv", "DATE"], 
    "CPI":   [CPIObj, "CPI.csv", "DATE"]}

for dataset in data.keys():
    obj = data[dataset][0]
    obj = pd.read_csv("%s" %(data[dataset][1]), index_col="%s" %(data[dataset][2]), parse_dates=["%s" %(data[dataset][2])])
    obj = dataset.loc["2004-01-01":"2018-09-01"]


Таким образом, у вас будет локальный объект фрейма данных для каждого из ваших наборов данных. Недостатком является то, что вы должны определить каждую переменную.

Другой вариант - создать второй словарь, как вы упомянули, что-то вроде этого:

data = {"google":["multiTimeline.csv", "Month"], 
    "RDPI":  ["RealDisposableIncome-2004-1_Present-Mon-US(Grab-30-11-18).csv", "DATE"], 
    "CPI":   ["CPI.csv", "DATE"]}

output_data = {}
for dataset_key in data.keys():
    dataset = pd.read_csv("%s" %(data[dataset_key][0]), index_col="%s" %(data[dataset_key][1]), parse_dates=["%s" %(data[dataset_key][1])])
    dataset = dataset.loc["2004-01-01":"2018-09-01"]
    output_data[dataset_key] = dataset
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...