Przekonwertowałem dataframe do słownika, dzięki czemu mogę zaimplementować API przez kolbę. Walczę, aby dołączyć nazwę kolumny do każdego indeksu w słowniku, dlatego nie można uruchomić kodu:

@app.route('/api/v1/resources/names', methods=['GET'])
def api_name():
    if 'name' in request.args:
        name = str(request.args['name'])
    else:
        return "Error: No name was provided, Please specify a first and last name"
    results = []

    for index['Name] in main_data:
        if (index == name):
            results.append(index)
    results = str(results)
    return jsonify(results)

A kiedy próbuję zadzwonić do interfejsu API

http://127.0.0.1:5000/api/v1/resources/names?name=John%20Doe
TypeError: string indices must be integers

Pomyślałem, że jest to spowodowany, że mój słownik nie ma żadnych nagłówków kolumnowych, chcę przekonwertować słownik

{
  "John Doe": {
    "2020-09-01": "4:00PM", 
    "2020-09-03": "8:00AM", 
    "2020-09-04": "2:00PM", 
    "2020-09-14": "8:00AM", 
    "2020-09-16": "6:00PM", 
    "2020-09-22": "5:00PM", 
    "2020-09-23": "2:00PM", 
    "2020-09-25": "1:00PM", 
    "2020-09-30": "5:00PM", 
    "2020-10-01": "8:00PM", 
    "2020-10-05": "5:00PM", 
    "2020-10-08": "1:00PM", 
    "2020-10-09": "5:00PM", 
    "2020-10-10": "4:00PM", 
    "2020-10-12": "5:00PM", 
    "2020-10-14": "7:00PM"
  }, 
  "Firstname Lastname": {
    "2020-08-20": "11:00AM", 
    "2020-08-21": "10:00AM", 
    "2020-08-22": "10:00AM", 
    "2020-08-23": "11:00AM", 
    "2020-08-24": "10:00AM", 
    "2020-08-25": "11:00AM", 
    "2020-08-26": "2:00PM", 
    "2020-08-27": "4:00PM", 
    "2020-08-28": "2:00PM", 
    "2020-08-29": "1:00PM"
  }
}

Do:

{Name: "John Doe": {Date: "2020-09-01": Time:"4:00PM" }}

Kod, którego używałem w Pandas, aby początkowo przekonwertować dataframe do słownika wygląda tak

def buildDictionary():
    main_data = pd.read_csv('output.csv', delimiter=",", encoding='cp1252')
    nameDictionary = (main_data.groupby('Name')
       .apply(lambda x: dict(zip(x['Date'],x['Time'])))
       .to_dict())
    return nameDictionary

Oto niektóre z danych CSV

Name    Time    Date
FName LName 12:00PM     10/5/20
FName LName 12:00PM     10/5/20
FName LName 12:00PM     10/5/20
FName LName 12:00PM     10/5/20
FName LName 12:00PM     10/5/20
FName LName 12:00PM     10/5/20
FName LName 12:00PM     10/5/20

Chciałbym wrócić

  "John Doe": {
    "2020-09-01": "4:00PM", 
    "2020-09-03": "8:00AM", 
    "2020-09-04": "2:00PM", 
    "2020-09-14": "8:00AM", 
    "2020-09-16": "6:00PM", 
    "2020-09-22": "5:00PM", 
    "2020-09-23": "2:00PM", 
    "2020-09-25": "1:00PM", 
    "2020-09-30": "5:00PM", 
    "2020-10-01": "8:00PM", 
    "2020-10-05": "5:00PM", 
    "2020-10-08": "1:00PM", 
    "2020-10-09": "5:00PM", 
    "2020-10-10": "4:00PM", 
    "2020-10-12": "5:00PM", 
    "2020-10-14": "7:00PM"
  } 

Ale aby to zrobić, muszę indeksować każdą kolumnę w słowniku.

0
mlabenski 22 październik 2020, 19:36

1 odpowiedź

Najlepsza odpowiedź

To powinno załatwić sprawę:

@app.route('/api/v1/resources/names', methods=['GET'])
def api_name():
    if 'name' in request.args:
        name = str(request.args['name'])
    else:
        return "Error: No name was provided, Please specify a first and last name"

    return jsonify({name: main_data[name]})

Powód, dla którego masz ten błąd, jest to, że pętla jest równoważna:

for key in main_data.keys(): #looping over a dict is equivalent to looping over its keys
    index['Name'] = key
    if index == name:
        results.append(index)

... I najwyraźniej masz zmienną globalną o nazwie index, który jest gdzieś ciąg.

Jeśli to naprawisz, otrzymasz:

for key in main_data():
    if key == name:
        results.append(key)

... co jest takie samo jak:

results = [name]

... który następnie przekonwertuj na ciąg, i serializuj ten ciąg do JSON, co oznacza, że Twoja prośba wróciła "['John Doe']" (w zestawie licencja)

1
Jasmijn 22 październik 2020, 17:25