#python #pandas #dataframe #numpy #datetime
#питон #панды #фрейм данных #тупица #дата и время
Вопрос:
Мне трудно добавлять несколько строк данных в имеющийся у меня набор данных. По какой-то причине, когда я пытаюсь добавить значения, он задает только первую строку, а остальные строки имеют значение NaN.
В качестве заголовка он выводит следующее:
Time Open Tone 0 1449341520 377.48 0 1 1449341580 377.50 NaN 2 1449341640 377.50 NaN 3 1449341760 377.50 NaN 4 1449341820 377.50 NaN
Ожидаемый:
Time Open Tone 0 1449341520 377.48 0 1 1449341580 377.50 0 2 1449341640 377.50 0 3 1449341760 377.50 0 4 1449341820 377.50 0
btc_data.iloc[:position, -1] = to_btc_data["tone_id"]
предполагается, что эти строки должны соответствовать тому, что position
есть, но вместо этого он задает только первую строку.
Полный код:
from pygooglenews import GoogleNews import datetime import time from datetime import timezone from datetime import datetime import json import numpy as np import pandas as pd gn = GoogleNews() def create_week_data(ts=1449341520): df = pd.DataFrame() search = gn.search('Bitcoin', from_=datetime.fromtimestamp(ts).strftime('%Y-%m-%d'), to_=datetime.fromtimestamp(ts 604800).strftime('%Y-%m-%d')) titles=[] dates=[] timestamps=[] for item in search["entries"]: titles.append(item["title"]) dates.append(item["published"]) df["published"] = dates df["title"] = titles for item in dates: month = 1 if (item[8:11] == "Jan"): month = 1 elif (item[8:11] == "Feb"): month = 2 elif (item[8:11] == "Mar"): month = 3 elif (item[8:11] == "Apr"): month = 4 elif (item[8:11] == "May"): month = 5 elif (item[8:11] == "Jun"): month = 6 elif (item[8:11] == "Jul"): month = 7 elif (item[8:11] == "Aug"): month = 8 elif (item[8:11] == "Sep"): month = 9 elif (item[8:11] == "Oct"): month = 10 elif (item[8:11] == "Nov"): month = 11 elif (item[8:11] == "Dec"): month = 12 dt = item[5:7] "/" str(month) "/" item[12:16] timestamps.append(int(time.mktime(datetime.strptime(dt, "%d/%m/%Y").timetuple()))) df["timestamp"] = timestamps return df from ibm_watson import ToneAnalyzerV3 from ibm_cloud_sdk_core.authenticators import IAMAuthenticator import json watson_api_key = "KEY" watson_url = "URL" authenticator = IAMAuthenticator(watson_api_key) tone_analyzer = ToneAnalyzerV3(version='2021-11-27', authenticator=authenticator) tone_analyzer.set_service_url(watson_url) def to_tone(df = df): toneData = pd.DataFrame() tones = [] timestamps = [] for index, row in df.iterrows(): timestamp = row["timestamp"] title = row["title"] dump = json.dumps(tone_analyzer.tone(title).get_result())[10:] tone_id = 0; if (dump.find("Joy") gt;= 0): tone_id = 1 elif (dump.find("Anger") gt;= 0): tone_id = 2 elif (dump.find("Fear") gt;= 0): tone_id = 3 elif (dump.find("Sadness") gt;= 0): tone_id = 4 elif (dump.find("Analytical") gt;= 0): next elif (dump.find("Confident") gt;= 0): next elif (dump.find("Tentative") gt;= 0): next else: tone_id = 0 tones.append(tone_id) timestamps.append(timestamp) if (len(tones) gt;= 1): break toneData["timestamp"] = timestamps toneData["tone_id"] = tones return toneData print(to_tone()) import numpy as np import pandas as pd np.set_printoptions(precision=15, suppress=True) btc_data = pd.read_csv( "/content/drive/MyDrive/Science Fair/output.csv", names=["Time", "Open"]) btc_data["Tone"] = None ts = 1449341520 position = 0 while (True): to_btc_data = pd.DataFrame() to_btc_data = to_tone(df=create_week_data(ts=ts)) for index, row in btc_data.iterrows(): timestamp = row["Time"] if (timestamp gt;= ts): ts = timestamp position = index break btc_data.iloc[:position, -1] = to_btc_data["tone_id"] ts =604800 print(btc_data.head()) if (ts gt; 1617148800): btc_data.iloc[ts 604800:] = to_btc_data[0] break btc_data.head()
Какое бы значение ни было в to_btc_data
DF, оно должно быть установлено там. Что я здесь делаю не так?
Также прошу прощения за ужасно структурированный код. Я играю над его организацией во время производства, и обычно я не пишу код на Python, поэтому я не буду писать красивый код.
Комментарии:
1. Там , где у вас есть
next
, вам нужно иметьcontinue
. Это не тоnext
, для чего нужно.2.
len(tones)
всегда будет gt;= 1, Вы только что добавилиtone_id
к немуgt;.3. Я в курсе. Я, вероятно, удалю часть кода, так как мне действительно не нужны звуковые сигналы, чтобы быть в кадре данных.
4. Вы не увеличиваете свою
position
переменную внутриwhile
цикла. Независимо от того, сколько разwhile
выполняется цикл, он всегда установлен наzero
.5. Я исправил это несколько минут назад. Спасибо, что указали на это.