Почему мои глобальные переменные не обновляются после вызова моих функций?

#python #pandas #function #dataframe #global-variables

#python #pandas #функция #dataframe #глобальные переменные

Вопрос:

Я создал пару функций, которые загружают dataset с github, а затем объединяют его. Эта часть кода работает правильно. Моя проблема возникает, когда я запускаю функцию объединения во второй раз.

Что я пробовал при тестировании, работают ли мои функции так, как задумано.

 loadDataset("https://raw.githubusercontent.com/AAF108/ml/master/test3")
print (dataset)
combine({"data": [{"room_temperature": 20, "light_intensity": 
511,"humidity": 50}]})
print(combinedData)
  

URL-адрес в loadDataset такой:

 {"data": [{"room_temperature": 20, "light_intensity": 511,"humidity": 50}]}
  

Когда я запускаю эту часть, я получаю (именно это я и ожидал получить):

    humidity  light_intensity  room_temperature
0        50              511                20


   humidity  light_intensity  room_temperature
0        50              511                20
0        50              511                20
  

Ниже приведен код для функций, которые я создал:

 def loadDataset(url):
    global dataset
    dataset = pd.read_json(url)

def combine(obj):
    global combinedData

    json= obj

    df1 = pd.DataFrame(dataset)
    df2 = pd.DataFrame(json["data"])

    combinedData = pd.concat([df1, df2])
  

Моя проблема возникает, когда я делаю это:

 loadDataset("https://raw.githubusercontent.com/AAF108/ml/master/test3")
print (dataset)
combine({"data": [{"room_temperature": 20, "light_intensity": 
511,"humidity": 50}]})
print(combinedData)
combine({"data": [{"room_temperature": 20, "light_intensity": 
511,"humidity": 50}]})
print(combinedData)
  

Чего я ожидаю:

    humidity  light_intensity  room_temperature
0        50              511                20


   humidity  light_intensity  room_temperature
0        50              511                20
0        50              511                20
0        50              511                20
  

Что я получаю вместо этого:

    humidity  light_intensity  room_temperature
0        50              511                20


   humidity  light_intensity  room_temperature
0        50              511                20
0        50              511                20
  

Я не уверен, почему мои combineData не обновляются.

Комментарии:

1. Похоже, что он обновляется, просто не так часто, как вы ожидаете. Вы вызывали print(combinedData) дважды и получили более длительный результат во втором print . Может быть полезно перепроверить вашу combine функцию.

2. @Kevin но если бы это работало правильно, разве я не получил бы 3 строки, поскольку я дважды объединяю их в свой исходный фрейм данных с 1 строкой?

3. Я думаю, вы можете захотеть проверить содержимое df1 и df2 с помощью 2 print в вашей combine функции.

4. @A0sXc950 вы запускаете свой код как скрипт или в записной книжке Jupyter?

5. @A0sXc950 по этой причине вам на самом деле не нужна глобальная переменная (на мой взгляд, старайтесь избегать глобальных переменных, насколько это возможно). Просто удалите global combinedData , добавьте return combinedData в свою combine функцию. И в вашем основном скрипте используйте combinedData = combine(...) вместо combine(...) . В другой функции, которая нуждается combinedData , просто передайте свой global combinedData этой функции в качестве параметра.

Ответ №1:

Это не так global работает. Скорее, он «импортирует» имя combinedData в вашу функцию как локальную переменную, которая ссылается на глобально определенный объект.

Итак, следовательно, при запуске combinedData = pd.concat([df1, df2]) вы присваиваете результат pd.concat([df1, df2]) локальной переменной combinedData . Это изменение, очевидно, не видно в глобальной области видимости.

Вам следует избегать использования глобальных переменных таким образом и вместо этого передавать объекты в качестве аргументов.

Однако, если вы действительно хотите это сделать…вы можете сделать что-то вроде этого (редактировать: это на самом деле не сработало бы, потому что pd.append не работает на месте):

 combinedData = pd.DataFrame()

def combine(obj):
    global combinedData

    json = obj

    df1 = pd.DataFrame(dataset)
    df2 = pd.DataFrame(json["data"])

    combinedData.append(pd.concat([df1, df2]))
  

Благодаря комментарию я провел еще некоторое тестирование и обнаружил реальную причину, по которой код OP не работает: среда выполнения.

Если вы запустите этот код как скрипт, то он изменит глобальную переменную combinedData . Однако, если вы запустите его в Jupyter notebook, то это не произойдет.

Комментарии:

1. global combinedData позволяет вам повторно присвоить новое значение глобальным combinedData , и это видно в глобальной области видимости. Я только что создал простой скрипт для проверки этого.

2. теперь, когда я пытаюсь напечатать combinedData, я получаю пустые фреймы данных. Я пытаюсь неправильно напечатать глобальные переменные?

3. @A0sXc950 На самом деле, я допустил ошибку; это тоже не сработало бы.

4. @Kevin По-видимому, global в записной книжке Jupyter notebook ведет себя иначе, чем в скрипте. Я обновил свой ответ, чтобы отразить это. Спасибо за предупреждение!