Есть ли способ сохранить метки значений для категориальных данных Stata в Python?

Итак, я знаю, что можно читать либо метки категорий Stata, либо значения, используя параметр convert_categoricals.

Я искал способ написать/экспортировать фрейм данных pandas в Stata и включить метки значений. Однако все, что я мог найти, было либо

data_label : str, optional для метки набора данных

или

variable_labels : dict для метки имен столбцов,

но ничего для самих значений.

Привет! Я думаю, это отвечает на ваш вопрос: pandas.pydata.org/pandas-docs/stable/reference/api/…

Serge de Gosson de Varennes 12.12.2020 11:39

Спасибо. Я должен был сказать, что просмотрел документы и не нашел ответа.

Andrei 12.12.2020 12:01

Я удивлен, но документы действительно не указывают на возможность сделать это. Похоже, что на данный момент это невозможно.

Wouter 13.12.2020 10:49

@SergedeGossondeVarennes, @Wouter Я добавил обходное решение для вопроса @Andrei, которое работает в Stata, используя Stata Function Interface (sfi). Я не знаю, решит ли это вашу проблему, потому что предполагается, что на вашем терминале работает Stata 16, но, к сожалению, я не смог найти способ экспортировать значения меток с помощью pd.to_stata().

Álvaro A. Gutiérrez-Vargas 13.12.2020 13:05
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
4
916
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вот ответ на ваш вопрос. Вероятно, это не то, что вы ожидали, потому что я не использую pd.to_Stata, а интеграцию Python, разработанную на Stata 16.

Приведенный ниже код должен выполняться в Stata (начиная с версии 16). Вкратце, я создаю Pandas Data.Frame (df), который я экспортирую в Stata. Хитрость заключается в том, чтобы применить метки к значениям, используя функциональность ValueLabel.setLabelValue() из библиотеки sfi.

clear all

python:
from sfi import ValueLabel, Data
import pandas as pd

data = [['Eren Jaeger', 15, 1, 'Soldier' ] , ['Mikasa Ackerman', 14, 1, 'Soldier'], ['Armin Arlert', 14, 1 , 'Soldier'],['Levi Ackerman', 30, 2, 'Captain']]  
#creating DataFrame
df = pd.DataFrame(data, columns = ['Name', 'Age', 'Rank_num', 'Rank'])

##              Name  Age  Rank_num     Rank
##0      Eren Jaeger   15         1  Soldier
##1  Mikasa Ackerman   14         1  Soldier
##2     Armin Arlert   14         1  Soldier
##3    Levi Ackerman   30         2  Captain


# Set number of observations in Stata
Data.setObsTotal(len(df))

#Create variables on Stata (from Python)
Data.addVarStr("Name",10)
Data.addVarDouble("Age")
Data.addVarInt("Rank_num")

#Store the content of "df" object from Python to Stata
Data.store("Name", None, df['Name'], None)
Data.store("Age", None, df['Age'], None)
Data.store("Rank_num", None, df['Rank_num'], None)

# HERE is where I solve your question!
# 1) Create the labels
ValueLabel.setLabelValue('rank_num_LABEL', 1, 'Soldier')
ValueLabel.setLabelValue('rank_num_LABEL', 2, 'Captain')
ValueLabel.getValueLabels('rank_num_LABEL')

# 2) Attach the labels to the created variable
#Attach the created label 
ValueLabel.setVarValueLabel('Rank_num', 'rank_num_LABEL')

end 

br

* At the end, you will see the following on the Stata browser
* Name              Age Rank_num
* Eren Jaeger       15  Soldier
* Mikasa Ackerman   14  Soldier
* Armin Arlert      14  Soldier
* Levi Ackerman     30  Captain

Если вы хотите лучше понять причину приведенного выше кода, вот ссылки, которые я использовал для его изучения.

  1. Интеграция Stata/Python, часть 9: Использование интерфейса функций Stata для копирования данных из Python в Stata
  2. Интеграция Stata/Python, часть 8: Использование интерфейса функций Stata для копирования данных из Stata в Питон

Панды, эквивалентные переменной Stata со строковыми значениями, закодированными в числовом виде, — это категориальный тип dtype. Экспорт столбца категорий с помощью метода to_stata будет экспортировать его как таковой. На примере Альваро А. Гутьерреса Варгаса:

data = [['Eren Jaeger', 15, 1, 'Soldier' ] , ['Mikasa Ackerman', 14, 1, 'Soldier'], ['Armin Arlert', 14, 1 , 'Soldier'],['Levi Ackerman', 30, 2, 'Captain']]
df = pd.DataFrame(data, columns = ['Name', 'Age', 'Rank_num', 'Rank'])
df['Rank'] = df['Rank'].astype('category')
df.to_stata('YOUR/PATH/HERE', write_index=False)

Это создаст набор данных Stata с переменной Rank, закодированной как 0 = капитан, 1 = солдат. Можно изменить порядок, используя Categorical.reorder_categories() или Categorical.set_categories(), например:

df['Rank'] = df['Rank'].cat.reorder_categories(['Soldier', 'Captain'], ordered=True)

Теперь при экспорте методом to_stata будет использоваться кодировка 0=солдат, 1=капитан.

Однако нет возможности указать пользовательскую кодировку, поэтому, если вам нужно что-то более конкретное, чем кодировка от 0 до max, вам следует использовать метод Альваро А. Гутьерреса Варгаса.

Привет @Wouter, это интересный момент, потому что он проясняет отсутствие прямого эквивалента label values, который есть у Stata. Кроме того, это может быть обходным путем для моего обходного пути, потому что вы можете использовать предложенную вами кодировку для маркировки ваших значений с помощью процедур публикации в Stata в версиях старше 16 (я в основном думаю о манипуляциях со строками вместе с командой label values).

Álvaro A. Gutiérrez-Vargas 14.12.2020 16:05

По состоянию на апрель 2023 года pandas позволяет вам указывать «value_labels» в pd.DataFrame.to_stata(). Если вы посмотрите на код метода «to_stata», вы найдете описание добавления меток переменных, меток данных, а также меток значений: Вот кусок из этого описания:

....

value_labels : словарь словарей

Словарь, содержащий столбцы в качестве ключей и словари значений столбцов для меток в качестве значений. Метки для одной переменной не должны превышать 32 000 символов.

....

Пример: Если для столбца «животные», который может принимать два значения [1,2], вы хотите установить метки ['Cat', 'Dog], в pd.DataFrame.to_stata() вы указываете:

value_labels = {'животные': {1: 'Кошка', 2: 'Собака'}}

Другие вопросы по теме