2017-11-28 2 views
1

Ich habe dfs mit den folgenden Spaltenüberschriften:Übertragung Pandas df db.sqlite3 django Modelle mit

Year JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC WIN SPR SUM AUT ANN ATTRIBUTE LOCATION 

Jede Spalte enthält zufälligen Fließkommawert, mit Ausnahme von ATTRIBUTEN, die einen Wert aus dieser Liste:

[Max_temp, Min_temp, Mean_temp, Sunshine, Rainfall] 
  • und LOCATION, die einen Wert aus dieser Liste:

    [UK, Engl und, Schottland, Wales]

Ich brauche es in die sqlite3 Datenbank zu setzen, die mit django kommt mit den folgenden Modellen:

from django.db import models 
from django.core.validators import MaxValueValidator, MinValueValidator 


class Location(models.Model): 
    LOCATIONS = (
     ('EN', 'England'), 
     ('SC', 'Scotland'), 
     ('WA', 'Wales'), 
     ('UK', 'United Kingdom'), 
    ) 
    location = models.CharField(max_length=2, choices=LOCATIONS) 

    class Meta: 
     verbose_name_plural = "Location" 

    def __str__(self): 
     return self.location 

class Max_temp(models.Model): 
    location = models.ForeignKey(Location, on_delete=models.CASCADE) 
    year = models.IntegerField(
    default=0, 
    validators=[MaxValueValidator(9999), MinValueValidator(0)] 
) 
    MONTH_OR_SEASON = (
     ("JAN", "January"), 
     ("FEB", "February"), 
     ("MAR", "March"), 
     ("APR", "April"), 
     ("MAY", "May"), 
     ("JUN", "June"), 
     ("JUL", "July"), 
     ("AUG", "August"), 
     ("SEP", "September"), 
     ("OCT", "October"), 
     ("NOV", "November"), 
     ("DEC", "December"), 
     ("WIN", "Winter"), 
     ("SPR", "Spring"), 
     ("SUM", "Summer"), 
     ("AUT", "Autumn"), 
     ("ANN", "Annual"), 
) 
    month_or_season = models.CharField(max_length=3, choices=MONTH_OR_SEASON) 

    class Meta: 
     verbose_name_plural = "Maximum Temperature" 

    def __str__(self): 
     return self.year 

class Min_temp(models.Model): 
    location = models.ForeignKey(Location, on_delete=models.CASCADE) 
    year = models.IntegerField(
    default=0, 
    validators=[MaxValueValidator(9999), MinValueValidator(0)] 
) 
    MONTH_OR_SEASON = (
     ("JAN", "January"), 
     ("FEB", "February"), 
     ("MAR", "March"), 
     ("APR", "April"), 
     ("MAY", "May"), 
     ("JUN", "June"), 
     ("JUL", "July"), 
     ("AUG", "August"), 
     ("SEP", "September"), 
     ("OCT", "October"), 
     ("NOV", "November"), 
     ("DEC", "December"), 
     ("WIN", "Winter"), 
     ("SPR", "Spring"), 
     ("SUM", "Summer"), 
     ("AUT", "Autumn"), 
     ("ANN", "Annual"), 
) 
    month_or_season = models.CharField(max_length=3, choices=MONTH_OR_SEASON) 

    class Meta: 
     verbose_name_plural = "Minimum Temperature" 

    def __str__(self): 
     return self.year 

class Mean_temp(models.Model): 
    location = models.ForeignKey(Location, on_delete=models.CASCADE) 
    year = models.IntegerField(
    default=0, 
    validators=[MaxValueValidator(9999), MinValueValidator(0)] 
) 
    MONTH_OR_SEASON = (
     ("JAN", "January"), 
     ("FEB", "February"), 
     ("MAR", "March"), 
     ("APR", "April"), 
     ("MAY", "May"), 
     ("JUN", "June"), 
     ("JUL", "July"), 
     ("AUG", "August"), 
     ("SEP", "September"), 
     ("OCT", "October"), 
     ("NOV", "November"), 
     ("DEC", "December"), 
     ("WIN", "Winter"), 
     ("SPR", "Spring"), 
     ("SUM", "Summer"), 
     ("AUT", "Autumn"), 
     ("ANN", "Annual"), 
) 
    month_or_season = models.CharField(max_length=3, choices=MONTH_OR_SEASON) 

    class Meta: 
     verbose_name_plural = "Mean Temperature" 

    def __str__(self): 
     return self.year 

class Sunshine(models.Model): 
    location = models.ForeignKey(Location, on_delete=models.CASCADE) 
    year = models.IntegerField(
    default=0, 
    validators=[MaxValueValidator(9999), MinValueValidator(0)] 
) 
    MONTH_OR_SEASON = (
     ("JAN", "January"), 
     ("FEB", "February"), 
     ("MAR", "March"), 
     ("APR", "April"), 
     ("MAY", "May"), 
     ("JUN", "June"), 
     ("JUL", "July"), 
     ("AUG", "August"), 
     ("SEP", "September"), 
     ("OCT", "October"), 
     ("NOV", "November"), 
     ("DEC", "December"), 
     ("WIN", "Winter"), 
     ("SPR", "Spring"), 
     ("SUM", "Summer"), 
     ("AUT", "Autumn"), 
     ("ANN", "Annual"), 
) 
    month_or_season = models.CharField(max_length=3, choices=MONTH_OR_SEASON) 

    class Meta: 
     verbose_name_plural = "Sunshine" 

    def __str__(self): 
     return self.year 

class Rainfall(models.Model): 
    location = models.ForeignKey(Location, on_delete=models.CASCADE) 
    year = models.IntegerField(
    default=0, 
    validators=[MaxValueValidator(9999), MinValueValidator(0)] 
) 
    MONTH_OR_SEASON = (
     ("JAN", "January"), 
     ("FEB", "February"), 
     ("MAR", "March"), 
     ("APR", "April"), 
     ("MAY", "May"), 
     ("JUN", "June"), 
     ("JUL", "July"), 
     ("AUG", "August"), 
     ("SEP", "September"), 
     ("OCT", "October"), 
     ("NOV", "November"), 
     ("DEC", "December"), 
     ("WIN", "Winter"), 
     ("SPR", "Spring"), 
     ("SUM", "Summer"), 
     ("AUT", "Autumn"), 
     ("ANN", "Annual"), 
) 
    month_or_season = models.CharField(max_length=3, choices=MONTH_OR_SEASON) 

    class Meta: 
     verbose_name_plural = "Rainfall" 

    def __str__(self): 
     return self.year 

ich ein bisschen bin ratlos, wie dies zu tun - Ich bin mir nicht sicher, ob meine Modellstruktur stimmt? Und gibt es eine Möglichkeit, die Modelle so zu strukturieren, dass ich den Code nicht wiederholen muss? Ich brauche eine Datenbank wie so strukturiert:

Location - Max_temp
- Min_temp
- Mean_temp
- Sunshine
- Regen

So hat jeder Standort hat eine Max_temp Tisch, ein Min_temp Tisch etc ...

Die Hauptsache ist, wie ich Django sagen, um die Pandas df in die Datenbank und wo in der Django Projekt stelle ich diesen Code?

Jede Hilfe wird geschätzt!

+0

Es gibt eine ganze Menge von Daten zu sein scheint Attribute aus Ihrem Beispiel Pandas DF fehlt.Es ist nicht wirklich möglich, Modellstrukturen zu empfehlen, ohne Ihren Anwendungsfall zu kennen. – ptr

+0

Könnten Sie eine Beispielzeile aus Pandas zeigen und wie möchten Sie in Ihren Tabellen? – Sniper

+0

Entschuldigen Sie haben bearbeitet - ich hoffe, dass das klarer ist? – Davtho1983

Antwort

2

Sie hatten Recht, Ihre Modellstruktur in Frage zu stellen :) Normalerweise, wenn Sie so viel Code kopieren, gibt es einen einfacheren Weg. Der Schlüssel hier ist die Tatsache, dass Ihre Messungen alle das gleiche Schema haben. Jedes Modell, das Sie definieren, stellt eine Datenbanktabelle dar, und wir müssen wirklich keine neue Datenbanktabelle für jeden Messtyp erstellen. Wir können den Typ einfach als Spalte in einer "Measurement" -Tabelle speichern.

ich auch fragen, ob Sie die separate Tabelle müssen für Location wie alle es enthält die ausführliche Namen für das Land Code- Sie auch kann ein verwenden ChoiceField (wenn Ihr usecase ist weiter fortgeschritten, als dies dann fühlen sich frei, das zu halten Standortmodell getrennt).

from django.db import models 
from django.core.validators import MaxValueValidator, MinValueValidator 


class Measurement(models.Model): 
    MEASUREMENT_TYPES = (
     ("max_temp", "Maximum Temperature"), 
     ("min_temp", "Minimum Temperature"), 
     ("mean_temp", "Mean Temperature"), 
     ("sunshine", "Sunshine"), 
     ("rainfall", "Rainfall"), 
    ) 

    LOCATIONS = (
     ('EN', 'England'), 
     ('SC', 'Scotland'), 
     ('WA', 'Wales'), 
     ('UK', 'United Kingdom'), 
    ) 

    MONTH_OR_SEASON = (
     ("JAN", "January"), 
     ("FEB", "February"), 
     ("MAR", "March"), 
     ("APR", "April"), 
     ("MAY", "May"), 
     ("JUN", "June"), 
     ("JUL", "July"), 
     ("AUG", "August"), 
     ("SEP", "September"), 
     ("OCT", "October"), 
     ("NOV", "November"), 
     ("DEC", "December"), 
     ("WIN", "Winter"), 
     ("SPR", "Spring"), 
     ("SUM", "Summer"), 
     ("AUT", "Autumn"), 
     ("ANN", "Annual"), 
    ) 

    measurement_type = models.CharField(
     max_length=255, choices=MEASUREMENT_TYPES, default="max_temp", 
    ) 
    location = models.CharField(
     max_length=2, choices=LOCATIONS, default="EN", 
    ) 
    year = models.IntegerField(
     default=0, 
     validators=[MaxValueValidator(9999), MinValueValidator(0)], 
    ) 
    month_or_season = models.CharField(
     max_length=3, choices=MONTH_OR_SEASON, default="ANN", 
    ) 
    value = models.FloatField(
     default=0, 
     validators=[MinValueValidator(0)], 
    ) 

    def __str__(self): 
     return "{0} in {1} - {2}, {3}".format(
      self.measurement_type, self.location, 
      self.month_or_season, self.year, 
     ) 

Nun, wenn Sie eine Schleife über jede Zeile in Ihrem Datenrahmen, können Sie den ATTRIBUTE Wert bekommen (man kann es .lower() werfen mit den MEASUREMENT_TYPES Entscheidungen in-line sein definiert in Ihrem models.py) und der LOCATION und für Jeder Wert in JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC WIN SPR SUM AUT ANN Sie erstellen eine neue Measurement mit diesem Attribut, Standort und Monat/Saison und den Wert aus dieser Spalte.

Um ein neues Measurement-Objekt zu erstellen Sie gerade tun:

for row in my_data_frame: 
    attribute = row['ATTRIBUTE'] # (or whatever) 
    location = row['LOCATION'] 
    ... 
    for month_or_season in MONTH_AND_SEASONS: 
     value = row[month_or_season] 
     .... 
     Measurement(
      measurement_type=attribute, 
      location=location, 
      value=value, 
      ... 
     ).save() # Saves model instance to database 
+0

Das ist großartig, aber können Sie die Rückgabe "{0} in {1} - {2}, {3}" erklären. Format ( self.measurement_type, self.location, self.month_or_season, self.year, ) Syntax? Ich bin mir nicht sicher, was das macht? – Davtho1983

+0

Ist auch Looping über die df effizient? Es muss eine eingebaute Funktion geben, die ich die schnellere Rechenzeit für große dfs nennen kann? – Davtho1983

+1

das verwendet Pythons in String-Formatierung (siehe https://docs.python.org/2/library/string.html#format-examples) gebaut, um eine Zeichenfolge mit den Modellen Attribute – ptr