Python 使用django模型将数据传输到db.sqlite3
我有以下列标题的dfs:Python 使用django模型将数据传输到db.sqlite3,python,django,pandas,sqlite,python-3.6,Python,Django,Pandas,Sqlite,Python 3.6,我有以下列标题的dfs: Year JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC WIN SPR SUM AUT ANN ATTRIBUTE LOCATION 每列包含随机浮点值,属性除外,该属性包含以下列表中的值: [Max_temp, Min_temp, Mean_temp, Sunshine, Rainfall] 和位置,其中包含此列表中的值: [Max_temp, Min_temp, Mean_temp, Sunshine, Rai
Year JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC WIN SPR SUM AUT ANN ATTRIBUTE LOCATION
每列包含随机浮点值,属性除外,该属性包含以下列表中的值:
[Max_temp, Min_temp, Mean_temp, Sunshine, Rainfall]
- 和位置,其中包含此列表中的值:
[英国、英格兰、苏格兰、威尔士][Max_temp, Min_temp, Mean_temp, Sunshine, Rainfall]
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
我有点困惑于如何做到这一点——我不确定我的模型结构是否正确?有没有一种方法可以构造模型,这样我就不必重复代码了?我需要一个结构如下的数据库:
位置-最高温度-最低温度
-平均温度
-阳光
-降雨 所以每个位置都有一个最大温度表,一个最小温度表等等 最主要的问题是,我如何告诉Django将熊猫df放入数据库,以及在Django项目中我将代码放在哪里
感谢您的帮助 您对模型结构的质疑是正确的:)通常,当您有那么多代码重复时,有一种更简单的方法。这里的关键是,您的度量都具有相同的模式。您定义的每个模型代表一个数据库表,我们实际上不需要为每个度量类型创建一个新的数据库表——我们可以将该类型作为列存储在“度量”表中 我还质疑您是否需要
位置
的单独表格,因为它只包含国家/地区代码的详细名称-您也可以使用选项字段
(如果您的用例比这更高级,那么可以将位置模型分开)
现在,当您循环数据帧中的每一行时,您将获得属性
值(您可以将其转换为.lower()
,以与模型.py中定义的测量类型
选项一致)和位置
,对于1-2-3-4-5-6-7-8-9-10-11-12-WIN SPR SUM AUT ANN中的每个值,您可以使用该属性、位置和月/季以及该列中的值创建一个新的度量值
要创建新的测量
对象,您只需执行以下操作:
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
您的示例中似乎缺少了相当数量的数据属性。在不知道用例的情况下,推荐模型结构是不可能的。你能展示pandas中的一个示例行吗?你想在你的表中显示什么样的行吗?抱歉,我已经编辑了-我希望这更清楚?这很好,但是你能解释返回“{0}in{1}-{2},{3}”格式吗(self.measurement\u type、self.location、self.month\u或self.seasure、self.year等)语法?我不确定这是在做什么?在df上循环也是有效的?必须有一个内置函数,我可以调用它来加快大型dfs的计算时间?它使用内置字符串格式的python(请参阅)使用models属性构建字符串这可能是一种比循环更有效的方法,但我对pandas的了解还不够-无论哪种方法,您最终都会选择这些属性,这似乎是在数据帧上循环的最快方法