Вы можете попробовать это:
# make some arrays
score = [100, 50, 43, 67, 89, 2, 13, 56, 22, -1, 53]
homework_problem = ['A', 'B', 'C', 'B', 'A', 'D', 'D', 'A', 'C', 'D', 'B']
topic = ['F', 'G', 'H', 'G', 'H', 'F', 'H', 'G', 'G', 'F', 'H']
# put the arrays into a pandas df
df = pd.DataFrame()
df['score'] = score
df['homework_problem'] = homework_problem
df['topic'] = topic
df['scoregroup'] = pd.cut(df['score'],bins=[0,50,75,100], labels=['Poor','Bad','Good'])
#make sure it looks okay
print(df)
# let's groupby and plot
d = df.groupby(['homework_problem','scoregroup'])['topic'].size().unstack()
d.plot(kind='bar',stacked=True, title = "Test")
Выход:
score homework_problem topic scoregroup
0 100 A F Good
1 50 B G Poor
2 43 C H Poor
3 67 B G Bad
4 89 A H Good
5 2 D F Poor
6 13 D H Poor
7 56 A G Bad
8 22 C G Poor
9 -1 D F NaN
10 53 B H Bad
После поиска в Интернете и закапывания некоторых книг я выяснил, как реализовать это.
В первую очередь, мы должны определить универсальный тип, который размещает все атрибуты и элементы от обоих видов примитивного элемента. Предполагается, что элемент определения определяется где-то в другом месте.
<xs:complexType name="primitive" abstract="true">
<xs:sequence>
<xs:element ref="definition" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
<xs:attribute name="name" type="xs:Name" />
<xs:attribute name="ref" type="xs:Name" />
</xs:complexType>
Затем мы определяем два примитивных подтипа, которые будут использоваться в примитивном списке и составном объекте соответственно.
<xs:complexType name="public-primitive">
<xs:complexContent>
<xs:restriction base="primitive">
<xs:sequence>
<xs:element ref="definition" minOccurs="1" maxOccurs="unbounded" />
</xs:sequence>
<xs:attribute name="name" type="xs:Name" use="required" />
<xs:attribute name="ref" use="prohibited" />
</xs:restriction>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="private-primitive">
<xs:complexContent>
<xs:restriction base="primitive">
<xs:sequence>
<xs:element ref="definition" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
<xs:attribute name="name" use="prohibited" />
</xs:restriction>
</xs:complexContent>
</xs:complexType>
Теперь мы можем определить примитивный список и составить элементы с точки зрения этих составных типов следующим образом:
<xs:element name="primitive-list">
<xs:complexType>
<xs:sequence>
<xs:element name="primitive" type="public-primitive" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="composite">
<xs:complexType>
<xs:sequence>
<xs:element name="primitive" type="private-primitive" maxOccurs="unbounded">
<xs:key name="definition-ref--co-occurrence--constraint">
<xs:selector xpath="." />
<xs:field xpath="definition|@ref" />
</xs:key>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
Давайте смотреть на исходные требования схемы и давайте посмотрим, как они осуществляются:
- Если примитивный элемент указан в элементе примитивного списка, то он должен содержать атрибут имени и встроенный элемент определения, но не касательно атрибута.
Это требование осуществляется определением одного только общедоступного типа примитива.
- Если примитивный элемент указан в составном элементе, то он должен содержать или касательно атрибута или элемента определения. Имя не позволяется ни в каком случаи.
Это требование осуществляется определением частного типа примитива и xs:key элементом, указанным в примитивном элементе, определенном в составном элементе. Гарантии xs:key, что или касательно или определение присутствует, но не оба.
Да, это возможно. При создании XML-схемы Вы будете создавать составной тип для каждого сценария, на основе того, где в дереве XML элемент определяется.
Если я добираюсь мгновение спустя на, я могу попытаться на самом деле получить пример здесь для Вас, у меня просто нет времени для получения всего этого отлично для регистрации здесь.
Я лично настоятельно рекомендую рассмотрение этого w3schools учебного руководства, поскольку это должно получить Вас, в чем Вы нуждаетесь.
Хорошо, вот образец, это получает Вас близко, единственной вещью, не обработанной, является примитив и касательно атрибута на составном объекте. Взгляд на то, что я могу найти, это, действительно почти кажется, невозможно сделать это с помощью схемы. Я не на 100% уверен, хотя, но во всех случаях, где я видел сделанный, схема как это используется для кода проверки и процесса высокого уровня, затем используется для проверки отдельных объектов.
<?xml version="1.0" encoding="utf-8"?>
<xs:schema targetNamespace="http://www.iowacomputergurus.com/stackoverflow/samples/xsdexample"
elementFormDefault="qualified"
xmlns="http://www.iowacomputergurus.com/stackoverflow/samples/xsdexample"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
<xs:complexType name="PrimitiveType">
<xs:sequence>
<xs:element name="definition" type="xs:string" minOccurs="1" maxOccurs="1" />
</xs:sequence>
<xs:attribute name ="name" use="required" type="xs:string" />
</xs:complexType>
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element name="primitive-list" minOccurs="1" maxOccurs="1">
<xs:complexType>
<xs:sequence>
<xs:element name="primitive" type="PrimitiveType" minOccurs="1" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="composite-list" minOccurs="1" maxOccurs="1">
<xs:complexType>
<xs:sequence>
<xs:element name="composite">
<xs:complexType>
<xs:sequence>
<xs:element name="primitive" minOccurs="1" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="definition" minOccurs="0" maxOccurs="1" />
</xs:sequence>
<xs:attribute name="ref" use="optional" type="xs:string" />
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="name" type="xs:string" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>