1
votes

TypeError: l'objet 'str' ne prend pas en charge l'affectation d'élément, l'opération pandas

J'essaie de récupérer des données financières sur un site Web financier. Je veux manipuler df ['__ this value__'] . J'ai fait des recherches moi-même, et je comprends bien l'erreur, mais je ne sais vraiment pas comment la corriger. Voici à quoi ressemble mon code:

import requests
import bs4
import os
import pandas as pd


def worker_names(code=600110):

    ......

    df = pd.DataFrame({'class': name_list})
    worker_years(df)


def worker_years(df, code=600110, years=None):

    if years is None:
        years = ['2019', '2018', '2017', '2016']
        url = 'http://quotes.money.163.com/f10/dbfx_'\
              + str(code) + '.html?date='\
              + str(years) + '-12-31,'\
              + str(years) + '-09-30#01c08'

        ......

        df['{}-12-31'.format(years)] = number_list  # this is where the problem is
        df = df.drop_duplicates(subset=['class'], keep=False)
        df.to_csv(".\\__fundamentals__\\{:0>6}.csv".format(code),
                  index=False, encoding='GBK')
        print(df)

if __name__ == '__main__':
    pd.set_option('display.max_columns', None)
    pd.set_option('display.unicode.ambiguous_as_wide', True)
    pd.set_option('display.unicode.east_asian_width', True)

    fundamental_path = '.\\__fundamentals__'
    stock_path = '.\\__stock__'

    worker_names(code=600110)

Y a-t-il des moyens de contourner le problème? s'il vous plaît aidez! THX TOUS! PS pour les codes complets, j'ai fourni dans la section réponse. désolé pour les inconvénients.


9 commentaires

Je veux vraiment mettre plus de codes dans mon post, mais il semble que j'en ai mis trop, alors j'ai raccourci un peu. J'espère que vous pouvez comprendre ma situation.


où avez-vous déclaré str var dans votre code? et pourquoi vous utilisez est une fonction? str (code) ...? veuillez nous donner plus de données sur str var où vous l'avez déclaré ... est-ce une fonction ou juste un tableau?


Je l'ai déclaré où years = ['2019', '2018', '2017', '2016'] , je veux nommer mon df [col] avec des années, respectivement. @ZINEMahmoud


votre str (code) str (année) ... n'a aucun sens pour votre code? .... qu'est-ce que str dans votre code? c'était ma question? est-ce une fonction ou une var? vous ne pouvez pas simplement le définir sans le définir


permettez-moi d'afficher tous mes codes dans la section réponse. @ZINEMahmoud


'str' est toujours indéfini monsieur


Il semble que je ne comprends pas tout à fait par «str» n'est pas défini. ma capacité de codage est encore assez amatrice. pouvez-vous me donner quelques indices? @ZINEMahmoud


veux-tu dire que je devrais avoir quelque chose comme ça? pour i, année en énumération (années, 1) ? @ZINEMahmoud


continuons cette discussion dans le chat .


3 Réponses :


0
votes
import requests
import bs4
import os
import pandas as pd


def worker_names(code):

    url = 'http://quotes.money.163.com/f10/dbfx_'\
          + str(code) + '.html?date=2019-12-31,2019-09-30#01c08'


    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) '
                      'AppleWebKit/537.36 (KHTML, like Gecko) '
                      'Chrome/63.0.3239.132 Safari/537.36 QIHU 360SE'
    }

    response = requests.get(url, headers=headers).content
    soup = bs4.BeautifulSoup(response, 'html5lib')

    DuPond_name = soup.find_all(name='td', attrs={'class': 'dbbg01'})

    name_list = []
    for i, names in enumerate(DuPond_name, 1):
        name = names.getText()
        name_list.append(name)

    df = pd.DataFrame({'class': name_list})
    worker_years(code, df)

0 commentaires

0
votes
def worker_years(df, code, years=None):

    if years is None:
        years = ['2019', '2018', '2017', '2016']
        url = 'http://quotes.money.163.com/f10/dbfx_'\
              + str(code) + '.html?date='\
              + str(years) + '-12-31,'\
              + str(years) + '-09-30#01c08'


        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) '
                          'AppleWebKit/537.36 (KHTML, like Gecko) '
                          'Chrome/63.0.3239.132 Safari/537.36 QIHU 360SE'
        }

        response = requests.get(url, headers=headers).content
        soup = bs4.BeautifulSoup(response, 'html5lib')

        DuPond_number = soup.find_all(name='td', attrs={'class': 'dbbg02'})

        number_list = []
        for i, numbers in enumerate(DuPond_number, 1):
            number = numbers.getText()
            number_list.append(number)
            # print(number_list)

        df['{}-12-31'.format(years)] = number_list  # this is where the problem is
        df = df.drop_duplicates(subset=['class'], keep=False)
        df.to_csv(".\\__fundamentals__\\{:0>6}.csv".format(code),
                  index=False, encoding='GBK')
        print(df)


if __name__ == '__main__':
    pd.set_option('display.max_columns', None)
    pd.set_option('display.unicode.ambiguous_as_wide', True)
    pd.set_option('display.unicode.east_asian_width', True)

    for root, dirs, files in os.walk('.\\__stock__'):
        for csv in files:
            if csv.endswith('.csv'):
                path = csv
                prefix = os.path.splitext(path)
                print(prefix[0])
                worker_names(prefix[0])

0 commentaires

1
votes

vos codes df ['{} - 12-31'.format (years)] = number_list montrent un très bon exemple de vous ne pouvez pas créer 2 variables des deux côtés de l'équation. Essayez ceci:

df_year = pd.DataFrame({'{}'.format(year): number_list})
df = pd.concat([df, df_year], axis=1)

contourner avec dataframe, il existe de nombreuses façons d'obtenir le même résultat.


1 commentaires

merci, je vais essayer plus tard, et voir comment je dois manipuler mes codes.